From 18eb3f6047b1a35be3cc3e4b9d307d3de148a867 Mon Sep 17 00:00:00 2001 From: Pierre Gaufillet Date: Thu, 6 Dec 2018 16:01:56 +0100 Subject: [PATCH] Initial commit. --- CMakeLists.txt | 70 + CeCILL-C.txt | 1041 + Copyright | 10 - LGPL-v2.txt | 481 + LICENSES.md | 143 + README.md | 17 + TODO | 3 + config/FindGlib.cmake | 39 + config/FindGlibmm.cmake | 38 + config/FindLibXML++.cmake | 41 + config/FindLibXML2.cmake | 90 + config/FindPLplot.cmake | 75 + config/FindSigC++.cmake | 34 + config/FindUMFPACK.cmake | 100 + config/FindwxWidgetsCustom.cmake | 1086 + config/LibFindMacros.cmake | 101 + doc/CMakeLists.txt | 20 + doc/Doxyfile.cmake | 1663 ++ doc/Rapport post-doc/1-introduction.tex | 134 + doc/Rapport post-doc/2-motivation.tex | 400 + doc/Rapport post-doc/2-sota.tex | 173 + doc/Rapport post-doc/3-imbsa.tex | 884 + doc/Rapport post-doc/4-aocs.tex | 300 + doc/Rapport post-doc/5-conclusions.tex | 131 + doc/Rapport post-doc/IMBSA-paper.tex | 64 + doc/Rapport post-doc/algos/function.fcr | 17 + doc/Rapport post-doc/algos/function2.alt | 12 + doc/Rapport post-doc/algos/function2.fcr | 1 + doc/Rapport post-doc/algos/pre.alt | 12 + doc/Rapport post-doc/algos/pre.fcr | 8 + doc/Rapport post-doc/algos/pre2.fcr | 22 + doc/Rapport post-doc/aliascnt.sty | 88 + doc/Rapport post-doc/altarica-diagrams.tex | 32 + doc/Rapport post-doc/altarica-function.tex | 24 + doc/Rapport post-doc/app.tex | 588 + doc/Rapport post-doc/dirtytalk.sty | 73 + doc/Rapport post-doc/etgts.tex | 130 + .../figures/0- AOCS mode Abstract.png | Bin 0 -> 53332 bytes .../figures/2-2 - AOCS mode automaton.png | Bin 0 -> 179051 bytes .../figures/2-3 - ASH mode.png | Bin 0 -> 19923 bytes .../2-4 set ON the equipment for ASM mode.png | Bin 0 -> 12901 bytes .../figures/2-5 ACM automaton.png | Bin 0 -> 22340 bytes .../2-6 set ON the equipment for ACM mode.png | Bin 0 -> 20287 bytes .../figures/2-7 Collision Avoidance Mode.png | Bin 0 -> 16288 bytes .../figures/2-8 OCM automaton.png | Bin 0 -> 18207 bytes .../figures/2-9 Formation Control Mode.png | Bin 0 -> 18262 bytes doc/Rapport post-doc/figures/AOCS mode.png | Bin 0 -> 94752 bytes .../figures/AOCSmode_schema.png | Bin 0 -> 76954 bytes .../figures/AirSpeed_Computation.jpg | Bin 0 -> 170707 bytes .../figures/ERTS - AOCS mode.png | Bin 0 -> 94752 bytes .../figures/EUTELSAT-172B-SATELLITE.jpg | Bin 0 -> 278946 bytes .../figures/Equipment Mode.png | Bin 0 -> 18413 bytes doc/Rapport post-doc/figures/Function2_1.pdf | Bin 0 -> 5648 bytes doc/Rapport post-doc/figures/Function2_1.png | Bin 0 -> 4875 bytes doc/Rapport post-doc/figures/Function2_1.svg | 271 + doc/Rapport post-doc/figures/Function2_1.tex | 306 + doc/Rapport post-doc/figures/Function2_2.pdf | Bin 0 -> 8084 bytes doc/Rapport post-doc/figures/Function2_2.png | Bin 0 -> 14447 bytes doc/Rapport post-doc/figures/Function2_2.svg | 276 + .../figures/Gnc mode simplifie.png | Bin 0 -> 42279 bytes doc/Rapport post-doc/figures/Modele0.png | Bin 0 -> 3179 bytes doc/Rapport post-doc/figures/Modele0F4.png | Bin 0 -> 4875 bytes doc/Rapport post-doc/figures/Modele1.png | Bin 0 -> 6473 bytes doc/Rapport post-doc/figures/Modele2.png | Bin 0 -> 7628 bytes doc/Rapport post-doc/figures/passerelle.png | Bin 0 -> 94903 bytes .../figures/satellite_telecom.png | Bin 0 -> 1008761 bytes .../figures/space_systems_2.jpg | Bin 0 -> 77369 bytes doc/Rapport post-doc/figures/table1.png | Bin 0 -> 10573 bytes doc/Rapport post-doc/figures/texput.log | 21 + doc/Rapport post-doc/llncsdoc.sty | 42 + doc/Rapport post-doc/longabstract.tex | 25 + doc/Rapport post-doc/lstlang3.sty | 1067 + doc/Rapport post-doc/main.tex | 198 + doc/Rapport post-doc/main.toc | 48 + doc/Rapport post-doc/paper.bib | 427 + doc/Rapport post-doc/readme.txt | 30 + doc/Rapport post-doc/remreset.sty | 39 + doc/Rapport post-doc/splncs03.bst | 1519 ++ doc/Rapport post-doc/sprmindx.sty | 4 + doc/Rapport post-doc/subjidx.ind | 70 + doc/Rapport post-doc/tina.bib | 103 + doc/TODO | 1 + doc/altarica-syntax.pdf | Bin 0 -> 205146 bytes doc/boundedcont.pdf | Bin 0 -> 53049 bytes doc/cont.pdf | Bin 0 -> 25443 bytes doc/quickstart.aux | 22 + doc/quickstart.log | 246 + doc/quickstart.pdf | Bin 0 -> 254520 bytes doc/quickstart.tex | 407 + icons/document-build-model-16.xpm | 162 + icons/document-build-model-24.xpm | 343 + icons/document-switch-mode-16.xpm | 60 + icons/document-switch-mode-24.xpm | 80 + sdk/CMakeLists.txt | 27 + .../numeric/bindings/addressing_index.hpp | 74 + sdk/boost/numeric/bindings/at.hpp | 71 + sdk/boost/numeric/bindings/bandwidth.hpp | 167 + sdk/boost/numeric/bindings/begin.hpp | 145 + sdk/boost/numeric/bindings/blas.hpp | 17 + sdk/boost/numeric/bindings/blas/detail/blas.h | 574 + .../numeric/bindings/blas/detail/blas_names.h | 275 + .../bindings/blas/detail/blas_option.hpp | 57 + .../numeric/bindings/blas/detail/cblas.h | 41 + .../bindings/blas/detail/cblas_option.hpp | 85 + .../numeric/bindings/blas/detail/cublas.h | 16 + .../bindings/blas/detail/default_order.hpp | 38 + sdk/boost/numeric/bindings/blas/level1.hpp | 29 + .../numeric/bindings/blas/level1/asum.hpp | 230 + .../numeric/bindings/blas/level1/axpy.hpp | 249 + .../numeric/bindings/blas/level1/copy.hpp | 243 + .../numeric/bindings/blas/level1/dot.hpp | 246 + .../numeric/bindings/blas/level1/dotc.hpp | 186 + .../numeric/bindings/blas/level1/dotu.hpp | 42 + .../numeric/bindings/blas/level1/iamax.hpp | 232 + .../numeric/bindings/blas/level1/nrm2.hpp | 230 + .../numeric/bindings/blas/level1/prec_dot.hpp | 150 + .../numeric/bindings/blas/level1/rot.hpp | 250 + .../numeric/bindings/blas/level1/rotg.hpp | 223 + .../numeric/bindings/blas/level1/rotm.hpp | 187 + .../numeric/bindings/blas/level1/rotmg.hpp | 179 + .../numeric/bindings/blas/level1/scal.hpp | 291 + .../numeric/bindings/blas/level1/set.hpp | 62 + .../numeric/bindings/blas/level1/swap.hpp | 244 + sdk/boost/numeric/bindings/blas/level2.hpp | 38 + .../numeric/bindings/blas/level2/gbmv.hpp | 332 + .../numeric/bindings/blas/level2/gemv.hpp | 325 + .../numeric/bindings/blas/level2/ger.hpp | 215 + .../numeric/bindings/blas/level2/gerc.hpp | 220 + .../numeric/bindings/blas/level2/geru.hpp | 220 + .../numeric/bindings/blas/level2/hbmv.hpp | 320 + .../numeric/bindings/blas/level2/hemv.hpp | 315 + .../numeric/bindings/blas/level2/her.hpp | 283 + .../numeric/bindings/blas/level2/her2.hpp | 309 + .../numeric/bindings/blas/level2/hpmv.hpp | 315 + .../numeric/bindings/blas/level2/hpr.hpp | 281 + .../numeric/bindings/blas/level2/hpr2.hpp | 301 + .../numeric/bindings/blas/level2/sbmv.hpp | 224 + .../numeric/bindings/blas/level2/spmv.hpp | 221 + .../numeric/bindings/blas/level2/spr.hpp | 203 + .../numeric/bindings/blas/level2/spr2.hpp | 216 + .../numeric/bindings/blas/level2/symv.hpp | 221 + .../numeric/bindings/blas/level2/syr.hpp | 203 + .../numeric/bindings/blas/level2/syr2.hpp | 220 + .../numeric/bindings/blas/level2/tbmv.hpp | 305 + .../numeric/bindings/blas/level2/tbsv.hpp | 305 + .../numeric/bindings/blas/level2/tpmv.hpp | 296 + .../numeric/bindings/blas/level2/tpsv.hpp | 296 + .../numeric/bindings/blas/level2/trmv.hpp | 302 + .../numeric/bindings/blas/level2/trsv.hpp | 302 + sdk/boost/numeric/bindings/blas/level3.hpp | 22 + .../numeric/bindings/blas/level3/gemm.hpp | 338 + .../numeric/bindings/blas/level3/hemm.hpp | 336 + .../numeric/bindings/blas/level3/her2k.hpp | 334 + .../numeric/bindings/blas/level3/herk.hpp | 308 + .../numeric/bindings/blas/level3/symm.hpp | 336 + .../numeric/bindings/blas/level3/syr2k.hpp | 338 + .../numeric/bindings/blas/level3/syrk.hpp | 315 + .../numeric/bindings/blas/level3/trmm.hpp | 334 + .../numeric/bindings/blas/level3/trsm.hpp | 334 + sdk/boost/numeric/bindings/boost/array.hpp | 47 + .../numeric/bindings/boost/multi_array.hpp | 87 + sdk/boost/numeric/bindings/column.hpp | 96 + sdk/boost/numeric/bindings/conj.hpp | 48 + sdk/boost/numeric/bindings/data_order.hpp | 44 + sdk/boost/numeric/bindings/data_side.hpp | 35 + .../bindings/detail/adaptable_type.hpp | 43 + sdk/boost/numeric/bindings/detail/adaptor.hpp | 51 + sdk/boost/numeric/bindings/detail/array.hpp | 127 + .../bindings/detail/basic_unwrapper.hpp | 56 + .../numeric/bindings/detail/basic_wrapper.hpp | 41 + .../numeric/bindings/detail/complex_utils.hpp | 182 + .../bindings/detail/config/fortran.hpp | 88 + .../numeric/bindings/detail/convert_to.hpp | 25 + .../numeric/bindings/detail/copy_const.hpp | 32 + .../bindings/detail/generate_functions.hpp | 48 + sdk/boost/numeric/bindings/detail/get.hpp | 96 + sdk/boost/numeric/bindings/detail/if_left.hpp | 53 + .../numeric/bindings/detail/if_row_major.hpp | 34 + .../bindings/detail/linear_iterator.hpp | 89 + sdk/boost/numeric/bindings/detail/offset.hpp | 72 + sdk/boost/numeric/bindings/detail/pod.hpp | 90 + .../numeric/bindings/detail/property_map.hpp | 73 + sdk/boost/numeric/bindings/diag_tag.hpp | 56 + sdk/boost/numeric/bindings/eigen/matrix.hpp | 92 + .../numeric/bindings/eigen/sparsematrix.hpp | 92 + sdk/boost/numeric/bindings/end.hpp | 139 + .../numeric/bindings/glas/compressed.hpp | 84 + .../numeric/bindings/glas/dense_matrix.hpp | 71 + .../numeric/bindings/glas/dense_vector.hpp | 51 + .../bindings/glas/dense_vector_collection.hpp | 84 + .../bindings/glas/detail/convert_to.hpp | 36 + sdk/boost/numeric/bindings/has_band_array.hpp | 28 + .../numeric/bindings/has_linear_array.hpp | 32 + sdk/boost/numeric/bindings/has_rank.hpp | 36 + .../numeric/bindings/has_static_size.hpp | 52 + .../numeric/bindings/has_static_stride.hpp | 52 + .../numeric/bindings/has_triangular_array.hpp | 27 + sdk/boost/numeric/bindings/herm.hpp | 44 + sdk/boost/numeric/bindings/index_base.hpp | 35 + sdk/boost/numeric/bindings/io.hpp | 52 + .../numeric/bindings/is_column_major.hpp | 32 + sdk/boost/numeric/bindings/is_complex.hpp | 25 + sdk/boost/numeric/bindings/is_mutable.hpp | 33 + sdk/boost/numeric/bindings/is_numeric.hpp | 28 + sdk/boost/numeric/bindings/is_real.hpp | 25 + sdk/boost/numeric/bindings/is_row_major.hpp | 32 + sdk/boost/numeric/bindings/is_symmetric.hpp | 27 + sdk/boost/numeric/bindings/lapack.hpp | 16 + .../numeric/bindings/lapack/auxiliary.hpp | 48 + .../bindings/lapack/auxiliary/ilaenv.hpp | 38 + .../bindings/lapack/auxiliary/labrd.hpp | 301 + .../bindings/lapack/auxiliary/lacgv.hpp | 122 + .../bindings/lapack/auxiliary/lacon.hpp | 296 + .../bindings/lapack/auxiliary/laebz.hpp | 287 + .../bindings/lapack/auxiliary/lalsd.hpp | 425 + .../bindings/lapack/auxiliary/langb.hpp | 223 + .../bindings/lapack/auxiliary/lange.hpp | 218 + .../bindings/lapack/auxiliary/lanhb.hpp | 203 + .../bindings/lapack/auxiliary/lanhe.hpp | 196 + .../bindings/lapack/auxiliary/lanhp.hpp | 188 + .../bindings/lapack/auxiliary/lanhs.hpp | 213 + .../bindings/lapack/auxiliary/lansb.hpp | 233 + .../bindings/lapack/auxiliary/lansp.hpp | 214 + .../bindings/lapack/auxiliary/lansy.hpp | 224 + .../bindings/lapack/auxiliary/lantb.hpp | 238 + .../bindings/lapack/auxiliary/lantp.hpp | 216 + .../bindings/lapack/auxiliary/lantr.hpp | 235 + .../bindings/lapack/auxiliary/larf.hpp | 362 + .../bindings/lapack/auxiliary/larfb.hpp | 393 + .../bindings/lapack/auxiliary/larfg.hpp | 195 + .../bindings/lapack/auxiliary/larft.hpp | 179 + .../bindings/lapack/auxiliary/larfx.hpp | 364 + .../bindings/lapack/auxiliary/largv.hpp | 210 + .../bindings/lapack/auxiliary/larnv.hpp | 149 + .../bindings/lapack/auxiliary/larrb.hpp | 271 + .../bindings/lapack/auxiliary/larre.hpp | 332 + .../bindings/lapack/auxiliary/larz.hpp | 370 + .../bindings/lapack/auxiliary/latrd.hpp | 251 + .../bindings/lapack/auxiliary/latrs.hpp | 244 + .../bindings/lapack/auxiliary/latrz.hpp | 313 + .../numeric/bindings/lapack/computational.hpp | 174 + .../bindings/lapack/computational/bdsdc.hpp | 256 + .../bindings/lapack/computational/bdsqr.hpp | 401 + .../bindings/lapack/computational/gbbrd.hpp | 456 + .../bindings/lapack/computational/gbcon.hpp | 364 + .../bindings/lapack/computational/gbequ.hpp | 238 + .../bindings/lapack/computational/gbrfs.hpp | 499 + .../bindings/lapack/computational/gbtrf.hpp | 170 + .../bindings/lapack/computational/gbtrs.hpp | 195 + .../bindings/lapack/computational/gebak.hpp | 222 + .../bindings/lapack/computational/gebal.hpp | 209 + .../bindings/lapack/computational/gebrd.hpp | 391 + .../bindings/lapack/computational/gecon.hpp | 333 + .../bindings/lapack/computational/geequ.hpp | 221 + .../bindings/lapack/computational/gehrd.hpp | 332 + .../bindings/lapack/computational/gelqf.hpp | 330 + .../bindings/lapack/computational/geqlf.hpp | 330 + .../bindings/lapack/computational/geqp3.hpp | 352 + .../bindings/lapack/computational/geqrf.hpp | 330 + .../bindings/lapack/computational/gerfs.hpp | 469 + .../bindings/lapack/computational/gerqf.hpp | 330 + .../bindings/lapack/computational/getrf.hpp | 228 + .../bindings/lapack/computational/getri.hpp | 399 + .../bindings/lapack/computational/getrs.hpp | 255 + .../bindings/lapack/computational/ggbak.hpp | 242 + .../bindings/lapack/computational/ggbal.hpp | 376 + .../bindings/lapack/computational/gghrd.hpp | 209 + .../bindings/lapack/computational/ggqrf.hpp | 403 + .../bindings/lapack/computational/ggrqf.hpp | 403 + .../bindings/lapack/computational/ggsvp.hpp | 525 + .../bindings/lapack/computational/gtrfs.hpp | 561 + .../bindings/lapack/computational/gttrs.hpp | 206 + .../bindings/lapack/computational/hbgst.hpp | 383 + .../bindings/lapack/computational/hbtrd.hpp | 370 + .../bindings/lapack/computational/hecon.hpp | 338 + .../bindings/lapack/computational/hegst.hpp | 179 + .../bindings/lapack/computational/herfs.hpp | 464 + .../bindings/lapack/computational/hetrd.hpp | 368 + .../bindings/lapack/computational/hetrf.hpp | 325 + .../bindings/lapack/computational/hetri.hpp | 310 + .../bindings/lapack/computational/hetrs.hpp | 182 + .../bindings/lapack/computational/hgeqz.hpp | 525 + .../bindings/lapack/computational/hpcon.hpp | 322 + .../bindings/lapack/computational/hprfs.hpp | 439 + .../bindings/lapack/computational/hptrd.hpp | 226 + .../bindings/lapack/computational/hptrf.hpp | 152 + .../bindings/lapack/computational/hptri.hpp | 293 + .../bindings/lapack/computational/hptrs.hpp | 177 + .../bindings/lapack/computational/hsein.hpp | 500 + .../bindings/lapack/computational/hseqr.hpp | 463 + .../bindings/lapack/computational/opgtr.hpp | 206 + .../bindings/lapack/computational/opmtr.hpp | 225 + .../bindings/lapack/computational/orgbr.hpp | 212 + .../bindings/lapack/computational/orghr.hpp | 209 + .../bindings/lapack/computational/orglq.hpp | 203 + .../bindings/lapack/computational/orgql.hpp | 202 + .../bindings/lapack/computational/orgqr.hpp | 202 + .../bindings/lapack/computational/orgrq.hpp | 203 + .../bindings/lapack/computational/orgtr.hpp | 208 + .../bindings/lapack/computational/ormbr.hpp | 244 + .../bindings/lapack/computational/ormhr.hpp | 245 + .../bindings/lapack/computational/ormlq.hpp | 241 + .../bindings/lapack/computational/ormql.hpp | 239 + .../bindings/lapack/computational/ormqr.hpp | 239 + .../bindings/lapack/computational/ormrq.hpp | 241 + .../bindings/lapack/computational/ormrz.hpp | 244 + .../bindings/lapack/computational/ormtr.hpp | 241 + .../bindings/lapack/computational/pbcon.hpp | 347 + .../bindings/lapack/computational/pbequ.hpp | 221 + .../bindings/lapack/computational/pbrfs.hpp | 457 + .../bindings/lapack/computational/pbstf.hpp | 162 + .../bindings/lapack/computational/pbtrf.hpp | 162 + .../bindings/lapack/computational/pbtrs.hpp | 181 + .../bindings/lapack/computational/pftrf.hpp | 154 + .../bindings/lapack/computational/pftri.hpp | 159 + .../bindings/lapack/computational/pftrs.hpp | 173 + .../bindings/lapack/computational/pocon.hpp | 340 + .../bindings/lapack/computational/poequ.hpp | 203 + .../bindings/lapack/computational/porfs.hpp | 452 + .../bindings/lapack/computational/potrf.hpp | 220 + .../bindings/lapack/computational/potri.hpp | 220 + .../bindings/lapack/computational/potrs.hpp | 245 + .../bindings/lapack/computational/ppcon.hpp | 328 + .../bindings/lapack/computational/ppequ.hpp | 202 + .../bindings/lapack/computational/pprfs.hpp | 428 + .../bindings/lapack/computational/pptrf.hpp | 149 + .../bindings/lapack/computational/pptri.hpp | 149 + .../bindings/lapack/computational/pptrs.hpp | 171 + .../bindings/lapack/computational/pstrf.hpp | 234 + .../bindings/lapack/computational/ptcon.hpp | 296 + .../bindings/lapack/computational/pteqr.hpp | 316 + .../bindings/lapack/computational/ptrfs.hpp | 478 + .../bindings/lapack/computational/pttrf.hpp | 187 + .../bindings/lapack/computational/pttrs.hpp | 229 + .../bindings/lapack/computational/sbgst.hpp | 226 + .../bindings/lapack/computational/sbtrd.hpp | 230 + .../bindings/lapack/computational/spcon.hpp | 322 + .../bindings/lapack/computational/sprfs.hpp | 439 + .../bindings/lapack/computational/sptrd.hpp | 147 + .../bindings/lapack/computational/sptrf.hpp | 152 + .../bindings/lapack/computational/sptri.hpp | 293 + .../bindings/lapack/computational/sptrs.hpp | 177 + .../bindings/lapack/computational/stebz.hpp | 262 + .../bindings/lapack/computational/stedc.hpp | 432 + .../bindings/lapack/computational/stegr.hpp | 481 + .../bindings/lapack/computational/stein.hpp | 423 + .../bindings/lapack/computational/stemr.hpp | 486 + .../bindings/lapack/computational/steqr.hpp | 324 + .../bindings/lapack/computational/sterf.hpp | 127 + .../bindings/lapack/computational/sycon.hpp | 338 + .../bindings/lapack/computational/sygst.hpp | 147 + .../bindings/lapack/computational/syrfs.hpp | 464 + .../bindings/lapack/computational/sytrd.hpp | 228 + .../bindings/lapack/computational/sytrf.hpp | 325 + .../bindings/lapack/computational/sytri.hpp | 310 + .../bindings/lapack/computational/sytrs.hpp | 182 + .../bindings/lapack/computational/tbcon.hpp | 353 + .../bindings/lapack/computational/tbrfs.hpp | 458 + .../bindings/lapack/computational/tbtrs.hpp | 194 + .../bindings/lapack/computational/tftri.hpp | 162 + .../bindings/lapack/computational/tgevc.hpp | 421 + .../bindings/lapack/computational/tgexc.hpp | 378 + .../bindings/lapack/computational/tgsen.hpp | 621 + .../bindings/lapack/computational/tgsja.hpp | 494 + .../bindings/lapack/computational/tgsna.hpp | 498 + .../bindings/lapack/computational/tgsyl.hpp | 548 + .../bindings/lapack/computational/tpcon.hpp | 333 + .../bindings/lapack/computational/tprfs.hpp | 440 + .../bindings/lapack/computational/tptri.hpp | 157 + .../bindings/lapack/computational/tptrs.hpp | 182 + .../bindings/lapack/computational/trcon.hpp | 346 + .../bindings/lapack/computational/trevc.hpp | 509 + .../bindings/lapack/computational/trexc.hpp | 297 + .../bindings/lapack/computational/trrfs.hpp | 448 + .../bindings/lapack/computational/trsen.hpp | 254 + .../bindings/lapack/computational/trsna.hpp | 439 + .../bindings/lapack/computational/trsyl.hpp | 265 + .../bindings/lapack/computational/trtri.hpp | 229 + .../bindings/lapack/computational/trtrs.hpp | 187 + .../bindings/lapack/computational/tzrzf.hpp | 326 + .../bindings/lapack/computational/ungbr.hpp | 337 + .../bindings/lapack/computational/unghr.hpp | 334 + .../bindings/lapack/computational/unglq.hpp | 326 + .../bindings/lapack/computational/ungql.hpp | 324 + .../bindings/lapack/computational/ungqr.hpp | 324 + .../bindings/lapack/computational/ungrq.hpp | 326 + .../bindings/lapack/computational/ungtr.hpp | 333 + .../bindings/lapack/computational/unmbr.hpp | 430 + .../bindings/lapack/computational/unmhr.hpp | 401 + .../bindings/lapack/computational/unmlq.hpp | 428 + .../bindings/lapack/computational/unmql.hpp | 424 + .../bindings/lapack/computational/unmqr.hpp | 394 + .../bindings/lapack/computational/unmrq.hpp | 428 + .../bindings/lapack/computational/unmrz.hpp | 432 + .../bindings/lapack/computational/unmtr.hpp | 397 + .../bindings/lapack/computational/upgtr.hpp | 328 + .../bindings/lapack/computational/upmtr.hpp | 366 + .../numeric/bindings/lapack/detail/clapack.h | 18 + .../bindings/lapack/detail/clapack_option.hpp | 29 + .../numeric/bindings/lapack/detail/lapack.h | 4380 ++++ .../bindings/lapack/detail/lapack_names.h | 1442 ++ .../bindings/lapack/detail/lapack_option.hpp | 32 + sdk/boost/numeric/bindings/lapack/driver.hpp | 103 + .../numeric/bindings/lapack/driver/gbsv.hpp | 183 + .../numeric/bindings/lapack/driver/gbsvx.hpp | 547 + .../numeric/bindings/lapack/driver/gees.hpp | 520 + .../numeric/bindings/lapack/driver/geesx.hpp | 537 + .../numeric/bindings/lapack/driver/geev.hpp | 456 + .../numeric/bindings/lapack/driver/geevx.hpp | 597 + .../numeric/bindings/lapack/driver/gegv.hpp | 509 + .../numeric/bindings/lapack/driver/gejsv.hpp | 274 + .../numeric/bindings/lapack/driver/gels.hpp | 375 + .../numeric/bindings/lapack/driver/gelsd.hpp | 493 + .../numeric/bindings/lapack/driver/gelss.hpp | 415 + .../numeric/bindings/lapack/driver/gelsy.hpp | 400 + .../numeric/bindings/lapack/driver/gesdd.hpp | 465 + .../numeric/bindings/lapack/driver/gesv.hpp | 242 + .../numeric/bindings/lapack/driver/gesvd.hpp | 470 + .../numeric/bindings/lapack/driver/gesvx.hpp | 524 + .../numeric/bindings/lapack/driver/gges.hpp | 580 + .../numeric/bindings/lapack/driver/ggesx.hpp | 683 + .../numeric/bindings/lapack/driver/ggev.hpp | 509 + .../numeric/bindings/lapack/driver/ggevx.hpp | 756 + .../numeric/bindings/lapack/driver/ggglm.hpp | 407 + .../numeric/bindings/lapack/driver/gglse.hpp | 405 + .../numeric/bindings/lapack/driver/ggsvd.hpp | 514 + .../numeric/bindings/lapack/driver/gtsv.hpp | 181 + .../numeric/bindings/lapack/driver/gtsvx.hpp | 556 + .../numeric/bindings/lapack/driver/hbev.hpp | 358 + .../numeric/bindings/lapack/driver/hbevd.hpp | 459 + .../numeric/bindings/lapack/driver/hbevx.hpp | 484 + .../numeric/bindings/lapack/driver/hbgv.hpp | 397 + .../numeric/bindings/lapack/driver/hbgvd.hpp | 505 + .../numeric/bindings/lapack/driver/hbgvx.hpp | 514 + .../numeric/bindings/lapack/driver/heev.hpp | 351 + .../numeric/bindings/lapack/driver/heevd.hpp | 428 + .../numeric/bindings/lapack/driver/heevr.hpp | 489 + .../numeric/bindings/lapack/driver/heevx.hpp | 485 + .../numeric/bindings/lapack/driver/hegv.hpp | 393 + .../numeric/bindings/lapack/driver/hegvd.hpp | 468 + .../numeric/bindings/lapack/driver/hegvx.hpp | 522 + .../numeric/bindings/lapack/driver/hesv.hpp | 362 + .../numeric/bindings/lapack/driver/hesvx.hpp | 516 + .../numeric/bindings/lapack/driver/hpev.hpp | 340 + .../numeric/bindings/lapack/driver/hpevd.hpp | 438 + .../numeric/bindings/lapack/driver/hpevx.hpp | 436 + .../numeric/bindings/lapack/driver/hpgv.hpp | 369 + .../numeric/bindings/lapack/driver/hpgvd.hpp | 469 + .../numeric/bindings/lapack/driver/hpgvx.hpp | 462 + .../numeric/bindings/lapack/driver/hpsv.hpp | 176 + .../numeric/bindings/lapack/driver/hpsvx.hpp | 457 + .../bindings/lapack/driver/iter_gesv.hpp | 390 + .../bindings/lapack/driver/iter_posv.hpp | 383 + .../numeric/bindings/lapack/driver/pbsv.hpp | 182 + .../numeric/bindings/lapack/driver/pbsvx.hpp | 508 + .../numeric/bindings/lapack/driver/posv.hpp | 246 + .../numeric/bindings/lapack/driver/posvx.hpp | 495 + .../numeric/bindings/lapack/driver/ppsv.hpp | 172 + .../numeric/bindings/lapack/driver/ppsvx.hpp | 474 + .../numeric/bindings/lapack/driver/ptsv.hpp | 216 + .../numeric/bindings/lapack/driver/ptsvx.hpp | 452 + .../numeric/bindings/lapack/driver/sbev.hpp | 216 + .../numeric/bindings/lapack/driver/sbevd.hpp | 259 + .../numeric/bindings/lapack/driver/sbevx.hpp | 286 + .../numeric/bindings/lapack/driver/sbgv.hpp | 236 + .../numeric/bindings/lapack/driver/sbgvd.hpp | 283 + .../numeric/bindings/lapack/driver/sbgvx.hpp | 302 + .../numeric/bindings/lapack/driver/spev.hpp | 207 + .../numeric/bindings/lapack/driver/spevd.hpp | 248 + .../numeric/bindings/lapack/driver/spevx.hpp | 261 + .../numeric/bindings/lapack/driver/spgv.hpp | 222 + .../numeric/bindings/lapack/driver/spgvd.hpp | 267 + .../numeric/bindings/lapack/driver/spgvx.hpp | 275 + .../numeric/bindings/lapack/driver/spsv.hpp | 176 + .../numeric/bindings/lapack/driver/spsvx.hpp | 457 + .../numeric/bindings/lapack/driver/stev.hpp | 200 + .../numeric/bindings/lapack/driver/stevd.hpp | 241 + .../numeric/bindings/lapack/driver/stevr.hpp | 282 + .../numeric/bindings/lapack/driver/stevx.hpp | 267 + .../numeric/bindings/lapack/driver/syev.hpp | 210 + .../numeric/bindings/lapack/driver/syevd.hpp | 243 + .../numeric/bindings/lapack/driver/syevr.hpp | 286 + .../numeric/bindings/lapack/driver/syevx.hpp | 287 + .../numeric/bindings/lapack/driver/sygv.hpp | 232 + .../numeric/bindings/lapack/driver/sygvd.hpp | 266 + .../numeric/bindings/lapack/driver/sygvx.hpp | 305 + .../numeric/bindings/lapack/driver/sysv.hpp | 362 + .../numeric/bindings/lapack/driver/sysvx.hpp | 516 + .../numeric/bindings/lapack/workspace.hpp | 202 + sdk/boost/numeric/bindings/lower.hpp | 45 + sdk/boost/numeric/bindings/min_rank.hpp | 26 + .../numeric/bindings/mtl/compressed2D.hpp | 88 + sdk/boost/numeric/bindings/mtl/dense2D.hpp | 98 + .../numeric/bindings/mtl/dense_vector.hpp | 71 + .../bindings/mtl/detail/convert_to.hpp | 36 + .../numeric/bindings/mumps/4.6.4/cmumps_c.hpp | 118 + .../numeric/bindings/mumps/4.6.4/dmumps_c.hpp | 125 + .../numeric/bindings/mumps/4.6.4/smumps_c.hpp | 117 + .../numeric/bindings/mumps/4.6.4/zmumps_c.hpp | 118 + .../numeric/bindings/mumps/mumps_driver.hpp | 14 + .../bindings/mumps/mumps_driver_4_6_4.hpp | 264 + .../bindings/mumps/mumps_driver_4_8_0.hpp | 271 + sdk/boost/numeric/bindings/noop.hpp | 61 + sdk/boost/numeric/bindings/num_columns.hpp | 35 + sdk/boost/numeric/bindings/num_rows.hpp | 35 + sdk/boost/numeric/bindings/rank.hpp | 25 + .../numeric/bindings/remove_imaginary.hpp | 37 + sdk/boost/numeric/bindings/row.hpp | 100 + sdk/boost/numeric/bindings/size.hpp | 155 + sdk/boost/numeric/bindings/std.hpp | 15 + sdk/boost/numeric/bindings/std/valarray.hpp | 51 + sdk/boost/numeric/bindings/std/vector.hpp | 51 + sdk/boost/numeric/bindings/stride.hpp | 210 + sdk/boost/numeric/bindings/symm.hpp | 44 + sdk/boost/numeric/bindings/tag.hpp | 126 + .../numeric/bindings/traits/detail/utils.hpp | 63 + sdk/boost/numeric/bindings/traits/type.h | 44 + sdk/boost/numeric/bindings/traits/type.hpp | 34 + .../numeric/bindings/traits/type_traits.hpp | 64 + sdk/boost/numeric/bindings/trans.hpp | 173 + sdk/boost/numeric/bindings/trans_tag.hpp | 89 + sdk/boost/numeric/bindings/ublas.hpp | 27 + sdk/boost/numeric/bindings/ublas/banded.hpp | 121 + .../ublas/detail/basic_ublas_adaptor.hpp | 60 + .../bindings/ublas/detail/convert_to.hpp | 76 + .../numeric/bindings/ublas/hermitian.hpp | 86 + sdk/boost/numeric/bindings/ublas/matrix.hpp | 148 + .../bindings/ublas/matrix_expression.hpp | 126 + .../numeric/bindings/ublas/matrix_proxy.hpp | 244 + .../numeric/bindings/ublas/matrix_sparse.hpp | 135 + .../numeric/bindings/ublas/scalar_vector.hpp | 51 + sdk/boost/numeric/bindings/ublas/storage.hpp | 53 + .../numeric/bindings/ublas/symmetric.hpp | 86 + .../numeric/bindings/ublas/triangular.hpp | 73 + sdk/boost/numeric/bindings/ublas/vector.hpp | 107 + .../bindings/ublas/vector_expression.hpp | 54 + .../numeric/bindings/ublas/vector_proxy.hpp | 81 + .../numeric/bindings/ublas/vector_sparse.hpp | 53 + .../numeric/bindings/umfpack/umfpack.hpp | 1053 + .../numeric/bindings/umfpack/umfpack_inc.hpp | 59 + .../bindings/umfpack/umfpack_overloads.hpp | 472 + sdk/boost/numeric/bindings/unit_lower.hpp | 45 + sdk/boost/numeric/bindings/unit_upper.hpp | 45 + sdk/boost/numeric/bindings/uplo_tag.hpp | 77 + sdk/boost/numeric/bindings/upper.hpp | 45 + sdk/boost/numeric/bindings/value_type.hpp | 27 + sdk/boost/numeric/bindings/vector_view.hpp | 83 + sdk/boost/numeric/bindings/views.hpp | 26 + sdk/buddy-2.4/AUTHORS | 11 + sdk/buddy-2.4/CHANGES | 0 sdk/buddy-2.4/CMakeLists.txt | 26 + sdk/buddy-2.4/ChangeLog | 218 + sdk/buddy-2.4/Makefile.am | 5 + sdk/buddy-2.4/Makefile.in | 599 + sdk/buddy-2.4/NEWS | 200 + sdk/buddy-2.4/README | 128 + sdk/buddy-2.4/aclocal.m4 | 6861 ++++++ sdk/buddy-2.4/autom4te.cache/output.0 | 19914 ++++++++++++++++ sdk/buddy-2.4/autom4te.cache/requests | 79 + sdk/buddy-2.4/autom4te.cache/traces.0 | 712 + sdk/buddy-2.4/config.h.in | 66 + sdk/buddy-2.4/configure | 19914 ++++++++++++++++ sdk/buddy-2.4/configure.ac | 29 + sdk/buddy-2.4/include/bdd.h | 838 + sdk/buddy-2.4/include/bvec.h | 297 + sdk/buddy-2.4/include/fdd.h | 174 + sdk/buddy-2.4/libtool | 7381 ++++++ sdk/buddy-2.4/m4/debug.m4 | 25 + sdk/buddy-2.4/src/Makefile.am | 31 + sdk/buddy-2.4/src/Makefile.in | 566 + sdk/buddy-2.4/src/bdd.h | 838 + sdk/buddy-2.4/src/bddio.c | 593 + sdk/buddy-2.4/src/bddop.c | 2924 +++ sdk/buddy-2.4/src/bddtest.cxx | 110 + sdk/buddy-2.4/src/bddtree.h | 60 + .../src/buddy-2.4-stamp/buddy-2.4-done | 0 sdk/buddy-2.4/src/bvec.c | 1355 ++ sdk/buddy-2.4/src/bvec.h | 297 + sdk/buddy-2.4/src/cache.c | 97 + sdk/buddy-2.4/src/cache.h | 70 + sdk/buddy-2.4/src/cppext.cxx | 624 + sdk/buddy-2.4/src/fdd.c | 1129 + sdk/buddy-2.4/src/fdd.h | 174 + sdk/buddy-2.4/src/imatrix.c | 149 + sdk/buddy-2.4/src/imatrix.h | 59 + sdk/buddy-2.4/src/kernel.c | 1496 ++ sdk/buddy-2.4/src/kernel.h | 231 + sdk/buddy-2.4/src/libbdd.la | 35 + sdk/buddy-2.4/src/pairs.c | 335 + sdk/buddy-2.4/src/prime.c | 321 + sdk/buddy-2.4/src/prime.h | 48 + sdk/buddy-2.4/src/reorder.c | 2322 ++ sdk/buddy-2.4/src/tree.c | 222 + sdk/buddy-2.4/stamp-h1 | 1 + sdk/buddy-2.4/tools/config.guess | 1411 ++ sdk/buddy-2.4/tools/config.sub | 1500 ++ sdk/buddy-2.4/tools/depcomp | 526 + sdk/buddy-2.4/tools/install-sh | 325 + sdk/buddy-2.4/tools/ltmain.sh | 6443 +++++ sdk/buddy-2.4/tools/missing | 360 + sdk/wxscintilla/CMakeLists.txt | 26 + sdk/wxscintilla/include/wx/wxscintilla.h | 3837 +++ sdk/wxscintilla/src/PlatWX.cpp | 1647 ++ sdk/wxscintilla/src/PlatWX.h | 14 + sdk/wxscintilla/src/ScintillaWX.cpp | 1359 ++ sdk/wxscintilla/src/ScintillaWX.h | 214 + sdk/wxscintilla/src/gtkstring.h | 39 + sdk/wxscintilla/src/scintilla/License.txt | 20 + sdk/wxscintilla/src/scintilla/README.txt | 5 + .../src/scintilla/include/Accessor.h | 79 + sdk/wxscintilla/src/scintilla/include/Face.py | 110 + .../src/scintilla/include/HFacer.py | 75 + .../src/scintilla/include/KeyWords.h | 113 + .../src/scintilla/include/Platform.h | 558 + .../src/scintilla/include/PropSet.h | 26 + .../src/scintilla/include/SString.h | 289 + .../src/scintilla/include/SciLexer.h | 1446 ++ .../src/scintilla/include/Scintilla.h | 974 + .../src/scintilla/include/Scintilla.iface | 3784 +++ .../src/scintilla/include/ScintillaWidget.h | 55 + .../src/scintilla/include/WindowAccessor.h | 67 + .../src/scintilla/src/AutoComplete.cxx | 178 + .../src/scintilla/src/AutoComplete.h | 78 + sdk/wxscintilla/src/scintilla/src/CallTip.cxx | 387 + sdk/wxscintilla/src/scintilla/src/CallTip.h | 91 + .../src/scintilla/src/CellBuffer.cxx | 656 + .../src/scintilla/src/CellBuffer.h | 208 + .../src/scintilla/src/CharClassify.cxx | 78 + .../src/scintilla/src/CharClassify.h | 37 + .../src/scintilla/src/CharacterSet.h | 59 + .../src/scintilla/src/ContractionState.cxx | 251 + .../src/scintilla/src/ContractionState.h | 66 + .../src/scintilla/src/Decoration.cxx | 188 + .../src/scintilla/src/Decoration.h | 64 + .../src/scintilla/src/Document.cxx | 1920 ++ sdk/wxscintilla/src/scintilla/src/Document.h | 426 + .../src/scintilla/src/DocumentAccessor.cxx | 199 + .../src/scintilla/src/DocumentAccessor.h | 77 + sdk/wxscintilla/src/scintilla/src/Editor.cxx | 8708 +++++++ sdk/wxscintilla/src/scintilla/src/Editor.h | 590 + .../src/scintilla/src/ExternalLexer.cxx | 262 + .../src/scintilla/src/ExternalLexer.h | 104 + .../src/scintilla/src/FontQuality.h | 12 + .../src/scintilla/src/Indicator.cxx | 81 + sdk/wxscintilla/src/scintilla/src/Indicator.h | 32 + sdk/wxscintilla/src/scintilla/src/KeyMap.cxx | 152 + sdk/wxscintilla/src/scintilla/src/KeyMap.h | 51 + .../src/scintilla/src/KeyWords.cxx | 441 + sdk/wxscintilla/src/scintilla/src/LexAPDL.cxx | 256 + sdk/wxscintilla/src/scintilla/src/LexASY.cxx | 270 + sdk/wxscintilla/src/scintilla/src/LexAU3.cxx | 907 + sdk/wxscintilla/src/scintilla/src/LexAVE.cxx | 228 + .../src/scintilla/src/LexAbaqus.cxx | 617 + sdk/wxscintilla/src/scintilla/src/LexAda.cxx | 525 + .../src/scintilla/src/LexAltaRica.cxx | 412 + sdk/wxscintilla/src/scintilla/src/LexAsm.cxx | 180 + sdk/wxscintilla/src/scintilla/src/LexAsn1.cxx | 185 + sdk/wxscintilla/src/scintilla/src/LexBaan.cxx | 193 + sdk/wxscintilla/src/scintilla/src/LexBash.cxx | 521 + .../src/scintilla/src/LexBasic.cxx | 373 + .../src/scintilla/src/LexBullant.cxx | 229 + sdk/wxscintilla/src/scintilla/src/LexCLW.cxx | 679 + .../src/scintilla/src/LexCOBOL.cxx | 368 + sdk/wxscintilla/src/scintilla/src/LexCPP.cxx | 519 + sdk/wxscintilla/src/scintilla/src/LexCSS.cxx | 371 + sdk/wxscintilla/src/scintilla/src/LexCaml.cxx | 449 + .../src/scintilla/src/LexCmake.cxx | 457 + sdk/wxscintilla/src/scintilla/src/LexConf.cxx | 188 + .../src/scintilla/src/LexCppCheck.cxx | 119 + .../src/scintilla/src/LexCrontab.cxx | 222 + .../src/scintilla/src/LexCsound.cxx | 210 + sdk/wxscintilla/src/scintilla/src/LexD.cxx | 399 + .../src/scintilla/src/LexEScript.cxx | 273 + .../src/scintilla/src/LexEiffel.cxx | 238 + .../src/scintilla/src/LexErlang.cxx | 619 + sdk/wxscintilla/src/scintilla/src/LexFIF.cxx | 130 + .../src/scintilla/src/LexFlagship.cxx | 352 + .../src/scintilla/src/LexForth.cxx | 176 + .../src/scintilla/src/LexFortran.cxx | 466 + sdk/wxscintilla/src/scintilla/src/LexGAP.cxx | 263 + sdk/wxscintilla/src/scintilla/src/LexGCC.cxx | 119 + sdk/wxscintilla/src/scintilla/src/LexGen.py | 287 + .../src/scintilla/src/LexGui4Cli.cxx | 313 + sdk/wxscintilla/src/scintilla/src/LexHTML.cxx | 2131 ++ .../src/scintilla/src/LexHaskell.cxx | 275 + sdk/wxscintilla/src/scintilla/src/LexInno.cxx | 279 + sdk/wxscintilla/src/scintilla/src/LexKix.cxx | 126 + sdk/wxscintilla/src/scintilla/src/LexLisp.cxx | 282 + sdk/wxscintilla/src/scintilla/src/LexLout.cxx | 212 + sdk/wxscintilla/src/scintilla/src/LexLua.cxx | 358 + .../src/scintilla/src/LexMMIXAL.cxx | 186 + sdk/wxscintilla/src/scintilla/src/LexMPT.cxx | 188 + .../src/scintilla/src/LexMSSQL.cxx | 363 + .../src/scintilla/src/LexMagik.cxx | 445 + .../src/scintilla/src/LexMarkdown.cxx | 412 + .../src/scintilla/src/LexMatlab.cxx | 236 + .../src/scintilla/src/LexMetapost.cxx | 399 + .../src/scintilla/src/LexMySQL.cxx | 518 + .../src/scintilla/src/LexNimrod.cxx | 430 + sdk/wxscintilla/src/scintilla/src/LexNsis.cxx | 655 + sdk/wxscintilla/src/scintilla/src/LexOpal.cxx | 522 + .../src/scintilla/src/LexOthers.cxx | 1286 + sdk/wxscintilla/src/scintilla/src/LexPB.cxx | 362 + sdk/wxscintilla/src/scintilla/src/LexPLM.cxx | 198 + sdk/wxscintilla/src/scintilla/src/LexPOV.cxx | 316 + sdk/wxscintilla/src/scintilla/src/LexPS.cxx | 347 + .../src/scintilla/src/LexPascal.cxx | 592 + sdk/wxscintilla/src/scintilla/src/LexPerl.cxx | 1305 + .../src/scintilla/src/LexPowerPro.cxx | 600 + .../src/scintilla/src/LexPowerShell.cxx | 175 + .../src/scintilla/src/LexPrism.cxx | 342 + .../src/scintilla/src/LexProgress.cxx | 279 + .../src/scintilla/src/LexPython.cxx | 569 + sdk/wxscintilla/src/scintilla/src/LexR.cxx | 213 + .../src/scintilla/src/LexRebol.cxx | 322 + sdk/wxscintilla/src/scintilla/src/LexRuby.cxx | 1715 ++ sdk/wxscintilla/src/scintilla/src/LexSML.cxx | 221 + sdk/wxscintilla/src/scintilla/src/LexSQL.cxx | 357 + sdk/wxscintilla/src/scintilla/src/LexSVN.cxx | 117 + .../src/scintilla/src/LexScriptol.cxx | 408 + .../src/scintilla/src/LexSmalltalk.cxx | 321 + .../src/scintilla/src/LexSorcus.cxx | 205 + .../src/scintilla/src/LexSpecman.cxx | 289 + .../src/scintilla/src/LexSpice.cxx | 226 + sdk/wxscintilla/src/scintilla/src/LexTACL.cxx | 397 + .../src/scintilla/src/LexTADS3.cxx | 904 + sdk/wxscintilla/src/scintilla/src/LexTAL.cxx | 396 + sdk/wxscintilla/src/scintilla/src/LexTCL.cxx | 366 + sdk/wxscintilla/src/scintilla/src/LexTeX.cxx | 494 + sdk/wxscintilla/src/scintilla/src/LexVB.cxx | 316 + sdk/wxscintilla/src/scintilla/src/LexVHDL.cxx | 476 + .../src/scintilla/src/LexVerilog.cxx | 330 + sdk/wxscintilla/src/scintilla/src/LexYAML.cxx | 314 + .../src/scintilla/src/LineMarker.cxx | 533 + .../src/scintilla/src/LineMarker.h | 62 + .../src/scintilla/src/Partitioning.h | 184 + sdk/wxscintilla/src/scintilla/src/PerLine.cxx | 486 + sdk/wxscintilla/src/scintilla/src/PerLine.h | 120 + .../src/scintilla/src/PositionCache.cxx | 659 + .../src/scintilla/src/PositionCache.h | 168 + sdk/wxscintilla/src/scintilla/src/PropSet.cxx | 176 + .../src/scintilla/src/PropSetSimple.h | 33 + .../src/scintilla/src/RESearch.cxx | 987 + sdk/wxscintilla/src/scintilla/src/RESearch.h | 75 + .../src/scintilla/src/RunStyles.cxx | 216 + sdk/wxscintilla/src/scintilla/src/RunStyles.h | 46 + sdk/wxscintilla/src/scintilla/src/SVector.h | 123 + .../src/scintilla/src/SciTE.properties | 6 + .../src/scintilla/src/ScintillaBase.cxx | 807 + .../src/scintilla/src/ScintillaBase.h | 101 + .../src/scintilla/src/Selection.cxx | 366 + sdk/wxscintilla/src/scintilla/src/Selection.h | 187 + .../src/scintilla/src/SplitVector.h | 249 + sdk/wxscintilla/src/scintilla/src/Style.cxx | 165 + sdk/wxscintilla/src/scintilla/src/Style.h | 64 + .../src/scintilla/src/StyleContext.cxx | 55 + .../src/scintilla/src/StyleContext.h | 177 + .../src/scintilla/src/UniConversion.cxx | 185 + .../src/scintilla/src/UniConversion.h | 18 + .../src/scintilla/src/ViewStyle.cxx | 389 + sdk/wxscintilla/src/scintilla/src/ViewStyle.h | 135 + .../src/scintilla/src/WindowAccessor.cxx | 191 + sdk/wxscintilla/src/scintilla/src/XPM.cxx | 326 + sdk/wxscintilla/src/scintilla/src/XPM.h | 80 + sdk/wxscintilla/src/wxscintilla.cpp | 3532 +++ sdk/wxshapeframework/CMakeLists.txt | 24 + .../include/wx/wxsf/ArrowBase.h | 85 + .../include/wx/wxsf/BitmapShape.h | 163 + .../include/wx/wxsf/CanvasHistory.h | 136 + .../include/wx/wxsf/CanvasState.h | 62 + .../include/wx/wxsf/CircleArrow.h | 72 + .../include/wx/wxsf/CircleShape.h | 84 + .../include/wx/wxsf/CommonFcn.h | 45 + .../include/wx/wxsf/ControlShape.h | 311 + .../include/wx/wxsf/CurveShape.h | 82 + sdk/wxshapeframework/include/wx/wxsf/Defs.h | 21 + .../include/wx/wxsf/DiagramManager.h | 345 + .../include/wx/wxsf/DiamondArrow.h | 51 + .../include/wx/wxsf/DiamondShape.h | 51 + .../include/wx/wxsf/EditTextShape.h | 204 + .../include/wx/wxsf/EllipseShape.h | 87 + .../include/wx/wxsf/FixedRectShape.h | 62 + .../include/wx/wxsf/FlexGridShape.h | 64 + .../include/wx/wxsf/GridShape.h | 189 + .../include/wx/wxsf/LineShape.h | 411 + .../include/wx/wxsf/MultiSelRect.h | 87 + .../include/wx/wxsf/OpenArrow.h | 68 + .../include/wx/wxsf/OrthoShape.h | 92 + .../include/wx/wxsf/PolygonShape.h | 190 + .../include/wx/wxsf/Printout.h | 62 + .../include/wx/wxsf/RectShape.h | 211 + .../include/wx/wxsf/RoundRectShape.h | 116 + .../include/wx/wxsf/SFEvents.h | 673 + .../include/wx/wxsf/ScaledDC.h | 700 + .../include/wx/wxsf/ShapeBase.h | 1099 + .../include/wx/wxsf/ShapeCanvas.h | 1196 + .../include/wx/wxsf/ShapeDataObject.h | 67 + .../include/wx/wxsf/ShapeHandle.h | 199 + .../include/wx/wxsf/SolidArrow.h | 85 + .../include/wx/wxsf/TextShape.h | 196 + .../include/wx/wxsf/Thumbnail.h | 120 + .../include/wx/wxsf/wxShapeFramework.h | 59 + .../include/wx/wxxmlserializer/Defs.h | 21 + .../include/wx/wxxmlserializer/PropertyIO.h | 321 + .../wx/wxxmlserializer/XmlSerializer.h | 1143 + sdk/wxshapeframework/src/ArrowBase.cpp | 80 + sdk/wxshapeframework/src/BitmapShape.cpp | 269 + sdk/wxshapeframework/src/BitmapShapeXml.cpp | 59 + sdk/wxshapeframework/src/CanvasHistory.cpp | 176 + sdk/wxshapeframework/src/CanvasState.cpp | 83 + sdk/wxshapeframework/src/CircleArrow.cpp | 66 + sdk/wxshapeframework/src/CircleShape.cpp | 138 + sdk/wxshapeframework/src/CommonFcn.cpp | 117 + sdk/wxshapeframework/src/ControlShape.cpp | 404 + sdk/wxshapeframework/src/CurveShape.cpp | 283 + sdk/wxshapeframework/src/DiagramManager.cpp | 827 + sdk/wxshapeframework/src/DiamondArrow.cpp | 58 + sdk/wxshapeframework/src/DiamondShape.cpp | 78 + sdk/wxshapeframework/src/EditTextShape.cpp | 290 + sdk/wxshapeframework/src/EllipseShape.cpp | 138 + sdk/wxshapeframework/src/FixedRectShape.cpp | 160 + sdk/wxshapeframework/src/FlexGridShape.cpp | 114 + sdk/wxshapeframework/src/GUI.fbp | 171 + sdk/wxshapeframework/src/GridShape.cpp | 389 + sdk/wxshapeframework/src/LineShape.cpp | 927 + sdk/wxshapeframework/src/MultiSelRect.cpp | 350 + sdk/wxshapeframework/src/OpenArrow.cpp | 69 + sdk/wxshapeframework/src/OrthoShape.cpp | 295 + sdk/wxshapeframework/src/PolygonShape.cpp | 322 + sdk/wxshapeframework/src/PolygonShapeXml.cpp | 44 + sdk/wxshapeframework/src/Printout.cpp | 195 + sdk/wxshapeframework/src/RectShape.cpp | 365 + sdk/wxshapeframework/src/RoundRectShape.cpp | 136 + sdk/wxshapeframework/src/SFEvents.cpp | 231 + sdk/wxshapeframework/src/ScaledDC.cpp | 683 + sdk/wxshapeframework/src/ShapeBase.cpp | 1537 ++ sdk/wxshapeframework/src/ShapeBaseXml.cpp | 50 + sdk/wxshapeframework/src/ShapeCanvas.cpp | 3284 +++ sdk/wxshapeframework/src/ShapeDataObject.cpp | 92 + sdk/wxshapeframework/src/ShapeHandle.cpp | 318 + sdk/wxshapeframework/src/SolidArrow.cpp | 80 + sdk/wxshapeframework/src/TextShape.cpp | 390 + sdk/wxshapeframework/src/TextShapeXml.cpp | 45 + sdk/wxshapeframework/src/Thumbnail.cpp | 256 + sdk/wxshapeframework/src/premake.lua | 60 + sdk/wxshapeframework/src/res/NoSource.xpm | 69 + sdk/wxshapeframework/src/wxSF.rc | 17 + sdk/wxshapeframework/src/wx_pch.cpp | 1 + sdk/wxshapeframework/src/wx_pch.h | 44 + .../src/wxxmlserializer/PropertyIO.cpp | 1318 + .../src/wxxmlserializer/XmlSerializer.cpp | 1012 + src/CMakeFiles/progress.marks | 1 + src/CMakeLists.txt | 45 + src/algebra/ScalarBackend.hh | 230 + src/algebra/UblasBackend.hh | 844 + src/algebra/details/UblasBackendImpl.hh | 3472 +++ src/commons/Exception.cc | 254 + src/commons/Exception.hh | 155 + src/console/CMakeLists.txt | 70 + src/console/ParsingDriverConsoleReporter.cc | 42 + src/console/ParsingDriverConsoleReporter.hh | 42 + src/console/bddepochmain.cc | 200 + src/console/epochconsolealtarica.cc | 316 + src/console/epochconsolealtarica.hh | 106 + src/console/epochmain.cc | 146 + src/console/iaepochmain.cc | 233 + src/console/symepochmain.cc | 211 + src/grammars/CMakeLists.txt | 21 + src/grammars/altarica/AltaricaException.cc | 52 + src/grammars/altarica/AltaricaException.hh | 60 + src/grammars/altarica/AltaricaGenerator.cc | 90 + src/grammars/altarica/AltaricaGenerator.hh | 96 + src/grammars/altarica/AltaricaInitInfo.cc | 164 + src/grammars/altarica/AltaricaInitInfo.hh | 66 + src/grammars/altarica/AltaricaInitInfoXML.cc | 278 + src/grammars/altarica/AltaricaInitInfoXML.hh | 66 + src/grammars/altarica/AltaricaInitInfoXML2.cc | 174 + src/grammars/altarica/AltaricaInitInfoXML2.hh | 64 + src/grammars/altarica/AltaricaInteractive.cc | 72 + src/grammars/altarica/AltaricaInteractive.hh | 42 + src/grammars/altarica/AltaricaJson.cc | 370 + src/grammars/altarica/AltaricaJson.hh | 79 + src/grammars/altarica/AltaricaModel.cc | 1369 ++ src/grammars/altarica/AltaricaModel.hh | 353 + src/grammars/altarica/AltaricaState.cc | 409 + src/grammars/altarica/AltaricaState.hh | 109 + src/grammars/altarica/Assertion.cc | 77 + src/grammars/altarica/Assertion.hh | 77 + src/grammars/altarica/Assignment.cc | 80 + src/grammars/altarica/Assignment.hh | 82 + src/grammars/altarica/CMakeLists.txt | 99 + src/grammars/altarica/Constant.cc | 80 + src/grammars/altarica/Constant.hh | 79 + src/grammars/altarica/Event.cc | 262 + src/grammars/altarica/Event.hh | 121 + src/grammars/altarica/EventLaw.cc | 119 + src/grammars/altarica/EventLaw.hh | 111 + src/grammars/altarica/FiacreTranslator.cc | 709 + src/grammars/altarica/FiacreTranslator.hh | 110 + src/grammars/altarica/LandmarkDriver.cc | 110 + src/grammars/altarica/LandmarkDriver.hh | 54 + src/grammars/altarica/LandmarkMetaEvent.cc | 104 + src/grammars/altarica/LandmarkMetaEvent.hh | 65 + src/grammars/altarica/LandmarkState.cc | 269 + src/grammars/altarica/LandmarkState.hh | 95 + src/grammars/altarica/MemberAccess.cc | 458 + src/grammars/altarica/MemberAccess.hh | 135 + src/grammars/altarica/MetaEvent.cc | 292 + src/grammars/altarica/MetaEvent.hh | 89 + src/grammars/altarica/Node.cc | 836 + src/grammars/altarica/Node.hh | 206 + src/grammars/altarica/Parameter.cc | 62 + src/grammars/altarica/Parameter.hh | 65 + src/grammars/altarica/Synchronisation.cc | 276 + src/grammars/altarica/Synchronisation.hh | 88 + src/grammars/altarica/Transition.cc | 194 + src/grammars/altarica/Transition.hh | 106 + src/grammars/altarica/Values.hh | 33 + src/grammars/altarica/Variable.cc | 529 + src/grammars/altarica/Variable.hh | 182 + src/grammars/altarica/altarica.l | 202 + src/grammars/altarica/altarica.yy | 2303 ++ src/grammars/altarica/altarica_driver.cc | 58 + src/grammars/altarica/altarica_driver.hh | 77 + .../altarica/details/AltaricaGeneratorImpl.hh | 56 + src/grammars/altarica/domains/ArrayDomain.cc | 100 + src/grammars/altarica/domains/ArrayDomain.hh | 70 + .../altarica/domains/ContinuousDomain.hh | 44 + .../altarica/domains/DiscreteDomain.hh | 55 + src/grammars/altarica/domains/Domain.cc | 73 + src/grammars/altarica/domains/Domain.hh | 63 + src/grammars/altarica/domains/Domains.hh | 35 + src/grammars/altarica/domains/EnumDomain.cc | 153 + src/grammars/altarica/domains/EnumDomain.hh | 63 + .../altarica/domains/PredefinedDomain.cc | 146 + .../altarica/domains/PredefinedDomain.hh | 59 + src/grammars/altarica/domains/RangeDomain.cc | 85 + src/grammars/altarica/domains/RangeDomain.hh | 55 + src/grammars/altarica/domains/RealDomain.cc | 79 + src/grammars/altarica/domains/RealDomain.hh | 59 + .../altarica/domains/StructuredDomain.cc | 122 + .../altarica/domains/StructuredDomain.hh | 75 + .../altarica/expressions/EvaluationVisitor.hh | 70 + .../altarica/expressions/Expression.cc | 56 + .../altarica/expressions/Expression.hh | 73 + .../altarica/expressions/ExpressionADD.cc | 85 + .../altarica/expressions/ExpressionADD.hh | 76 + .../altarica/expressions/ExpressionAND.cc | 54 + .../altarica/expressions/ExpressionAND.hh | 71 + .../altarica/expressions/ExpressionARITH.cc | 91 + .../altarica/expressions/ExpressionARITH.hh | 80 + .../altarica/expressions/ExpressionATOMIC.hh | 61 + .../expressions/ExpressionBOOLCONSTANT.cc | 47 + .../expressions/ExpressionBOOLCONSTANT.hh | 70 + .../altarica/expressions/ExpressionCARD.cc | 70 + .../altarica/expressions/ExpressionCARD.hh | 66 + .../altarica/expressions/ExpressionCASE.cc | 144 + .../altarica/expressions/ExpressionCASE.hh | 74 + .../expressions/ExpressionCONSTARRAY.cc | 68 + .../expressions/ExpressionCONSTARRAY.hh | 64 + .../expressions/ExpressionCONSTSTRUCT.cc | 97 + .../expressions/ExpressionCONSTSTRUCT.hh | 73 + .../expressions/ExpressionEvaluator.cc | 928 + .../expressions/ExpressionEvaluator.hh | 84 + .../ExpressionEvaluatorLandmark.cc | 1215 + .../ExpressionEvaluatorLandmark.hh | 88 + .../expressions/ExpressionFUNCTIONCALL.cc | 69 + .../expressions/ExpressionFUNCTIONCALL.hh | 70 + .../expressions/ExpressionINTERVAL.cc | 71 + .../expressions/ExpressionINTERVAL.hh | 73 + .../expressions/ExpressionIfThenElse.cc | 76 + .../expressions/ExpressionIfThenElse.hh | 71 + .../altarica/expressions/ExpressionInfoVar.cc | 180 + .../altarica/expressions/ExpressionInfoVar.hh | 86 + .../altarica/expressions/ExpressionLOG.cc | 147 + .../altarica/expressions/ExpressionLOG.hh | 79 + .../altarica/expressions/ExpressionMEMBER.cc | 190 + .../altarica/expressions/ExpressionMEMBER.hh | 84 + .../altarica/expressions/ExpressionMINMAX.cc | 78 + .../altarica/expressions/ExpressionMINMAX.hh | 71 + .../altarica/expressions/ExpressionMUL.cc | 84 + .../altarica/expressions/ExpressionMUL.hh | 78 + .../altarica/expressions/ExpressionOR.cc | 54 + .../altarica/expressions/ExpressionOR.hh | 71 + .../altarica/expressions/ExpressionPAREN.cc | 51 + .../altarica/expressions/ExpressionPAREN.hh | 66 + .../expressions/ExpressionQUANTIFIED.cc | 84 + .../expressions/ExpressionQUANTIFIED.hh | 78 + .../altarica/expressions/ExpressionREAL.cc | 64 + .../altarica/expressions/ExpressionREAL.hh | 70 + .../altarica/expressions/ExpressionUNARY.cc | 77 + .../altarica/expressions/ExpressionUNARY.hh | 74 + .../expressions/ExpressionUNSIGNEDINT.cc | 54 + .../expressions/ExpressionUNSIGNEDINT.hh | 72 + .../altarica/expressions/Expressions.hh | 55 + src/grammars/altarica/expressions/Visitor.hh | 90 + src/grammars/altarica/parser_helper.cc | 53 + src/grammars/altarica/parser_helper.hh | 72 + src/grammars/altarica/values/Value.cc | 166 + src/grammars/altarica/values/Value.hh | 177 + src/grammars/altarica/values/ValueBool.cc | 206 + src/grammars/altarica/values/ValueBool.hh | 97 + src/grammars/altarica/values/ValueInt.cc | 578 + src/grammars/altarica/values/ValueInt.hh | 133 + src/grammars/altarica/values/ValueReal.cc | 436 + src/grammars/altarica/values/ValueReal.hh | 140 + src/grammars/altarica/values/ValueSymbol.cc | 297 + src/grammars/altarica/values/ValueSymbol.hh | 107 + src/grammars/details/parsingdriverbaseimpl.hh | 102 + src/grammars/parsingdriverbase.hh | 204 + utils/altarica-mode.el | 146 + 1011 files changed, 345688 insertions(+), 10 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 CeCILL-C.txt delete mode 100644 Copyright create mode 100644 LGPL-v2.txt create mode 100644 LICENSES.md create mode 100644 README.md create mode 100644 TODO create mode 100644 config/FindGlib.cmake create mode 100644 config/FindGlibmm.cmake create mode 100644 config/FindLibXML++.cmake create mode 100644 config/FindLibXML2.cmake create mode 100644 config/FindPLplot.cmake create mode 100644 config/FindSigC++.cmake create mode 100644 config/FindUMFPACK.cmake create mode 100644 config/FindwxWidgetsCustom.cmake create mode 100644 config/LibFindMacros.cmake create mode 100644 doc/CMakeLists.txt create mode 100644 doc/Doxyfile.cmake create mode 100644 doc/Rapport post-doc/1-introduction.tex create mode 100644 doc/Rapport post-doc/2-motivation.tex create mode 100644 doc/Rapport post-doc/2-sota.tex create mode 100644 doc/Rapport post-doc/3-imbsa.tex create mode 100644 doc/Rapport post-doc/4-aocs.tex create mode 100644 doc/Rapport post-doc/5-conclusions.tex create mode 100644 doc/Rapport post-doc/IMBSA-paper.tex create mode 100644 doc/Rapport post-doc/algos/function.fcr create mode 100644 doc/Rapport post-doc/algos/function2.alt create mode 100644 doc/Rapport post-doc/algos/function2.fcr create mode 100644 doc/Rapport post-doc/algos/pre.alt create mode 100644 doc/Rapport post-doc/algos/pre.fcr create mode 100644 doc/Rapport post-doc/algos/pre2.fcr create mode 100644 doc/Rapport post-doc/aliascnt.sty create mode 100644 doc/Rapport post-doc/altarica-diagrams.tex create mode 100644 doc/Rapport post-doc/altarica-function.tex create mode 100644 doc/Rapport post-doc/app.tex create mode 100644 doc/Rapport post-doc/dirtytalk.sty create mode 100644 doc/Rapport post-doc/etgts.tex create mode 100644 doc/Rapport post-doc/figures/0- AOCS mode Abstract.png create mode 100644 doc/Rapport post-doc/figures/2-2 - AOCS mode automaton.png create mode 100644 doc/Rapport post-doc/figures/2-3 - ASH mode.png create mode 100644 doc/Rapport post-doc/figures/2-4 set ON the equipment for ASM mode.png create mode 100644 doc/Rapport post-doc/figures/2-5 ACM automaton.png create mode 100644 doc/Rapport post-doc/figures/2-6 set ON the equipment for ACM mode.png create mode 100644 doc/Rapport post-doc/figures/2-7 Collision Avoidance Mode.png create mode 100644 doc/Rapport post-doc/figures/2-8 OCM automaton.png create mode 100644 doc/Rapport post-doc/figures/2-9 Formation Control Mode.png create mode 100644 doc/Rapport post-doc/figures/AOCS mode.png create mode 100644 doc/Rapport post-doc/figures/AOCSmode_schema.png create mode 100644 doc/Rapport post-doc/figures/AirSpeed_Computation.jpg create mode 100644 doc/Rapport post-doc/figures/ERTS - AOCS mode.png create mode 100644 doc/Rapport post-doc/figures/EUTELSAT-172B-SATELLITE.jpg create mode 100644 doc/Rapport post-doc/figures/Equipment Mode.png create mode 100644 doc/Rapport post-doc/figures/Function2_1.pdf create mode 100644 doc/Rapport post-doc/figures/Function2_1.png create mode 100644 doc/Rapport post-doc/figures/Function2_1.svg create mode 100644 doc/Rapport post-doc/figures/Function2_1.tex create mode 100644 doc/Rapport post-doc/figures/Function2_2.pdf create mode 100644 doc/Rapport post-doc/figures/Function2_2.png create mode 100644 doc/Rapport post-doc/figures/Function2_2.svg create mode 100644 doc/Rapport post-doc/figures/Gnc mode simplifie.png create mode 100644 doc/Rapport post-doc/figures/Modele0.png create mode 100644 doc/Rapport post-doc/figures/Modele0F4.png create mode 100644 doc/Rapport post-doc/figures/Modele1.png create mode 100644 doc/Rapport post-doc/figures/Modele2.png create mode 100644 doc/Rapport post-doc/figures/passerelle.png create mode 100644 doc/Rapport post-doc/figures/satellite_telecom.png create mode 100644 doc/Rapport post-doc/figures/space_systems_2.jpg create mode 100644 doc/Rapport post-doc/figures/table1.png create mode 100644 doc/Rapport post-doc/figures/texput.log create mode 100644 doc/Rapport post-doc/llncsdoc.sty create mode 100644 doc/Rapport post-doc/longabstract.tex create mode 100644 doc/Rapport post-doc/lstlang3.sty create mode 100644 doc/Rapport post-doc/main.tex create mode 100644 doc/Rapport post-doc/main.toc create mode 100644 doc/Rapport post-doc/paper.bib create mode 100644 doc/Rapport post-doc/readme.txt create mode 100644 doc/Rapport post-doc/remreset.sty create mode 100644 doc/Rapport post-doc/splncs03.bst create mode 100644 doc/Rapport post-doc/sprmindx.sty create mode 100644 doc/Rapport post-doc/subjidx.ind create mode 100644 doc/Rapport post-doc/tina.bib create mode 100644 doc/TODO create mode 100644 doc/altarica-syntax.pdf create mode 100644 doc/boundedcont.pdf create mode 100644 doc/cont.pdf create mode 100644 doc/quickstart.aux create mode 100644 doc/quickstart.log create mode 100644 doc/quickstart.pdf create mode 100644 doc/quickstart.tex create mode 100644 icons/document-build-model-16.xpm create mode 100644 icons/document-build-model-24.xpm create mode 100644 icons/document-switch-mode-16.xpm create mode 100644 icons/document-switch-mode-24.xpm create mode 100644 sdk/CMakeLists.txt create mode 100644 sdk/boost/numeric/bindings/addressing_index.hpp create mode 100644 sdk/boost/numeric/bindings/at.hpp create mode 100644 sdk/boost/numeric/bindings/bandwidth.hpp create mode 100644 sdk/boost/numeric/bindings/begin.hpp create mode 100644 sdk/boost/numeric/bindings/blas.hpp create mode 100644 sdk/boost/numeric/bindings/blas/detail/blas.h create mode 100644 sdk/boost/numeric/bindings/blas/detail/blas_names.h create mode 100644 sdk/boost/numeric/bindings/blas/detail/blas_option.hpp create mode 100644 sdk/boost/numeric/bindings/blas/detail/cblas.h create mode 100644 sdk/boost/numeric/bindings/blas/detail/cblas_option.hpp create mode 100644 sdk/boost/numeric/bindings/blas/detail/cublas.h create mode 100644 sdk/boost/numeric/bindings/blas/detail/default_order.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/asum.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/axpy.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/copy.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/dot.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/dotc.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/dotu.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/iamax.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/nrm2.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/prec_dot.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/rot.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/rotg.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/rotm.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/rotmg.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/scal.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/set.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level1/swap.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/gbmv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/gemv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/ger.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/gerc.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/geru.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/hbmv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/hemv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/her.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/her2.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/hpmv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/hpr.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/hpr2.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/sbmv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/spmv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/spr.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/spr2.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/symv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/syr.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/syr2.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/tbmv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/tbsv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/tpmv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/tpsv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/trmv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level2/trsv.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level3.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level3/gemm.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level3/hemm.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level3/her2k.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level3/herk.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level3/symm.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level3/syr2k.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level3/syrk.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level3/trmm.hpp create mode 100644 sdk/boost/numeric/bindings/blas/level3/trsm.hpp create mode 100644 sdk/boost/numeric/bindings/boost/array.hpp create mode 100644 sdk/boost/numeric/bindings/boost/multi_array.hpp create mode 100644 sdk/boost/numeric/bindings/column.hpp create mode 100644 sdk/boost/numeric/bindings/conj.hpp create mode 100644 sdk/boost/numeric/bindings/data_order.hpp create mode 100644 sdk/boost/numeric/bindings/data_side.hpp create mode 100644 sdk/boost/numeric/bindings/detail/adaptable_type.hpp create mode 100644 sdk/boost/numeric/bindings/detail/adaptor.hpp create mode 100644 sdk/boost/numeric/bindings/detail/array.hpp create mode 100644 sdk/boost/numeric/bindings/detail/basic_unwrapper.hpp create mode 100644 sdk/boost/numeric/bindings/detail/basic_wrapper.hpp create mode 100644 sdk/boost/numeric/bindings/detail/complex_utils.hpp create mode 100644 sdk/boost/numeric/bindings/detail/config/fortran.hpp create mode 100644 sdk/boost/numeric/bindings/detail/convert_to.hpp create mode 100644 sdk/boost/numeric/bindings/detail/copy_const.hpp create mode 100644 sdk/boost/numeric/bindings/detail/generate_functions.hpp create mode 100644 sdk/boost/numeric/bindings/detail/get.hpp create mode 100644 sdk/boost/numeric/bindings/detail/if_left.hpp create mode 100644 sdk/boost/numeric/bindings/detail/if_row_major.hpp create mode 100644 sdk/boost/numeric/bindings/detail/linear_iterator.hpp create mode 100644 sdk/boost/numeric/bindings/detail/offset.hpp create mode 100644 sdk/boost/numeric/bindings/detail/pod.hpp create mode 100644 sdk/boost/numeric/bindings/detail/property_map.hpp create mode 100644 sdk/boost/numeric/bindings/diag_tag.hpp create mode 100644 sdk/boost/numeric/bindings/eigen/matrix.hpp create mode 100644 sdk/boost/numeric/bindings/eigen/sparsematrix.hpp create mode 100644 sdk/boost/numeric/bindings/end.hpp create mode 100644 sdk/boost/numeric/bindings/glas/compressed.hpp create mode 100644 sdk/boost/numeric/bindings/glas/dense_matrix.hpp create mode 100644 sdk/boost/numeric/bindings/glas/dense_vector.hpp create mode 100644 sdk/boost/numeric/bindings/glas/dense_vector_collection.hpp create mode 100644 sdk/boost/numeric/bindings/glas/detail/convert_to.hpp create mode 100644 sdk/boost/numeric/bindings/has_band_array.hpp create mode 100644 sdk/boost/numeric/bindings/has_linear_array.hpp create mode 100644 sdk/boost/numeric/bindings/has_rank.hpp create mode 100644 sdk/boost/numeric/bindings/has_static_size.hpp create mode 100644 sdk/boost/numeric/bindings/has_static_stride.hpp create mode 100644 sdk/boost/numeric/bindings/has_triangular_array.hpp create mode 100644 sdk/boost/numeric/bindings/herm.hpp create mode 100644 sdk/boost/numeric/bindings/index_base.hpp create mode 100644 sdk/boost/numeric/bindings/io.hpp create mode 100644 sdk/boost/numeric/bindings/is_column_major.hpp create mode 100644 sdk/boost/numeric/bindings/is_complex.hpp create mode 100644 sdk/boost/numeric/bindings/is_mutable.hpp create mode 100644 sdk/boost/numeric/bindings/is_numeric.hpp create mode 100644 sdk/boost/numeric/bindings/is_real.hpp create mode 100644 sdk/boost/numeric/bindings/is_row_major.hpp create mode 100644 sdk/boost/numeric/bindings/is_symmetric.hpp create mode 100644 sdk/boost/numeric/bindings/lapack.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/ilaenv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/labrd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lacgv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lacon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/laebz.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lalsd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/langb.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lange.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lanhb.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lanhe.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lanhp.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lanhs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lansb.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lansp.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lansy.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lantb.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lantp.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/lantr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/larf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/larfb.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/larfg.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/larft.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/larfx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/largv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/larnv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/larrb.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/larre.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/larz.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/latrd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/latrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/auxiliary/latrz.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/bdsdc.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/bdsqr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gbbrd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gbcon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gbequ.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gbrfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gbtrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gbtrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gebak.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gebal.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gebrd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gecon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/geequ.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gehrd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gelqf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/geqlf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/geqp3.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/geqrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gerfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gerqf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/getrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/getri.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/getrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ggbak.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ggbal.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gghrd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ggqrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ggrqf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ggsvp.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gtrfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/gttrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hbgst.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hbtrd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hecon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hegst.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/herfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hetrd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hetrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hetri.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hetrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hgeqz.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hpcon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hprfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hptrd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hptrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hptri.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hptrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hsein.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/hseqr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/opgtr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/opmtr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/orgbr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/orghr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/orglq.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/orgql.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/orgqr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/orgrq.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/orgtr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ormbr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ormhr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ormlq.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ormql.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ormqr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ormrq.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ormrz.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ormtr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pbcon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pbequ.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pbrfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pbstf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pbtrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pbtrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pftrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pftri.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pftrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pocon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/poequ.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/porfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/potrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/potri.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/potrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ppcon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ppequ.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pprfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pptrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pptri.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pptrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pstrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ptcon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pteqr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ptrfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pttrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/pttrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sbgst.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sbtrd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/spcon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sprfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sptrd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sptrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sptri.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sptrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/stebz.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/stedc.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/stegr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/stein.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/stemr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/steqr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sterf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sycon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sygst.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/syrfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sytrd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sytrf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sytri.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/sytrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tbcon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tbrfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tbtrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tftri.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tgevc.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tgexc.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tgsen.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tgsja.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tgsna.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tgsyl.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tpcon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tprfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tptri.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tptrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/trcon.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/trevc.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/trexc.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/trrfs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/trsen.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/trsna.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/trsyl.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/trtri.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/trtrs.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/tzrzf.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ungbr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/unghr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/unglq.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ungql.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ungqr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ungrq.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/ungtr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/unmbr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/unmhr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/unmlq.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/unmql.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/unmqr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/unmrq.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/unmrz.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/unmtr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/upgtr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/computational/upmtr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/detail/clapack.h create mode 100644 sdk/boost/numeric/bindings/lapack/detail/clapack_option.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/detail/lapack.h create mode 100644 sdk/boost/numeric/bindings/lapack/detail/lapack_names.h create mode 100644 sdk/boost/numeric/bindings/lapack/detail/lapack_option.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gbsv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gbsvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gees.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/geesx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/geev.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/geevx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gegv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gejsv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gels.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gelsd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gelss.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gelsy.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gesdd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gesv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gesvd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gesvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gges.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/ggesx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/ggev.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/ggevx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/ggglm.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gglse.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/ggsvd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gtsv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/gtsvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hbev.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hbevd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hbevx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hbgv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hbgvd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hbgvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/heev.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/heevd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/heevr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/heevx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hegv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hegvd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hegvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hesv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hesvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hpev.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hpevd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hpevx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hpgv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hpgvd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hpgvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hpsv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/hpsvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/iter_gesv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/iter_posv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/pbsv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/pbsvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/posv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/posvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/ppsv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/ppsvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/ptsv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/ptsvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/sbev.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/sbevd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/sbevx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/sbgv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/sbgvd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/sbgvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/spev.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/spevd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/spevx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/spgv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/spgvd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/spgvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/spsv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/spsvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/stev.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/stevd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/stevr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/stevx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/syev.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/syevd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/syevr.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/syevx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/sygv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/sygvd.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/sygvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/sysv.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/driver/sysvx.hpp create mode 100644 sdk/boost/numeric/bindings/lapack/workspace.hpp create mode 100644 sdk/boost/numeric/bindings/lower.hpp create mode 100644 sdk/boost/numeric/bindings/min_rank.hpp create mode 100644 sdk/boost/numeric/bindings/mtl/compressed2D.hpp create mode 100644 sdk/boost/numeric/bindings/mtl/dense2D.hpp create mode 100644 sdk/boost/numeric/bindings/mtl/dense_vector.hpp create mode 100644 sdk/boost/numeric/bindings/mtl/detail/convert_to.hpp create mode 100644 sdk/boost/numeric/bindings/mumps/4.6.4/cmumps_c.hpp create mode 100644 sdk/boost/numeric/bindings/mumps/4.6.4/dmumps_c.hpp create mode 100644 sdk/boost/numeric/bindings/mumps/4.6.4/smumps_c.hpp create mode 100644 sdk/boost/numeric/bindings/mumps/4.6.4/zmumps_c.hpp create mode 100644 sdk/boost/numeric/bindings/mumps/mumps_driver.hpp create mode 100644 sdk/boost/numeric/bindings/mumps/mumps_driver_4_6_4.hpp create mode 100644 sdk/boost/numeric/bindings/mumps/mumps_driver_4_8_0.hpp create mode 100644 sdk/boost/numeric/bindings/noop.hpp create mode 100644 sdk/boost/numeric/bindings/num_columns.hpp create mode 100644 sdk/boost/numeric/bindings/num_rows.hpp create mode 100644 sdk/boost/numeric/bindings/rank.hpp create mode 100644 sdk/boost/numeric/bindings/remove_imaginary.hpp create mode 100644 sdk/boost/numeric/bindings/row.hpp create mode 100644 sdk/boost/numeric/bindings/size.hpp create mode 100644 sdk/boost/numeric/bindings/std.hpp create mode 100644 sdk/boost/numeric/bindings/std/valarray.hpp create mode 100644 sdk/boost/numeric/bindings/std/vector.hpp create mode 100644 sdk/boost/numeric/bindings/stride.hpp create mode 100644 sdk/boost/numeric/bindings/symm.hpp create mode 100644 sdk/boost/numeric/bindings/tag.hpp create mode 100644 sdk/boost/numeric/bindings/traits/detail/utils.hpp create mode 100644 sdk/boost/numeric/bindings/traits/type.h create mode 100644 sdk/boost/numeric/bindings/traits/type.hpp create mode 100644 sdk/boost/numeric/bindings/traits/type_traits.hpp create mode 100644 sdk/boost/numeric/bindings/trans.hpp create mode 100644 sdk/boost/numeric/bindings/trans_tag.hpp create mode 100644 sdk/boost/numeric/bindings/ublas.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/banded.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/detail/basic_ublas_adaptor.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/detail/convert_to.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/hermitian.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/matrix.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/matrix_expression.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/matrix_proxy.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/matrix_sparse.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/scalar_vector.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/storage.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/symmetric.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/triangular.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/vector.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/vector_expression.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/vector_proxy.hpp create mode 100644 sdk/boost/numeric/bindings/ublas/vector_sparse.hpp create mode 100644 sdk/boost/numeric/bindings/umfpack/umfpack.hpp create mode 100644 sdk/boost/numeric/bindings/umfpack/umfpack_inc.hpp create mode 100644 sdk/boost/numeric/bindings/umfpack/umfpack_overloads.hpp create mode 100644 sdk/boost/numeric/bindings/unit_lower.hpp create mode 100644 sdk/boost/numeric/bindings/unit_upper.hpp create mode 100644 sdk/boost/numeric/bindings/uplo_tag.hpp create mode 100644 sdk/boost/numeric/bindings/upper.hpp create mode 100644 sdk/boost/numeric/bindings/value_type.hpp create mode 100644 sdk/boost/numeric/bindings/vector_view.hpp create mode 100644 sdk/boost/numeric/bindings/views.hpp create mode 100644 sdk/buddy-2.4/AUTHORS create mode 100644 sdk/buddy-2.4/CHANGES create mode 100644 sdk/buddy-2.4/CMakeLists.txt create mode 100644 sdk/buddy-2.4/ChangeLog create mode 100644 sdk/buddy-2.4/Makefile.am create mode 100644 sdk/buddy-2.4/Makefile.in create mode 100644 sdk/buddy-2.4/NEWS create mode 100644 sdk/buddy-2.4/README create mode 100644 sdk/buddy-2.4/aclocal.m4 create mode 100644 sdk/buddy-2.4/autom4te.cache/output.0 create mode 100644 sdk/buddy-2.4/autom4te.cache/requests create mode 100644 sdk/buddy-2.4/autom4te.cache/traces.0 create mode 100644 sdk/buddy-2.4/config.h.in create mode 100644 sdk/buddy-2.4/configure create mode 100644 sdk/buddy-2.4/configure.ac create mode 100644 sdk/buddy-2.4/include/bdd.h create mode 100644 sdk/buddy-2.4/include/bvec.h create mode 100644 sdk/buddy-2.4/include/fdd.h create mode 100644 sdk/buddy-2.4/libtool create mode 100644 sdk/buddy-2.4/m4/debug.m4 create mode 100644 sdk/buddy-2.4/src/Makefile.am create mode 100644 sdk/buddy-2.4/src/Makefile.in create mode 100644 sdk/buddy-2.4/src/bdd.h create mode 100644 sdk/buddy-2.4/src/bddio.c create mode 100644 sdk/buddy-2.4/src/bddop.c create mode 100644 sdk/buddy-2.4/src/bddtest.cxx create mode 100644 sdk/buddy-2.4/src/bddtree.h create mode 100644 sdk/buddy-2.4/src/buddy-2.4-stamp/buddy-2.4-done create mode 100644 sdk/buddy-2.4/src/bvec.c create mode 100644 sdk/buddy-2.4/src/bvec.h create mode 100644 sdk/buddy-2.4/src/cache.c create mode 100644 sdk/buddy-2.4/src/cache.h create mode 100644 sdk/buddy-2.4/src/cppext.cxx create mode 100644 sdk/buddy-2.4/src/fdd.c create mode 100644 sdk/buddy-2.4/src/fdd.h create mode 100644 sdk/buddy-2.4/src/imatrix.c create mode 100644 sdk/buddy-2.4/src/imatrix.h create mode 100644 sdk/buddy-2.4/src/kernel.c create mode 100644 sdk/buddy-2.4/src/kernel.h create mode 100644 sdk/buddy-2.4/src/libbdd.la create mode 100644 sdk/buddy-2.4/src/pairs.c create mode 100644 sdk/buddy-2.4/src/prime.c create mode 100644 sdk/buddy-2.4/src/prime.h create mode 100644 sdk/buddy-2.4/src/reorder.c create mode 100644 sdk/buddy-2.4/src/tree.c create mode 100644 sdk/buddy-2.4/stamp-h1 create mode 100644 sdk/buddy-2.4/tools/config.guess create mode 100644 sdk/buddy-2.4/tools/config.sub create mode 100644 sdk/buddy-2.4/tools/depcomp create mode 100644 sdk/buddy-2.4/tools/install-sh create mode 100644 sdk/buddy-2.4/tools/ltmain.sh create mode 100644 sdk/buddy-2.4/tools/missing create mode 100644 sdk/wxscintilla/CMakeLists.txt create mode 100644 sdk/wxscintilla/include/wx/wxscintilla.h create mode 100644 sdk/wxscintilla/src/PlatWX.cpp create mode 100644 sdk/wxscintilla/src/PlatWX.h create mode 100644 sdk/wxscintilla/src/ScintillaWX.cpp create mode 100644 sdk/wxscintilla/src/ScintillaWX.h create mode 100644 sdk/wxscintilla/src/gtkstring.h create mode 100644 sdk/wxscintilla/src/scintilla/License.txt create mode 100644 sdk/wxscintilla/src/scintilla/README.txt create mode 100644 sdk/wxscintilla/src/scintilla/include/Accessor.h create mode 100644 sdk/wxscintilla/src/scintilla/include/Face.py create mode 100644 sdk/wxscintilla/src/scintilla/include/HFacer.py create mode 100644 sdk/wxscintilla/src/scintilla/include/KeyWords.h create mode 100644 sdk/wxscintilla/src/scintilla/include/Platform.h create mode 100644 sdk/wxscintilla/src/scintilla/include/PropSet.h create mode 100644 sdk/wxscintilla/src/scintilla/include/SString.h create mode 100644 sdk/wxscintilla/src/scintilla/include/SciLexer.h create mode 100644 sdk/wxscintilla/src/scintilla/include/Scintilla.h create mode 100644 sdk/wxscintilla/src/scintilla/include/Scintilla.iface create mode 100644 sdk/wxscintilla/src/scintilla/include/ScintillaWidget.h create mode 100644 sdk/wxscintilla/src/scintilla/include/WindowAccessor.h create mode 100644 sdk/wxscintilla/src/scintilla/src/AutoComplete.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/AutoComplete.h create mode 100644 sdk/wxscintilla/src/scintilla/src/CallTip.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/CallTip.h create mode 100644 sdk/wxscintilla/src/scintilla/src/CellBuffer.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/CellBuffer.h create mode 100644 sdk/wxscintilla/src/scintilla/src/CharClassify.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/CharClassify.h create mode 100644 sdk/wxscintilla/src/scintilla/src/CharacterSet.h create mode 100644 sdk/wxscintilla/src/scintilla/src/ContractionState.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/ContractionState.h create mode 100644 sdk/wxscintilla/src/scintilla/src/Decoration.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/Decoration.h create mode 100644 sdk/wxscintilla/src/scintilla/src/Document.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/Document.h create mode 100644 sdk/wxscintilla/src/scintilla/src/DocumentAccessor.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/DocumentAccessor.h create mode 100644 sdk/wxscintilla/src/scintilla/src/Editor.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/Editor.h create mode 100644 sdk/wxscintilla/src/scintilla/src/ExternalLexer.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/ExternalLexer.h create mode 100644 sdk/wxscintilla/src/scintilla/src/FontQuality.h create mode 100644 sdk/wxscintilla/src/scintilla/src/Indicator.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/Indicator.h create mode 100644 sdk/wxscintilla/src/scintilla/src/KeyMap.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/KeyMap.h create mode 100644 sdk/wxscintilla/src/scintilla/src/KeyWords.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexAPDL.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexASY.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexAU3.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexAVE.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexAbaqus.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexAda.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexAltaRica.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexAsm.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexAsn1.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexBaan.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexBash.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexBasic.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexBullant.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexCLW.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexCOBOL.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexCPP.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexCSS.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexCaml.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexCmake.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexConf.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexCppCheck.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexCrontab.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexCsound.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexD.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexEScript.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexEiffel.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexErlang.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexFIF.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexFlagship.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexForth.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexFortran.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexGAP.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexGCC.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexGen.py create mode 100644 sdk/wxscintilla/src/scintilla/src/LexGui4Cli.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexHTML.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexHaskell.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexInno.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexKix.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexLisp.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexLout.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexLua.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexMMIXAL.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexMPT.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexMSSQL.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexMagik.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexMarkdown.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexMatlab.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexMetapost.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexMySQL.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexNimrod.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexNsis.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexOpal.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexOthers.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexPB.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexPLM.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexPOV.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexPS.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexPascal.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexPerl.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexPowerPro.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexPowerShell.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexPrism.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexProgress.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexPython.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexR.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexRebol.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexRuby.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexSML.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexSQL.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexSVN.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexScriptol.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexSmalltalk.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexSorcus.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexSpecman.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexSpice.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexTACL.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexTADS3.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexTAL.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexTCL.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexTeX.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexVB.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexVHDL.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexVerilog.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LexYAML.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LineMarker.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/LineMarker.h create mode 100644 sdk/wxscintilla/src/scintilla/src/Partitioning.h create mode 100644 sdk/wxscintilla/src/scintilla/src/PerLine.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/PerLine.h create mode 100644 sdk/wxscintilla/src/scintilla/src/PositionCache.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/PositionCache.h create mode 100644 sdk/wxscintilla/src/scintilla/src/PropSet.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/PropSetSimple.h create mode 100644 sdk/wxscintilla/src/scintilla/src/RESearch.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/RESearch.h create mode 100644 sdk/wxscintilla/src/scintilla/src/RunStyles.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/RunStyles.h create mode 100644 sdk/wxscintilla/src/scintilla/src/SVector.h create mode 100644 sdk/wxscintilla/src/scintilla/src/SciTE.properties create mode 100644 sdk/wxscintilla/src/scintilla/src/ScintillaBase.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/ScintillaBase.h create mode 100644 sdk/wxscintilla/src/scintilla/src/Selection.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/Selection.h create mode 100644 sdk/wxscintilla/src/scintilla/src/SplitVector.h create mode 100644 sdk/wxscintilla/src/scintilla/src/Style.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/Style.h create mode 100644 sdk/wxscintilla/src/scintilla/src/StyleContext.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/StyleContext.h create mode 100644 sdk/wxscintilla/src/scintilla/src/UniConversion.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/UniConversion.h create mode 100644 sdk/wxscintilla/src/scintilla/src/ViewStyle.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/ViewStyle.h create mode 100644 sdk/wxscintilla/src/scintilla/src/WindowAccessor.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/XPM.cxx create mode 100644 sdk/wxscintilla/src/scintilla/src/XPM.h create mode 100644 sdk/wxscintilla/src/wxscintilla.cpp create mode 100644 sdk/wxshapeframework/CMakeLists.txt create mode 100644 sdk/wxshapeframework/include/wx/wxsf/ArrowBase.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/BitmapShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/CanvasHistory.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/CanvasState.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/CircleArrow.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/CircleShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/CommonFcn.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/ControlShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/CurveShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/Defs.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/DiagramManager.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/DiamondArrow.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/DiamondShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/EditTextShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/EllipseShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/FixedRectShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/FlexGridShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/GridShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/LineShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/MultiSelRect.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/OpenArrow.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/OrthoShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/PolygonShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/Printout.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/RectShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/RoundRectShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/SFEvents.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/ScaledDC.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/ShapeBase.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/ShapeCanvas.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/ShapeDataObject.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/ShapeHandle.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/SolidArrow.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/TextShape.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/Thumbnail.h create mode 100644 sdk/wxshapeframework/include/wx/wxsf/wxShapeFramework.h create mode 100644 sdk/wxshapeframework/include/wx/wxxmlserializer/Defs.h create mode 100644 sdk/wxshapeframework/include/wx/wxxmlserializer/PropertyIO.h create mode 100644 sdk/wxshapeframework/include/wx/wxxmlserializer/XmlSerializer.h create mode 100644 sdk/wxshapeframework/src/ArrowBase.cpp create mode 100644 sdk/wxshapeframework/src/BitmapShape.cpp create mode 100644 sdk/wxshapeframework/src/BitmapShapeXml.cpp create mode 100644 sdk/wxshapeframework/src/CanvasHistory.cpp create mode 100644 sdk/wxshapeframework/src/CanvasState.cpp create mode 100644 sdk/wxshapeframework/src/CircleArrow.cpp create mode 100644 sdk/wxshapeframework/src/CircleShape.cpp create mode 100644 sdk/wxshapeframework/src/CommonFcn.cpp create mode 100644 sdk/wxshapeframework/src/ControlShape.cpp create mode 100644 sdk/wxshapeframework/src/CurveShape.cpp create mode 100644 sdk/wxshapeframework/src/DiagramManager.cpp create mode 100644 sdk/wxshapeframework/src/DiamondArrow.cpp create mode 100644 sdk/wxshapeframework/src/DiamondShape.cpp create mode 100644 sdk/wxshapeframework/src/EditTextShape.cpp create mode 100644 sdk/wxshapeframework/src/EllipseShape.cpp create mode 100644 sdk/wxshapeframework/src/FixedRectShape.cpp create mode 100644 sdk/wxshapeframework/src/FlexGridShape.cpp create mode 100644 sdk/wxshapeframework/src/GUI.fbp create mode 100644 sdk/wxshapeframework/src/GridShape.cpp create mode 100644 sdk/wxshapeframework/src/LineShape.cpp create mode 100644 sdk/wxshapeframework/src/MultiSelRect.cpp create mode 100644 sdk/wxshapeframework/src/OpenArrow.cpp create mode 100644 sdk/wxshapeframework/src/OrthoShape.cpp create mode 100644 sdk/wxshapeframework/src/PolygonShape.cpp create mode 100644 sdk/wxshapeframework/src/PolygonShapeXml.cpp create mode 100644 sdk/wxshapeframework/src/Printout.cpp create mode 100644 sdk/wxshapeframework/src/RectShape.cpp create mode 100644 sdk/wxshapeframework/src/RoundRectShape.cpp create mode 100644 sdk/wxshapeframework/src/SFEvents.cpp create mode 100644 sdk/wxshapeframework/src/ScaledDC.cpp create mode 100644 sdk/wxshapeframework/src/ShapeBase.cpp create mode 100644 sdk/wxshapeframework/src/ShapeBaseXml.cpp create mode 100644 sdk/wxshapeframework/src/ShapeCanvas.cpp create mode 100644 sdk/wxshapeframework/src/ShapeDataObject.cpp create mode 100644 sdk/wxshapeframework/src/ShapeHandle.cpp create mode 100644 sdk/wxshapeframework/src/SolidArrow.cpp create mode 100644 sdk/wxshapeframework/src/TextShape.cpp create mode 100644 sdk/wxshapeframework/src/TextShapeXml.cpp create mode 100644 sdk/wxshapeframework/src/Thumbnail.cpp create mode 100644 sdk/wxshapeframework/src/premake.lua create mode 100644 sdk/wxshapeframework/src/res/NoSource.xpm create mode 100644 sdk/wxshapeframework/src/wxSF.rc create mode 100644 sdk/wxshapeframework/src/wx_pch.cpp create mode 100644 sdk/wxshapeframework/src/wx_pch.h create mode 100644 sdk/wxshapeframework/src/wxxmlserializer/PropertyIO.cpp create mode 100644 sdk/wxshapeframework/src/wxxmlserializer/XmlSerializer.cpp create mode 100644 src/CMakeFiles/progress.marks create mode 100644 src/CMakeLists.txt create mode 100644 src/algebra/ScalarBackend.hh create mode 100644 src/algebra/UblasBackend.hh create mode 100644 src/algebra/details/UblasBackendImpl.hh create mode 100644 src/commons/Exception.cc create mode 100644 src/commons/Exception.hh create mode 100644 src/console/CMakeLists.txt create mode 100644 src/console/ParsingDriverConsoleReporter.cc create mode 100644 src/console/ParsingDriverConsoleReporter.hh create mode 100644 src/console/bddepochmain.cc create mode 100644 src/console/epochconsolealtarica.cc create mode 100644 src/console/epochconsolealtarica.hh create mode 100644 src/console/epochmain.cc create mode 100644 src/console/iaepochmain.cc create mode 100644 src/console/symepochmain.cc create mode 100644 src/grammars/CMakeLists.txt create mode 100644 src/grammars/altarica/AltaricaException.cc create mode 100644 src/grammars/altarica/AltaricaException.hh create mode 100644 src/grammars/altarica/AltaricaGenerator.cc create mode 100644 src/grammars/altarica/AltaricaGenerator.hh create mode 100644 src/grammars/altarica/AltaricaInitInfo.cc create mode 100644 src/grammars/altarica/AltaricaInitInfo.hh create mode 100644 src/grammars/altarica/AltaricaInitInfoXML.cc create mode 100644 src/grammars/altarica/AltaricaInitInfoXML.hh create mode 100644 src/grammars/altarica/AltaricaInitInfoXML2.cc create mode 100644 src/grammars/altarica/AltaricaInitInfoXML2.hh create mode 100644 src/grammars/altarica/AltaricaInteractive.cc create mode 100644 src/grammars/altarica/AltaricaInteractive.hh create mode 100644 src/grammars/altarica/AltaricaJson.cc create mode 100644 src/grammars/altarica/AltaricaJson.hh create mode 100644 src/grammars/altarica/AltaricaModel.cc create mode 100644 src/grammars/altarica/AltaricaModel.hh create mode 100644 src/grammars/altarica/AltaricaState.cc create mode 100644 src/grammars/altarica/AltaricaState.hh create mode 100644 src/grammars/altarica/Assertion.cc create mode 100644 src/grammars/altarica/Assertion.hh create mode 100644 src/grammars/altarica/Assignment.cc create mode 100644 src/grammars/altarica/Assignment.hh create mode 100644 src/grammars/altarica/CMakeLists.txt create mode 100644 src/grammars/altarica/Constant.cc create mode 100644 src/grammars/altarica/Constant.hh create mode 100644 src/grammars/altarica/Event.cc create mode 100644 src/grammars/altarica/Event.hh create mode 100644 src/grammars/altarica/EventLaw.cc create mode 100644 src/grammars/altarica/EventLaw.hh create mode 100644 src/grammars/altarica/FiacreTranslator.cc create mode 100644 src/grammars/altarica/FiacreTranslator.hh create mode 100644 src/grammars/altarica/LandmarkDriver.cc create mode 100644 src/grammars/altarica/LandmarkDriver.hh create mode 100644 src/grammars/altarica/LandmarkMetaEvent.cc create mode 100644 src/grammars/altarica/LandmarkMetaEvent.hh create mode 100644 src/grammars/altarica/LandmarkState.cc create mode 100644 src/grammars/altarica/LandmarkState.hh create mode 100644 src/grammars/altarica/MemberAccess.cc create mode 100644 src/grammars/altarica/MemberAccess.hh create mode 100644 src/grammars/altarica/MetaEvent.cc create mode 100644 src/grammars/altarica/MetaEvent.hh create mode 100644 src/grammars/altarica/Node.cc create mode 100644 src/grammars/altarica/Node.hh create mode 100644 src/grammars/altarica/Parameter.cc create mode 100644 src/grammars/altarica/Parameter.hh create mode 100644 src/grammars/altarica/Synchronisation.cc create mode 100644 src/grammars/altarica/Synchronisation.hh create mode 100644 src/grammars/altarica/Transition.cc create mode 100644 src/grammars/altarica/Transition.hh create mode 100644 src/grammars/altarica/Values.hh create mode 100644 src/grammars/altarica/Variable.cc create mode 100644 src/grammars/altarica/Variable.hh create mode 100644 src/grammars/altarica/altarica.l create mode 100644 src/grammars/altarica/altarica.yy create mode 100644 src/grammars/altarica/altarica_driver.cc create mode 100644 src/grammars/altarica/altarica_driver.hh create mode 100644 src/grammars/altarica/details/AltaricaGeneratorImpl.hh create mode 100644 src/grammars/altarica/domains/ArrayDomain.cc create mode 100644 src/grammars/altarica/domains/ArrayDomain.hh create mode 100644 src/grammars/altarica/domains/ContinuousDomain.hh create mode 100644 src/grammars/altarica/domains/DiscreteDomain.hh create mode 100644 src/grammars/altarica/domains/Domain.cc create mode 100644 src/grammars/altarica/domains/Domain.hh create mode 100644 src/grammars/altarica/domains/Domains.hh create mode 100644 src/grammars/altarica/domains/EnumDomain.cc create mode 100644 src/grammars/altarica/domains/EnumDomain.hh create mode 100644 src/grammars/altarica/domains/PredefinedDomain.cc create mode 100644 src/grammars/altarica/domains/PredefinedDomain.hh create mode 100644 src/grammars/altarica/domains/RangeDomain.cc create mode 100644 src/grammars/altarica/domains/RangeDomain.hh create mode 100644 src/grammars/altarica/domains/RealDomain.cc create mode 100644 src/grammars/altarica/domains/RealDomain.hh create mode 100644 src/grammars/altarica/domains/StructuredDomain.cc create mode 100644 src/grammars/altarica/domains/StructuredDomain.hh create mode 100644 src/grammars/altarica/expressions/EvaluationVisitor.hh create mode 100644 src/grammars/altarica/expressions/Expression.cc create mode 100644 src/grammars/altarica/expressions/Expression.hh create mode 100644 src/grammars/altarica/expressions/ExpressionADD.cc create mode 100644 src/grammars/altarica/expressions/ExpressionADD.hh create mode 100644 src/grammars/altarica/expressions/ExpressionAND.cc create mode 100644 src/grammars/altarica/expressions/ExpressionAND.hh create mode 100644 src/grammars/altarica/expressions/ExpressionARITH.cc create mode 100644 src/grammars/altarica/expressions/ExpressionARITH.hh create mode 100644 src/grammars/altarica/expressions/ExpressionATOMIC.hh create mode 100644 src/grammars/altarica/expressions/ExpressionBOOLCONSTANT.cc create mode 100644 src/grammars/altarica/expressions/ExpressionBOOLCONSTANT.hh create mode 100644 src/grammars/altarica/expressions/ExpressionCARD.cc create mode 100644 src/grammars/altarica/expressions/ExpressionCARD.hh create mode 100644 src/grammars/altarica/expressions/ExpressionCASE.cc create mode 100644 src/grammars/altarica/expressions/ExpressionCASE.hh create mode 100644 src/grammars/altarica/expressions/ExpressionCONSTARRAY.cc create mode 100644 src/grammars/altarica/expressions/ExpressionCONSTARRAY.hh create mode 100644 src/grammars/altarica/expressions/ExpressionCONSTSTRUCT.cc create mode 100644 src/grammars/altarica/expressions/ExpressionCONSTSTRUCT.hh create mode 100644 src/grammars/altarica/expressions/ExpressionEvaluator.cc create mode 100644 src/grammars/altarica/expressions/ExpressionEvaluator.hh create mode 100644 src/grammars/altarica/expressions/ExpressionEvaluatorLandmark.cc create mode 100644 src/grammars/altarica/expressions/ExpressionEvaluatorLandmark.hh create mode 100644 src/grammars/altarica/expressions/ExpressionFUNCTIONCALL.cc create mode 100644 src/grammars/altarica/expressions/ExpressionFUNCTIONCALL.hh create mode 100644 src/grammars/altarica/expressions/ExpressionINTERVAL.cc create mode 100644 src/grammars/altarica/expressions/ExpressionINTERVAL.hh create mode 100644 src/grammars/altarica/expressions/ExpressionIfThenElse.cc create mode 100644 src/grammars/altarica/expressions/ExpressionIfThenElse.hh create mode 100644 src/grammars/altarica/expressions/ExpressionInfoVar.cc create mode 100644 src/grammars/altarica/expressions/ExpressionInfoVar.hh create mode 100644 src/grammars/altarica/expressions/ExpressionLOG.cc create mode 100644 src/grammars/altarica/expressions/ExpressionLOG.hh create mode 100644 src/grammars/altarica/expressions/ExpressionMEMBER.cc create mode 100644 src/grammars/altarica/expressions/ExpressionMEMBER.hh create mode 100644 src/grammars/altarica/expressions/ExpressionMINMAX.cc create mode 100644 src/grammars/altarica/expressions/ExpressionMINMAX.hh create mode 100644 src/grammars/altarica/expressions/ExpressionMUL.cc create mode 100644 src/grammars/altarica/expressions/ExpressionMUL.hh create mode 100644 src/grammars/altarica/expressions/ExpressionOR.cc create mode 100644 src/grammars/altarica/expressions/ExpressionOR.hh create mode 100644 src/grammars/altarica/expressions/ExpressionPAREN.cc create mode 100644 src/grammars/altarica/expressions/ExpressionPAREN.hh create mode 100644 src/grammars/altarica/expressions/ExpressionQUANTIFIED.cc create mode 100644 src/grammars/altarica/expressions/ExpressionQUANTIFIED.hh create mode 100644 src/grammars/altarica/expressions/ExpressionREAL.cc create mode 100644 src/grammars/altarica/expressions/ExpressionREAL.hh create mode 100644 src/grammars/altarica/expressions/ExpressionUNARY.cc create mode 100644 src/grammars/altarica/expressions/ExpressionUNARY.hh create mode 100644 src/grammars/altarica/expressions/ExpressionUNSIGNEDINT.cc create mode 100644 src/grammars/altarica/expressions/ExpressionUNSIGNEDINT.hh create mode 100644 src/grammars/altarica/expressions/Expressions.hh create mode 100644 src/grammars/altarica/expressions/Visitor.hh create mode 100644 src/grammars/altarica/parser_helper.cc create mode 100644 src/grammars/altarica/parser_helper.hh create mode 100644 src/grammars/altarica/values/Value.cc create mode 100644 src/grammars/altarica/values/Value.hh create mode 100644 src/grammars/altarica/values/ValueBool.cc create mode 100644 src/grammars/altarica/values/ValueBool.hh create mode 100644 src/grammars/altarica/values/ValueInt.cc create mode 100644 src/grammars/altarica/values/ValueInt.hh create mode 100644 src/grammars/altarica/values/ValueReal.cc create mode 100644 src/grammars/altarica/values/ValueReal.hh create mode 100644 src/grammars/altarica/values/ValueSymbol.cc create mode 100644 src/grammars/altarica/values/ValueSymbol.hh create mode 100644 src/grammars/details/parsingdriverbaseimpl.hh create mode 100644 src/grammars/parsingdriverbase.hh create mode 100644 utils/altarica-mode.el diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..eae8fe3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,70 @@ +# This file is part of EPOCH. +# File: CMakeLists.txt +# Author: Florent Teichteil-Königsbuch +# Contact: florent.teichteil@onera.fr +# +# EPOCH is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# EPOCH is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with EPOCH. If not, see . + +CMAKE_MINIMUM_REQUIRED (VERSION 2.8) + +PROJECT (EPOCH) +ENABLE_LANGUAGE(C CXX Fortran) + +SET (CMAKE_MODULE_PATH ${CMAKE_HOME_DIRECTORY}/config) + +INCLUDE (CheckIncludeFiles) + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") + +##################### +# FIND DEPENDENCIES # +##################### + +FIND_PACKAGE (Boost 1.46.0 COMPONENTS program_options timer chrono filesystem system date_time timer unit_test_framework REQUIRED) +INCLUDE_DIRECTORIES (${Boost_INCLUDE_DIRS} ${SUITESPARSE_PATH}) +LINK_DIRECTORIES (${Boost_LIBRARY_DIRS}) +MESSAGE (STATUS "Found Boost version: " ${Boost_VERSION}) + +OPTION (BUILD_GUI "Build EPOCH's Graphical User Interface" OFF) +IF (BUILD_GUI) + FIND_PACKAGE (wxWidgetsCustom COMPONENTS base core aui xml REQUIRED) + SET (CMAKE_REQUIRED_INCLUDES_COPY ${CMAKE_REQUIRED_INCLUDES}) + LIST (APPEND CMAKE_REQUIRED_INCLUDES ${wxWidgets_INCLUDE_DIRS}) + CHECK_INCLUDE_FILES (wx/aui/tabdocmdi.h HAVE_TABDOCMDI_H) + SET (CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES_COPY}) + FIND_PACKAGE (PLplot REQUIRED) + IF (NOT PLplot_wxwidgets_LIBRARY) + MESSAGE (FATAL_ERROR "PLplot wxwidgets bindings required to build the GUI") + ENDIF(NOT PLplot_wxwidgets_LIBRARY) +ENDIF (BUILD_GUI) + +OPTION (BUILD_DOC "Build Doxygen documentation" OFF) +IF (BUILD_DOC) + FIND_PACKAGE (Doxygen REQUIRED) +ENDIF (BUILD_DOC) + +################## +# COMPILES FILES # +################## + +ADD_SUBDIRECTORY (sdk) +ADD_SUBDIRECTORY (src) + +####################### +# BUILD DOCUMENTATION # +####################### + +IF (BUILD_DOC) + ADD_SUBDIRECTORY (doc) +ENDIF (BUILD_DOC) diff --git a/CeCILL-C.txt b/CeCILL-C.txt new file mode 100644 index 0000000..6569837 --- /dev/null +++ b/CeCILL-C.txt @@ -0,0 +1,1041 @@ + +CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-C + + + Avertissement + +Ce contrat est une licence de logiciel libre issue d'une concertation +entre ses auteurs afin que le respect de deux grands principes préside à +sa rédaction: + + * d'une part, le respect des principes de diffusion des logiciels + libres: accès au code source, droits étendus conférés aux + utilisateurs, + * d'autre part, la désignation d'un droit applicable, le droit + français, auquel elle est conforme, tant au regard du droit de la + responsabilité civile que du droit de la propriété intellectuelle + et de la protection qu'il offre aux auteurs et titulaires des + droits patrimoniaux sur un logiciel. + +Les auteurs de la licence CeCILL-C (pour Ce[a] C[nrs] I[nria] L[ogiciel] +L[ibre]) sont: + +Commissariat à l'Energie Atomique - CEA, établissement public de +recherche à caractère scientifique, technique et industriel, dont le +siège est situé 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris. + +Centre National de la Recherche Scientifique - CNRS, établissement +public à caractère scientifique et technologique, dont le siège est +situé 3 rue Michel-Ange, 75794 Paris cedex 16. + +Institut National de Recherche en Informatique et en Automatique - +INRIA, établissement public à caractère scientifique et technologique, +dont le siège est situé Domaine de Voluceau, Rocquencourt, BP 105, 78153 +Le Chesnay cedex. + + + Préambule + +Ce contrat est une licence de logiciel libre dont l'objectif est de +conférer aux utilisateurs la liberté de modifier et de réutiliser le +logiciel régi par cette licence. + +L'exercice de cette liberté est assorti d'une obligation de remettre à +la disposition de la communauté les modifications apportées au code +source du logiciel afin de contribuer à son évolution. + +L'accessibilité au code source et les droits de copie, de modification +et de redistribution qui découlent de ce contrat ont pour contrepartie +de n'offrir aux utilisateurs qu'une garantie limitée et de ne faire +peser sur l'auteur du logiciel, le titulaire des droits patrimoniaux et +les concédants successifs qu'une responsabilité restreinte. + +A cet égard l'attention de l'utilisateur est attirée sur les risques +associés au chargement, à l'utilisation, à la modification et/ou au +développement et à la reproduction du logiciel par l'utilisateur étant +donné sa spécificité de logiciel libre, qui peut le rendre complexe à +manipuler et qui le réserve donc à des développeurs ou des +professionnels avertis possédant des connaissances informatiques +approfondies. Les utilisateurs sont donc invités à charger et tester +l'adéquation du logiciel à leurs besoins dans des conditions permettant +d'assurer la sécurité de leurs systèmes et/ou de leurs données et, plus +généralement, à l'utiliser et l'exploiter dans les mêmes conditions de +sécurité. Ce contrat peut être reproduit et diffusé librement, sous +réserve de le conserver en l'état, sans ajout ni suppression de clauses. + +Ce contrat est susceptible de s'appliquer à tout logiciel dont le +titulaire des droits patrimoniaux décide de soumettre l'exploitation aux +dispositions qu'il contient. + + + Article 1 - DEFINITIONS + +Dans ce contrat, les termes suivants, lorsqu'ils seront écrits avec une +lettre capitale, auront la signification suivante: + +Contrat: désigne le présent contrat de licence, ses éventuelles versions +postérieures et annexes. + +Logiciel: désigne le logiciel sous sa forme de Code Objet et/ou de Code +Source et le cas échéant sa documentation, dans leur état au moment de +l'acceptation du Contrat par le Licencié. + +Logiciel Initial: désigne le Logiciel sous sa forme de Code Source et +éventuellement de Code Objet et le cas échéant sa documentation, dans +leur état au moment de leur première diffusion sous les termes du Contrat. + +Logiciel Modifié: désigne le Logiciel modifié par au moins une +Contribution Intégrée. + +Code Source: désigne l'ensemble des instructions et des lignes de +programme du Logiciel et auquel l'accès est nécessaire en vue de +modifier le Logiciel. + +Code Objet: désigne les fichiers binaires issus de la compilation du +Code Source. + +Titulaire: désigne le ou les détenteurs des droits patrimoniaux d'auteur +sur le Logiciel Initial. + +Licencié: désigne le ou les utilisateurs du Logiciel ayant accepté le +Contrat. + +Contributeur: désigne le Licencié auteur d'au moins une Contribution +Intégrée. + +Concédant: désigne le Titulaire ou toute personne physique ou morale +distribuant le Logiciel sous le Contrat. + +Contribution Intégrée: désigne l'ensemble des modifications, +corrections, traductions, adaptations et/ou nouvelles fonctionnalités +intégrées dans le Code Source par tout Contributeur. + +Module Lié: désigne un ensemble de fichiers sources y compris leur +documentation qui, sans modification du Code Source, permet de réaliser +des fonctionnalités ou services supplémentaires à ceux fournis par le +Logiciel. + +Logiciel Dérivé: désigne toute combinaison du Logiciel, modifié ou non, +et d'un Module Lié. + +Parties: désigne collectivement le Licencié et le Concédant. + +Ces termes s'entendent au singulier comme au pluriel. + + + Article 2 - OBJET + +Le Contrat a pour objet la concession par le Concédant au Licencié d'une +licence non exclusive, cessible et mondiale du Logiciel telle que +définie ci-après à l'article 5 pour toute la durée de protection des droits +portant sur ce Logiciel. + + + Article 3 - ACCEPTATION + +3.1 L'acceptation par le Licencié des termes du Contrat est réputée +acquise du fait du premier des faits suivants: + + * (i) le chargement du Logiciel par tout moyen notamment par + téléchargement à partir d'un serveur distant ou par chargement à + partir d'un support physique; + * (ii) le premier exercice par le Licencié de l'un quelconque des + droits concédés par le Contrat. + +3.2 Un exemplaire du Contrat, contenant notamment un avertissement +relatif aux spécificités du Logiciel, à la restriction de garantie et à +la limitation à un usage par des utilisateurs expérimentés a été mis à +disposition du Licencié préalablement à son acceptation telle que +définie à l'article 3.1 ci dessus et le Licencié reconnaît en avoir pris +connaissance. + + + Article 4 - ENTREE EN VIGUEUR ET DUREE + + + 4.1 ENTREE EN VIGUEUR + +Le Contrat entre en vigueur à la date de son acceptation par le Licencié +telle que définie en 3.1. + + + 4.2 DUREE + +Le Contrat produira ses effets pendant toute la durée légale de +protection des droits patrimoniaux portant sur le Logiciel. + + + Article 5 - ETENDUE DES DROITS CONCEDES + +Le Concédant concède au Licencié, qui accepte, les droits suivants sur +le Logiciel pour toutes destinations et pour la durée du Contrat dans +les conditions ci-après détaillées. + +Par ailleurs, si le Concédant détient ou venait à détenir un ou +plusieurs brevets d'invention protégeant tout ou partie des +fonctionnalités du Logiciel ou de ses composants, il s'engage à ne pas +opposer les éventuels droits conférés par ces brevets aux Licenciés +successifs qui utiliseraient, exploiteraient ou modifieraient le +Logiciel. En cas de cession de ces brevets, le Concédant s'engage à +faire reprendre les obligations du présent alinéa aux cessionnaires. + + + 5.1 DROIT D'UTILISATION + +Le Licencié est autorisé à utiliser le Logiciel, sans restriction quant +aux domaines d'application, étant ci-après précisé que cela comporte: + + 1. la reproduction permanente ou provisoire du Logiciel en tout ou + partie par tout moyen et sous toute forme. + + 2. le chargement, l'affichage, l'exécution, ou le stockage du + Logiciel sur tout support. + + 3. la possibilité d'en observer, d'en étudier, ou d'en tester le + fonctionnement afin de déterminer les idées et principes qui sont + à la base de n'importe quel élément de ce Logiciel; et ceci, + lorsque le Licencié effectue toute opération de chargement, + d'affichage, d'exécution, de transmission ou de stockage du + Logiciel qu'il est en droit d'effectuer en vertu du Contrat. + + + 5.2 DROIT DE MODIFICATION + +Le droit de modification comporte le droit de traduire, d'adapter, +d'arranger ou d'apporter toute autre modification au Logiciel et le +droit de reproduire le logiciel en résultant. Il comprend en particulier +le droit de créer un Logiciel Dérivé. + +Le Licencié est autorisé à apporter toute modification au Logiciel sous +réserve de mentionner, de façon explicite, son nom en tant qu'auteur de +cette modification et la date de création de celle-ci. + + + 5.3 DROIT DE DISTRIBUTION + +Le droit de distribution comporte notamment le droit de diffuser, de +transmettre et de communiquer le Logiciel au public sur tout support et +par tout moyen ainsi que le droit de mettre sur le marché à titre +onéreux ou gratuit, un ou des exemplaires du Logiciel par tout procédé. + +Le Licencié est autorisé à distribuer des copies du Logiciel, modifié ou +non, à des tiers dans les conditions ci-après détaillées. + + + 5.3.1 DISTRIBUTION DU LOGICIEL SANS MODIFICATION + +Le Licencié est autorisé à distribuer des copies conformes du Logiciel, +sous forme de Code Source ou de Code Objet, à condition que cette +distribution respecte les dispositions du Contrat dans leur totalité et +soit accompagnée: + + 1. d'un exemplaire du Contrat, + + 2. d'un avertissement relatif à la restriction de garantie et de + responsabilité du Concédant telle que prévue aux articles 8 + et 9, + +et que, dans le cas où seul le Code Objet du Logiciel est redistribué, +le Licencié permette un accès effectif au Code Source complet du +Logiciel pendant au moins toute la durée de sa distribution du Logiciel, +étant entendu que le coût additionnel d'acquisition du Code Source ne +devra pas excéder le simple coût de transfert des données. + + + 5.3.2 DISTRIBUTION DU LOGICIEL MODIFIE + +Lorsque le Licencié apporte une Contribution Intégrée au Logiciel, les +conditions de distribution du Logiciel Modifié en résultant sont alors +soumises à l'intégralité des dispositions du Contrat. + +Le Licencié est autorisé à distribuer le Logiciel Modifié sous forme de +code source ou de code objet, à condition que cette distribution +respecte les dispositions du Contrat dans leur totalité et soit +accompagnée: + + 1. d'un exemplaire du Contrat, + + 2. d'un avertissement relatif à la restriction de garantie et de + responsabilité du Concédant telle que prévue aux articles 8 + et 9, + +et que, dans le cas où seul le code objet du Logiciel Modifié est +redistribué, le Licencié permette un accès effectif à son code source +complet pendant au moins toute la durée de sa distribution du Logiciel +Modifié, étant entendu que le coût additionnel d'acquisition du code +source ne devra pas excéder le simple coût de transfert des données. + + + 5.3.3 DISTRIBUTION DU LOGICIEL DERIVE + +Lorsque le Licencié crée un Logiciel Dérivé, ce Logiciel Dérivé peut +être distribué sous un contrat de licence autre que le présent Contrat à +condition de respecter les obligations de mention des droits sur le +Logiciel telles que définies à l'article 6.4. Dans le cas où la création du +Logiciel Dérivé a nécessité une modification du Code Source le licencié +s'engage à ce que: + + 1. le Logiciel Modifié correspondant à cette modification soit régi + par le présent Contrat, + 2. les Contributions Intégrées dont le Logiciel Modifié résulte + soient clairement identifiées et documentées, + 3. le Licencié permette un accès effectif au code source du Logiciel + Modifié, pendant au moins toute la durée de la distribution du + Logiciel Dérivé, de telle sorte que ces modifications puissent + être reprises dans une version ultérieure du Logiciel, étant + entendu que le coût additionnel d'acquisition du code source du + Logiciel Modifié ne devra pas excéder le simple coût du transfert + des données. + + + 5.3.4 COMPATIBILITE AVEC LA LICENCE CeCILL + +Lorsqu'un Logiciel Modifié contient une Contribution Intégrée soumise au +contrat de licence CeCILL, ou lorsqu'un Logiciel Dérivé contient un +Module Lié soumis au contrat de licence CeCILL, les stipulations prévues +au troisième item de l'article 6.4 sont facultatives. + + + Article 6 - PROPRIETE INTELLECTUELLE + + + 6.1 SUR LE LOGICIEL INITIAL + +Le Titulaire est détenteur des droits patrimoniaux sur le Logiciel +Initial. Toute utilisation du Logiciel Initial est soumise au respect +des conditions dans lesquelles le Titulaire a choisi de diffuser son +oeuvre et nul autre n'a la faculté de modifier les conditions de +diffusion de ce Logiciel Initial. + +Le Titulaire s'engage à ce que le Logiciel Initial reste au moins régi +par le Contrat et ce, pour la durée visée à l'article 4.2. + + + 6.2 SUR LES CONTRIBUTIONS INTEGREES + +Le Licencié qui a développé une Contribution Intégrée est titulaire sur +celle-ci des droits de propriété intellectuelle dans les conditions +définies par la législation applicable. + + + 6.3 SUR LES MODULES LIES + +Le Licencié qui a développé un Module Lié est titulaire sur celui-ci des +droits de propriété intellectuelle dans les conditions définies par la +législation applicable et reste libre du choix du contrat régissant sa +diffusion dans les conditions définies à l'article 5.3.3. + + + 6.4 MENTIONS DES DROITS + +Le Licencié s'engage expressément: + + 1. à ne pas supprimer ou modifier de quelque manière que ce soit les + mentions de propriété intellectuelle apposées sur le Logiciel; + + 2. à reproduire à l'identique lesdites mentions de propriété + intellectuelle sur les copies du Logiciel modifié ou non; + + 3. à faire en sorte que l'utilisation du Logiciel, ses mentions de + propriété intellectuelle et le fait qu'il est régi par le Contrat + soient indiqués dans un texte facilement accessible notamment + depuis l'interface de tout Logiciel Dérivé. + +Le Licencié s'engage à ne pas porter atteinte, directement ou +indirectement, aux droits de propriété intellectuelle du Titulaire et/ou +des Contributeurs sur le Logiciel et à prendre, le cas échéant, à +l'égard de son personnel toutes les mesures nécessaires pour assurer le +respect des dits droits de propriété intellectuelle du Titulaire et/ou +des Contributeurs. + + + Article 7 - SERVICES ASSOCIES + +7.1 Le Contrat n'oblige en aucun cas le Concédant à la réalisation de +prestations d'assistance technique ou de maintenance du Logiciel. + +Cependant le Concédant reste libre de proposer ce type de services. Les +termes et conditions d'une telle assistance technique et/ou d'une telle +maintenance seront alors déterminés dans un acte séparé. Ces actes de +maintenance et/ou assistance technique n'engageront que la seule +responsabilité du Concédant qui les propose. + +7.2 De même, tout Concédant est libre de proposer, sous sa seule +responsabilité, à ses licenciés une garantie, qui n'engagera que lui, +lors de la redistribution du Logiciel et/ou du Logiciel Modifié et ce, +dans les conditions qu'il souhaite. Cette garantie et les modalités +financières de son application feront l'objet d'un acte séparé entre le +Concédant et le Licencié. + + + Article 8 - RESPONSABILITE + +8.1 Sous réserve des dispositions de l'article 8.2, le Licencié a la +faculté, sous réserve de prouver la faute du Concédant concerné, de +solliciter la réparation du préjudice direct qu'il subirait du fait du +Logiciel et dont il apportera la preuve. + +8.2 La responsabilité du Concédant est limitée aux engagements pris en +application du Contrat et ne saurait être engagée en raison notamment: +(i) des dommages dus à l'inexécution, totale ou partielle, de ses +obligations par le Licencié, (ii) des dommages directs ou indirects +découlant de l'utilisation ou des performances du Logiciel subis par le +Licencié et (iii) plus généralement d'un quelconque dommage indirect. En +particulier, les Parties conviennent expressément que tout préjudice +financier ou commercial (par exemple perte de données, perte de +bénéfices, perte d'exploitation, perte de clientèle ou de commandes, +manque à gagner, trouble commercial quelconque) ou toute action dirigée +contre le Licencié par un tiers, constitue un dommage indirect et +n'ouvre pas droit à réparation par le Concédant. + + + Article 9 - GARANTIE + +9.1 Le Licencié reconnaît que l'état actuel des connaissances +scientifiques et techniques au moment de la mise en circulation du +Logiciel ne permet pas d'en tester et d'en vérifier toutes les +utilisations ni de détecter l'existence d'éventuels défauts. L'attention +du Licencié a été attirée sur ce point sur les risques associés au +chargement, à l'utilisation, la modification et/ou au développement et à +la reproduction du Logiciel qui sont réservés à des utilisateurs avertis. + +Il relève de la responsabilité du Licencié de contrôler, par tous +moyens, l'adéquation du produit à ses besoins, son bon fonctionnement et +de s'assurer qu'il ne causera pas de dommages aux personnes et aux biens. + +9.2 Le Concédant déclare de bonne foi être en droit de concéder +l'ensemble des droits attachés au Logiciel (comprenant notamment les +droits visés à l'article 5). + +9.3 Le Licencié reconnaît que le Logiciel est fourni "en l'état" par le +Concédant sans autre garantie, expresse ou tacite, que celle prévue à +l'article 9.2 et notamment sans aucune garantie sur sa valeur commerciale, +son caractère sécurisé, innovant ou pertinent. + +En particulier, le Concédant ne garantit pas que le Logiciel est exempt +d'erreur, qu'il fonctionnera sans interruption, qu'il sera compatible +avec l'équipement du Licencié et sa configuration logicielle ni qu'il +remplira les besoins du Licencié. + +9.4 Le Concédant ne garantit pas, de manière expresse ou tacite, que le +Logiciel ne porte pas atteinte à un quelconque droit de propriété +intellectuelle d'un tiers portant sur un brevet, un logiciel ou sur tout +autre droit de propriété. Ainsi, le Concédant exclut toute garantie au +profit du Licencié contre les actions en contrefaçon qui pourraient être +diligentées au titre de l'utilisation, de la modification, et de la +redistribution du Logiciel. Néanmoins, si de telles actions sont +exercées contre le Licencié, le Concédant lui apportera son aide +technique et juridique pour sa défense. Cette aide technique et +juridique est déterminée au cas par cas entre le Concédant concerné et +le Licencié dans le cadre d'un protocole d'accord. Le Concédant dégage +toute responsabilité quant à l'utilisation de la dénomination du +Logiciel par le Licencié. Aucune garantie n'est apportée quant à +l'existence de droits antérieurs sur le nom du Logiciel et sur +l'existence d'une marque. + + + Article 10 - RESILIATION + +10.1 En cas de manquement par le Licencié aux obligations mises à sa +charge par le Contrat, le Concédant pourra résilier de plein droit le +Contrat trente (30) jours après notification adressée au Licencié et +restée sans effet. + +10.2 Le Licencié dont le Contrat est résilié n'est plus autorisé à +utiliser, modifier ou distribuer le Logiciel. Cependant, toutes les +licences qu'il aura concédées antérieurement à la résiliation du Contrat +resteront valides sous réserve qu'elles aient été effectuées en +conformité avec le Contrat. + + + Article 11 - DISPOSITIONS DIVERSES + + + 11.1 CAUSE EXTERIEURE + +Aucune des Parties ne sera responsable d'un retard ou d'une défaillance +d'exécution du Contrat qui serait dû à un cas de force majeure, un cas +fortuit ou une cause extérieure, telle que, notamment, le mauvais +fonctionnement ou les interruptions du réseau électrique ou de +télécommunication, la paralysie du réseau liée à une attaque +informatique, l'intervention des autorités gouvernementales, les +catastrophes naturelles, les dégâts des eaux, les tremblements de terre, +le feu, les explosions, les grèves et les conflits sociaux, l'état de +guerre... + +11.2 Le fait, par l'une ou l'autre des Parties, d'omettre en une ou +plusieurs occasions de se prévaloir d'une ou plusieurs dispositions du +Contrat, ne pourra en aucun cas impliquer renonciation par la Partie +intéressée à s'en prévaloir ultérieurement. + +11.3 Le Contrat annule et remplace toute convention antérieure, écrite +ou orale, entre les Parties sur le même objet et constitue l'accord +entier entre les Parties sur cet objet. Aucune addition ou modification +aux termes du Contrat n'aura d'effet à l'égard des Parties à moins +d'être faite par écrit et signée par leurs représentants dûment habilités. + +11.4 Dans l'hypothèse où une ou plusieurs des dispositions du Contrat +s'avèrerait contraire à une loi ou à un texte applicable, existants ou +futurs, cette loi ou ce texte prévaudrait, et les Parties feraient les +amendements nécessaires pour se conformer à cette loi ou à ce texte. +Toutes les autres dispositions resteront en vigueur. De même, la +nullité, pour quelque raison que ce soit, d'une des dispositions du +Contrat ne saurait entraîner la nullité de l'ensemble du Contrat. + + + 11.5 LANGUE + +Le Contrat est rédigé en langue française et en langue anglaise, ces +deux versions faisant également foi. + + + Article 12 - NOUVELLES VERSIONS DU CONTRAT + +12.1 Toute personne est autorisée à copier et distribuer des copies de +ce Contrat. + +12.2 Afin d'en préserver la cohérence, le texte du Contrat est protégé +et ne peut être modifié que par les auteurs de la licence, lesquels se +réservent le droit de publier périodiquement des mises à jour ou de +nouvelles versions du Contrat, qui posséderont chacune un numéro +distinct. Ces versions ultérieures seront susceptibles de prendre en +compte de nouvelles problématiques rencontrées par les logiciels libres. + +12.3 Tout Logiciel diffusé sous une version donnée du Contrat ne pourra +faire l'objet d'une diffusion ultérieure que sous la même version du +Contrat ou une version postérieure. + + + Article 13 - LOI APPLICABLE ET COMPETENCE TERRITORIALE + +13.1 Le Contrat est régi par la loi française. Les Parties conviennent +de tenter de régler à l'amiable les différends ou litiges qui +viendraient à se produire par suite ou à l'occasion du Contrat. + +13.2 A défaut d'accord amiable dans un délai de deux (2) mois à compter +de leur survenance et sauf situation relevant d'une procédure d'urgence, +les différends ou litiges seront portés par la Partie la plus diligente +devant les Tribunaux compétents de Paris. + + +Version 1.0 du 2006-09-05. + +--- + + +CeCILL-C FREE SOFTWARE LICENSE AGREEMENT + + + Notice + +This Agreement is a Free Software license agreement that is the result +of discussions between its authors in order to ensure compliance with +the two main principles guiding its drafting: + + * firstly, compliance with the principles governing the distribution + of Free Software: access to source code, broad rights granted to + users, + * secondly, the election of a governing law, French law, with which + it is conformant, both as regards the law of torts and + intellectual property law, and the protection that it offers to + both authors and holders of the economic rights over software. + +The authors of the CeCILL-C (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre]) +license are: + +Commissariat à l'Energie Atomique - CEA, a public scientific, technical +and industrial research establishment, having its principal place of +business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France. + +Centre National de la Recherche Scientifique - CNRS, a public scientific +and technological establishment, having its principal place of business +at 3 rue Michel-Ange, 75794 Paris cedex 16, France. + +Institut National de Recherche en Informatique et en Automatique - +INRIA, a public scientific and technological establishment, having its +principal place of business at Domaine de Voluceau, Rocquencourt, BP +105, 78153 Le Chesnay cedex, France. + + + Preamble + +The purpose of this Free Software license agreement is to grant users +the right to modify and re-use the software governed by this license. + +The exercising of this right is conditional upon the obligation to make +available to the community the modifications made to the source code of +the software so as to contribute to its evolution. + +In consideration of access to the source code and the rights to copy, +modify and redistribute granted by the license, users are provided only +with a limited warranty and the software's author, the holder of the +economic rights, and the successive licensors only have limited liability. + +In this respect, the risks associated with loading, using, modifying +and/or developing or reproducing the software by the user are brought to +the user's attention, given its Free Software status, which may make it +complicated to use, with the result that its use is reserved for +developers and experienced professionals having in-depth computer +knowledge. Users are therefore encouraged to load and test the +suitability of the software as regards their requirements in conditions +enabling the security of their systems and/or data to be ensured and, +more generally, to use and operate it in the same conditions of +security. This Agreement may be freely reproduced and published, +provided it is not altered, and that no provisions are either added or +removed herefrom. + +This Agreement may apply to any or all software for which the holder of +the economic rights decides to submit the use thereof to its provisions. + + + Article 1 - DEFINITIONS + +For the purpose of this Agreement, when the following expressions +commence with a capital letter, they shall have the following meaning: + +Agreement: means this license agreement, and its possible subsequent +versions and annexes. + +Software: means the software in its Object Code and/or Source Code form +and, where applicable, its documentation, "as is" when the Licensee +accepts the Agreement. + +Initial Software: means the Software in its Source Code and possibly its +Object Code form and, where applicable, its documentation, "as is" when +it is first distributed under the terms and conditions of the Agreement. + +Modified Software: means the Software modified by at least one +Integrated Contribution. + +Source Code: means all the Software's instructions and program lines to +which access is required so as to modify the Software. + +Object Code: means the binary files originating from the compilation of +the Source Code. + +Holder: means the holder(s) of the economic rights over the Initial +Software. + +Licensee: means the Software user(s) having accepted the Agreement. + +Contributor: means a Licensee having made at least one Integrated +Contribution. + +Licensor: means the Holder, or any other individual or legal entity, who +distributes the Software under the Agreement. + +Integrated Contribution: means any or all modifications, corrections, +translations, adaptations and/or new functions integrated into the +Source Code by any or all Contributors. + +Related Module: means a set of sources files including their +documentation that, without modification to the Source Code, enables +supplementary functions or services in addition to those offered by the +Software. + +Derivative Software: means any combination of the Software, modified or +not, and of a Related Module. + +Parties: mean both the Licensee and the Licensor. + +These expressions may be used both in singular and plural form. + + + Article 2 - PURPOSE + +The purpose of the Agreement is the grant by the Licensor to the +Licensee of a non-exclusive, transferable and worldwide license for the +Software as set forth in Article 5 hereinafter for the whole term of the +protection granted by the rights over said Software. + + + Article 3 - ACCEPTANCE + +3.1 The Licensee shall be deemed as having accepted the terms and +conditions of this Agreement upon the occurrence of the first of the +following events: + + * (i) loading the Software by any or all means, notably, by + downloading from a remote server, or by loading from a physical + medium; + * (ii) the first time the Licensee exercises any of the rights + granted hereunder. + +3.2 One copy of the Agreement, containing a notice relating to the +characteristics of the Software, to the limited warranty, and to the +fact that its use is restricted to experienced users has been provided +to the Licensee prior to its acceptance as set forth in Article 3.1 +hereinabove, and the Licensee hereby acknowledges that it has read and +understood it. + + + Article 4 - EFFECTIVE DATE AND TERM + + + 4.1 EFFECTIVE DATE + +The Agreement shall become effective on the date when it is accepted by +the Licensee as set forth in Article 3.1. + + + 4.2 TERM + +The Agreement shall remain in force for the entire legal term of +protection of the economic rights over the Software. + + + Article 5 - SCOPE OF RIGHTS GRANTED + +The Licensor hereby grants to the Licensee, who accepts, the following +rights over the Software for any or all use, and for the term of the +Agreement, on the basis of the terms and conditions set forth hereinafter. + +Besides, if the Licensor owns or comes to own one or more patents +protecting all or part of the functions of the Software or of its +components, the Licensor undertakes not to enforce the rights granted by +these patents against successive Licensees using, exploiting or +modifying the Software. If these patents are transferred, the Licensor +undertakes to have the transferees subscribe to the obligations set +forth in this paragraph. + + + 5.1 RIGHT OF USE + +The Licensee is authorized to use the Software, without any limitation +as to its fields of application, with it being hereinafter specified +that this comprises: + + 1. permanent or temporary reproduction of all or part of the Software + by any or all means and in any or all form. + + 2. loading, displaying, running, or storing the Software on any or + all medium. + + 3. entitlement to observe, study or test its operation so as to + determine the ideas and principles behind any or all constituent + elements of said Software. This shall apply when the Licensee + carries out any or all loading, displaying, running, transmission + or storage operation as regards the Software, that it is entitled + to carry out hereunder. + + + 5.2 RIGHT OF MODIFICATION + +The right of modification includes the right to translate, adapt, +arrange, or make any or all modifications to the Software, and the right +to reproduce the resulting software. It includes, in particular, the +right to create a Derivative Software. + +The Licensee is authorized to make any or all modification to the +Software provided that it includes an explicit notice that it is the +author of said modification and indicates the date of the creation thereof. + + + 5.3 RIGHT OF DISTRIBUTION + +In particular, the right of distribution includes the right to publish, +transmit and communicate the Software to the general public on any or +all medium, and by any or all means, and the right to market, either in +consideration of a fee, or free of charge, one or more copies of the +Software by any means. + +The Licensee is further authorized to distribute copies of the modified +or unmodified Software to third parties according to the terms and +conditions set forth hereinafter. + + + 5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION + +The Licensee is authorized to distribute true copies of the Software in +Source Code or Object Code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's + warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the Object Code of the Software is +redistributed, the Licensee allows effective access to the full Source +Code of the Software at a minimum during the entire period of its +distribution of the Software, it being understood that the additional +cost of acquiring the Source Code shall not exceed the cost of +transferring the data. + + + 5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE + +When the Licensee makes an Integrated Contribution to the Software, the +terms and conditions for the distribution of the resulting Modified +Software become subject to all the provisions of this Agreement. + +The Licensee is authorized to distribute the Modified Software, in +source code or object code form, provided that said distribution +complies with all the provisions of the Agreement and is accompanied by: + + 1. a copy of the Agreement, + + 2. a notice relating to the limitation of both the Licensor's + warranty and liability as set forth in Articles 8 and 9, + +and that, in the event that only the object code of the Modified +Software is redistributed, the Licensee allows effective access to the +full source code of the Modified Software at a minimum during the entire +period of its distribution of the Modified Software, it being understood +that the additional cost of acquiring the source code shall not exceed +the cost of transferring the data. + + + 5.3.3 DISTRIBUTION OF DERIVATIVE SOFTWARE + +When the Licensee creates Derivative Software, this Derivative Software +may be distributed under a license agreement other than this Agreement, +subject to compliance with the requirement to include a notice +concerning the rights over the Software as defined in Article 6.4. +In the event the creation of the Derivative Software required modification +of the Source Code, the Licensee undertakes that: + + 1. the resulting Modified Software will be governed by this Agreement, + 2. the Integrated Contributions in the resulting Modified Software + will be clearly identified and documented, + 3. the Licensee will allow effective access to the source code of the + Modified Software, at a minimum during the entire period of + distribution of the Derivative Software, such that such + modifications may be carried over in a subsequent version of the + Software; it being understood that the additional cost of + purchasing the source code of the Modified Software shall not + exceed the cost of transferring the data. + + + 5.3.4 COMPATIBILITY WITH THE CeCILL LICENSE + +When a Modified Software contains an Integrated Contribution subject to +the CeCILL license agreement, or when a Derivative Software contains a +Related Module subject to the CeCILL license agreement, the provisions +set forth in the third item of Article 6.4 are optional. + + + Article 6 - INTELLECTUAL PROPERTY + + + 6.1 OVER THE INITIAL SOFTWARE + +The Holder owns the economic rights over the Initial Software. Any or +all use of the Initial Software is subject to compliance with the terms +and conditions under which the Holder has elected to distribute its work +and no one shall be entitled to modify the terms and conditions for the +distribution of said Initial Software. + +The Holder undertakes that the Initial Software will remain ruled at +least by this Agreement, for the duration set forth in Article 4.2. + + + 6.2 OVER THE INTEGRATED CONTRIBUTIONS + +The Licensee who develops an Integrated Contribution is the owner of the +intellectual property rights over this Contribution as defined by +applicable law. + + + 6.3 OVER THE RELATED MODULES + +The Licensee who develops a Related Module is the owner of the +intellectual property rights over this Related Module as defined by +applicable law and is free to choose the type of agreement that shall +govern its distribution under the conditions defined in Article 5.3.3. + + + 6.4 NOTICE OF RIGHTS + +The Licensee expressly undertakes: + + 1. not to remove, or modify, in any manner, the intellectual property + notices attached to the Software; + + 2. to reproduce said notices, in an identical manner, in the copies + of the Software modified or not; + + 3. to ensure that use of the Software, its intellectual property + notices and the fact that it is governed by the Agreement is + indicated in a text that is easily accessible, specifically from + the interface of any Derivative Software. + +The Licensee undertakes not to directly or indirectly infringe the +intellectual property rights of the Holder and/or Contributors on the +Software and to take, where applicable, vis-à-vis its staff, any and all +measures required to ensure respect of said intellectual property rights +of the Holder and/or Contributors. + + + Article 7 - RELATED SERVICES + +7.1 Under no circumstances shall the Agreement oblige the Licensor to +provide technical assistance or maintenance services for the Software. + +However, the Licensor is entitled to offer this type of services. The +terms and conditions of such technical assistance, and/or such +maintenance, shall be set forth in a separate instrument. Only the +Licensor offering said maintenance and/or technical assistance services +shall incur liability therefor. + +7.2 Similarly, any Licensor is entitled to offer to its licensees, under +its sole responsibility, a warranty, that shall only be binding upon +itself, for the redistribution of the Software and/or the Modified +Software, under terms and conditions that it is free to decide. Said +warranty, and the financial terms and conditions of its application, +shall be subject of a separate instrument executed between the Licensor +and the Licensee. + + + Article 8 - LIABILITY + +8.1 Subject to the provisions of Article 8.2, the Licensee shall be +entitled to claim compensation for any direct loss it may have suffered +from the Software as a result of a fault on the part of the relevant +Licensor, subject to providing evidence thereof. + +8.2 The Licensor's liability is limited to the commitments made under +this Agreement and shall not be incurred as a result of in particular: +(i) loss due the Licensee's total or partial failure to fulfill its +obligations, (ii) direct or consequential loss that is suffered by the +Licensee due to the use or performance of the Software, and (iii) more +generally, any consequential loss. In particular the Parties expressly +agree that any or all pecuniary or business loss (i.e. loss of data, +loss of profits, operating loss, loss of customers or orders, +opportunity cost, any disturbance to business activities) or any or all +legal proceedings instituted against the Licensee by a third party, +shall constitute consequential loss and shall not provide entitlement to +any or all compensation from the Licensor. + + + Article 9 - WARRANTY + +9.1 The Licensee acknowledges that the scientific and technical +state-of-the-art when the Software was distributed did not enable all +possible uses to be tested and verified, nor for the presence of +possible defects to be detected. In this respect, the Licensee's +attention has been drawn to the risks associated with loading, using, +modifying and/or developing and reproducing the Software which are +reserved for experienced users. + +The Licensee shall be responsible for verifying, by any or all means, +the suitability of the product for its requirements, its good working +order, and for ensuring that it shall not cause damage to either persons +or properties. + +9.2 The Licensor hereby represents, in good faith, that it is entitled +to grant all the rights over the Software (including in particular the +rights set forth in Article 5). + +9.3 The Licensee acknowledges that the Software is supplied "as is" by +the Licensor without any other express or tacit warranty, other than +that provided for in Article 9.2 and, in particular, without any warranty +as to its commercial value, its secured, safe, innovative or relevant +nature. + +Specifically, the Licensor does not warrant that the Software is free +from any error, that it will operate without interruption, that it will +be compatible with the Licensee's own equipment and software +configuration, nor that it will meet the Licensee's requirements. + +9.4 The Licensor does not either expressly or tacitly warrant that the +Software does not infringe any third party intellectual property right +relating to a patent, software or any other property right. Therefore, +the Licensor disclaims any and all liability towards the Licensee +arising out of any or all proceedings for infringement that may be +instituted in respect of the use, modification and redistribution of the +Software. Nevertheless, should such proceedings be instituted against +the Licensee, the Licensor shall provide it with technical and legal +assistance for its defense. Such technical and legal assistance shall be +decided on a case-by-case basis between the relevant Licensor and the +Licensee pursuant to a memorandum of understanding. The Licensor +disclaims any and all liability as regards the Licensee's use of the +name of the Software. No warranty is given as regards the existence of +prior rights over the name of the Software or as regards the existence +of a trademark. + + + Article 10 - TERMINATION + +10.1 In the event of a breach by the Licensee of its obligations +hereunder, the Licensor may automatically terminate this Agreement +thirty (30) days after notice has been sent to the Licensee and has +remained ineffective. + +10.2 A Licensee whose Agreement is terminated shall no longer be +authorized to use, modify or distribute the Software. However, any +licenses that it may have granted prior to termination of the Agreement +shall remain valid subject to their having been granted in compliance +with the terms and conditions hereof. + + + Article 11 - MISCELLANEOUS + + + 11.1 EXCUSABLE EVENTS + +Neither Party shall be liable for any or all delay, or failure to +perform the Agreement, that may be attributable to an event of force +majeure, an act of God or an outside cause, such as defective +functioning or interruptions of the electricity or telecommunications +networks, network paralysis following a virus attack, intervention by +government authorities, natural disasters, water damage, earthquakes, +fire, explosions, strikes and labor unrest, war, etc. + +11.2 Any failure by either Party, on one or more occasions, to invoke +one or more of the provisions hereof, shall under no circumstances be +interpreted as being a waiver by the interested Party of its right to +invoke said provision(s) subsequently. + +11.3 The Agreement cancels and replaces any or all previous agreements, +whether written or oral, between the Parties and having the same +purpose, and constitutes the entirety of the agreement between said +Parties concerning said purpose. No supplement or modification to the +terms and conditions hereof shall be effective as between the Parties +unless it is made in writing and signed by their duly authorized +representatives. + +11.4 In the event that one or more of the provisions hereof were to +conflict with a current or future applicable act or legislative text, +said act or legislative text shall prevail, and the Parties shall make +the necessary amendments so as to comply with said act or legislative +text. All other provisions shall remain effective. Similarly, invalidity +of a provision of the Agreement, for any reason whatsoever, shall not +cause the Agreement as a whole to be invalid. + + + 11.5 LANGUAGE + +The Agreement is drafted in both French and English and both versions +are deemed authentic. + + + Article 12 - NEW VERSIONS OF THE AGREEMENT + +12.1 Any person is authorized to duplicate and distribute copies of this +Agreement. + +12.2 So as to ensure coherence, the wording of this Agreement is +protected and may only be modified by the authors of the License, who +reserve the right to periodically publish updates or new versions of the +Agreement, each with a separate number. These subsequent versions may +address new issues encountered by Free Software. + +12.3 Any Software distributed under a given version of the Agreement may +only be subsequently distributed under the same version of the Agreement +or a subsequent version. + + + Article 13 - GOVERNING LAW AND JURISDICTION + +13.1 The Agreement is governed by French law. The Parties agree to +endeavor to seek an amicable solution to any disagreements or disputes +that may arise during the performance of the Agreement. + +13.2 Failing an amicable solution within two (2) months as from their +occurrence, and unless emergency proceedings are necessary, the +disagreements or disputes shall be referred to the Paris Courts having +jurisdiction, by the more diligent Party. + + +Version 1.0 dated 2006-09-05. diff --git a/Copyright b/Copyright deleted file mode 100644 index a0fec18..0000000 --- a/Copyright +++ /dev/null @@ -1,10 +0,0 @@ -Copyright (c) 2017-2018 IRT AESE (IRT Saint Exupéry). -All rights reserved. This program and the accompanying materials -are made available under the terms of the -CeCILL-C V1 - -which accompanies this distribution, and is available at -http://www.cecill.info/licences/Licence_CeCILL-C_V1-fr.html - -Contributors: -Alexandre Albore – Initial contribution \ No newline at end of file diff --git a/LGPL-v2.txt b/LGPL-v2.txt new file mode 100644 index 0000000..f4fac14 --- /dev/null +++ b/LGPL-v2.txt @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/LICENSES.md b/LICENSES.md new file mode 100644 index 0000000..89f27f1 --- /dev/null +++ b/LICENSES.md @@ -0,0 +1,143 @@ +# Copyrights and licensing + +## Altarica / Fiacre translator +The Altarica / Fiacre translator is copyright 2015-2017 ONERA (the French Aerospace Lab) and IRT Saint Exupéry. +All rights reserved. It is distributed under the terms of the CeCILL-C license. +See the accompanying file CeCILL-C.txt, +or . + +## Third party components + +### Boost under the terms of BOOST license : + + Boost Software License - Version 1.0 - August 17th, 2003 + + Permission is hereby granted, free of charge, to any person or organization + obtaining a copy of the software and accompanying documentation covered by + this license (the "Software") to use, reproduce, display, distribute, + execute, and transmit the Software, and to prepare derivative works of the + Software, and to permit third-parties to whom the Software is furnished to + do so, all subject to the following: + + The copyright notices in the Software and this entire statement, including + the above license grant, this restriction and the following disclaimer, + must be included in all copies of the Software, in whole or in part, and + all derivative works of the Software, unless such copies or derivative + works are solely in the form of machine-executable object code generated by + a source language processor. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +### Buddy 2.4 + + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. + +### WxScintilla-1.69.2 from codelite-2.7.0.4375 and Wxshapeframework 1.9.2 + + https://opensource.org/licenses/WXwindows + + wxWindows Library Licence, Version 3.1 + ====================================== + + Copyright (c) 1998-2005 Julian Smart, Robert Roebling et al + + Everyone is permitted to copy and distribute verbatim copies + of this licence document, but changing it is not allowed. + + WXWINDOWS LIBRARY LICENCE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public Licence as published by + the Free Software Foundation; either version 2 of the Licence, or (at your + option) any later version. + + This library is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + Licence for more details. + + You should have received a copy of the GNU Library General Public Licence + along with this software, usually in a file named COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth + Floor, Boston, MA 02110-1301 USA. + + EXCEPTION NOTICE + + 1. As a special exception, the copyright holders of this library give + permission for additional uses of the text contained in this release of the + library as licenced under the wxWindows Library Licence, applying either + version 3.1 of the Licence, or (at your option) any later version of the + Licence as published by the copyright holders of version 3.1 of the Licence + document. + + 2. The exception is that you may use, copy, link, modify and distribute + under your own terms, binary object code versions of works based on the + Library. + + 3. If you copy code from files distributed under the terms of the GNU + General Public Licence or the GNU Library General Public Licence into a + copy of this library, as this licence permits, the exception does not apply + to the code that you add in this way. To avoid misleading anyone as to the + status of such modified files, you must delete this exception notice from + such code and/or adjust the licensing conditions notice accordingly. + + 4. If you write modifications of your own for this library, it is your + choice whether to permit this exception to apply to your modifications. If + you do not wish that, you must delete the exception notice from such code + and/or adjust the licensing conditions notice accordingly. + +### Scintilla 1.62 + + License for Scintilla and SciTE + + Copyright 1998-2003 by Neil Hodgson + + All Rights Reserved + + Permission to use, copy, modify, and distribute this software and its + documentation for any purpose and without fee is hereby granted, + provided that the above copyright notice appear in all copies and that + both that copyright notice and this permission notice appear in + supporting documentation. + + NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY + SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + OR PERFORMANCE OF THIS SOFTWARE. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..d7b1789 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# What are the prerequisites to build altarica_epoch? +On Linux Ubuntu 16.04.1 LTS, the following packages are required to build altarica_epoch: build-essential, flex, bison, cmake, gcc/g++/gfortran 5.4.0, libsuitesparse-dev, libxml-dev, libglib2.0-dev, libsigc++-2.0-dev, libglibmm-2.4-dev, libxml++2.6-dev and pkg-config. + + sudo apt install build-essential flex bison cmake gcc-5 g++-5 gfortran-5 libsuitesparse-dev libxml-dev libglib2.0-dev libsigc++-2.0-dev libglibmm-2.4-dev libxml++2.6-dev pkg-config + +# How to build altarica_epoch? +altarica_epoch uses CMake build system. It can be built with the following commands: + + cd altarica_epoch + cmake ./CMakeList.txt + make + +# How to launch altarica_epoch? +You can get the inline help with: + + src/console/epochnogui --help + \ No newline at end of file diff --git a/TODO b/TODO new file mode 100644 index 0000000..f346e7e --- /dev/null +++ b/TODO @@ -0,0 +1,3 @@ +- Min/Max in renamings +- Special handlings of boolean types in PRISM operators creators + diff --git a/config/FindGlib.cmake b/config/FindGlib.cmake new file mode 100644 index 0000000..d3547d5 --- /dev/null +++ b/config/FindGlib.cmake @@ -0,0 +1,39 @@ +# - Try to find Glib-2.0 (with gobject) +# Once done, this will define +# +# Glib_FOUND - system has Glib +# Glib_INCLUDE_DIRS - the Glib include directories +# Glib_LIBRARIES - link these to use Glib + +include(LibFindMacros) + +# Use pkg-config to get hints about paths +libfind_pkg_check_modules(Glib_PKGCONF glib-2.0) + +# Main include dir +find_path(Glib_INCLUDE_DIR + NAMES glib.h + PATHS ${Glib_PKGCONF_INCLUDE_DIRS} + PATH_SUFFIXES glib-2.0 +) + +# Glib-related libraries also use a separate config header, which is in lib dir +find_path(GlibConfig_INCLUDE_DIR + NAMES glibconfig.h + PATHS ${Glib_PKGCONF_INCLUDE_DIRS} /usr + PATH_SUFFIXES lib/glib-2.0/include +) + +# Finally the library itself +find_library(Glib_LIBRARY + NAMES glib-2.0 + PATHS ${Glib_PKGCONF_LIBRARY_DIRS} +) + +# Set the include dir variables and the libraries and let libfind_process do the rest. +# NOTE: Singular variables for this library, plural for libraries this this lib depends on. +set(Glib_PROCESS_INCLUDES Glib_INCLUDE_DIR GlibConfig_INCLUDE_DIR) +set(Glib_PROCESS_LIBS Glib_LIBRARY) +libfind_process(Glib) + + diff --git a/config/FindGlibmm.cmake b/config/FindGlibmm.cmake new file mode 100644 index 0000000..1615bc2 --- /dev/null +++ b/config/FindGlibmm.cmake @@ -0,0 +1,38 @@ +# - Try to find Glibmm-2.4 +# Once done, this will define +# +# Glibmm_FOUND - system has Glibmm +# Glibmm_INCLUDE_DIRS - the Glibmm include directories +# Glibmm_LIBRARIES - link these to use Glibmm + +include(LibFindMacros) + +# Dependencies +libfind_package(Glibmm Glib) +libfind_package(Glibmm SigC++) + +# Use pkg-config to get hints about paths +libfind_pkg_check_modules(Glibmm_PKGCONF glibmm-2.4) + +# Main include dir +find_path(Glibmm_INCLUDE_DIR + NAMES glibmm/main.h + PATHS ${Glibmm_PKGCONF_INCLUDE_DIRS} + PATH_SUFFIXES glibmm-2.4 +) + +# Glib-related libraries also use a separate config header, which is in lib dir +find_path(GlibmmConfig_INCLUDE_DIR + NAMES glibmmconfig.h + PATHS ${Glibmm_PKGCONF_INCLUDE_DIRS} /usr + PATH_SUFFIXES lib/glibmm-2.4/include +) + +libfind_library(Glibmm glibmm 2.4) + +# Set the include dir variables and the libraries and let libfind_process do the rest. +# NOTE: Singular variables for this library, plural for libraries this this lib depends on. +set(Glibmm_PROCESS_INCLUDES Glibmm_INCLUDE_DIR GlibmmConfig_INCLUDE_DIR Glib_INCLUDE_DIRS SigC++_INCLUDE_DIRS) +set(Glibmm_PROCESS_LIBS Glibmm_LIBRARY Glib_LIBRARIES SigC++_LIBRARIES) +libfind_process(Glibmm) + diff --git a/config/FindLibXML++.cmake b/config/FindLibXML++.cmake new file mode 100644 index 0000000..7d6c47f --- /dev/null +++ b/config/FindLibXML++.cmake @@ -0,0 +1,41 @@ +# - Try to find LibXML++ 2.6 +# Once done, this will define +# +# LibXML++_FOUND - system has LibXML++ +# LibXML++_INCLUDE_DIRS - the LibXML++ include directories +# LibXML++_LIBRARIES - link these to use LibXML++ + +include(LibFindMacros) + +# Dependencies +libfind_package(LibXML++ LibXML2) +libfind_package(LibXML++ Glibmm) + +# Use pkg-config to get hints about paths +libfind_pkg_check_modules(LibXML++_PKGCONF libxml++-2.6) + +# Main include dir +find_path(LibXML++_INCLUDE_DIR + NAMES libxml++/libxml++.h + PATHS ${LibXML++_PKGCONF_INCLUDE_DIRS} + PATH_SUFFIXES libxml++-2.6 + ) + +# Glib-related libraries also use a separate config header, which is in lib dir +find_path(LibXML++Config_INCLUDE_DIR + NAMES libxml++config.h + PATHS ${LibXML++_PKGCONF_INCLUDE_DIRS} /usr + PATH_SUFFIXES lib/libxml++-2.6/include + ) + +# Finally the library itself +find_library(LibXML++_LIBRARY + NAMES xml++-2.6 + PATHS ${LibXML++_PKGCONF_LIBRARY_DIRS} + ) + +# Set the include dir variables and the libraries and let libfind_process do the rest. +# NOTE: Singular variables for this library, plural for libraries this this lib depends on. +set(LibXML++_PROCESS_INCLUDES LibXML++_INCLUDE_DIR LibXML++Config_INCLUDE_DIR LibXML2_INCLUDE_DIRS Glibmm_INCLUDE_DIRS) +set(LibXML++_PROCESS_LIBS LibXML++_LIBRARY LibXML2_LIBRARIES Glibmm_LIBRARIES) +libfind_process(LibXML++) diff --git a/config/FindLibXML2.cmake b/config/FindLibXML2.cmake new file mode 100644 index 0000000..013b278 --- /dev/null +++ b/config/FindLibXML2.cmake @@ -0,0 +1,90 @@ +# - Try to find libxml2 +# Once done this will define +# +# LibXML2_FOUND - system has xml2 +# LibXML2_INCLUDE_DIRS - the xml2 include directory +# LibXML2_LIBRARIES - Link these to use xml2 +# LibXML2_DEFINITIONS - Compiler switches required for using xml2 +# +# Copyright (c) 2008 Andreas Schneider +# Modified for other libraries by Lasse Kärkkäinen +# +# Redistribution and use is allowed according to the terms of the New +# BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# + + +if (LibXML2_LIBRARIES AND LibXML2_INCLUDE_DIRS) + # in cache already + set(LibXML2_FOUND TRUE) +else (LibXML2_LIBRARIES AND LibXML2_INCLUDE_DIRS) + # use pkg-config to get the directories and then use these values + # in the FIND_PATH() and FIND_LIBRARY() calls + if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + include(UsePkgConfig) + pkgconfig(libxml-2.0 _LibXML2_INCLUDEDIR _LibXML2_LIBDIR _LibXML2_LDFLAGS _LibXML2_CFLAGS) + else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + find_package(PkgConfig) + if (PKG_CONFIG_FOUND) + pkg_check_modules(_LIBXML2 libxml-2.0) + endif (PKG_CONFIG_FOUND) + endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + find_path(LibXML2_INCLUDE_DIR + NAMES + libxml/xpath.h + PATHS + ${_LibXML2_INCLUDEDIR} + /usr/include + /usr/local/include + /opt/local/include + /sw/include + PATH_SUFFIXES + libxml2 + ) + + find_library(LibXML2_LIBRARY + NAMES + xml2 + PATHS + ${_LibXML2_LIBDIR} + /usr/lib + /usr/local/lib + /opt/local/lib + /sw/lib + ) + + if (LibXML2_LIBRARY) + set(LibXML2_FOUND TRUE) + endif (LibXML2_LIBRARY) + + set(LibXML2_INCLUDE_DIRS + ${LibXML2_INCLUDE_DIR} + ) + + if (LibXML2_FOUND) + set(LibXML2_LIBRARIES + ${LibXML2_LIBRARIES} + ${LibXML2_LIBRARY} + ) + endif (LibXML2_FOUND) + + if (LibXML2_INCLUDE_DIRS AND LibXML2_LIBRARIES) + set(LibXML2_FOUND TRUE) + endif (LibXML2_INCLUDE_DIRS AND LibXML2_LIBRARIES) + + if (LibXML2_FOUND) + if (NOT LibXML2_FIND_QUIETLY) + message(STATUS "Found libxml2: ${LibXML2_LIBRARY}") + endif (NOT LibXML2_FIND_QUIETLY) + else (LibXML2_FOUND) + if (LibXML2_FIND_REQUIRED) + message(FATAL_ERROR "Could not find libxml2") + endif (LibXML2_FIND_REQUIRED) + endif (LibXML2_FOUND) + + # show the LibXML2_INCLUDE_DIRS and LibXML2_LIBRARIES variables only in the advanced view + mark_as_advanced(LibXML2_INCLUDE_DIRS LibXML2_LIBRARIES) + +endif (LibXML2_LIBRARIES AND LibXML2_INCLUDE_DIRS) + diff --git a/config/FindPLplot.cmake b/config/FindPLplot.cmake new file mode 100644 index 0000000..006a102 --- /dev/null +++ b/config/FindPLplot.cmake @@ -0,0 +1,75 @@ +# Find PLplot header and library. + +# This module defines the following uncached variables: +# PLplot_FOUND, if false, do not try to use PLplot. +# PLplot_INCLUDE_DIRS, where to find plplot.h. +# PLplot_LIBRARIES, the libraries to link against to use PLplot +# PLplot_LIBRARY_DIRS, the directory where the PLplot library is found. + +FIND_PATH( + PLplot_INCLUDE_DIR + NAMES plplot.h + PATHS /usr/local/include /usr/include + PATH_SUFFIXES plplot +) + +IF( PLplot_INCLUDE_DIR ) + find_library( PLplot_LIBRARY + NAMES plplotd + PATHS /usr/local/lib /usr/lib + ) + if(PLplot_LIBRARY) + set( PLplot_LIBRARY_DIR "" ) + get_filename_component(PLplot_LIBRARY_DIRS ${PLplot_LIBRARY} PATH) + # Set uncached variables as per standard. + set(PLplot_FOUND ON) + set(PLplot_INCLUDE_DIRS ${PLplot_INCLUDE_DIR}) + set(PLplot_LIBRARIES ${PLplot_LIBRARY}) + endif(PLplot_LIBRARY) + + # find cxx bindings + find_library( PLplot_cxx_LIBRARY + NAMES plplotcxxd + PATHS /usr/local/lib /usr/lib + ) + if( PLplot_cxx_LIBRARY ) + set( PLplot_LIBRARIES ${PLplot_LIBRARIES} ${PLplot_cxx_LIBRARY} ) + endif( PLplot_cxx_LIBRARY ) + + # find f77 bindings + find_library( PLplot_f77_LIBRARY + NAMES plplotf77d + PATHS /usr/local/lib /usr/lib + ) + if( PLplot_f77_LIBRARY ) + set( PLplot_LIBRARIES ${PLplot_LIBRARIES} ${PLplot_f77_LIBRARY} ) + endif( PLplot_f77_LIBRARY ) + + # find f90 bindings + find_library( PLplot_f90_LIBRARY + NAMES plplotf90d + PATHS /usr/local/lib /usr/lib + ) + if( PLplot_f90_LIBRARY ) + set( PLplot_LIBRARIES ${PLplot_LIBRARIES} ${PLplot_f90_LIBRARY} ) + endif( PLplot_f90_LIBRARY ) + + # find wxwidgets bindings + find_library( PLplot_wxwidgets_LIBRARY + NAMES plplotwxwidgetsd + PATHS /usr/local/lib /usr/lib + ) + if( PLplot_wxwidgets_LIBRARY ) + set( PLplot_LIBRARIES ${PLplot_LIBRARIES} ${PLplot_wxwidgets_LIBRARY} ) + endif( PLplot_wxwidgets_LIBRARY ) +endif(PLplot_INCLUDE_DIR) + +if(PLplot_FOUND) + if(NOT PLplot_FIND_QUIETLY) + message(STATUS "FindPLplot: Found both PLplot headers and library") + endif(NOT PLplot_FIND_QUIETLY) +else(PLplot_FOUND) + if(PLplot_FIND_REQUIRED) + message(FATAL_ERROR "FindPLplot: Could not find PLplot headers or library") + endif(PLplot_FIND_REQUIRED) +endif(PLplot_FOUND) diff --git a/config/FindSigC++.cmake b/config/FindSigC++.cmake new file mode 100644 index 0000000..7d34d9e --- /dev/null +++ b/config/FindSigC++.cmake @@ -0,0 +1,34 @@ +# - Try to find SigC++-2.0 +# Once done, this will define +# +# SigC++_FOUND - system has SigC++ +# SigC++_INCLUDE_DIRS - the SigC++ include directories +# SigC++_LIBRARIES - link these to use SigC++ + +include(LibFindMacros) + +# Use pkg-config to get hints about paths +libfind_pkg_check_modules(SigC++_PKGCONF sigc++-2.0) + +# Main include dir +find_path(SigC++_INCLUDE_DIR + NAMES sigc++/sigc++.h + PATHS ${SigC++_PKGCONF_INCLUDE_DIRS} + PATH_SUFFIXES sigc++-2.0 +) + +# Glib-related libraries also use a separate config header, which is in lib dir +find_path(SigC++Config_INCLUDE_DIR + NAMES sigc++config.h + PATHS ${SigC++_PKGCONF_INCLUDE_DIRS} /usr + PATH_SUFFIXES lib/sigc++-2.0/include +) + +libfind_library(SigC++ sigc 2.0) + +# Set the include dir variables and the libraries and let libfind_process do the rest. +# NOTE: Singular variables for this library, plural for libraries this this lib depends on. +set(SigC++_PROCESS_INCLUDES SigC++_INCLUDE_DIR SigC++Config_INCLUDE_DIR) +set(SigC++_PROCESS_LIBS SigC++_LIBRARY) +libfind_process(SigC++) + diff --git a/config/FindUMFPACK.cmake b/config/FindUMFPACK.cmake new file mode 100644 index 0000000..238f203 --- /dev/null +++ b/config/FindUMFPACK.cmake @@ -0,0 +1,100 @@ +SET( UMFPACK_FOUND "NO" ) + +if (UMFPACK_INCLUDES AND UMFPACK_LIBRARIES) + set(UMFPACK_FIND_QUIETLY TRUE) +endif (UMFPACK_INCLUDES AND UMFPACK_LIBRARIES) + +find_package(BLAS REQUIRED) + +if(BLAS_FOUND) + + find_path(UMFPACK_INCLUDES + NAMES + umfpack.h + PATHS + $ENV{UMFPACKDIR} + ${INCLUDE_INSTALL_DIR} + PATH_SUFFIXES + suitesparse + ) + + find_library(UMFPACK_LIBRARIES umfpack PATHS $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR}) + + if(UMFPACK_LIBRARIES) + + get_filename_component(UMFPACK_LIBDIR ${UMFPACK_LIBRARIES} PATH) + + find_library(AMD_LIBRARY amd PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR}) + if (AMD_LIBRARY) + set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${AMD_LIBRARY}) + else (AMD_LIBRARY) + MESSAGE ( FATAL_ERROR "AMD library not found!" ) + set(UMFPACK_LIBRARIES) + endif (AMD_LIBRARY) + + find_library(CHOLMOD_LIBRARY cholmod PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR}) + if (CHOLMOD_LIBRARY) + set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${CHOLMOD_LIBRARY}) + else (CHOLMOD_LIBRARY) + MESSAGE ( FATAL_ERROR "CHOLAMD library not found!" ) + set(UMFPACK_LIBRARIES) + endif (CHOLMOD_LIBRARY) + + find_library(COLAMD_LIBRARY colamd PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR}) + if (COLAMD_LIBRARY) + set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${COLAMD_LIBRARY}) + else (COLAMD_LIBRARY) + MESSAGE ( FATAL_ERROR "COLAMD library not found!" ) + set(UMFPACK_LIBRARIES) + endif (COLAMD_LIBRARY) + + find_library(CAMD_LIBRARY camd PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR}) + if (CAMD_LIBRARY) + set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${CAMD_LIBRARY}) + else (CAMD_LIBRARY) + MESSAGE ( FATAL_ERROR "CAMD library not found!" ) + set(UMFPACK_LIBRARIES) + endif (CAMD_LIBRARY) + + find_library(CCOLAMD_LIBRARY ccolamd PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR}) + if (CCOLAMD_LIBRARY) + set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${CCOLAMD_LIBRARY}) + else (CCOLAMD_LIBRARY) + MESSAGE ( FATAL_ERROR "CCOLAMD library not found!" ) + set(UMFPACK_LIBRARIES) + endif (CCOLAMD_LIBRARY) + + find_library(METIS_LIBRARY metis PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR}) + if (METIS_LIBRARY) + set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${METIS_LIBRARY}) + else (METIS_LIBRARY) + MESSAGE ( STATUS "METIS library not found!" ) +# set(UMFPACK_LIBRARIES) + endif (METIS_LIBRARY) + + find_library(SPARSECONFIG_LIBRARY suitesparseconfig PATHS ${UMFPACK_LIBDIR} $ENV{UMFPACKDIR} ${LIB_INSTALL_DIR}) + if (SPARSECONFIG_LIBRARY) + set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${SPARSECONFIG_LIBRARY}) + else (SPARSECONFIG_LIBRARY) + message ("paths : " ${PATHS}) + MESSAGE ( FATAL_ERROR "SPARSECONFIG library not found!" ) + set(UMFPACK_LIBRARIES) + endif (SPARSECONFIG_LIBRARY) + + + endif(UMFPACK_LIBRARIES) + + if(UMFPACK_LIBRARIES) + set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARIES} ${BLAS_LIBRARIES} gfortran) + SET( UMFPACK_FOUND "YES" ) + endif(UMFPACK_LIBRARIES) + +endif(BLAS_FOUND) + + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(UMFPACK DEFAULT_MSG + UMFPACK_INCLUDES UMFPACK_LIBRARIES) + +mark_as_advanced(UMFPACK_INCLUDES UMFPACK_LIBRARIES AMD_LIBRARY COLAMD_LIBRARY) + diff --git a/config/FindwxWidgetsCustom.cmake b/config/FindwxWidgetsCustom.cmake new file mode 100644 index 0000000..b964006 --- /dev/null +++ b/config/FindwxWidgetsCustom.cmake @@ -0,0 +1,1086 @@ +#.rst: +# FindwxWidgets +# ------------- +# +# Find a wxWidgets (a.k.a., wxWindows) installation. +# +# This module finds if wxWidgets is installed and selects a default +# configuration to use. wxWidgets is a modular library. To specify the +# modules that you will use, you need to name them as components to the +# package: +# +# find_package(wxWidgets COMPONENTS core base ...) +# +# There are two search branches: a windows style and a unix style. For +# windows, the following variables are searched for and set to defaults +# in case of multiple choices. Change them if the defaults are not +# desired (i.e., these are the only variables you should change to +# select a configuration): +# +# :: +# +# wxWidgets_ROOT_DIR - Base wxWidgets directory +# (e.g., C:/wxWidgets-2.6.3). +# wxWidgets_LIB_DIR - Path to wxWidgets libraries +# (e.g., C:/wxWidgets-2.6.3/lib/vc_lib). +# wxWidgets_CONFIGURATION - Configuration to use +# (e.g., msw, mswd, mswu, mswunivud, etc.) +# wxWidgets_EXCLUDE_COMMON_LIBRARIES +# - Set to TRUE to exclude linking of +# commonly required libs (e.g., png tiff +# jpeg zlib regex expat). +# +# +# +# For unix style it uses the wx-config utility. You can select between +# debug/release, unicode/ansi, universal/non-universal, and +# static/shared in the QtDialog or ccmake interfaces by turning ON/OFF +# the following variables: +# +# :: +# +# wxWidgets_USE_DEBUG +# wxWidgets_USE_UNICODE +# wxWidgets_USE_UNIVERSAL +# wxWidgets_USE_STATIC +# +# +# +# There is also a wxWidgets_CONFIG_OPTIONS variable for all other +# options that need to be passed to the wx-config utility. For example, +# to use the base toolkit found in the /usr/local path, set the variable +# (before calling the FIND_PACKAGE command) as such: +# +# :: +# +# set(wxWidgets_CONFIG_OPTIONS --toolkit=base --prefix=/usr) +# +# +# +# The following are set after the configuration is done for both windows +# and unix style: +# +# :: +# +# wxWidgets_FOUND - Set to TRUE if wxWidgets was found. +# wxWidgets_INCLUDE_DIRS - Include directories for WIN32 +# i.e., where to find "wx/wx.h" and +# "wx/setup.h"; possibly empty for unices. +# wxWidgets_LIBRARIES - Path to the wxWidgets libraries. +# wxWidgets_LIBRARY_DIRS - compile time link dirs, useful for +# rpath on UNIX. Typically an empty string +# in WIN32 environment. +# wxWidgets_DEFINITIONS - Contains defines required to compile/link +# against WX, e.g. WXUSINGDLL +# wxWidgets_DEFINITIONS_DEBUG- Contains defines required to compile/link +# against WX debug builds, e.g. __WXDEBUG__ +# wxWidgets_CXX_FLAGS - Include dirs and compiler flags for +# unices, empty on WIN32. Essentially +# "`wx-config --cxxflags`". +# wxWidgets_USE_FILE - Convenience include file. +# +# +# +# Sample usage: +# +# :: +# +# # Note that for MinGW users the order of libs is important! +# find_package(wxWidgets COMPONENTS net gl core base) +# if(wxWidgets_FOUND) +# include(${wxWidgets_USE_FILE}) +# # and for each of your dependent executable/library targets: +# target_link_libraries( ${wxWidgets_LIBRARIES}) +# endif() +# +# +# +# If wxWidgets is required (i.e., not an optional part): +# +# :: +# +# find_package(wxWidgets REQUIRED net gl core base) +# include(${wxWidgets_USE_FILE}) +# # and for each of your dependent executable/library targets: +# target_link_libraries( ${wxWidgets_LIBRARIES}) + +#============================================================================= +# Copyright 2004-2009 Kitware, Inc. +# Copyright 2007-2009 Miguel A. Figueroa-Villanueva +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +# +# FIXME: check this and provide a correct sample usage... +# Remember to connect back to the upper text. +# Sample usage with monolithic wx build: +# +# find_package(wxWidgets COMPONENTS mono) +# ... + +# NOTES +# +# This module has been tested on the WIN32 platform with wxWidgets +# 2.6.2, 2.6.3, and 2.5.3. However, it has been designed to +# easily extend support to all possible builds, e.g., static/shared, +# debug/release, unicode, universal, multilib/monolithic, etc.. +# +# If you want to use the module and your build type is not supported +# out-of-the-box, please contact me to exchange information on how +# your system is setup and I'll try to add support for it. +# +# AUTHOR +# +# Miguel A. Figueroa-Villanueva (miguelf at ieee dot org). +# Jan Woetzel (jw at mip.informatik.uni-kiel.de). +# +# Based on previous works of: +# Jan Woetzel (FindwxWindows.cmake), +# Jorgen Bodde and Jerry Fath (FindwxWin.cmake). + +# TODO/ideas +# +# (1) Option/Setting to use all available wx libs +# In contrast to expert developer who lists the +# minimal set of required libs in wxWidgets_USE_LIBS +# there is the newbie user: +# - who just wants to link against WX with more 'magic' +# - doesn't know the internal structure of WX or how it was built, +# in particular if it is monolithic or not +# - want to link against all available WX libs +# Basically, the intent here is to mimic what wx-config would do by +# default (i.e., `wx-config --libs`). +# +# Possible solution: +# Add a reserved keyword "std" that initializes to what wx-config +# would default to. If the user has not set the wxWidgets_USE_LIBS, +# default to "std" instead of "base core" as it is now. To implement +# "std" will basically boil down to a FOR_EACH lib-FOUND, but maybe +# checking whether a minimal set was found. + + +# FIXME: This and all the DBG_MSG calls should be removed after the +# module stabilizes. +# +# Helper macro to control the debugging output globally. There are +# two versions for controlling how verbose your output should be. +macro(DBG_MSG _MSG) +# message(STATUS +# "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): ${_MSG}") +endmacro() +macro(DBG_MSG_V _MSG) +# message(STATUS +# "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): ${_MSG}") +endmacro() + +# Clear return values in case the module is loaded more than once. +set(wxWidgets_FOUND FALSE) +set(wxWidgets_INCLUDE_DIRS "") +set(wxWidgets_LIBRARIES "") +set(wxWidgets_LIBRARY_DIRS "") +set(wxWidgets_CXX_FLAGS "") + +# Using SYSTEM with INCLUDE_DIRECTORIES in conjunction with wxWidgets on +# the Mac produces compiler errors. Set wxWidgets_INCLUDE_DIRS_NO_SYSTEM +# to prevent UsewxWidgets.cmake from using SYSTEM. +# +# See cmake mailing list discussions for more info: +# http://www.cmake.org/pipermail/cmake/2008-April/021115.html +# http://www.cmake.org/pipermail/cmake/2008-April/021146.html +# +if(APPLE OR CMAKE_CXX_PLATFORM_ID MATCHES "OpenBSD") + set(wxWidgets_INCLUDE_DIRS_NO_SYSTEM 1) +endif() + +# DEPRECATED: This is a patch to support the DEPRECATED use of +# wxWidgets_USE_LIBS. +# +# If wxWidgets_USE_LIBS is set: +# - if using , then override wxWidgets_USE_LIBS +# - else set wxWidgets_FIND_COMPONENTS to wxWidgets_USE_LIBS +if(wxWidgets_USE_LIBS AND NOT wxWidgets_FIND_COMPONENTS) + set(wxWidgets_FIND_COMPONENTS ${wxWidgets_USE_LIBS}) +endif() +DBG_MSG("wxWidgets_FIND_COMPONENTS : ${wxWidgets_FIND_COMPONENTS}") + +# Add the convenience use file if available. +# +# Get dir of this file which may reside in: +# - CMAKE_MAKE_ROOT/Modules on CMake installation +# - CMAKE_MODULE_PATH if user prefers his own specialized version +set(wxWidgets_USE_FILE "") +get_filename_component( + wxWidgets_CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_FILE} PATH) +# Prefer an existing customized version, but the user might override +# the FindwxWidgets module and not the UsewxWidgets one. +if(EXISTS "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake") + set(wxWidgets_USE_FILE + "${wxWidgets_CURRENT_LIST_DIR}/UsewxWidgets.cmake") +else() + set(wxWidgets_USE_FILE UsewxWidgets) +endif() + +#===================================================================== +# Determine whether unix or win32 paths should be used +#===================================================================== +if(WIN32 AND NOT CYGWIN AND NOT MSYS AND NOT CMAKE_CROSSCOMPILING) + set(wxWidgets_FIND_STYLE "win32") +else() + set(wxWidgets_FIND_STYLE "unix") +endif() + +#===================================================================== +# WIN32_FIND_STYLE +#===================================================================== +if(wxWidgets_FIND_STYLE STREQUAL "win32") + # Useful common wx libs needed by almost all components. + set(wxWidgets_COMMON_LIBRARIES png tiff jpeg zlib regex expat) + + # DEPRECATED: Use find_package(wxWidgets COMPONENTS mono) instead. + if(NOT wxWidgets_FIND_COMPONENTS) + if(wxWidgets_USE_MONOLITHIC) + set(wxWidgets_FIND_COMPONENTS mono) + else() + set(wxWidgets_FIND_COMPONENTS core base) # this is default + endif() + endif() + + # Add the common (usually required libs) unless + # wxWidgets_EXCLUDE_COMMON_LIBRARIES has been set. + if(NOT wxWidgets_EXCLUDE_COMMON_LIBRARIES) + list(APPEND wxWidgets_FIND_COMPONENTS + ${wxWidgets_COMMON_LIBRARIES}) + endif() + + #------------------------------------------------------------------- + # WIN32: Helper MACROS + #------------------------------------------------------------------- + # + # Get filename components for a configuration. For example, + # if _CONFIGURATION = mswunivud, then _UNV=univ, _UCD=u _DBG=d + # if _CONFIGURATION = mswu, then _UNV="", _UCD=u _DBG="" + # + macro(WX_GET_NAME_COMPONENTS _CONFIGURATION _UNV _UCD _DBG) + string(REGEX MATCH "univ" ${_UNV} "${_CONFIGURATION}") + string(REGEX REPLACE "msw.*(u)[d]*$" "u" ${_UCD} "${_CONFIGURATION}") + if(${_UCD} STREQUAL ${_CONFIGURATION}) + set(${_UCD} "") + endif() + string(REGEX MATCH "d$" ${_DBG} "${_CONFIGURATION}") + endmacro() + + # + # Find libraries associated to a configuration. + # + macro(WX_FIND_LIBS _UNV _UCD _DBG) + DBG_MSG_V("m_unv = ${_UNV}") + DBG_MSG_V("m_ucd = ${_UCD}") + DBG_MSG_V("m_dbg = ${_DBG}") + + # FIXME: What if both regex libs are available. regex should be + # found outside the loop and only wx${LIB}${_UCD}${_DBG}. + # Find wxWidgets common libraries. + foreach(LIB ${wxWidgets_COMMON_LIBRARIES} scintilla) + find_library(WX_${LIB}${_DBG} + NAMES + wx${LIB}${_UCD}${_DBG} # for regex + wx${LIB}${_DBG} + PATHS ${WX_LIB_DIR} + NO_DEFAULT_PATH + ) + mark_as_advanced(WX_${LIB}${_DBG}) + endforeach() + + # Find wxWidgets multilib base libraries. + find_library(WX_base${_DBG} + NAMES + wxbase30${_UCD}${_DBG} + wxbase29${_UCD}${_DBG} + wxbase28${_UCD}${_DBG} + wxbase27${_UCD}${_DBG} + wxbase26${_UCD}${_DBG} + wxbase25${_UCD}${_DBG} + PATHS ${WX_LIB_DIR} + NO_DEFAULT_PATH + ) + mark_as_advanced(WX_base${_DBG}) + foreach(LIB net odbc xml) + find_library(WX_${LIB}${_DBG} + NAMES + wxbase30${_UCD}${_DBG}_${LIB} + wxbase29${_UCD}${_DBG}_${LIB} + wxbase28${_UCD}${_DBG}_${LIB} + wxbase27${_UCD}${_DBG}_${LIB} + wxbase26${_UCD}${_DBG}_${LIB} + wxbase25${_UCD}${_DBG}_${LIB} + PATHS ${WX_LIB_DIR} + NO_DEFAULT_PATH + ) + mark_as_advanced(WX_${LIB}${_DBG}) + endforeach() + + # Find wxWidgets monolithic library. + find_library(WX_mono${_DBG} + NAMES + wxmsw${_UNV}30${_UCD}${_DBG} + wxmsw${_UNV}29${_UCD}${_DBG} + wxmsw${_UNV}28${_UCD}${_DBG} + wxmsw${_UNV}27${_UCD}${_DBG} + wxmsw${_UNV}26${_UCD}${_DBG} + wxmsw${_UNV}25${_UCD}${_DBG} + PATHS ${WX_LIB_DIR} + NO_DEFAULT_PATH + ) + mark_as_advanced(WX_mono${_DBG}) + + # Find wxWidgets multilib libraries. + foreach(LIB core adv aui html media xrc dbgrid gl qa richtext + stc ribbon propgrid webview) + find_library(WX_${LIB}${_DBG} + NAMES + wxmsw${_UNV}30${_UCD}${_DBG}_${LIB} + wxmsw${_UNV}29${_UCD}${_DBG}_${LIB} + wxmsw${_UNV}28${_UCD}${_DBG}_${LIB} + wxmsw${_UNV}27${_UCD}${_DBG}_${LIB} + wxmsw${_UNV}26${_UCD}${_DBG}_${LIB} + wxmsw${_UNV}25${_UCD}${_DBG}_${LIB} + PATHS ${WX_LIB_DIR} + NO_DEFAULT_PATH + ) + mark_as_advanced(WX_${LIB}${_DBG}) + endforeach() + endmacro() + + # + # Clear all library paths, so that FIND_LIBRARY refinds them. + # + # Clear a lib, reset its found flag, and mark as advanced. + macro(WX_CLEAR_LIB _LIB) + set(${_LIB} "${_LIB}-NOTFOUND" CACHE FILEPATH "Cleared." FORCE) + set(${_LIB}_FOUND FALSE) + mark_as_advanced(${_LIB}) + endmacro() + # Clear all debug or release library paths (arguments are "d" or ""). + macro(WX_CLEAR_ALL_LIBS _DBG) + # Clear wxWidgets common libraries. + foreach(LIB ${wxWidgets_COMMON_LIBRARIES} scintilla) + WX_CLEAR_LIB(WX_${LIB}${_DBG}) + endforeach() + + # Clear wxWidgets multilib base libraries. + WX_CLEAR_LIB(WX_base${_DBG}) + foreach(LIB net odbc xml) + WX_CLEAR_LIB(WX_${LIB}${_DBG}) + endforeach() + + # Clear wxWidgets monolithic library. + WX_CLEAR_LIB(WX_mono${_DBG}) + + # Clear wxWidgets multilib libraries. + foreach(LIB core adv aui html media xrc dbgrid gl qa richtext + stc ribbon propgrid) + WX_CLEAR_LIB(WX_${LIB}${_DBG}) + endforeach() + endmacro() + # Clear all wxWidgets debug libraries. + macro(WX_CLEAR_ALL_DBG_LIBS) + WX_CLEAR_ALL_LIBS("d") + endmacro() + # Clear all wxWidgets release libraries. + macro(WX_CLEAR_ALL_REL_LIBS) + WX_CLEAR_ALL_LIBS("") + endmacro() + + # + # Set the wxWidgets_LIBRARIES variable. + # Also, Sets output variable wxWidgets_FOUND to FALSE if it fails. + # + macro(WX_SET_LIBRARIES _LIBS _DBG) + DBG_MSG_V("Looking for ${${_LIBS}}") + if(WX_USE_REL_AND_DBG) + foreach(LIB ${${_LIBS}}) + DBG_MSG_V("Searching for ${LIB} and ${LIB}d") + DBG_MSG_V("WX_${LIB} : ${WX_${LIB}}") + DBG_MSG_V("WX_${LIB}d : ${WX_${LIB}d}") + if(WX_${LIB} AND WX_${LIB}d) + DBG_MSG_V("Found ${LIB} and ${LIB}d") + list(APPEND wxWidgets_LIBRARIES + debug ${WX_${LIB}d} optimized ${WX_${LIB}} + ) + else() + DBG_MSG_V("- not found due to missing WX_${LIB}=${WX_${LIB}} or WX_${LIB}d=${WX_${LIB}d}") + set(wxWidgets_FOUND FALSE) + endif() + endforeach() + else() + foreach(LIB ${${_LIBS}}) + DBG_MSG_V("Searching for ${LIB}${_DBG}") + DBG_MSG_V("WX_${LIB}${_DBG} : ${WX_${LIB}${_DBG}}") + if(WX_${LIB}${_DBG}) + DBG_MSG_V("Found ${LIB}${_DBG}") + list(APPEND wxWidgets_LIBRARIES ${WX_${LIB}${_DBG}}) + else() + DBG_MSG_V( + "- not found due to missing WX_${LIB}${_DBG}=${WX_${LIB}${_DBG}}") + set(wxWidgets_FOUND FALSE) + endif() + endforeach() + endif() + + DBG_MSG_V("OpenGL") + list(FIND ${_LIBS} gl WX_USE_GL) + if(NOT WX_USE_GL EQUAL -1) + DBG_MSG_V("- is required.") + list(APPEND wxWidgets_LIBRARIES opengl32 glu32) + endif() + + list(APPEND wxWidgets_LIBRARIES winmm comctl32 rpcrt4 wsock32) + endmacro() + + #------------------------------------------------------------------- + # WIN32: Start actual work. + #------------------------------------------------------------------- + + # Look for an installation tree. + find_path(wxWidgets_ROOT_DIR + NAMES include/wx/wx.h + PATHS + ENV wxWidgets_ROOT_DIR + ENV WXWIN + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\wxWidgets_is1;Inno Setup: App Path]" # WX 2.6.x + C:/ + D:/ + ENV ProgramFiles + PATH_SUFFIXES + wxWidgets-3.0.0 + wxWidgets-2.9.5 + wxWidgets-2.9.4 + wxWidgets-2.9.3 + wxWidgets-2.9.2 + wxWidgets-2.9.1 + wxWidgets-2.9.0 + wxWidgets-2.8.9 + wxWidgets-2.8.8 + wxWidgets-2.8.7 + wxWidgets-2.8.6 + wxWidgets-2.8.5 + wxWidgets-2.8.4 + wxWidgets-2.8.3 + wxWidgets-2.8.2 + wxWidgets-2.8.1 + wxWidgets-2.8.0 + wxWidgets-2.7.4 + wxWidgets-2.7.3 + wxWidgets-2.7.2 + wxWidgets-2.7.1 + wxWidgets-2.7.0 + wxWidgets-2.7.0-1 + wxWidgets-2.6.4 + wxWidgets-2.6.3 + wxWidgets-2.6.2 + wxWidgets-2.6.1 + wxWidgets-2.5.4 + wxWidgets-2.5.3 + wxWidgets-2.5.2 + wxWidgets-2.5.1 + wxWidgets + DOC "wxWidgets base/installation directory" + ) + + # If wxWidgets_ROOT_DIR changed, clear lib dir. + if(NOT WX_ROOT_DIR STREQUAL wxWidgets_ROOT_DIR) + set(WX_ROOT_DIR ${wxWidgets_ROOT_DIR} + CACHE INTERNAL "wxWidgets_ROOT_DIR") + set(wxWidgets_LIB_DIR "wxWidgets_LIB_DIR-NOTFOUND" + CACHE PATH "Cleared." FORCE) + endif() + + if(WX_ROOT_DIR) + # Select one default tree inside the already determined wx tree. + # Prefer static/shared order usually consistent with build + # settings. + if(MINGW) + set(WX_LIB_DIR_PREFIX gcc) + elseif(CMAKE_CL_64) + set(WX_LIB_DIR_PREFIX vc_x64) + else() + set(WX_LIB_DIR_PREFIX vc) + endif() + if(BUILD_SHARED_LIBS) + find_path(wxWidgets_LIB_DIR + NAMES + msw/wx/setup.h + mswd/wx/setup.h + mswu/wx/setup.h + mswud/wx/setup.h + mswuniv/wx/setup.h + mswunivd/wx/setup.h + mswunivu/wx/setup.h + mswunivud/wx/setup.h + PATHS + ${WX_ROOT_DIR}/lib/${WX_LIB_DIR_PREFIX}_dll # prefer shared + ${WX_ROOT_DIR}/lib/${WX_LIB_DIR_PREFIX}_lib + DOC "Path to wxWidgets libraries" + NO_DEFAULT_PATH + ) + else() + find_path(wxWidgets_LIB_DIR + NAMES + msw/wx/setup.h + mswd/wx/setup.h + mswu/wx/setup.h + mswud/wx/setup.h + mswuniv/wx/setup.h + mswunivd/wx/setup.h + mswunivu/wx/setup.h + mswunivud/wx/setup.h + PATHS + ${WX_ROOT_DIR}/lib/${WX_LIB_DIR_PREFIX}_lib # prefer static + ${WX_ROOT_DIR}/lib/${WX_LIB_DIR_PREFIX}_dll + DOC "Path to wxWidgets libraries" + NO_DEFAULT_PATH + ) + endif() + + # If wxWidgets_LIB_DIR changed, clear all libraries. + if(NOT WX_LIB_DIR STREQUAL wxWidgets_LIB_DIR) + set(WX_LIB_DIR ${wxWidgets_LIB_DIR} CACHE INTERNAL "wxWidgets_LIB_DIR") + WX_CLEAR_ALL_DBG_LIBS() + WX_CLEAR_ALL_REL_LIBS() + endif() + + if(WX_LIB_DIR) + # If building shared libs, define WXUSINGDLL to use dllimport. + if(WX_LIB_DIR MATCHES "[dD][lL][lL]") + set(wxWidgets_DEFINITIONS WXUSINGDLL) + DBG_MSG_V("detected SHARED/DLL tree WX_LIB_DIR=${WX_LIB_DIR}") + endif() + + # Search for available configuration types. + foreach(CFG mswunivud mswunivd mswud mswd mswunivu mswuniv mswu msw) + set(WX_${CFG}_FOUND FALSE) + if(EXISTS ${WX_LIB_DIR}/${CFG}) + list(APPEND WX_CONFIGURATION_LIST ${CFG}) + set(WX_${CFG}_FOUND TRUE) + set(WX_CONFIGURATION ${CFG}) + endif() + endforeach() + DBG_MSG_V("WX_CONFIGURATION_LIST=${WX_CONFIGURATION_LIST}") + + if(WX_CONFIGURATION) + set(wxWidgets_FOUND TRUE) + + # If the selected configuration wasn't found force the default + # one. Otherwise, use it but still force a refresh for + # updating the doc string with the current list of available + # configurations. + if(NOT WX_${wxWidgets_CONFIGURATION}_FOUND) + set(wxWidgets_CONFIGURATION ${WX_CONFIGURATION} CACHE STRING + "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE) + else() + set(wxWidgets_CONFIGURATION ${wxWidgets_CONFIGURATION} CACHE STRING + "Set wxWidgets configuration (${WX_CONFIGURATION_LIST})" FORCE) + endif() + + # If release config selected, and both release/debug exist. + if(WX_${wxWidgets_CONFIGURATION}d_FOUND) + option(wxWidgets_USE_REL_AND_DBG + "Use release and debug configurations?" TRUE) + set(WX_USE_REL_AND_DBG ${wxWidgets_USE_REL_AND_DBG}) + else() + # If the option exists (already in cache), force it false. + if(wxWidgets_USE_REL_AND_DBG) + set(wxWidgets_USE_REL_AND_DBG FALSE CACHE BOOL + "No ${wxWidgets_CONFIGURATION}d found." FORCE) + endif() + set(WX_USE_REL_AND_DBG FALSE) + endif() + + # Get configuration parameters from the name. + WX_GET_NAME_COMPONENTS(${wxWidgets_CONFIGURATION} UNV UCD DBG) + + # Set wxWidgets lib setup include directory. + if(EXISTS ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h) + set(wxWidgets_INCLUDE_DIRS + ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}) + else() + DBG_MSG("wxWidgets_FOUND FALSE because ${WX_LIB_DIR}/${wxWidgets_CONFIGURATION}/wx/setup.h does not exists.") + set(wxWidgets_FOUND FALSE) + endif() + + # Set wxWidgets main include directory. + if(EXISTS ${WX_ROOT_DIR}/include/wx/wx.h) + list(APPEND wxWidgets_INCLUDE_DIRS ${WX_ROOT_DIR}/include) + else() + DBG_MSG("wxWidgets_FOUND FALSE because WX_ROOT_DIR=${WX_ROOT_DIR} has no ${WX_ROOT_DIR}/include/wx/wx.h") + set(wxWidgets_FOUND FALSE) + endif() + + # Find wxWidgets libraries. + WX_FIND_LIBS("${UNV}" "${UCD}" "${DBG}") + if(WX_USE_REL_AND_DBG) + WX_FIND_LIBS("${UNV}" "${UCD}" "d") + endif() + + # Settings for requested libs (i.e., include dir, libraries, etc.). + WX_SET_LIBRARIES(wxWidgets_FIND_COMPONENTS "${DBG}") + + # Add necessary definitions for unicode builds + if("${UCD}" STREQUAL "u") + list(APPEND wxWidgets_DEFINITIONS UNICODE _UNICODE) + endif() + + # Add necessary definitions for debug builds + set(wxWidgets_DEFINITIONS_DEBUG _DEBUG __WXDEBUG__) + + endif() + endif() + endif() + +#===================================================================== +# UNIX_FIND_STYLE +#===================================================================== +else() + if(wxWidgets_FIND_STYLE STREQUAL "unix") + #----------------------------------------------------------------- + # UNIX: Helper MACROS + #----------------------------------------------------------------- + # + # Set the default values based on "wx-config --selected-config". + # + macro(WX_CONFIG_SELECT_GET_DEFAULT) + execute_process( + COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" + ${wxWidgets_CONFIG_OPTIONS} --selected-config + OUTPUT_VARIABLE _wx_selected_config + RESULT_VARIABLE _wx_result + ERROR_QUIET + ) + if(_wx_result EQUAL 0) + foreach(_opt_name debug static unicode universal) + string(TOUPPER ${_opt_name} _upper_opt_name) + if(_wx_selected_config MATCHES "${_opt_name}") + set(wxWidgets_DEFAULT_${_upper_opt_name} ON) + else() + set(wxWidgets_DEFAULT_${_upper_opt_name} OFF) + endif() + endforeach() + else() + foreach(_upper_opt_name DEBUG STATIC UNICODE UNIVERSAL) + set(wxWidgets_DEFAULT_${_upper_opt_name} OFF) + endforeach() + endif() + endmacro() + + # + # Query a boolean configuration option to determine if the system + # has both builds available. If so, provide the selection option + # to the user. + # + macro(WX_CONFIG_SELECT_QUERY_BOOL _OPT_NAME _OPT_HELP) + execute_process( + COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" + ${wxWidgets_CONFIG_OPTIONS} --${_OPT_NAME}=yes + RESULT_VARIABLE _wx_result_yes + OUTPUT_QUIET + ERROR_QUIET + ) + execute_process( + COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" + ${wxWidgets_CONFIG_OPTIONS} --${_OPT_NAME}=no + RESULT_VARIABLE _wx_result_no + OUTPUT_QUIET + ERROR_QUIET + ) + string(TOUPPER ${_OPT_NAME} _UPPER_OPT_NAME) + if(_wx_result_yes EQUAL 0 AND _wx_result_no EQUAL 0) + option(wxWidgets_USE_${_UPPER_OPT_NAME} + ${_OPT_HELP} ${wxWidgets_DEFAULT_${_UPPER_OPT_NAME}}) + else() + # If option exists (already in cache), force to available one. + if(DEFINED wxWidgets_USE_${_UPPER_OPT_NAME}) + if(_wx_result_yes EQUAL 0) + set(wxWidgets_USE_${_UPPER_OPT_NAME} ON CACHE BOOL ${_OPT_HELP} FORCE) + else() + set(wxWidgets_USE_${_UPPER_OPT_NAME} OFF CACHE BOOL ${_OPT_HELP} FORCE) + endif() + endif() + endif() + endmacro() + + # + # Set wxWidgets_SELECT_OPTIONS to wx-config options for selecting + # among multiple builds. + # + macro(WX_CONFIG_SELECT_SET_OPTIONS) + set(wxWidgets_SELECT_OPTIONS ${wxWidgets_CONFIG_OPTIONS}) + foreach(_opt_name debug static unicode universal) + string(TOUPPER ${_opt_name} _upper_opt_name) + if(DEFINED wxWidgets_USE_${_upper_opt_name}) + if(wxWidgets_USE_${_upper_opt_name}) + list(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=yes) + else() + list(APPEND wxWidgets_SELECT_OPTIONS --${_opt_name}=no) + endif() + endif() + endforeach() + endmacro() + + #----------------------------------------------------------------- + # UNIX: Start actual work. + #----------------------------------------------------------------- + # Support cross-compiling, only search in the target platform. + find_program(wxWidgets_CONFIG_EXECUTABLE wx-config + DOC "Location of wxWidgets library configuration provider binary (wx-config)." + ONLY_CMAKE_FIND_ROOT_PATH + ) + + if(wxWidgets_CONFIG_EXECUTABLE) + set(wxWidgets_FOUND TRUE) + + # get defaults based on "wx-config --selected-config" + WX_CONFIG_SELECT_GET_DEFAULT() + + # for each option: if both builds are available, provide option + WX_CONFIG_SELECT_QUERY_BOOL(debug "Use debug build?") + WX_CONFIG_SELECT_QUERY_BOOL(unicode "Use unicode build?") + WX_CONFIG_SELECT_QUERY_BOOL(universal "Use universal build?") + WX_CONFIG_SELECT_QUERY_BOOL(static "Link libraries statically?") + + # process selection to set wxWidgets_SELECT_OPTIONS + WX_CONFIG_SELECT_SET_OPTIONS() + DBG_MSG("wxWidgets_SELECT_OPTIONS=${wxWidgets_SELECT_OPTIONS}") + + # run the wx-config program to get cxxflags + execute_process( + COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" + ${wxWidgets_SELECT_OPTIONS} --cxxflags + OUTPUT_VARIABLE wxWidgets_CXX_FLAGS + RESULT_VARIABLE RET + ERROR_QUIET + ) + if(RET EQUAL 0) + string(STRIP "${wxWidgets_CXX_FLAGS}" wxWidgets_CXX_FLAGS) + separate_arguments(wxWidgets_CXX_FLAGS) + + DBG_MSG_V("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}") + + # parse definitions from cxxflags; + # drop -D* from CXXFLAGS and the -D prefix + string(REGEX MATCHALL "-D[^;]+" + wxWidgets_DEFINITIONS "${wxWidgets_CXX_FLAGS}") + string(REGEX REPLACE "-D[^;]+(;|$)" "" + wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}") + string(REGEX REPLACE ";$" "" + wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}") + string(REPLACE "-D" "" + wxWidgets_DEFINITIONS "${wxWidgets_DEFINITIONS}") + + # parse include dirs from cxxflags; drop -I prefix + string(REGEX MATCHALL "-I[^;]+" + wxWidgets_INCLUDE_DIRS "${wxWidgets_CXX_FLAGS}") + string(REGEX REPLACE "-I[^;]+;" "" + wxWidgets_CXX_FLAGS "${wxWidgets_CXX_FLAGS}") + string(REPLACE "-I" "" + wxWidgets_INCLUDE_DIRS "${wxWidgets_INCLUDE_DIRS}") + + DBG_MSG_V("wxWidgets_DEFINITIONS=${wxWidgets_DEFINITIONS}") + DBG_MSG_V("wxWidgets_INCLUDE_DIRS=${wxWidgets_INCLUDE_DIRS}") + DBG_MSG_V("wxWidgets_CXX_FLAGS=${wxWidgets_CXX_FLAGS}") + + else() + set(wxWidgets_FOUND FALSE) + DBG_MSG_V( + "${wxWidgets_CONFIG_EXECUTABLE} --cxxflags FAILED with RET=${RET}") + endif() + + # run the wx-config program to get the libs + # - NOTE: wx-config doesn't verify that the libs requested exist + # it just produces the names. Maybe a TRY_COMPILE would + # be useful here... + string(REPLACE ";" "," + wxWidgets_FIND_COMPONENTS "${wxWidgets_FIND_COMPONENTS}") + execute_process( + COMMAND sh "${wxWidgets_CONFIG_EXECUTABLE}" + ${wxWidgets_SELECT_OPTIONS} --libs ${wxWidgets_FIND_COMPONENTS} + OUTPUT_VARIABLE wxWidgets_LIBRARIES + RESULT_VARIABLE RET + ERROR_QUIET + ) + if(RET EQUAL 0) + string(STRIP "${wxWidgets_LIBRARIES}" wxWidgets_LIBRARIES) + separate_arguments(wxWidgets_LIBRARIES) + string(REPLACE "-framework;" "-framework " + wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}") + string(REPLACE "-arch;" "-arch " + wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}") + string(REPLACE "-isysroot;" "-isysroot " + wxWidgets_LIBRARIES "${wxWidgets_LIBRARIES}") + + # extract linkdirs (-L) for rpath (i.e., LINK_DIRECTORIES) + string(REGEX MATCHALL "-L[^;]+" + wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARIES}") + string(REPLACE "-L" "" + wxWidgets_LIBRARY_DIRS "${wxWidgets_LIBRARY_DIRS}") + + DBG_MSG_V("wxWidgets_LIBRARIES=${wxWidgets_LIBRARIES}") + DBG_MSG_V("wxWidgets_LIBRARY_DIRS=${wxWidgets_LIBRARY_DIRS}") + + else() + set(wxWidgets_FOUND FALSE) + DBG_MSG("${wxWidgets_CONFIG_EXECUTABLE} --libs ${wxWidgets_FIND_COMPONENTS} FAILED with RET=${RET}") + endif() + endif() + +#===================================================================== +# Neither UNIX_FIND_STYLE, nor WIN32_FIND_STYLE +#===================================================================== + else() + if(NOT wxWidgets_FIND_QUIETLY) + message(STATUS + "${CMAKE_CURRENT_LIST_FILE}(${CMAKE_CURRENT_LIST_LINE}): \n" + " Platform unknown/unsupported. It's neither WIN32 nor UNIX " + "find style." + ) + endif() + endif() +endif() + +SET(wxWidgets_LIBRARIES_GUI ${wxWidgets_LIBRARIES}) +STRING(REPLACE "-Wl,--subsystem,windows" "-Wl,--subsystem,console" wxWidgets_LIBRARIES_CONSOLE "${wxWidgets_LIBRARIES}") +STRING(REPLACE "-mwindows" "-mconsole" wxWidgets_LIBRARIES_CONSOLE "${wxWidgets_LIBRARIES_CONSOLE}") + +# Debug output: +DBG_MSG("wxWidgets_FOUND : ${wxWidgets_FOUND}") +DBG_MSG("wxWidgets_INCLUDE_DIRS : ${wxWidgets_INCLUDE_DIRS}") +DBG_MSG("wxWidgets_LIBRARY_DIRS : ${wxWidgets_LIBRARY_DIRS}") +DBG_MSG("wxWidgets_LIBRARIES : ${wxWidgets_LIBRARIES}") +DBG_MSG("wxWidgets_CXX_FLAGS : ${wxWidgets_CXX_FLAGS}") +DBG_MSG("wxWidgets_USE_FILE : ${wxWidgets_USE_FILE}") + +#===================================================================== +#===================================================================== +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(wxWidgets DEFAULT_MSG wxWidgets_FOUND) +# Maintain consistency with all other variables. +set(wxWidgets_FOUND ${WXWIDGETS_FOUND}) + +#===================================================================== +# Macros for use in wxWidgets apps. +# - This module will not fail to find wxWidgets based on the code +# below. Hence, it's required to check for validity of: +# +# wxWidgets_wxrc_EXECUTABLE +#===================================================================== + +# Resource file compiler. +find_program(wxWidgets_wxrc_EXECUTABLE wxrc + ${wxWidgets_ROOT_DIR}/utils/wxrc/vc_msw + DOC "Location of wxWidgets resource file compiler binary (wxrc)" + ) + +# +# WX_SPLIT_ARGUMENTS_ON( ...) +# +# Sets and to contain arguments to the left and right, +# respectively, of . +# +# Example usage: +# function(WXWIDGETS_ADD_RESOURCES outfiles) +# WX_SPLIT_ARGUMENTS_ON(OPTIONS wxrc_files wxrc_options ${ARGN}) +# ... +# endfunction() +# +# WXWIDGETS_ADD_RESOURCES(sources ${xrc_files} OPTIONS -e -o file.C) +# +# NOTE: This is a generic piece of code that should be renamed to +# SPLIT_ARGUMENTS_ON and put in a file serving the same purpose as +# FindPackageStandardArgs.cmake. At the time of this writing +# FindQt4.cmake has a QT4_EXTRACT_OPTIONS, which I basically copied +# here a bit more generalized. So, there are already two find modules +# using this approach. +# +function(WX_SPLIT_ARGUMENTS_ON _keyword _leftvar _rightvar) + # FIXME: Document that the input variables will be cleared. + #list(APPEND ${_leftvar} "") + #list(APPEND ${_rightvar} "") + set(${_leftvar} "") + set(${_rightvar} "") + + set(_doing_right FALSE) + foreach(element ${ARGN}) + if("${element}" STREQUAL "${_keyword}") + set(_doing_right TRUE) + else() + if(_doing_right) + list(APPEND ${_rightvar} "${element}") + else() + list(APPEND ${_leftvar} "${element}") + endif() + endif() + endforeach() + + set(${_leftvar} ${${_leftvar}} PARENT_SCOPE) + set(${_rightvar} ${${_rightvar}} PARENT_SCOPE) +endfunction() + +# +# WX_GET_DEPENDENCIES_FROM_XML( +# +# +# +# +# +# ) +# +# FIXME: Add documentation here... +# +function(WX_GET_DEPENDENCIES_FROM_XML + _depends + _match_patt + _clean_patt + _xml_contents + _depends_path + ) + + string(REGEX MATCHALL + ${_match_patt} + dep_file_list + "${${_xml_contents}}" + ) + foreach(dep_file ${dep_file_list}) + string(REGEX REPLACE ${_clean_patt} "" dep_file "${dep_file}") + + # make the file have an absolute path + if(NOT IS_ABSOLUTE "${dep_file}") + set(dep_file "${${_depends_path}}/${dep_file}") + endif() + + # append file to dependency list + list(APPEND ${_depends} "${dep_file}") + endforeach() + + set(${_depends} ${${_depends}} PARENT_SCOPE) +endfunction() + +# +# WXWIDGETS_ADD_RESOURCES( +# OPTIONS [NO_CPP_CODE]) +# +# Adds a custom command for resource file compilation of the +# and appends the output files to . +# +# Example usages: +# WXWIDGETS_ADD_RESOURCES(sources xrc/main_frame.xrc) +# WXWIDGETS_ADD_RESOURCES(sources ${xrc_files} OPTIONS -e -o altname.cxx) +# +function(WXWIDGETS_ADD_RESOURCES _outfiles) + WX_SPLIT_ARGUMENTS_ON(OPTIONS rc_file_list rc_options ${ARGN}) + + # Parse files for dependencies. + set(rc_file_list_abs "") + set(rc_depends "") + foreach(rc_file ${rc_file_list}) + get_filename_component(depends_path ${rc_file} PATH) + + get_filename_component(rc_file_abs ${rc_file} ABSOLUTE) + list(APPEND rc_file_list_abs "${rc_file_abs}") + + # All files have absolute paths or paths relative to the location + # of the rc file. + file(READ "${rc_file_abs}" rc_file_contents) + + # get bitmap/bitmap2 files + WX_GET_DEPENDENCIES_FROM_XML( + rc_depends + "]*>" + rc_file_contents + depends_path + ) + + # get url files + WX_GET_DEPENDENCIES_FROM_XML( + rc_depends + "]*>" + rc_file_contents + depends_path + ) + + # get wxIcon files + WX_GET_DEPENDENCIES_FROM_XML( + rc_depends + "]*class=\"wxIcon\"[^<]+" + "^]*>" + rc_file_contents + depends_path + ) + endforeach() + + # + # Parse options. + # + # If NO_CPP_CODE option specified, then produce .xrs file rather + # than a .cpp file (i.e., don't add the default --cpp-code option). + list(FIND rc_options NO_CPP_CODE index) + if(index EQUAL -1) + list(APPEND rc_options --cpp-code) + # wxrc's default output filename for cpp code. + set(outfile resource.cpp) + else() + list(REMOVE_AT rc_options ${index}) + # wxrc's default output filename for xrs file. + set(outfile resource.xrs) + endif() + + # Get output name for use in ADD_CUSTOM_COMMAND. + # - short option scanning + list(FIND rc_options -o index) + if(NOT index EQUAL -1) + math(EXPR filename_index "${index} + 1") + list(GET rc_options ${filename_index} outfile) + #list(REMOVE_AT rc_options ${index} ${filename_index}) + endif() + # - long option scanning + string(REGEX MATCH "--output=[^;]*" outfile_opt "${rc_options}") + if(outfile_opt) + string(REPLACE "--output=" "" outfile "${outfile_opt}") + endif() + #string(REGEX REPLACE "--output=[^;]*;?" "" rc_options "${rc_options}") + #string(REGEX REPLACE ";$" "" rc_options "${rc_options}") + + if(NOT IS_ABSOLUTE "${outfile}") + set(outfile "${CMAKE_CURRENT_BINARY_DIR}/${outfile}") + endif() + add_custom_command( + OUTPUT "${outfile}" + COMMAND ${wxWidgets_wxrc_EXECUTABLE} ${rc_options} ${rc_file_list_abs} + DEPENDS ${rc_file_list_abs} ${rc_depends} + ) + + # Add generated header to output file list. + list(FIND rc_options -e short_index) + list(FIND rc_options --extra-cpp-code long_index) + if(NOT short_index EQUAL -1 OR NOT long_index EQUAL -1) + get_filename_component(outfile_ext ${outfile} EXT) + string(REPLACE "${outfile_ext}" ".h" outfile_header "${outfile}") + list(APPEND ${_outfiles} "${outfile_header}") + set_source_files_properties( + "${outfile_header}" PROPERTIES GENERATED TRUE + ) + endif() + + # Add generated file to output file list. + list(APPEND ${_outfiles} "${outfile}") + + set(${_outfiles} ${${_outfiles}} PARENT_SCOPE) +endfunction() diff --git a/config/LibFindMacros.cmake b/config/LibFindMacros.cmake new file mode 100644 index 0000000..49899a8 --- /dev/null +++ b/config/LibFindMacros.cmake @@ -0,0 +1,101 @@ +# Works the same as find_package, but forwards the "REQUIRED" and "QUIET" arguments +# used for the current package. For this to work, the first parameter must be the +# prefix of the current package, then the prefix of the new package etc, which are +# passed to find_package. +macro (libfind_package PREFIX) + set (LIBFIND_PACKAGE_ARGS ${ARGN}) + if (${PREFIX}_FIND_QUIETLY) + set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} QUIET) + endif (${PREFIX}_FIND_QUIETLY) + if (${PREFIX}_FIND_REQUIRED) + set (LIBFIND_PACKAGE_ARGS ${LIBFIND_PACKAGE_ARGS} REQUIRED) + endif (${PREFIX}_FIND_REQUIRED) + find_package(${LIBFIND_PACKAGE_ARGS}) +endmacro (libfind_package) + +# CMake developers made the UsePkgConfig system deprecated in the same release (2.6) +# where they added pkg_check_modules. Consequently I need to support both in my scripts +# to avoid those deprecated warnings. Here's a helper that does just that. +# Works identically to pkg_check_modules, except that no checks are needed prior to use. +macro (libfind_pkg_check_modules PREFIX PKGNAME) + if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + include(UsePkgConfig) + pkgconfig(${PKGNAME} ${PREFIX}_INCLUDE_DIRS ${PREFIX}_LIBRARY_DIRS ${PREFIX}_LDFLAGS ${PREFIX}_CFLAGS) + else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + find_package(PkgConfig) + if (PKG_CONFIG_FOUND) + pkg_check_modules(${PREFIX} ${PKGNAME}) + endif (PKG_CONFIG_FOUND) + endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) +endmacro (libfind_pkg_check_modules) + +# Do the final processing once the paths have been detected. +# If include dirs are needed, ${PREFIX}_PROCESS_INCLUDES should be set to contain +# all the variables, each of which contain one include directory. +# Ditto for ${PREFIX}_PROCESS_LIBS and library files. +# Will set ${PREFIX}_FOUND, ${PREFIX}_INCLUDE_DIRS and ${PREFIX}_LIBRARIES. +# Also handles errors in case library detection was required, etc. +macro (libfind_process PREFIX) + # Skip processing if already processed during this run + if (NOT ${PREFIX}_FOUND) + # Start with the assumption that the library was found + set (${PREFIX}_FOUND TRUE) + + # Process all includes and set _FOUND to false if any are missing + foreach (i ${${PREFIX}_PROCESS_INCLUDES}) + if (${i}) + set (${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIRS} ${${i}}) + mark_as_advanced(${i}) + else (${i}) + message(STATUS "Missing ${i}") + set (${PREFIX}_FOUND FALSE) + endif (${i}) + endforeach (i) + + # Process all libraries and set _FOUND to false if any are missing + foreach (i ${${PREFIX}_PROCESS_LIBS}) + if (${i}) + set (${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARIES} ${${i}}) + mark_as_advanced(${i}) + else (${i}) + message(STATUS "Missing ${i}") + set (${PREFIX}_FOUND FALSE) + endif (${i}) + endforeach (i) + + # Print message and/or exit on fatal error + if (${PREFIX}_FOUND) + if (NOT ${PREFIX}_FIND_QUIETLY) + message (STATUS "Found ${PREFIX} ${${PREFIX}_VERSION}") + endif (NOT ${PREFIX}_FIND_QUIETLY) + else (${PREFIX}_FOUND) + if (${PREFIX}_FIND_REQUIRED) + foreach (i ${${PREFIX}_PROCESS_INCLUDES} ${${PREFIX}_PROCESS_LIBS}) + message("${i}=${${i}}") + endforeach (i) + message (FATAL_ERROR "Required library ${PREFIX} NOT FOUND.\nInstall the library (dev version) and try again. If the library is already installed, use ccmake to set the missing variables manually.") + endif (${PREFIX}_FIND_REQUIRED) + endif (${PREFIX}_FOUND) + endif (NOT ${PREFIX}_FOUND) +endmacro (libfind_process) + +macro(libfind_library PREFIX basename) + set(TMP "") + if(MSVC80) + set(TMP -vc80) + endif(MSVC80) + if(MSVC90) + set(TMP -vc90) + endif(MSVC90) + set(${PREFIX}_LIBNAMES ${basename}${TMP}) + if(${ARGC} GREATER 2) + set(${PREFIX}_LIBNAMES ${basename}${TMP}-${ARGV2}) + string(REGEX REPLACE "\\." "_" TMP ${${PREFIX}_LIBNAMES}) + set(${PREFIX}_LIBNAMES ${${PREFIX}_LIBNAMES} ${TMP}) + endif(${ARGC} GREATER 2) + find_library(${PREFIX}_LIBRARY + NAMES ${${PREFIX}_LIBNAMES} + PATHS ${${PREFIX}_PKGCONF_LIBRARY_DIRS} + ) +endmacro(libfind_library) + diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt new file mode 100644 index 0000000..fc8552a --- /dev/null +++ b/doc/CMakeLists.txt @@ -0,0 +1,20 @@ +# This file is part of EPOCH. +# File: CMakeLists.txt +# Author: Florent Teichteil-Königsbuch +# Contact: florent.teichteil@onera.fr +# +# EPOCH is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# EPOCH is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with EPOCH. If not, see . + +CONFIGURE_FILE (${CMAKE_SOURCE_DIR}/doc/Doxyfile.cmake ${CMAKE_BINARY_DIR}/doc/Doxyfile @ONLY) +ADD_CUSTOM_TARGET (html ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/doc/Doxyfile) diff --git a/doc/Doxyfile.cmake b/doc/Doxyfile.cmake new file mode 100644 index 0000000..37be3b6 --- /dev/null +++ b/doc/Doxyfile.cmake @@ -0,0 +1,1663 @@ +# Doxyfile 1.7.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = EPOCH + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 9999 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = @CMAKE_BINARY_DIR@/doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = @CMAKE_BINARY_DIR@/doc/ + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = @CMAKE_SOURCE_DIR@ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.py \ + *.f90 \ + *.f \ + *.vhd \ + *.vhdl \ + *.ipp \ + *.tpp + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the stylesheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = YES + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvances is that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = NO + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans.ttf + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = YES + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = YES + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/doc/Rapport post-doc/1-introduction.tex b/doc/Rapport post-doc/1-introduction.tex new file mode 100644 index 0000000..e3c17c6 --- /dev/null +++ b/doc/Rapport post-doc/1-introduction.tex @@ -0,0 +1,134 @@ +\section{Toward an automated model-based approach to system validation} +\label{sec:intro} + + +The increasing complexity of interactions between functions and other equipment in modern +industrial systems poses new technical challenges. +In fact, developing complex systems often raise integration problems during the product +final testing and verification phase. Besides, correcting these issues +often generates a heavy rework and is a well-known cause for cost +overruns and project delays. + +We have to say that operation of complex systems is traditionally informally expressed in design documents as a set of modes representing functions, equipments and monitoring mechanisms, which are validated by review, i.e. exhaustive manual (opposed to automatic) consistence checks and cross-reading. +Human validation activities soon became practically impossible due to the high number of combinations to be checked. + Therefore, finding and applying powerful computer-aided analysis techniques that + contribute to anticipate and resolve integration problems as early + as possible in the design process has become a prior concern for the industry. + + +We believe that formalizing and validating the specifications through animation/simulation and model-checking has several strong advantages +wrt ``traditional approaches''. On the one hand, modelling during the specification phase forces the designer to formalise and clarify the specifications. Animation/simulation is useful for validating the model against the specifications and for identifying behaviour inconsistencies based on relevant user-defined scenarios. Such inconsistencies are difficult to identify in a classical purely paper-based specification process. Last, formal verification proves that none of the possible execution scenarios violates the system properties. Such approaches are useful not only for validating an architecture or failure detection, isolation and reconfiguration strategies once defined, but also for tuning its parameters during the definition phase. + +It is worth noting that the approach and tools described in these pages, while embracing the automated validation of properties over model-described complex systems via model checking, also extends the existing tools to permit the analysis of temporal properties. In fact, +in order to have a complete vision and control over a system, it is necessary to be able to grasp transient states, and system dynamics. + + +\subsection{Classical safety analysis techniques: FTA and FMEA} +Fault Tree Analysis (FTA)~\cite{stamatelatos2002fault} and Failure Mode Effects Analysis (FMEA)~\cite{FMEA} are well-known and widely used system analysis techniques used in reliability +engineering. Both are long established -- FMEA was formally introduced in the late 1940s, and FTA has been around since the +1960s -- and both have been employed in a number of different areas, including the aerospace, nuclear power, and automotive industries. +They are methods that we can use to identify potential faults in a system, so that we can then use that information to correct or prevent those faults. + +Fault Tree Analysis is equally applicable to quantitative and qualitative analyses, and easy to +use and understand. Fault trees themselves are graphical representations of logical combinations of failures, and show the +relationship between a failure or fault and the events that cause them: they normally consist of a top event, which is +typically a system failure, connected to one or more basic events via a system of logical gates, such as AND and OR. Basic +events are usually either component failures or events expected to happen as part of the normal operation of the system. +Analysis of the fault tree consists of two parts: qualitative (logical) analysis, and quantitative (probabilistic) analysis. +Qualitative analysis is performed by reducing the logical expression represented by the fault tree into a set of minimal cut sets, +which are the smallest possible combinations of failures required to cause the top event. Quantitative analysis is performed +by calculating the probability of the top event given the probability of each of the basic events occurring. + +In an FMEA, the basic process consists of compiling lists of possible component failure modes (all the ways in which an +entity may fail), gathered from descriptions of each part of the system, and then trying to infer the effects of those failures +on the rest of the system. Usually, these effects are evaluated according to a number of criteria, such as severity, probability, +and detectability, and often these criteria are then combined into an overall estimate of risk. All of this data is then presented +in the form of a table which allows the analyst see what the effects of each failure mode are. + +Even if useful, the usage of those manual techniques is hindered by the increasing complexity of systems: it is becoming more and more difficult to +incorporate FTA or FMEA in the design cycle of systems that are more than relatively simple and manageable. +In complex systems, however, manual analysis is laborious and error prone, and a thorough assessment and interpretation of the results becomes increasingly +difficult to achieve within the constraints of most projects. Furthermore, the results of the analyses are separated from the +design being analysed, meaning that the effects of any changes in the system design may only become apparent after another +long and costly analysis~\cite{papadopoulos2011HH}. + +Complex systems yield a need for specific supporting measures and tools to +assist in the application of analysis techniques. One obvious approach would be to automate at least part of the process. This +would mean that the analyses could be carried out more quickly and efficiently, leaving more time for the results to be studied and allowing more useful conclusions to be drawn. + +\subsection{Modern safety analysis techniques: MBSE and MBSA} + + +New modelling techniques, such as MBSE or MBSA, propose to master the +combinatorial complexity at early concept phases by using abstract +high level representations of a system~\cite{Stamatis}. These views constitute a +promising ground to implement early validation techniques of the +architectures. But, in order to be profitable and implemented by the +industry, those validation techniques must remain lightweight and well +integrated in the system design process. That is to say, the modelling +workload must be limited, and the analysis results (even preliminary) +must be available at the same time as designers evaluate the +possible architecture choices. These requirements have driven our research and the toolchain described in those pages. + +As written above, modern safety analysis techniques permit a wealth of information about the safety and reliability of a +system to be gathered much more quickly and easily than ever before. This information gives to the designers the means to use safety and +reliability as a major factor in the decisions they make during the evolution of a system design: by evaluating the effects of +one or more potential design choices, e.g. increased reliability at the expense of greater cost or increased weight, etc., designers are able to make informed choices. +However, just as classical manual safety analyses restrict the rate that information can be obtained about a system, manually evaluating different design choices is time-consuming and restricts the number of design candidates that can be investigated. If this process could be automated, it would be possible to examine hundreds or thousands of potential design +candidates -- a much greater portion of the total design space -- and thus hopefully provide a better foundation for the next +iteration of the system design. + + + + +\section{Automated Evaluation of Safety Temporal Conditions} +In this report, we describe an approach that allows us to extend models +developed for safety analysis in order to reason about the correctness +of temporal conditions. +We intend to offer the capability to study a +new range of system requirements that can be of main interest for +functions such as failure detection, isolation and recovery. We +advocate that timing properties are critical when assessing the safety +of embedded and real-time systems. Indeed, temporal aspects---like +network delays or computation times---can be the cause of missed +failure detections or undesired reactions to (delayed) failure +propagation. It is therefore necessary to be able to analyse the +temporal properties of a model in order to build systems that will +operate as intended in a real-world environment. + + + +We define a model-based process to check simultaneously safety and temporal +conditions on systems. Our approach is based on an extension of the +AltaRica language~\cite{arn00} where timing constraints can be +associated with events. This extension can then be translated into the +intermediate language Fiacre~\cite{berthomieu2008fiacre}, a formal +specification language that can be used to represent both the +behavioural and timing aspects of systems. This Fiacre model can be +analysed with the realtime model-checker Tina~\cite{BRV04}. The +results of model-checking shed light on the dysfunctional behaviour of +the original model, including how the cascading effects due to failure +propagation delay reveal transitory failure modes~\cite{albore2017IMBSA}. +The approach scales up on models of industrial scale, like in the validation +of formation flying satellite systems where complex equipment and instruments are distributed over several spacecrafts~\cite{albore2018ERTS}. + +The translation developed takes the functional part of the system model and the dysfunctional viewpoint modelled by safety engineers to generate an AltaRica model of the system. The generated AltaRica model is formal and allows, one from another, the dysfunctional simulation of the system and the generation of sequences of events leading to accidents.\\ + + + +%%%% + +This report is organised as follows. We start by giving a wider vision about the subject +by revising the state of the art~\ref{soa}. We then define the AltaRica and the Fiacre +language and the time model in Chap.~\ref{altarica}, providing examples of the encoding of AltaRica in Fiacre, +and giving some experimental results about time failure propagation +in Sect.~\ref{sec:sect4}. +In Chap.~\ref{aocs} we apply the described approach to an industrial case of (automated) verification +on AOCS modes in satellites, and discuss scalability issues and empirical results. + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "main" +%%% End: + +%% LocalWords: Fiacre diff --git a/doc/Rapport post-doc/2-motivation.tex b/doc/Rapport post-doc/2-motivation.tex new file mode 100644 index 0000000..4076a40 --- /dev/null +++ b/doc/Rapport post-doc/2-motivation.tex @@ -0,0 +1,400 @@ +\section{Example of a Failure Detection and Isolation System} +\label{sec:example-fail-detect-1} + +We study the example of a safety critical function that illustrates +standard failure propagation problems. We use this example to show the +adverse effects of temporal failure propagation even in the presence +of % system safety improvements. In our case the addition of +Failure Detection and Isolation (FDI) safety capabilities. + +This example is inspired by the avionic functions that provide +parameters for Primary Flight Display (PFD), which is located in the +aircraft cockpit. The system of interest is the computer that acquires +sensors measurements and computes the aircraft \emph{calibrated airspeed + } (CAS) parameter. Airspeed is crucial for pilots: it is taken into +account to adjust aircraft engines thrust and it plays a main role in +the prevention of over speed and stall. + +%% +\begin{figure}[tb] + \centering +\includegraphics[width=0.99\textwidth]{figures/AirSpeed_Computation.jpg} + \caption{Functional and physical views of the airspeed computation function.\label{fig:cockpit}} +\end{figure} +%% + +CAS is not directly measured by a dedicated sensor, but is computed as +a function of two auxiliary pressure measurements, the static pressure +(Ps) and total pressure (Pt); that is +$\mathrm{CAS} = f(\mathrm{Pt}, \mathrm{Ps})$. +% \begin{equation*} +% CAS = C_{SO}\sqrt{5 \cdot \left( \left(\frac{Pt - Ps}{P_0} + 1\right)^{2/7} - 1\right)} +% \end{equation*} +% with $C_{SO}$ and $P_0$ two +% constants. % the speed of sound under standard day sea level conditions +These two measurements come from sensors located on the aircraft nose, +a pressure probe and a pitot tube. +% Our proposed functional view shows: +% \begin{itemize} +% \item Two external functions \I{1} and \I{2} that measure static and total pressure. They represent the functions allocated to the sensors. +% \item Three inner functions of the system: \F{1} and \F{2} for sensor measurements acquisition by the onboard computer and \F{3} for airspeed computation. +% \item The PFD functions have not been modelled in the sole purpose of simplification. +% \end{itemize} +% +%% + +Our proposed functional view is given in Fig.~\ref{fig:cockpit}. It +consists in two external functions \I{1} and \I{2} that measure static +and total pressure; and three inner functions of the system, \F{1} and +\F{2} for sensor measurements acquisition by the onboard computer and +\F{3} for airspeed computation. For simplification purposes, the +PFD functions have not been modelled. + +Next, we propose a first failure propagation view aiming at +identifying the scenarios leading to an erroneous airspeed computation +and display to the pilot (denoted \ERR). Such failure can only be +detected if a failure detector is implemented, for instance by +comparing the outputs of different functions. Undetected, it could +mislead the pilot and, consequently, lead to an inappropriate engine +thrust setting. We also want to identify the scenarios leading to +% (clearly) erroneous transmitted values, for instance a variable out of bounds or +the loss of the measure (denoted \LOSS). In such a case, the pilot can +easily assess that the measure is missing or false and consequently +rely upon another measure to control the aircraft (note that such +redundancy is not modelled). For example, airspeed out of +bound---indicating that an airliner has crossed the sonic barrier---is +considered to be of kind \LOSS. It can be unserstood that scenarios leading to the +loss of the airspeed are less critical than the ones leading erroneous +values. + +% We consider two possible kinds of fail status: the ``silent'' failure of +%an element (denoted \ERR); or a communication problem with one of the +% functions (denoted \LOSS). + +% A failure is typically a loss of connectivity or the +% detection of (clearly) erroneous transmitted values, for instance a +% variable out of bounds. A \LOSS fail is less critical than an \ERR +% since it can be detected immediately and isolated. On the other hand, +% an \ERR fail can only be detected if a failure detector is +% implemented, for instance by comparing the outputs of different +% functions. In the remainder of this paper, we consider that the status +% are ordered by their level of severity, that is \ERR $<$ \LOSS $<$\OK. + + +\subsubsection*{Safety model of the architecture without FDI.} +%%\label{sec:error-prop-simple} +%For the sake of brevity, we choose to study a simplified version of +%FDI system. While simple, this system is representative of failure +%propagation mechanisms found in actual onboard systems. To simplify +%the presentation, we start by describing the system without any +%safety-related elements, see Fig.~\ref{fig:example0}. +%% +% +We provide an AltaRica model corresponding to the functional structure +of the CAS function in Fig.~\ref{fig:example0}. This model, tailored +to study failure propagation, is comprised of: +% ( All the functions are modelled according to the node function +% introduced in the Sect.~\ref{sec:sect2}. +% +two external functions, \I{1} and \I{2}, that have no input (so, in +their nominal state, the output is set to \OK); two inner functions, +\F{1} and \F{2}, which are instances of the node \FUNC described in +Sect.~\ref{sec:sect2}; and a function, \F{3}, that is the composition +of two basic elements: a multiplexer, \MIN, representing the +dependence of the output of \F{3} from its two inputs; and a computing +element \F{3Processing} that represents the computation of the +airspeed. \F{3Processing} is also an instance of node \FUNC. + +\begin{figure}[t] + \centering + \begin{tikzpicture} + \node[anchor=south west,inner sep=0] at (0,0) { \includegraphics[width=0.7\textwidth]{figures/Modele0}}; + \draw[red!50,ultra thick, dashed] (6.7,2.6) rectangle (2.6,0.5); + \node[red] at (6.3,2.3) {\texttt{\large F3}}; +\end{tikzpicture} + \caption{A simple example of failure propagation.\label{fig:example0}} +\end{figure} +% +In case of single failure scenario, \MIN propagates the failure coming +either from one input or the other. In case of multiple failures, when +both inputs have identical failure, this one propagates. For instance, +both inputs to \LOSS lead to an output of \LOSS. +% But when it receives an erroneous fail then the multiplexer will +% propagate an \ERR. The remaining failure combination drew our +% attention during \F{3} modelling. +On the other hand, when different failures propagate, one being \LOSS +and the other being \ERR,---and without appropriate FDI---the system +outcome is uncertain. +% +Solving this uncertainty would require a detailed behavioural model of +the onboard computer and a model for all the possible failure modes, +which is rarely feasible with a sufficient level of confidence, except +for time-tested technology. Given this uncertainty, it is usual to +retain the state with the most critical effect, that is to say: +% in this case, \MIN can be thought of as a simple logic operator that +% computes the minimum of its two inputs, and +the output of \F{3} is \ERR. + + +% Since a \LOSS can be ``easily'' detected, we want to avoid a situation +% where the whole system propagates \ERR while one of its +%internal element propagates a \LOSS. The rationale is that we should be +% able to isolate (or quarantine) the system when we know for sure that +% one of its element does not reliably respond to commands. This can be +% expressed by the following safety property. +%% + +% In the next section, we study the system with the addition of FDI +% capabilities. + +Our goal is to prevent the computation of an erroneous airspeed while +one of \F{3} input signals is lost. The rationale is that the system +should be able to passivate automatically the airspeed when it detects +that one of its input signals is not reliable. This behavior can be +expressed with the following property. + + +%The goal of the safety engineer is to avoid a situation where \F{3} +%propagates an erroneous value while one of its input propagates a +%\LOSS. The rationale is that we should be able to isolate (or +% quarantine) the function when we can detect that one of its element is +% not reliable. This can be expressed by the following safety property. +%% +\begin{prop}[Loss Detection and Instantaneous Propagation]\label{prop:1} + A function is \emph{loss detection safe} if, when in nominal mode, it + propagates a \LOSS whenever one of its input nodes propagates a + \LOSS. +\end{prop} + +% This is a simple system used to detect non-nominal behaviours +% and to trigger observables in order to isolate the failure mode. +% ({The figures are actual screen capture of models edited with Cecilia +% OCAS.}) +% \subsubsection{Analysis} + + +We can show that our example of Fig.~\ref{fig:example0} does not meet +this property using the \emph{Sequence Generation} tool available in +Cecilia OCAS. +%% +% This system has several sources of unreliability. Both its sources and +% the computing elements (\F{1}, \F{2} and \F{3Processing}) can +% experience spontaneous failures, meaning that their outputs can +% transition instantaneously to \LOSS or \ERR. Errors are irrecoverable; +% once a function becomes faulty, its output will always stay equal to +% \LOSS or \ERR. Likewise, if both inputs are ``nominal'' then the +% output of \MIN is \OK. We assume that the multiplexer cannot undergo +% spontaneous failures. +%% +% This can be tested using a perfect detectors, \FF{3}{Loss}, placed at +% the output of the system. +%% +To this end, we compute the minimal cuts for the target equation +$((\text{\F{1.O.Loss}} \vee \text{\F{2.O.Loss}}) \wedge \neg +\text{\F{3.O.Loss}})$, meaning the scenario where \F{3} does not +propagates \LOSS when one of \F{1} or \F{2} does. Hence function \F{3} +is {loss detection safe} if and only if the set is empty. +% \footnote{To check the safety of \F{3}, we need to perform the same +% analysis for all the elements that can propagate a loss fail, not +% only \F{1}.}. + +In our example, once we eliminate the cases where \F{3} is not nominal +(that is when \F{3Processing} is in an error state), we find eight +minimal cuts, all of order $2$. In the following section, we correct +the behaviour of \F{3} by considering a new architecture based on +detectors and a switch to isolate the output of \F{3} when faulty. + +%% +% {%\centering +% \begin{small} +% \begin{tabular}{c@{\quad\quad}c} +% \begin{minipage}[t]{0.42\linewidth} +% \begin{verbatim} +% {'F1.fail_err', 'F2.fail_loss'} +% {'F1.fail_err', 'I2.fail_loss'} +% {'F1.fail_loss', 'F2.fail_err'} +% {'F1.fail_loss', 'I2.fail_err'} +% \end{verbatim} +% \end{minipage} +% & +% \begin{minipage}[t]{0.42\linewidth} +% \begin{verbatim} +% {'F2.fail_err', 'I1.fail_loss'} +% {'F2.fail_loss', 'I1.fail_err'} +% {'I1.fail_err', 'I2.fail_loss'} +% {'I1.fail_loss', 'I2.fail_err'} +% \end{verbatim} +% \end{minipage}\\ +% \end{tabular}\\ +% \end{small} +% } +%% +% Each of these cuts lead to trivial violations of our safety +% property. For instance, we obtain the cut \code{\{'F1.fail\_err', +% 'F2.fail\_loss'\}} that corresponds to the case where \F{1} +% propagates \ERR and \F{2} propagates \LOSS, in which case \F{3} +% propagates \ERR. This is exactly the situation that we want to +% avoid. + + +\begin{figure}[bt] + \centering + \begin{tikzpicture} + \node[anchor=south west,inner sep=0] at (0,0) { \includegraphics[width=\textwidth]{figures/Modele2.png}}; + \draw[red!50,ultra thick, dashed] (10.8,3.4) rectangle (2,0); + \node[red] at (10.4,3.1) {\texttt{\large F3}}; +\end{tikzpicture} + \caption{Model of a FDI function with a switch and an alarm.\label{fig:example1}} +\end{figure}%\vspace*{-1cm} + +%\enlargethispage{\baselineskip} + +\subsubsection*{Safety model of the architecture with FDI.} +%%\label{sec:simple-fail-detect} +%% +%In order to satisfy the Prop.~\ref{prop:1}, +We update our implementation of \F{3} (see Fig.~\ref{fig:example1}) +using two perfect detectors, \F{1Loss} and \F{2Loss}, that can detect +a loss fail on the inputs of the function. The (Boolean) outputs of +these detectors are linked to an OR gate ({\ttfamily AtLeastOneLoss}) +which triggers an \ALARM when at least one of the detectors outputs +true. The alarm commands a \SWITCH; the output of \SWITCH is the same +as \MIN, unless \ALARM is activated, in which case it propagates a +\LOSS fail status. The alarm can fail in two modes, either +continuously triggering the switch or never being activated. The +schema also includes two delays operators, \D{1} and \D{2}, that can +be used to model delay propagations at the input of the detectors. We +will come back to these timing constraints at the end of this section. + +% \TODO{why do we need Alarm ! why does the alarm can fail ! we could +% plug directly the or gate to the switch}- Permanent failure of the alarm. + +The FDI function---with a switch and an alarm---is a stable scheme for +failure propagation: when in nominal mode, it detects all the failures +of the system and it is able to disambiguate the case where its inputs +contains both \ERR and \LOSS. Once again, this can be confirmed using +the Sequence Generation tool. If we repeat the same analysis than +before---and if we abstract away the delays nodes---we find $56$ +minimal cuts, all involving a failure of either \ALARM or +\F{3Processing}. This means that, in an untimed model, our new +implementation of \F{3} satisifies the loss detection property, as +desired. +% \begin{figure}[hbt] +% \centering +% \begin{tikzpicture} +% \node[anchor=south west,inner sep=0] at (0,0) { \includegraphics[width=\textwidth]{figures/Modele2.png}}; +% \draw[red,ultra thick, dashed] (10.6,3.6) rectangle (2.2,0); +% \node[red] at (10,3) {\texttt{\huge F3}}; +% \end{tikzpicture} +% % \includegraphics[width=0.95\textwidth]{figures/Modele2} +% \caption{Taking into consideration propagation delays in the FDI +% system.\label{fig:example2}} +% \end{figure} +% Unfortunately, this model makes unrealistic assumptions about the +% instantaneous failure propagation of detection. Indeed, it may be the +% case that the outputs of \F{1} and \F{2} are delayed as they are +% propagated to the observers \F{1Loss} and \F{2Loss}. Next, we study +% new failure modes that may arise from this situation and how we can +% detect them. +%% +% \subsection{Timed Safety model of the architecture with FDI} +% \label{sec:timed-safety-model} +%% +% In this section, we consider a new AltaRica model that takes into +% account propagation delays. To this end, we may insert two instances +% of the delay node (the element \PRE defined in Sect.~\ref{sec:sect2}) +% before the detectors \F{1Loss} and \F{2Loss}. +Even so, it is easy to find a timed scenario where the safety property +is violated. + +Assume now that \F{1} and \F{2} propagate respectively the status \LOSS and \ERR, + at the same date. In such a case, the output of \F{1} +might reach \F{1Loss} at successive date of the output of \F{2} +reaching \F{2Loss}, while \ERR reaches \MIN instantaneously. This +leads to a transient state where the alarm is not activated whereas +the output of \MIN is set to \ERR. This brings us back to the same +dreaded scenario than in our initial model. +%% +% In particular, this scenario corresponds to the cut +% \code{\{'F1.fail\_loss', 'F2.fail\_err'\}}, that is not admissible in +% an untimed semantics. +%% + +This example suggests that we need a more powerful method to compute +the set of cuts in the presence of temporal constraints. On the other +hand, we may also advocate that our safety property is too strong in +this context, where perfect synchronicity of events is rare. Actually, +we can prove that the output of \F{3} will eventually converge to a +loss detection and isolation (assuming that \F{3} stays nominal and +that its inputs stay stable). Therefore, if we can bound the latency +needed to detect the loss failure, and if this bound is sufficiently +small safety-wise, we could still deem our system as safe. To reflect +this situation, we propose an improved safety property that takes into +account temporal conditions. +%% +\begin{prop}[Loss Detection Convergent]\label{prop:2} A function is + \emph{loss detection convergent} if (when in nominal mode) there + exists a duration $\Delta$ such that it continuously outputs a \LOSS + after the date $\delta_0 + \Delta$ if at least one of its input + nodes continuously propagates a \LOSS starting from $\delta_0$ + onward. The smallest possible value for $\Delta$ is called the + \emph{convergence latency} of the function. +\end{prop} + + + +In the next section, we use our approach to generate a list ``timed +cuts'' (as model-checking counterexamples) that would have exposed the +problems that we just described. We also use model-checking to compute +the {convergence latency} for the node \F{3}. In this simple example, +we can show that the latency is equal to the maximal propagation delay +at the input of the detectors. The value of the latency could be much +harder to compute in a more sophisticated scenario, where delays can +be chained and/or depends on the internal state of a component. + +% The failure to detect a lost element in the system strongly affects +% the safety assessment process, and motivates our approach to take +% directly into account temporal constraints when analysing AltaRica +% models. Unfortunately, while it is possible to define some timing +% constraints on AltaRica synchronizations using ``Dirac events'', this +% information is not taken into account during analysis. In particular, +% we cannot use the Sequence Generation tool to find the ``timed'' +% minimal cuts that would expose the problems that we just described. In +% the next section, we propose a way to check our timed extension of +% AltaRica using a translation into the Fiacre specification +% language. After translation into this new format, the model can be +% used by a realtime model-checker Tina. + +% \TODO{Limitations of OCAS are described above as well: to integrate the two parts} +% \TODO{talk about Dirac(2) in AltaRica as a way to do some crude +% temporal constraints. It works in simulation mode in Cecilia OCAS but +% no tooling !? actually I am not sure.} + +% \subsubsection{Dialects of AltaRica} +% AltaRica is a high level modelling language dedicated to Safety Analysis. +% The semantics of AltaRica is formally defined in terms of Guarded Transitions Systems, and the state of the system is described by means of variables~\cite{poi99}. The system changes of state are dictate by events, i.e. the transitions between states happen only when an event occurs as it is the only mechanism updates the value of variables. + +% Few versions of AltaRica exist; we consider here AltaRica 2.0 Dataflow, a version where variables are updated by propagating values in a fixed order, and this order is determined at compilation time. + +% The model we realised used CECILIA as a tool, then brought to a more +% standard AltaRica 2.0 version (the one of Epoch). + +% \subsection{Cecilia OCAS graphical interactive simulator} +% %% Pris de l'article de Christel +% The system architecture we modelled can be realised using Cecilia OCAS graphical interactive simulator, which has the capacity of exporting AltaRica code, in a dialect that can easily be translated in AltaRica DataFlow. + +% Each system component is modelled by an AltaRica node +% that can be regarded as a mode automaton~\cite{rauzy02}. In Cecilia +% OCAS, each node is associated to an icon and belongs to a library. +% Components are dragged and dropped from the library to the system +% architecture sheet and then linked graphically. + +% As failures are events in the AltaRica model, the safety engineer can use the graphical capacities of the tool to communicate more easily the model characteristics to other project members, as graphical representations are possibly the easiest way to communicate models, not only for the safety engineers. +% This tool permits to inject in the model a number of failure events in order to observe whether a failure condition is reached (such as loss of one or several elements). + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "main" +%%% End: + +%% LocalWords: PFD OCAS CAS Ps Fiacre diff --git a/doc/Rapport post-doc/2-sota.tex b/doc/Rapport post-doc/2-sota.tex new file mode 100644 index 0000000..ce31331 --- /dev/null +++ b/doc/Rapport post-doc/2-sota.tex @@ -0,0 +1,173 @@ +% State of the Art + +\section{Modelling languages for Safety Analysis} +% modelling languages + + +In AltaRica, a system is expressed in terms of variables constrained +by formulas and transitions. Several versions of the language have +been defined (see for instance~\cite{arn00,prosvirnova2013altarica}). +Underlying mathematical model...... + +AltaRica will be described more deeply in Sec.~\ref{sec:altarica}. +% Tempora lproperties for safety + +OpenAltarica~\citep{prosvirnova2013altarica} relies on propagation based variable update, but the order in which this propagation +takes place in determined at execution time. Technically, a fixpoint is computed. This new update +scheme does not increase much computation times but extends significantly the expressiveness of the +language. It makes it possible to handle looped systems, i.e. systems in which variables depend of each +other in a circular way. Another new feature of AltaRica 3.0 is the notion of guarded synchronization +that both increases the expressiveness and unifies transitions and synchronizations + + +Several model-based approaches have been proposed, each with their associated tooling, in order to cope with the complexity of analyzing sophisticated safety architectures and scenarios. However, rare are the languages that come equipped with tools that can perform formal analysis of timed models. + +Figaro language~\citep{bouissou05} is an alternative language for failure propagation model which introduces time via stochastic events, while we express temporal constraints on the triggering of events. Figaro models can be analyzed with stochastic simulators which are relevant to assess performance of the system (e.g. an estimation of the false detection rate). As far as we know, there is no translation from Figaro to timed model checking tools in order to verify whether a software logic satisfies applicable deterministic timed requirements. +Several works have combined model-checking and AltaRica. The archetypal example is the MEC tool~\citep{mec5} that was developed at the same time as the language. More recently, Bozzano et al.~\citep{bozzano2012} have defined a transformation from AltaRica Dataflow to the symbolic model-checker NuSMV. While this tool does not support complex timing constraints, it offers some support for Dirac laws (and implicit priorities) by encoding an ad-hoc scheduler. + +COMPASS uses the SLIM language, a subset of AADL, for modelling safety architectures. It can automatically generate fault trees, which can be evaluated to determine the probabilities of failures. The FDIR design process and analysis relies, for describing temporal events on fault propagation, on the so-called TFPM (Timed Failure Propagation Models)~\citep{bittner2014}. + +AADL (Architecture Analysis and Design Language) is a multi-concerns modelling language dedicated to distributed real-time embedded systems~\cite{aadl}. +AADL has been enriched with several annexes to describe embedded system behvior; for instance, the Error Model V2 (EMV2) is an error annex that focuses on Safety analyses. +EMV2 offers a terminology and an ontology to capture key features of failure propagations, like permanent and transient errors events. EM2V supports AADL to PRISM export into a PRISM model, in order to process model-checking method using the Markov-Chain formalism~\cite{PRISM}; i.e. probabilistic model analysys. The PRISM input language is a simple, state-based language. We discuss furter the PRISM model-checker in sec.~\ref{modelsota}. + +UPPAAL is a non-deterministic guarded command language with data types description language. It serves as a modeling or design language to describe system behavior as networks of +timed automata extended with data variables. A simulator and a model-checker are designed for interactive and automated analysis of system behavior by manipulating and solving constraints that represent the state-space of a system description. +Validating a FDIR approach in satellite architecture has been done in project AGATA~\citep{rugina09} by coupling simulation with model-checking, focusing significant part of the system and abstracted away the rest of it using UPPAAL~\cite{uppaal1997}. + +\section{Safety Assessment on Temporal Properties} + +% Who does that + + +Our approach provides a solution to +model safety timing constraints within AltaRica, also providing an +automatic transformation from Time AltaRica models in one of the +input formats of Tina, showing how two interesting +problems---computing ``timed cuts'' and bounding the convergence +latency of a node---can be reduced to a decidable model-checking +problem. %% TODO: Complete with FDIR results, and underline the needs filled. + +Several works have combined model-checking and AltaRica, the +archetypal example being the MEC tool~\cite{mec5,griffault2004mec} that was +developed at the same time as the language. More recently, Bozzano +et al~\cite{bozzano2012} have defined a transformation from AltaRica +Dataflow to the symbolic model-checker NuSMV. While this tool does not +support complex timing constraints, it offers some support for Dirac +laws (and implicit priorities) by encoding an ad-hoc scheduler. The +use of symbolic model-checking techniques is interesting in the case +of models with a strong combinatorial blow up, like for instance model +HYDRAU of Sect.~\ref{sec:sect4}. Nonetheless, even though Tina also +includes BDD-based tools, no approaches allow to combine the advantages +of both realtime and symbolic model-checking techniques. + + +Other model-based approaches aim at assessing the dependability of safety-critical dynamic systems. +HiP-HOPS~\cite{papadopoulos2011engineering} is a tool for safety analysis that can generate automatically fault-trees and FMEA tables from extended system models, as well as perform quantitative analysis on fault trees and multi-objective optimisation of the system model. + +In Pandora~\cite{walker2009pandora}, Temporal Fault Trees allow to model dynamic behaviours with temporal gates, while temporal laws are used for qualitative analysis. +This approach specifies directly the dynamic failure behaviour of components through a formalism for dynamic dependability, on the other side, using a model-based approach (e.g. modelling with AltaRica), the failure propagation mechanism is directly inferred by the analysis tool from the undelying model. + + + +Realtime techniques are central to our approach. As we will see in Sect.\ref{sec:sect2}, we define an +extension of AltaRica, Time AltaRica, where timing constraints can be declared using {temporal laws} of the form \code{law (evt) = "[a,b]"}, with a +semantics inspired by Time Petri nets. As a result, we can apply on +Time AltaRica several state space abstractions techniques that have been +developed for ``timed models'', such as the use of DBM and state +classes~\cite{BRV04}. In a different way, Cassez et +al.~\cite{pagetti2004} have proposed an extension of AltaRica with +explicit ``clock variables'', inspired by Timed Automata, where clocks +are real-valued flow variables that can be used inside the guards of +events. +%% +% (Which means that there are restrictions on the type of equations +% one can use in the \code{assert} declaration of a node.) +%% +% They also define an algorithm to compile this extension into +% Uppaal~\cite{larsen1997uppaal}. +Their work is mainly focused on the verification of behavioural +properties and focuses on the encoding of urgency and priorities +between events, two notions that are naturally offered in +Fiacre. Also, our extension is less invasive. If we ignore the +\code{extern} declaration then we obtain valid AltaRica code. More +research is still needed to further the comparison between these two +approaches in the context of safety assessments. + +Aside from these works on AltaRica, recent works +centred on combining failure propagation analysis and timing constraints, +define an automatic method for +synthesising \emph{Timed Failure Propagation Graphs} (TFPG), that is +an extension of the notion of cut-sets including information on the +date of events~\cite{bittner2016}. TFPG provide a condensed representation that is easier +to use than sets of timed cuts. Therefore, it would be interesting to +use this format in our case. + + +\section{Model-checking approach to safety assessment} +\label{modelsota} +Several model-checkers have been used in industrial or academic +projects to perform safety analysis. Besides Tina from LAAS, that we discuss further in Sect.~\ref{sec:tina}, +UPPAAL, MEC, ARC, PRISM, and NuSMV are the model-checkers more widely used in this domain. + +UPPAAL~\cite{uppaal1997} provides a model-checker. It is designed to check for invariant +and reachability properties. Other properties, such as bounded liveness +properties, can be checked by reasoning about the system +in the context of testing automata or simply decorating +the system description with debugging information and +then checking reachability properties. Model-checking is +performed by a module which takes as input +a network of automata in the textual UPPAAL format +and a formula. + +Mec 5~\cite{mec5} is a model-checker for finite AltaRica models. +Properties are verified by testing that the set of states which violate the property is +empty. These properties are expressed in a specification language that allows the definition +of complex relations between different models, e.g. bisimulation. + +The AltaRica Checker (ARC)\cite{arc} is a toolbox for the AltaRica language. ARC is aimed at model-checking systems described with AltaRica. +It also gathers several tools for the analysis or compilation of AltaRica models, like the support for Mec 5 specifications, translators for the LUSTRE language~\cite{Griffault06}, +and a simulator for models decorated with stochastic informations. + +PRISM~\cite{PRISM} is a probabilistic model checker used for formal modelling and analysis of systems that exhibit random or probabilistic behaviour. + It incorporates symbolic data structures and algorithms, based on BDDs (Binary Decision Diagrams) and MTBDDs (Multi-Terminal Binary Decision Diagrams)~\cite{KNP04b}. It also includes a discrete-event simulation engine, providing support for approximate/statistical model checking, and implementations of various different analysis techniques, such as quantitative abstraction refinement and symmetry reduction. + a model-checking tool for processing Markov-Chain. It supports different models such as Discrete Time Markov-Chain (DTMC) or Continuous Time Markov-Chain (CTMC). + It has been used to analyse systems from many different application domains. + +NuSMV~\cite{nusmv} (New Symbolic Model Verifier) is a symbolic model checker, supporting verification techniques such as BDD-based and SAT-based techniques. It allows to check finite state systems against specifications in the temporal logic for CTL and LTL. The input language of NuSMV is designed to allow the description of finite state systems that range from completely synchronous to completely asynchronous. The NuSMV language (like the language of SMV) provides for modular hierarchical descriptions and for the definition of reusable components. + + Besides, translators between these languages exist, in certain cases. +Even if generally the translation concerns subsets of the languages expressivity, it makes possible testing +tools and compare modelling techniques. Notable examples, are the AADL EMV2 to AltaRica translation~\cite{brunel2017performing}, or the pioneer work from +an AADL subset (System-Level Integrated Modelling (SLIM) language) to NuSMV, aimed at achieving formal analysis via model-checking in the framework of the COMPASS project~\cite{bozzano2010safety}. + + +\subsection{Tina model-checker}\label{sec:tina} +Tina (TIme Petri Net Analyzer, \url{http://www.laas.fr/tina}) is a +software environment to edit and analyze Petri Nets and Time +Petri Nets~\cite{BRV04}. +Time Petri nets~\cite{merlin1976} are one of the most widely used model +for the specification and verification of real-time systems: +they extend Petri nets with temporal intervals associated with +transitions, specifying firing delay ranges for the transitions. +In addition to the usual editing and analysis facilities of +similar environments, Tina offers various abstract state space +constructions that preserve specific classes of properties of +the state spaces of nets, like absence of deadlocks, linear +time temporal properties, or bisimilarity. For untimed systems, +abstract state spaces helps to prevent combinatorial explosion. +For timed systems, abstractions are mandatory as their state +spaces are typically infinite, Tina implements various abstractions based on state classes. + +We used Tina as mode-checker (via the tool \emph{selt}) for the toolchain described in these pages +for its capacities with Temporal Petri Nets, and its performances as model-checker. +In addition, several model-checkers are being developed specifically for Tina. +The first available, \emph{selt}, is a model-checker for an enriched version +of State/Event -- LTL checking ~\cite{chaki2004}, a linear time temporal logic +supporting both state and transition properties. For the properties found false, a timed counter example is +computed and can be replayed by the simulator \emph{play}, also present in Tina's software suite. + +Then, Tina can present its results in a variety of formats, +understood by model checkers like MEC~\cite{mec5}, a $\mu$-calculus +formula checker, or behavior equivalence checkers like Bcg, +part of the CADP toolset~\cite{cadp}. diff --git a/doc/Rapport post-doc/3-imbsa.tex b/doc/Rapport post-doc/3-imbsa.tex new file mode 100644 index 0000000..505368a --- /dev/null +++ b/doc/Rapport post-doc/3-imbsa.tex @@ -0,0 +1,884 @@ + + +Failure propagation models are defined by safety engineers and are +usually obtained through manual assessment of the safety of the +system. This is a complicated task since failures can depend on more +than one element of the system; be the result of the interaction +between many faults; be the consequence of the missed detection of +another fault (e.g. a fault inside an element tasked with detecting +faults); etc. To cope with the complexity of the systems and the +scenarios that need to be analysed, several model-based approaches +have been proposed such as AltaRica~\cite{Altarica2.3,arnold1999altarica}, Figaro~\cite{bouissou05}, etc. each with their +associated tooling. + + +Our work is concerned with the modelling and analysis of failures +propagation in the presence of time constraints. We concentrate on a +particular safety property, called \emph{loss detection convergence}, +meaning that the system applies an appropriate and timely response +to the occurrence of a fault before the failure is +propagated and produces unwanted system behaviours. +% +Similar problems +were addressed in~\cite{thomas2013}, where the authors describe a +process to model Failure Detection Isolation and Reconfiguration architecture (for use on-board satellites) that +requires to take into account failure propagation, +detection, and recovery times. However, these needs are not matched by +an effective way to express or check the safety constraints of the system. + + +Our contribution is as follows. We define a lightweight extension of +AltaRica, meaning that timing constraints are declared separately from +the behaviour of a system (Sect.~\ref{sec:sect2}). Therefore it is easy to reuse a prior +safety model and to define its temporal behaviour afterwards. We +illustrate our method with an example inspired by safety architectures +found in avionic systems. This example illustrate the impact of time +when reasoning about failure propagation, and we use it to +show that taking into accounts timing constraints---in particular +propagation delays---can help finding new failure modes that cannot be +detected in the untimed models currently in use. In the process, we +define two safety properties: \emph{loss detection}; and its temporal +version, \emph{loss detection convergence}, meaning that a system +applies an appropriate and timely response to the occurrence of a +fault before the failure is propagated and produces unwanted system +behaviours. We show that these two properties, which are of interest +in a much broader context, can be reduced to effective model-checking +problems. + +In the next chapter we extend this approach, by applying it to an industrial +satellite study case, and analysing the scalability of the methodology to more +complex system models. + + +\section{Model-Based Safety Analysis with AltaRica}\label{sec:sect2} + + +\subsection{AltaRica language and versions} + + +AltaRica is a high level modelling language dedicated to Safety +Analysis. It has been defined to ease the modelling and analysis of +failure propagation in systems. The goal is to identify the +possible failure modes of the system and, for each mode, the chain of +events that lead to an unwanted situation. + + +In AltaRica, a system is expressed in terms of variables constrained +by formulas and transitions. Several versions of the language have +been defined (see for +instance~\cite{arn00,prosvirnova2013altarica}). + + + +Three main versions of AltaRica have been designed so far. These three versions differ essentially with +two respects: the way variables are updated after each transition firing and the way hierarchies of +components are managed. In the first version, designed at the Computer Science Laboratory of +University of Bordeaux (LaBRI), variables were updated by solving constraint systems. This model, +although very powerful, was too resource consuming for industrial scale applications. A radical turn +was therefore taken with the design of a data-flow version of the language. In AltaRica 2.0 Dataflow, +variables are updated by propagating values in a fixed order. This order is determined at compile time. +At the time this document is written, most of AltaRica tools rely on this Dataflow version. Ongoing investigation aim +at improving AltaRica Dataflow in several ways, like propagating variable values by determining a fixpoint at execution time, +hence justifying the third version of +the language currently being developped: AltaRica 3.0 or OpenAltaRica\cite{prosvirnova2013altarica}. + +\subsection{AltaRica modelling} +In this work, we use the AltaRica 2.0 Dataflow language which is a fragment of other +versions and which is sufficient to analyse the behaviour of computer +based systems. (The approach discussed here could be applied to other +AltaRica dialects.) The models used in this work have been edited and +analysed using Cecilia OCAS, a graphical interactive simulator +developed by Dassault Aviation~\cite{bieber2004safety}. + +An AltaRica model is made of interconnected \emph{nodes}. A node can +be essentially viewed as a mode automaton~\cite{rauzy02} extended with +guards and actions on data variables. A node comprises three parts: a +declaration of variables and events, the definition of transitions, +and the definition of assertions. We illustrate these concepts with +the example of a simple node called \FUNC. We give the code (textual +definition) of \FUNC in Listing~\ref{ls:altarica} and a schematic +representation in Fig.~\ref{fig:funct2}. The node \FUNC has one input, +\code{I}, and one output, \code{O}. + +\lstinputlisting[language=Altarica,float=bht,captionpos=b,caption=\protect{Example + of AltaRica code for the node \FUNC.},frame=single,label=ls:altarica]{algos/function2.alt} + +\begin{figure}[thb] + \centering + \begin{minipage}{0.25\textwidth} + \centering + \includegraphics[width=\textwidth]{altarica-function.pdf} + \end{minipage} + \begin{minipage}{0.7\textwidth} + \centering + \vspace{1em} + \includegraphics[width=0.8\textwidth]{altarica-diagrams.pdf} + \end{minipage} + \caption{Graphical representation of node \FUNC (left) and its + associated failure mode automaton (right).\label{fig:funct2}}\vspace{1em} +\end{figure} + +\enlargethispage{\baselineskip} +% +Nodes can have an internal state stored in a set of \emph{state + variables}, declared in a heading called \texttt{state}. In its +nominal state (when \code{S = NOMINAL}), the \FUNC node acts as a +perfect relay: it copies on its output the value provided by its input +(we have \code{O = I}); this is expressed in the \code{assert} +block. On the opposite, its output is set to \LOSS or \ERR when +\code{S} equals \code{LOST} or \code{ERROR}, respectively. +% +The assert directive is used to express constraints on the values of +the input and output variables of a node, also called \emph{flow + variables}, establishing a link between the node and its +environment, i.e. the other interconnected nodes. It distinguishes +between input (\texttt{in}) and output (\texttt{out}) variables. An +assertion defines a rule to update the value of output flows according +to the state of the component and the value of input flows. + +The state variables of a node can only change when an +event is triggered. The code of \FUNC declares two events: \code{fail\_err}, that +changes the state from \code{NOMINAL} to \code{ERROR}, and +\code{fail\_loss}, that can transition from any state to +\code{LOST}. This behaviour is the one displayed on the mode +automaton of Fig.~\ref{fig:funct2}. Transitions are listed in the +\texttt{trans} block of the node. Each transition has an (event) +name and a definition of the form +\lstinline[language=Altarica]{g |-evt-> e}, where the guard \code{g} +is a Boolean condition that can refer to state and flow +variables. The event \code{evt} can be triggered when the guard is +satisfied. In this case we apply the effect, \code{e}, that is an +expression that modifies the values of state variables. + +Events are useful to model the occurrence of failures or the reaction +to conditions on the flow variables. +% It is possible to indicate +% whether an event is triggered internally by a node---as in the case of +% a reconfiguration---or externally by its environment---as in the case +% of the occurrence of a failure. In the latter case, +We can assign a +law of probability on the occurrence of the failure using the heading +\code{extern}. For instance we could assert that event +\code{fail\_loss} follows an exponential distribution with the +declaration: +%% +{\lstinline[language=Altarica]{extern law ()="exp 1e-4";}} +%% +In the next section, we propose a way to enrich this syntax to express +timing constraints on events instead of probability distributions. At +the moment, it is not possible to use stochastic events in addition to +time events. + +\enlargethispage{\baselineskip} + +In the general case, an AltaRica model is composed of several +interconnected node instances, following a component-based +approach. Global assertions relate the input flows of a component to +the output flows of other components. For the sake of brevity, we do +not describe component synchronisation here and we refer the reader to +\cite{Altarica2.3} for further details. More importantly, a +hierarchical AltaRica model can always be ``flattened'', i.e. +represented by a single node containing all the variables, events, +assertions, and transitions from the composite system. We use this +property in our interpretation of AltaRica in Fiacre. + +%% +\subsection{Time AltaRica: Adding Timing Constraints to Events}%%\label{sec:adding-timing-constr} +%% +There already is a limited mechanism for declaring timing constraints +in AltaRica. It relies on the use of external law associated with a +\emph{Dirac distribution}. An event with Dirac$(0)$ law denotes an +instantaneous transition, that should be triggered with the highest +priority. Likewise, an event with Dirac($d$) (where $d$ is a +positive constant) models a transition that should be triggered with a +delay of $d$ units of time. +% +In practice, Dirac laws are rather a way to encode priorities between +events than an actual mean to express duration. Moreover, while Dirac +laws are used during simulation, they are not taken into account by +the other analysis tools. Finally, the use of Dirac laws is not +expressive enough to capture non-deterministic transitions that can +occur within time intervals of the form $[a, b]$, where $a \neq +b$. These constraints are useful to reason about failure propagation +delays with different best and worst case traversal time. For this +reason, we propose to extend event properties with \emph{temporal + laws} of the form: +%% +{\lstinline[language=Altarica]{extern law (evt) = "[a,b]";}} +%% +It is also possible to use open and/or unbounded time intervals, such +as \code{]a,}$\infty$\code{[}.%%\scriptstyle + +With such a declaration, the transition +\lstinline[language=Altarica]{g |-evt-> e} can be triggered only if +the guard \code{g} is satisfied for a duration (or \emph{waiting + time}) $\delta$, with $\delta \in [a, b]$. A main difference with +the original semantics of AltaRica is that the timing constraint of an event is +not reinitialised unless its guard is set to false. +%% +% Hence the waiting time of an event decreases when time elapse whereas, +% while with a Dirac($d$) law the waiting time is reset to $d$ each time +% the event fires. Finally, +Moreover, our semantics naturally entails a notion of \emph{urgency}, +meaning that it is not possible to miss a deadline: when $\delta$ +equals $b$, then either \code{evt} is triggered or another transition +should (instantaneously) change the value of the guard \code{g} to +false. + +We can illustrate the use of temporal laws with the following example of a new +node, \PRE; see Listing.~\ref{ls:pre}. This node encodes a buffer that +delays the propagation of its input. When the input changes, event +\code{pre\_read} has to be triggered instantaneously. Then, only after +a duration $\delta \in [a, b]$, the value stored by \PRE (in the state +variable \code{Stored}) is propagated to its output. +% +\lstinputlisting[language=Altarica,float=t,captionpos=b,caption=\protect{Example + of Time AltaRica code: the basic delay.},frame=single,label=ls:pre]{algos/pre.alt} + + +\section{A Definition of Fiacre Using Examples}\label{sec:sect3} + +Fiacre~\cite{berthomieu2008fiacre} is a high-level, formal +specification language designed to represent both the behavioural and +timing aspects of reactive systems. Fiacre programs are stratified in +two main notions: \emph{processes}, which are well-suited for modelling +structured activities (like for example simple state machines), and +\emph{components}, which describes a system as a composition of +processes. In the following, we base our presentation of Fiacre on +code examples used in our interpretation of Time AltaRica. +% \subsection{A Definition of Fiacre by Examples} +% \label{sec:defin-fiacre-exampl} +We give a simple example of Fiacre specification in +Listing~\ref{lst:fiacre}. This code defines a process, +\code{Function}, that simulates the behaviour of the AltaRica node +given in Listing~\ref{ls:altarica}. + +\lstinputlisting[language=Fiacre,float=hbt,captionpos=b,caption=\protect{Example + of Fiacre code: type, functions and processes},label=lst:fiacre,frame=single]{algos/function.fcr} + +Fiacre is a strongly typed language, meaning that type annotations are +exploited in order to avoid unchecked run-time errors. Our example +defines two enumeration types, \code{FState} and \code{FailureType}, +that are the equivalent of the namesake AltaRica domains. We also +define a record type, \code{Flows}, that models the environment of the +node \code{Function}, that is an association from flow variables to +values. Fiacre provides more complex data types, such as arrays, +tagged union or FIFO queues. Fiacre also supports native +\emph{functions} that provide a simple way to compute on values. In +our example, function \code{update} is used to compute the state of +the environment after an event is triggered; that is to model the +effect of assertions in AltaRica. It uses two ternary (conditional) +operators to mimic the \code{case}-expression found in the +\code{assert} heading of Listing~\ref{ls:altarica}. + +% Functions are evaluated applicatively (there are no side effects) and +% can be recursively defined. + +A Fiacre \emph{process} is defined by a set of parameters and {control + states}, each associated with a set of \emph{complex transitions} +(introduced by the keyword \code{from}). Our example defines a process +with two {shared variables}---symbol \code{\&} denotes variables +passed by reference---that can be updated concurrently by other +processes. In our case, variable \code{S} models the (unique) state +variable of node \FUNC. + +Complex transitions are expressions that declares how variables are +updated and which transitions may fire. They are built from constructs +available in imperative programming languages (assignments, +conditionals, sequential composition, \dots); non-deterministic +constructs (such as external choice, with the \code{select} operator); +communication on ports; and jump to a state (with the \code{to} or +\code{loop} operators). In Listing~\ref{lst:fiacre}, the \code{select} +statement defines two possible transitions, separated by the symbol +\code{[]}, that loop back to \code{s0}. Each transition maps exactly +to one of the AltaRica events, \code{fail\_loss} and \code{fail\_err}, +that we want to translate. Transitions are triggered +non-deterministically and their effects are atomic (they have an ``all +or nothing'' semantics). A transition can also be guarded by a Boolean +condition, using the operator \code{on} or another conditional +construct. + +It is possible to associate a time constraint to a transition using +the operator \code{wait}. Actually, the ability to express directly +timing constraints in programs is a distinguishing feature of +Fiacre. We illustrate this mechanism in the code below, that +corresponds to the interpretation of the node \PRE of +Listing~\ref{ls:pre}. Basically, a transition constrained by a (time) +interval $I$ can be triggered after a time $\delta$, with +$\delta \in I$, only if its guard stayed continuously valid during +this time. It is this behaviour that inspired our choice of semantics +for the temporal law. + +The last notion that we need to introduce is \emph{components}. + Components allow the hierarchical composition of processes, in the + same way than AltaRica nodes can be composed into classes in order to + build more complex behaviors. +Thus, a Fiacre component defines a parallel composition of components and/or +processes using statements of the form \code{par} \vars{P}$_0$ +$\parallel \dots \parallel$ \vars{P}$_n$ \code{end}. It can also be +used to restrict the visibility of variables and ports and to define +priorities between communication events. +% Priorities are explicitly declared as constraints between +% communication ports, as in \code{go1 > go2}. +We give an example of Fiacre component in Listing~\ref{lst:pre2}, +where we define an upgraded version of the delay operator \PRE. +% +\lstinputlisting[language=Fiacre,float=bt,captionpos=b,caption=\protect{Wait statement, components and synchronisation on ports.},label=lst:pre2,frame=single]{algos/pre2.fcr} + +% % +% \lstinputlisting[language=Fiacre,float=bt,captionpos=b,caption=\protect{Example +% of Fiacre code: declaring timing +% constraints},label=lst:pre1,frame=single]{algos/pre.fcr} +% % + + +A problem with the implementation of \PRE is that at most one failure +mode can be delayed at a time. Indeed, if the input of \PRE changes +while the state is \code{Full}, then the updated value is not taken +into account until after event \code{pre\_wait} triggers. +% +It is not possible to implement a version that can delay an unbounded +number of events in a bounded time; this would require an unbounded +amount of memory to store the intermediate values. More fundamentally, +this would give rise to undecidable verification problems (see +e.g.~\cite{bouyer2004updatable}). To fix this problem, we can define a +family of operators, \PRE\code{\_k}, that can delay up-to $k$ +simultaneous different inputs. Our implementation relies on a +component that uses three process instances: one instance of +\code{front}, that reads messages from the input (variable \code{I}), +and two instances of \code{delay}, that act as buffers for the values +that need to be delayed. Process \code{front} uses the local ports +\code{go1} and \code{go2} to dispatch values to the buffers. +Component \PRE\code{\_2} is enough to model the use case defined in +Sect.~\ref{sec:example-fail-detect-1}. Indeed, any element in the FDI +system may propagate at most two different status, one from \OK to +\LOSS and then from \LOSS to \ERR. + + + +\section{Example of a Failure Detection and Isolation System} +\label{sec:example-fail-detect-1} + +We study the example of a safety critical function that illustrates +standard failure propagation problems. We use this example to show the +adverse effects of temporal failure propagation even in the presence +of % system safety improvements. In our case the addition of +Failure Detection and Isolation (FDI) capabilities. +% +This example is inspired by the avionic functions that provide +parameters for Primary Flight Display (PFD), which is located in the +aircraft cockpit. The system of interest is the computer that acquires +sensors measurements and computes the aircraft \emph{calibrated airspeed} (CAS) parameter. +Airspeed is crucial for pilots: it is taken into +account to adjust aircraft engines thrust and it plays a main role in +the prevention of over speed and stall. + +%% +\begin{figure}[thb] + \centering + \includegraphics[width=1\textwidth]{figures/AirSpeed_Computation.jpg} + \caption{Functional and physical views of the airspeed computation function.\label{fig:cockpit}} +\end{figure} +%% + +CAS is not directly measured by a dedicated sensor, but is computed as +a function of two auxiliary pressure measurements, the static pressure +(Ps) and total pressure (Pt); that is +$\mathrm{CAS} = f(\mathrm{Pt}, \mathrm{Ps})$. +% \begin{equation*} +% CAS = C_{SO}\sqrt{5 \cdot \left( \left(\frac{Pt - Ps}{P_0} + 1\right)^{2/7} - 1\right)} +% \end{equation*} +% with $C_{SO}$ and $P_0$ two +% constants. % the speed of sound under standard day sea level conditions +These two measurements come from sensors located on the aircraft nose, +a pressure probe and a pitot tube. +% Our proposed functional view shows: +% \begin{itemize} +% \item Two external functions \I{1} and \I{2} that measure static and total pressure. They represent the functions allocated to the sensors. +% \item Three inner functions of the system: \F{1} and \F{2} for sensor measurements acquisition by the onboard computer and \F{3} for airspeed computation. +% \item The PFD functions have not been modelled in the sole purpose of simplification. +% \end{itemize} +% +%% + +Our proposed functional view is given in Fig.~\ref{fig:cockpit}. It +consists in two external input functions \I{1} and \I{2} that measure static +and total pressure; and three inner functions of the system, \F{1} and +\F{2} for sensor measurements acquisition by the on-board computer and +\F{3} for airspeed computation. For simplification purposes, the +PFD functions have not been modelled. + +Next, we propose a first failure propagation view aiming at +identifying the scenarios leading to an erroneous airspeed computation +and display to the pilot (denoted \ERR). Such failure can only be +detected if a failure detector is implemented, for instance by +comparing the outputs of different functions. Undetected, it could +mislead the pilot and, consequently, lead to an inappropriate engine +thrust setting. We also want to identify the scenarios leading to +the loss of the measure (denoted \LOSS). In such a case, the pilot can +easily assess that the measure is missing or false and consequently +rely upon another measure to control the aircraft (note that such +redundancy is not modelled). For example, airspeed out of +bound---indicating that an airliner has crossed the sonic barrier---is +considered to be of kind \LOSS. It can be understood that scenarios leading to the +loss of the airspeed are less critical than the ones leading erroneous +values. + +% We consider two possible kinds of fail status: the ``silent'' failure of +%an element (denoted \ERR); or a communication problem with one of the +% functions (denoted \LOSS). + + A failure is typically a loss of connectivity or the + detection of (clearly) erroneous transmitted values, for instance a + variable out of bounds. A \LOSS fail is less critical than an \ERR + since it can be detected immediately and isolated. On the other hand, + an \ERR fail can only be detected if a failure detector is + implemented, for instance by comparing the outputs of different + functions. In the following, we consider that the status + are ordered by their level of severity, that is \ERR $<$ \LOSS $<$\OK. + + +\subsubsection{Safety model of the architecture without FDI} +%%\label{sec:error-prop-simple} +For the sake of understandability, we choose to study a simplified version of +FDI system. While simple, this system is representative of failure +propagation mechanisms found in actual onboard systems. +%% + +We provide an AltaRica model corresponding to the functional view +of the CAS function in Fig.~\ref{fig:example0}. This model, tailored +to study failure propagation, is comprised of: +% ( All the functions are modelled according to the node function +% introduced in the Sect.~\ref{sec:sect2}. +% +two external functions, \I{1} and \I{2}, that have no input (so, in +their nominal state, the output is set to \OK); two inner functions, +\F{1} and \F{2}, which are instances of the node \FUNC described in +Sect.~\ref{sec:sect2}; and a function, \F{3}, that is the composition +of two basic elements: a multiplexer, \MIN, representing the +dependence of the output of \F{3} from its two inputs, and a computing +element \F{3Processing} that represents the computation of the +airspeed. \F{3Processing} is also an instance of node \FUNC. + +\begin{figure}[t] + \centering + \begin{tikzpicture} + \node[anchor=south west,inner sep=0] at (0,0) { \includegraphics[width=0.75\textwidth]{figures/Modele0}}; + \draw[red!50,ultra thick, dashed] (7,2.85) rectangle (2.6,0.5); + \node[red] at (6.5,2.5) {\texttt{\large F3}}; + \end{tikzpicture} + \caption{A simple example of failure propagation.\label{fig:example0}} +\end{figure} +% +In case of single failure scenario, \MIN propagates the failure coming +either from one input or the other. In case of multiple failures, +%when both inputs have identical failure, the faillure propagates; +%For instance, +% both inputs to \LOSS lead to an output of \LOSS. +% But when it receives an erroneous fail then the multiplexer will +% propagate an \ERR. The remaining failure combination drew our +% attention during \F{3} modelling. +%on the other hand, +when different failures propagate, one being \LOSS +and the other being \ERR,---and without appropriate FDI---the system +outcome is uncertain. +% +Solving this uncertainty would require a detailed behavioural model of +the on-board computer and a model for all the possible failure modes, +which is rarely feasible with a sufficient level of confidence, except +for time-tested technology. Given this uncertainty, it is usual to +retain the state with the most critical effect, that is to say: +% in this case, \MIN can be thought of as a simple logic operator that +% computes the minimum of its two inputs, and +the output of \F{3} is \ERR. + + +% Since a \LOSS can be ``easily'' detected, we want to avoid a situation +% where the whole system propagates \ERR while one of its +%internal element propagates a \LOSS. The rationale is that we should be +% able to isolate (or quarantine) the system when we know for sure that +% one of its element does not reliably respond to commands. This can be +% expressed by the following safety property. +%% + +% In the next section, we study the system with the addition of FDI +% capabilities. + +Our goal is to prevent the computation of an erroneous airspeed while +one of \F{3} input signals is lost. The rationale is that the system +should be able to passivate automatically the airspeed when it detects +that one of its input signals is not reliable. This behaviour can be +expressed with the following property: + +%% +\begin{prop}[Loss Detection and Instantaneous Propagation]\label{prop:1} + A function is \emph{loss detection safe} if, when in nominal mode, it + propagates a \LOSS whenever one of its input nodes propagates a + \LOSS. +\end{prop} + +% This is a simple system used to detect non-nominal behaviours +% and to trigger observables in order to isolate the failure mode. +% ({The figures are actual screen capture of models edited with Cecilia +% OCAS.}) +% \subsubsection{Analysis} + + +We can show that our example of Fig.~\ref{fig:example0} does not meet +this property using the \emph{Sequence Generation} tool available in +Cecilia OCAS. +%% +% This system has several sources of unreliability. Both its sources and +% the computing elements (\F{1}, \F{2} and \F{3Processing}) can +% experience spontaneous failures, meaning that their outputs can +% transition instantaneously to \LOSS or \ERR. Errors are irrecoverable; +% once a function becomes faulty, its output will always stay equal to +% \LOSS or \ERR. Likewise, if both inputs are ``nominal'' then the +% output of \MIN is \OK. We assume that the multiplexer cannot undergo +% spontaneous failures. +%% +% This can be tested using a perfect detectors, \FF{3}{Loss}, placed at +% the output of the system. +%% +To this end, we compute the minimal cuts for the target equation +$((\text{\F{1.O.Loss}} \vee \text{\F{2.O.Loss}}) \wedge \neg +\text{\F{3.O.Loss}})$, meaning the scenario where \F{3} does not +propagates \LOSS when one of \F{1} or \F{2} does. Hence function \F{3} +is {loss detection safe} if and only if the set is empty. + \footnote{To check the safety of \F{3}, we need to perform the same + analysis for all the elements that can propagate a loss fail, not + only \F{1}.}. + +In our example, once we eliminate the cases where \F{3} is not nominal +(that is when \F{3Processing} is in an error state), we find eight +minimal cuts, all of order $2$. In the following section, we correct +the behaviour of \F{3} by considering a new architecture based on +detectors and a switch to isolate the output of \F{3} when faulty: + +%% + {%\centering + \begin{small} + \begin{tabular}{c@{\quad\quad}c} + \begin{minipage}[t]{0.42\linewidth} + \begin{verbatim} + {'F1.fail_err', 'F2.fail_loss'} + {'F1.fail_err', 'I2.fail_loss'} + {'F1.fail_loss', 'F2.fail_err'} + {'F1.fail_loss', 'I2.fail_err'} + \end{verbatim} + \end{minipage} + & + \begin{minipage}[t]{0.42\linewidth} + \begin{verbatim} + {'F2.fail_err', 'I1.fail_loss'} + {'F2.fail_loss', 'I1.fail_err'} + {'I1.fail_err', 'I2.fail_loss'} + {'I1.fail_loss', 'I2.fail_err'} + \end{verbatim} + \end{minipage}\\ + \end{tabular}\\ + \end{small} + } +% + Each of these cuts lead to trivial violations of our safety + property. For instance, we obtain the cut \code{\{'F1.fail\_err', + 'F2.fail\_loss'\}} that corresponds to the case where \F{1} + propagates \ERR and \F{2} propagates \LOSS, in which case \F{3} + propagates \ERR. This is exactly the situation that we want to + avoid. + + +\begin{figure}[bt] + \centering + \begin{tikzpicture} + \node[anchor=south west,inner sep=0] at (0,0) { \includegraphics[width=\textwidth]{figures/Modele2.png}}; + \draw[red!50,ultra thick, dashed] (10.8,3.4) rectangle (2,0); + \node[red] at (10.4,3.1) {\texttt{\large F3}}; + \end{tikzpicture} + \caption{Model of a FDI function with a switch and an alarm.\label{fig:example1}} +\end{figure}%\vspace*{-1cm} +%\enlargethispage{\baselineskip} + +\subsubsection{Safety model of the architecture with FDI} +%%\label{sec:simple-fail-detect} +%% +%In order to satisfy the Prop.~\ref{prop:1}, +The updated implementation of \F{3} (see Fig.~\ref{fig:example1}) +uses two perfect detectors, \F{1Loss} and \F{2Loss}, that can detect +a loss failure event on the inputs of the function. The (Boolean) outputs of +these detectors are linked to an OR gate ({\ttfamily AtLeastOneLoss}) +which triggers an \ALARM when at least one of the detectors outputs +true. The alarm commands a \SWITCH; the output of \SWITCH is the same +as \MIN, unless \ALARM is activated, in which case it propagates a +\LOSS failure. The alarm can fail in two modes, either +continuously signaling a \LOSS or never being activated. The +schema in Fig.~\ref{fig:example1} also includes two delays operators, \D{1} and \D{2}, +that model delay propagation at the input of the detectors; +we will not consider them in the following lines, but come back to these timing constraints at the end of the section. + +% \TODO{why do we need Alarm ! why does the alarm can fail ! we could +% plug directly the or gate to the switch}- Permanent failure of the alarm. + +The FDI function---with a switch and an alarm---is a stable scheme for +failure propagation: when in nominal mode, it detects all the failures +of the system and it is able to disambiguate the case where its inputs +contains both \ERR and \LOSS. Once again, this can be confirmed using +the Sequence Generation tool. If we repeat the same analysis than +before---and if we abstract away the delay nodes---we find $56$ +minimal cuts, all involving a failure of either \ALARM or +\F{3Processing}, i.e. a non-nominal mode. This means that, in an untimed model, our new +implementation of \F{3} satisfies the loss detection property, as +desired. +% \begin{figure}[hbt] +% \centering +% \begin{tikzpicture} +% \node[anchor=south west,inner sep=0] at (0,0) { \includegraphics[width=\textwidth]{figures/Modele2.png}}; +% \draw[red,ultra thick, dashed] (10.6,3.6) rectangle (2.2,0); +% \node[red] at (10,3) {\texttt{\huge F3}}; +% \end{tikzpicture} +% % \includegraphics[width=0.95\textwidth]{figures/Modele2} +% \caption{Taking into consideration propagation delays in the FDI +% system.\label{fig:example2}} +% \end{figure} +% Unfortunately, this model makes unrealistic assumptions about the +% instantaneous failure propagation of detection. Indeed, it may be the +% case that the outputs of \F{1} and \F{2} are delayed as they are +% propagated to the observers \F{1Loss} and \F{2Loss}. Next, we study +% new failure modes that may arise from this situation and how we can +% detect them. +%% +% \subsection{Timed Safety model of the architecture with FDI} +% \label{sec:timed-safety-model} +%% +% In this section, we consider a new AltaRica model that takes into +% account propagation delays. To this end, we may insert two instances +% of the delay node (the element \PRE defined in Sect.~\ref{sec:sect2}) +% before the detectors \F{1Loss} and \F{2Loss}. +Even so, it is easy to find a timed scenario where the safety property +is violated. + +Assume now that \F{1} and \F{2} propagate respectively the status \LOSS and \ERR, +at the same date. In such a case and considering possible latencies, +while \ERR reaches \MIN instantaneously, +the output of \F{1} might reach \F{1Loss} at successive date. +% of the output of \F{2} reaching \F{2Loss},. +This leads to a transient state where the alarm is not activated whereas +the output of \MIN is set to \ERR. This brings us back to the same +dreaded scenario than in our initial model. +%% + In particular, this scenario corresponds to the cut + \code{\{'F1.fail\_loss', 'F2.fail\_err'\}}, that is not admissible in + an untimed semantics. +%% + +This example suggests that we need a more powerful method to compute +the set of cuts in the presence of temporal constraints. On the other +hand, we may also advocate that our safety property is too limiting in +this context, where perfect synchronicity of events is rare. Actually, +it can be proven that the output of \F{3} will eventually converge to a +loss detection and isolation mode (assuming that \F{3} stays nominal and +that its inputs stay stable). +% +To reflect +this si\-tua\-tion, we pro\-pose an improved safety property that takes into +account temporal properties of the system: +%% +\begin{prop}[Loss Detection Convergent]\label{prop:2} A function is + \emph{loss detection convergent} if (when in nominal mode) there + exists a duration $\Delta$ such that it continuously outputs a \LOSS + after the date $\delta_0 + \Delta$ if at least one of its input + nodes continuously propagates a \LOSS starting from $\delta_0$ + onward. The smallest possible value for $\Delta$ is called the + \emph{convergence latency} of the function. +\end{prop} +Hence, if the latency +needed to detect the loss failure can be bound, and if the bound is sufficiently +small safety-wise, we can still deem our system as safe. +In the example in Fig.~\ref{fig:cockpit}, this property can indicate for how long an erroneous airspeed is shown on the PFD to the pilot, +before the failure is isolated. + +In the next section, we use our approach to generate a list of ``timed +cuts'' (as model-checking counterexamples) that would have exposed the +aforedescribed problems. We also use model-checking to compute +the {convergence latency} for the node \F{3}. In this simple example, +we can show that the latency is equal to the maximal propagation delay +at the input of the detectors. The value of the latency could be much +harder to compute in a more sophisticated scenario, where delays can +be chained and/or depends on the internal state of a component. + + +\section{Compilation of AltaRica and Experimental evaluation}\label{sec:sect4} + +We have implemented the transformation outlined in +Sect.~\ref{sec:sect3}; the result is a compiler that automatically +generates Fiacre code from an AltaRica model. The compilation process +relies on the fact that it is possible to ``flatten'' a composition of +interconnected nodes into an intermediate representation, called a +\emph{Guarded Transition System} (GTS)~\cite{rau08}. A GTS is very +similar to a (single) AltaRica node and can therefore be encoded in a +similar way. Our tool is built using the codebase of the model-checker +EPOCH~\cite{epoch}, which provides the functionalities for the +syntactic analysis and the linking of AltaRica code. After +compilation, the Fiacre code can be checked using +Tina~\cite{BRV04}. As seen in Sect.~\ref{sec:tina}, the core of the Tina toolset is an +exploration engine that can be exploited by dedicated model-checking +and transition analyser tools. Tina offers several abstract state +space constructions that preserve specific classes of properties like +absence of deadlocks, reachability of markings, or linear and +branching time temporal properties. These state space abstractions are +vital when dealing with timed systems that generally have an infinite +state space (due to the use of a dense time model). In our +experiments, most of the requirements can be reduced to reachability +properties, so we can use on-the-fly model-checking techniques. +% and very ``aggressive'' abstractions. + +\begin{figure}[thb] + \centering + \includegraphics[width=\textwidth]{figures/passerelle.png} + \caption{Graphical representation of the AltaRica/Fiacre toolchain.\label{fig:toolchain}} +\end{figure} + +We interpret a GTS by a Fiacre process whose parameters consist of all +its state and flow variables. Each transition +\lstinline[language=Altarica]{g |-evt-> e} in the GTS is (bijectively) +encoded by a transition that matches the guard \code{g} and updates +the variables to reflect the effect of \code{e} plus the assertions. Each transition can +be labelled with time and priorities constraints to take +into account the \code{extern} declarations of the node. This +translation is straightforward since all the operators available in +AltaRica have a direct equivalent in Fiacre. Hence every +state/transition in the GTS corresponds to a unique state/transition +in Fiacre. This means that the state (reachability) graph of a GTS and +its associated Fiacre model are isomorphic. This is a very strong and +useful property for formal verification, since we can very easily +transfer verification artefacts (such as counterexamples) from one +model back to the other. + +The close proximity between AltaRica and Fiacre is not really +surprising. First of all, both languages have similar roots in process +algebra theory and share very similar synchronisation mechanisms. More +deeply, they share formal models that are very close: AltaRica +semantics is based on the product of ``communicating automata'', +whereas the semantics of Fiacre can be expressed using (a time +extension of) one-safe Petri nets. The main difference is that +AltaRica provide support for defining probabilities on events, whereas +Fiacre is targeted towards the definition of timing aspects. This +proximity in both syntax and semantics is an advantage for the +validation of our tool, because it means that our translation should +preserve the semantics of AltaRica on models that do not use extern +laws to define probabilities and time. We have used this property to +validate our translation by comparing the behaviours of the models +obtained using Cecilia OCAS simulation tool and their translation. For +instance, in the case of the CAS system of +Sect.~\ref{sec:example-fail-detect-1}, we can compute the set of cuts +corresponding to Safety Property~\ref{prop:1} (loss detection) by +checking an invariant of the form +$((\text{\F{1.O}} = \text{\code{Loss}}) \vee (\text{\F{2.O}} = +\text{\code{Loss}}) \Rightarrow (\text{\F{3.O}} = +\text{\code{Loss}}))$. +% +%%\TODO{Check if it is necessary to mention the tool, as opposed to counterexamples} +In both cases---with and without FDI---we are able to compute the +exact same set of cuts than Cecilia OCAS. This is done using the +model-checker for modal mu-calculus provided with Tina, which can list +all the counterexamples for a (reachability) formula as a graph. More +importantly, we can use our approach to compute the timed +counterexample described at the end of +Sect.~\ref{sec:example-fail-detect-1}. All these computations can be +done in less than a second on our test machine. + +\subsection{Empirical evaluation} +We have used our toolchain to generate the reachable state space of +several AltaRica models~\footnote{All the benchmarks tested in this paper are available at + https://w3.onera.fr/ifa-esa/content/model-checking-temporal-failure-propagation-altarica}: +RUDDER describes a control system for the +rudder of an A340 aircraft~\cite{bernard2007experiments}; ELEC refers +to three simplified electrical generation and power distribution +systems for a hypothetical twin jet aircraft; the HYDRAU model +describes a hydraulic system similar to the one of the A320 +aircraft~\cite{bieber2002combination}. The results are reported in +Table~\ref{table:2}. In each case, we indicate the time needed to +generate the whole state space (in seconds) and the number of states +and transitions explored. For information, we also give the number of +state variables as reported by Cecilia OCAS. All tests were run on an +Intel 2.50GHz CPU with 8GB of RAM running Linux. In the case of model +HYDRAU we stopped the exploration after $30$ minutes and more than +$9.10^{9}$ generated states. +The state space is large in this benchmark because it models the physical a-causal propagation of a leak, so a leak can impact both upward and backward components and trigger a reconfiguration, multiplying the number of reachable states. +Moreover, the topology of the system shall be reconfigurated after the detection of some failures and this dynamic reconfiguration combined with a-causal propagation increases again more the size of the state space. +In all cases, the time needed to generate +the Fiacre code is negligible, in the order of 10~ms. + +\begin{table}[tb] + \centering + \begin{tabular}{|l|c|c|c|c|c|} + \hline + \textbf{Model} & \textbf{time} (s) & \textbf{\# states} & + \textbf{\# + trans.} + & \textbf{\# state vars}\\ \hline + RUDDER~~~ & 0.85 & $3.3\,10^4$ & $2.5\,10^5$ & 15 \\ \hline + ELEC 01 & 0.40 & 512 & $2.3\,10^3$ & 9 \\ \hline + ELEC 02 & 0.40 & 512 & $2.3\,10^3$ & 9 \\ \hline + ELEC 03 & 101 & $4.2\,10^6$ & $4.6\,10^7$ & 22 \\ \hline + HYDRAU & 1800 & --- & --- & 59 \\ \hline + CAS~ & 0.40 & 729 & $2.9\,10^3$ & 6 \\ \hline + CAS with \PRE~~~ & 46 & $9.7\, 10^5$ & $4.3\, 10^6$ & 10 \\ \hline + \end{tabular} + \vspace*{1em} + \caption{State space size and generation time for several use cases.\label{table:2}} +\end{table} + +Our models also include two versions of the complete CAS system +(including the detectors, the alarm and the switch); both with and +without the delay functions \D{1} and \D{2}. The ``CAS with \PRE'' model +is our only example that contains timing constraints. In this case, we +give the size of the state class graph generated by Tina, that is an +abstract version of the state space that preserves LTL properties. We +can use Tina to check temporal properties on this +example. More precisely, we can check that \F{3} has the \emph{loss + detection convergence} property. To this end, a solution is to add a +Time Observer to check the maximal duration between two events: first, a \code{obs\_start} event is triggered when the output of \F{1} or \F{2} changes to \LOSS; +then an \code{obs\_end} event is triggered when the output of \F{3} changes to \LOSS. The +observer has also a third transition (\code{obs\_err}) that acts as a +timeout and is associated with a time interval $I$ and is enabled +concurrently with \code{obs\_end}. Hence, +Time Observer ends up in the state yield by \code{obs\_err} +when the output of \F{3} deviates from its +expected value for more than $d$ units of time, with $d \in I$. We +have used this observer to check that the \emph{convergence latency} +of the CAS system equals $3$, when +we assume that the +delays are in the time interval $[1, 3]$. +The result is that +\code{obs\_err} is fireable for any value of $d$ in the interval +$[0,3]$, while \code{obs\_err} is not fireable if $I = ]3, \infty[$. +% It is enough to indicate to choose $I = [0,3]$. +These two safety properties can be checked on the system (plus the +observer) in less than $0.6$~s. + + +% \begin{wraptable}{r}{0.35\textwidth} +% %\begin{table}[bth] +% \centering +% \vspace*{-7mm} +% \begin{tabular}{|c|c|l} +% \cline{1-2} +% \textbf{delay}$\mathbf\tau$ & \textbf{safety property} & \\ \cline{1-2} +% % {$\quad[4,4]\quad$} & ok & \\ \cline{1-2} +% {$]3, \infty[$} & holds & \\ \cline{1-2} +% {[}3,3{]} & not holds & \\ \cline{1-2} +% {[}0,3{]} & not holds & \\ \cline{1-2} +% \end{tabular} +% \caption{Latencies check on Eq.~\eqref{eq:mc1} +% with $\delta = [1,3]$.\label{table:1}} +% %\end{table} +% \end{wraptable} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "main" +%%% End: + +%% LocalWords: Fiacre diff --git a/doc/Rapport post-doc/4-aocs.tex b/doc/Rapport post-doc/4-aocs.tex new file mode 100644 index 0000000..f3c0b3b --- /dev/null +++ b/doc/Rapport post-doc/4-aocs.tex @@ -0,0 +1,300 @@ + +In order to assess the timed formal model approach, we apply it to an industrial case study, namely the validation of the automatic mode management model of an AOCS (Attitude and Orbit Control System) of a satellite. The full description is available in this report; the synthesis is published at ERTS 2018 conference. +\subsection*{Acronyms} +\begin{center} +\begin{table}[h!] + \begin{small} + \centering + \begin{tabular}{|c|c|} + \hline + \textbf{Term} & \textbf{Description} \\ + \hline + ACM & Attitude Control Mode \\ + \hline + ARO & Automatic Recondifiguration Order \\ + \hline + ASM & Acquisition and Safe Mode \\ + \hline + CAM & Collision Avoidance Manoeuvre \\ + \hline + FCM & Formation Control Mode \\ + \hline + GNC & Guidance, Navigation and Control \\ % Guidance and Navignatio Mode + \hline + IMU & Inertial Measurement Unit \\ + \hline + ISL & Inter-Satellite Link \\ + \hline + OCM& Orbit Control Mode \\ + \hline + OFF&OFF Mode \\ + \hline + PFailed&Permanent Failure\\ + \hline + STR&Star Tracker \\ + \hline + TC&Telecommand\\ + \hline + TFailed&Temporary Failure\\ + \hline + TM&Telemetry\\ + \hline + \end{tabular} + \end{small} +% \caption{Acronyms used} +\end{table} +\end{center} + + +\section{An Expression of Industrial Needs and Requirements}\label{sec:aocsintro} + +Failure Detection, Isolation and Recovery (FDIR) functions are implemented aboard satellites in order to detect the occurrence of failures and to prevent the failure from propagating in the whole system, which could cause critical events and thus jeopardize the mission. +The complexity of the FDIR verification and validation (V\&V) increases with the system complexity. As systems include more and more interacting functions and functional modes, it becomes harder to evaluate at the overall system level the effects of local failures. That is even truer when we consider the effects of time. Indeed, unexpected behavior can arise from a bad timing of events. Timing constraints allow to represent the impact of computation times, delays on the propagation of failures, and the reaction time of the reconfigurations steps triggered in reaction to failure detection. +Thus, new models and tools are needed to assist early V\&V of the on-board processes and FDIR design. Thomas and Blanquart~\cite{thomas2013} describe a process to model FDIR satellite functions. This process requires to model failure propagation, detection, and recovery times, which requires modelling languages expressive enough to support complex system modelling. Associated tools should provide automatic verification that on-board FDIR functions are correct despite latency in failure propagation or management. For instance, one should be able to verify whether failures are recovered before they are propagated further in the system. + +\begin{figure}[tb] + \centering + \includegraphics[width=\textwidth]{figures/satellite_telecom.png} + \caption{A satellite and its equipment} +\end{figure} + + + +\section{AOCS Case Study}\label{sec:aocs} + +The validation of the approach on the automatic mode management model of an AOCS (Attitude and Orbit Control System) of a satellite considers +control and command specifications of a satellite constellation mission. The example discussed in these pages is a simplification of this industrial specification which +takes into account a single function and 3 equipment per satellite. Each equipment is necessary to the execution of its function in any of its operational modes. +The real specification includes 3 functions, several equipment, surveillance elements and automata. +Validation can be done by simulation or property verification; the way we take here is the latter. + +\subsection{Architecture description} + +In space missions, the control of the attitude and the orbit of the aircraft is delegated to the AOCS. In the case study, the system relies on +\begin{itemize} + \item AOCS sensors: + \begin{itemize} + \item Inertial Measurement Unit (IMU) implements accelerometers which provide the acceleration and gyros which give the estimated angular speed; + \item Star-TRackers (STR) gives the estimated attitude quaternion; + \end{itemize} + \item AOCS actuators: Thrusters (ColdGasProp) permit the control of the spacecraft; + \item The On-Board Computer unit, which manages all the spacecraft’s activity and therefore the AOCS application software that acquires the information from the sensors and commands the actuators. +\end{itemize} + +\subsection{AOCS mode automaton} +The space industries and agencies contribute in the initiative Space AVionics Open Interface Architecture (SAVOIR) to define a single, agreed and common solution for the definition of the architecture of avionics system. The assess of our approach is validate with an industrial case study based on these Ground-Board Interface specifications\cite{ASRA}, the ECSS standard for the Space Segment Operability\cite{ECSS‐E‐ST‐70‐11C} and the AOCS mode management\cite{ECSS-E-ST-60-30C}. Generally, the specification of the satellite mode management is specified in early phases at system level with a co-engineering approach. The focus is on: +\begin{itemize} + \item The AOCS capabilities to control the attitude and the orbit of the satellite; + \item The Operations capabilities to operate the satellite by telecommand (TC) from the ground segment; + \item The FDIR capabilities to continue the mission operations and to survive critical situations without relying on ground intervention. +\end{itemize} + +In our approach, an early validation is experimented to increase the confidence on these system specifications and later to reduce the consolidation with the subsystems engineering. +The use-case focuses on the initial satellite mode management shown in Figure~\ref{fig:1}; the current representation of AOCS mode. + +\begin{figure}[thb] + \centering + \includegraphics[width=\textwidth]{figures/AOCSmode_schema.png}\vspace*{-5em} + \caption{Representation of the AOCS modes.\label{fig:1}} +\end{figure} + + +Several AOCS modes are designed for the different mission phases. +Switching between a mode and another depends on three possible reasons: +\begin{itemize} +\item either the satellite receives a telecommand (TC) from Earth to trigger a mode change (Acquisition \& Safe Mode, Attitude Control Mode, Orbit Control Mode, Formation Control Mode); +\item or there is an automatic on-board transition (A) when the separation from the launcher is detected or when the collision avoidance manoeuvre is finished; +\item or an automatic FDIR reconfiguration order (ARO) can be triggered by the ground (TC) or by the on-board FDIR to recover a failure. The ARO triggers the AOCS into the OFF mode and it is available from all AOCS mode except CAM. +\end{itemize} + +Transition between modes is possible only when the involved equipment is available. In fact, some devices can take tenths of minutes to be ready for a mode switch. This is why it is very important to take into account timing constraints. + +It is easy to understand that the planning and the reactivity to messages triggering a transition between modes is crucial, as failing to detect a message or reconfiguring in time would yield an unwanted mode. For instance, it could result in a transition into Safe Mode, which entails a heavy reboot and loss of scientific acquisition time. Many tasks of the mission depend on different inputs and are time-dependent; the temporal bounds of those tasks are the ones that we will analyse through formal V\&V in order to detect possible unwanted situations, or undetected failures through the system, in order to maintain the safety and mission autonomy objectives. + +Figure~\ref{fig:aocs} displays the AOCS mode automaton considered in the case study. This is a more precise version of the automaton of Fig.~\ref{fig:1} based on a SysML activity diagram that represents the transitions between mode and, for each AOCS mode, its associated state-machine. Each AOCS mode has essentially three states: an initial; a nominal; and a ``degraded'' state. +When the request of change mode is received, the AOCS triggers the initialization of equipment used by the mode in the Initial state and then it switches into the \emph{Nominal state} when all involved equipment are operational. The degraded state is triggered when the failure of used equipment is detected. All AOCS mode are described in the next subsections. + + +\begin{figure}[thb] + \centering + \includegraphics[width=1.1\textwidth]{{"figures/2-2 - AOCS mode automaton"}.png} + \caption{AOCS mode automaton.\label{fig:aocs}} +\end{figure} + +\begin{figure}[thb] + \centering + \includegraphics[width=.9\textwidth]{{"figures/2-3 - ASH mode"}.png} + \caption{Acquisition \& Safe mode automaton.\label{fig:asm}} +\end{figure} + +\begin{figure}[hbt] + \centering + \includegraphics[width=.6\textwidth]{{"figures/2-4 set ON the equipment for ASM mode"}.png} + \caption{Set ON equipment for ASM mode.\label{fig:asm-ON}} +\end{figure} + +\subsubsection{OFF mode} +In this mode, any equipment of use-case can be started. This mode is used when the satellite is in the launcher; and after an ARO to reestablish the satellite in safe conditions. +\subsubsection{Acquisition \& Safe mode (ASM)} +In this mode, the first acquisition in safe configuration is realized. The ASM automaton with the 3 states is shown in Figure \ref{fig:asm} When the TC to switch on ASM mode is received, the initialization of equipment used by ASM is started by the \texttt{EquipASM\_ON} activity (Figure~\ref{fig:asm-ON}). + +\begin{figure}[htb] + \centering + \includegraphics[width=\textwidth]{{"figures/2-5 ACM automaton"}.png} + \caption{Attitude Control Mode automaton.\label{fig:acm}} +\end{figure} + +\begin{figure}[bht] + \centering + \includegraphics[width=.6\textwidth]{{"figures/2-6 set ON the equipment for ACM mode"}.png} + \caption{Set ON equipment for ACM mode.\label{fig:acm-ON}} +\end{figure} + +\subsubsection{Attitude Control Mode (ACM)} +In this mode, the attitude is coarse controlled by the AOCS. The ASM automaton with the 3 states is shown in Figure~\ref{fig:acm}. When the TC to switch on ACM mode is received, the +initialization of equipment used by ACM mode is started by the \texttt{EquipASM\_ON} activity (Figure~\ref{fig:acm-ON}). + + +\subsubsection{Collision Avoidance Manœuvre (CAM)} +This case is used when the ground or FDIR triggers a manoeuvre to avoidance a collision with debris or other satellite. These specific TC are called CAM and they are only available +from the Attitude Control Mode, Orbit Control Mode and Formation Control Mode. So, the request of CAM is not possible from the Acquisition \& Safe Mode. + +The CAM automaton is described in Figure~\ref{fig:cam}. The exit of CAM is autonomous into ACM mode when the manoeuvre or predefined-timing is finished. + +\begin{figure}[htb] + \centering + \includegraphics[width=.6\textwidth]{figures/{"2-7 Collision Avoidance Mode"}.png} + \caption{Collision Avoidance Mode.\label{fig:cam}} +\end{figure} + +\subsubsection{Orbit Control Mode (OCM)} +In this mode, the orbit is controlled and the mission is suspended. The OCM automaton is shown in Figure~\ref{fig:ocm}. + +\begin{figure}[p] + \centering + \includegraphics[width=.8\textwidth]{figures/{"2-8 OCM automaton"}.png} + \caption{Orbit Control Mode.\label{fig:ocm}} +\end{figure} + +\subsubsection{Formation Control Mode (FCM)} +FCM is the nominal mode where the formation flying is operational. The FCM automaton with the 3 states is shown in Figure~\ref{fig:fcm}. + +\begin{figure}[p] + \centering + \includegraphics[width=.9\textwidth]{figures/{"2-9 Formation Control Mode"}.png} + \caption{Formation Control Mode.\label{fig:fcm}} +\end{figure} + + +\subsubsection{Equipment} + +The model is based on the following assumption: +\begin{itemize} + \item An equipment can be on, off, or faulty. + \item An equipment is started by the function that needs it. The reboot has a duration. + \item An equipment that is not useful in the current modes, is switched off. + \item The number of redundancies is a parameter defined for each equipment. + \item Temporary or permanent failures can affect an equipment\footnote{Those failures can be injected by the user.} only when it's running. + \begin{itemize} + \item After a temporary failure, the equipment is rebooted automatically. + \item After a permanent failure, the equipment moves over one of its available redundancies. If no redundancy is available, the state remains faulty. + \item When an ARO event is triggered, the equipment switches off. It can be switched on without moving to a redundancy by the functions. + \end{itemize} +\end{itemize} + +\begin{figure}[h] + \centering + \includegraphics[width=.5\textwidth]{figures/table1.png} + \caption{Allocation of the equipment on the modes.\label{tab:equip}} +\end{figure} + +\begin{figure}[bt] + \centering + \includegraphics[width=\textwidth]{figures/{"Equipment mode"}.png} + \caption{Equipment state machine.\label{fig:equip}} +\end{figure} + +Figure~\ref{fig:equip} also displays the state machine of an equipment. The IMU, ColdGasProp, and STR equipment have similar state machines. Equipment which is started from an ``OFF'' state, can only reach an ``ON'' state by passing through a ``Starting'' state. When a failure happens, the equipment makes a transition to state ``Failed''. If the failure is permanent, the equipment goes over the redundant equipment. If failure is temporary, state ``Starting'' can be restored with no further consequences. The allocation of equipment on modes is given by Table in Fig.~\ref{tab:equip}. For example, in our study case, the STR is used in four modes. + + +The AOCS, as all satellite systems, presents an increasing complexity of interactions between functions and other equipment, often raising design and integration issues during the product final testing and verification phases. Correcting these issues often generates a heavy rework and is a well-known cause for cost overruns and project delays. Moreover, the operation of space systems is traditionally informally expressed in design documents as a set of modes representing functions, equipments and monitoring mechanisms. Usually the mode dynamics of all the satellite systems and their interaction with the FDIR functions are validated by review, i.e. exhaustive manual (opposed to automatic) consistence checks and cross-reading. In case of formation flying, complex equipment and instruments are distributed over several spacecrafts. The human validation activities become practically impossible due to the high number of combinations to be analyzed. Powerful computer-aided analysis techniques are expected to help overcoming this issue. + +FDIR functions validation is particularly difficult, especially with ``traditional approaches'' because of the large number of interactions and not nominal situations, which increases the difficulty in analysing them. A large variety of points of view is necessary to fully analyse the behaviour of FDIR and its impact on dependability properties, including to be complete an explicit representation of the entities handled by FDIR: architecture, faults, time, etc. + +We believe that formalizing and validating the specifications through animation/simulation and model-checking has several strong advantages. On the one hand, modelling during the specification phase forces the designer to formalise and clarify the specifications. Animation/simulation is useful for validating the model against the specifications and for identifying behaviour inconsistencies based on relevant user-defined scenarios. Such inconsistencies are difficult to identify in a classical purely paper-based specification process. Last, formal verification proves that none of the possible execution scenarios violates the system properties. Such approaches are useful not only for validating an architecture or FDIR strategy once defined, but also for tuning its parameters during the definition phase. + +\section{Case study modelling} + +The original model of the AOCS case study comes from the validation of the FDIR of formation flying satellites. Formation flying requires specific techniques to ensure flight coordination and the safety of the spacecraft in case of anomaly. This requires giving more autonomy and complex decision-making mechanisms to the On-Board Computer unit. The SPaCIFY project~\cite{synoptic} described a similar architecture using the Synoptic language, in order to identify the needs in terms of guaranteeing traceability, validation, and general analysis---possibly using formal techniques---of the V-cycle of development~\cite{sutre09}. From this architecture, an AltaRica 1.0 version of the Synoptic model was generated automatically. We have used this initial AltaRica model and adapted it first to the AltaRica Dataflow syntax~\cite{Altarica2.3}. Then we can automatically translate this new model into Fiacre using our toolchain. + + +Validating a FDIR approach in satellite architecture has been done in project AGATA~\citep{rugina09} by coupling simulation with model-checking, the latter to prove that some given logical or timing properties hold in all states of a scenario generated by simulation. In AGATA the choice went in the same direction as us: focusing significant part of the system and abstracted away the rest of it using UPPAAL~\cite{uppaal1997}. +However, the model they performed model-checking was un-timed, with several variables used as clocks to track time, with the drawback that the size of the graph is exponential in the number of clocks~\cite{daws}, when Fiacre/Tina relies on a single clock. + + +\subsection{AltaRica modelling process} +In order to validate the FDIR software, the AltaRica model shall represent both the FDIR logic and the failure propagation in the hardware platform that is monitored and reconfigured according to the FDIR logic. During earlier design phase, AltaRica models without timing constraints can be used to abstract the details of the failure propagation paths and to support a preliminary safety and dependability analysis. Then the model details can be refined and timing information can be introduced in Time Altarica (see Chap.~\ref{altarica}). This will help system designers to verify critical properties when time-bounded reactions are required. On the application side, focusing on the interaction of FDIR mechanisms and AOCS modes is of an utmost importance when designing a space system. + +In this case study, we considered a quite detailed view of the FDIR logic related to the management of the AOCS and a simplified view of the satellite hardware. Next study will consider more detailed view of the satellite hardware architecture. + +\subsection{Details of the model} +Regarding the modelling activity, we focused first on the methodology applied to timed failure propagation described for a multi-phase system. In the starting architecture, described in Sect.~\ref{sec:aocs}, each satellite has three separate kinds of equipment: the STR (with a redundancy of 3), the ColdGasProp (with a redundancy of 3), and the IMU (with a redundancy of 2). We assume that mode transitions are initiated instantaneously (with a transition associated to a Dirac law), while events related to equipment “switching on” or rebooting are associated with a time law as follows: +\begin{itemize} +\item STR takes 30~mn, it is associated with the interval $[30,30]$ +\item IMU takes less than 10~s, it is associated with the interval $[0,0.1]$ +\item ColdGasProp takes between 5 and 10~mn, it is associated with $[5,10]$ +\end{itemize} + +We consider that these durations include all physical delays. The notification of a detected failure from Surveillance is a timed event, ranging between 0 and 10~ms. + +It is worth noting that the Synoptic (and later, the AltaRica 1.0) models that we have had access to, make practically no use of flow variables, which are variables that represent the ports’ input/output of components. This modelling style enforces that either communication are simultaneously performed both by sender and receiver either communication cannot occur at all. Moreover, This has a great influence on the empirical evaluation we performed, as undesired states are avoided by the modeller, while one of the interests of our approach resides in speeding-up the early design evaluation phase by outlining design errors and allowing an automated assessment of the model. As the design of the AOCS mode has no such flaws, we aimed at checking the invariants, in order to validate the model, and to evaluate the scalability of the approach on the former properties plus a temporal one. + +\subsection{Empirical evaluation} + +In general, real-time model-checking does not scale well on very detailed and large systems, especially when the system uses events that work on very different timescales. Nevertheless, failure propagation models can be large but not very detailed in early design phase. In this particular use case, we are able to check the smallest instances of the problem in less than 3 minutes on a typical laptop; while the most difficult problem can be checked in half an hour. + +We propose different versions of the AOCS architecture in order to appraise the complexity of the case, and the scalability of our toolchain. We apply a series of simplifications to the model, generating different benchmarks of growing complexity. The main parameters in our experiments will be the number of replicas of each equipment; and the possibility, or not, to have transient failures. +A first simplification of the model is to consider permanent failures only. Benchmarks done in this condition are denoted ``Pfail only'' (see Table~\ref{tab:results1}). This choice simplifies the model-checking problem since it discards loops in the behavior of the system that originate from the system rebooting through its ``Starting'' state. On the other hand, we can build instances that are more complex by increasing the number of equipment. For example, we can add a second kind of thruster. In Table~\ref{tab:results1}, we label each experiment with the number of different kind of thrusters used. + +For each configuration, we investigate two different kinds of properties. + +A first set of properties contains invariants on the set of states reachable by the system, like the absence of deadlocks or the property that \emph{equipment STR is always OFF when the AOCS is in Acquisition \& Safe Mode}. These are typically referred to as \emph{logical safety properties}. Both examples of properties, when true, require enumerating all the possible states of the system. Therefore, they give a good estimate of the complexity and size of the problem. Since reachability properties do not require to compute the possible transitions between two states (to compute the \emph{state graph}), it is possible to use very efficient on-the-fly techniques that are both space and time-efficient. + +Then we check an example of timing property, namely we prove a bound on the maximal time it takes for the system to reach a safe mode after a particular event. More precisely, given a duration δ, we check whether the AOCS can reach its ``Collision Avoidance'' mode in less than δ minutes after activating surveillance. We can check this kind of properties by adding an ``observer'' component that monitors the time elapsed since an event occurred and that can raise an error after a timeout. The observer adds extra behaviors to the analysis of the initial system and can therefore significantly increase its state space, especially when there is a lot of non-determinism in the system or when there are long-running activities. We observed that our use case exhibit partially these two causes of state space explosion, limiting the verification of timed properties to the one thruster benchmarks (in 640s for the ``\emph{Pfail only}'', and 44mn54s for the ``\emph{Pfail and Tfail}''), within the time-cut we set at 45mn. This can be explained by the fact that satellite systems are usually very deterministic. Indeed, operators need to plan the behavior of a satellite very precisely when they compute TCs. This is an encouraging observation for the tractability of our approach in the aerospace domain. + +\begin{table} + \centering +\begin{tabular}{|l|c|c|c|c|} + \hline + Model & states & transitions & time (s) & size (MB) \\ + \hline + 1 thruster Pfail only & 224 374 & 8345295 & 225 & 8 \\ + \hline + 1 thruster & 448 335 & 20 470 486 & & 16 \\ + \hline + 2 thrusters & 4 003 939 & 207 594 548 & & 189 \\ + \hline + 3 thrusters & - & - & - & - \\ + \hline +\end{tabular} +\caption{Empirical evaluation of state space generation, Intel Xeon @ 2.33GHz} +\label{tab:results1} +\end{table} + +Table~\ref{tab:results1} gives the results obtained with our experiments on four different configurations. We record the size of the model (in number of states and number of transitions) as well as the execution time and the memory consumed. All these results where obtained on a typical laptop with 8 GB of memory and an Intel processor. We observe that the Tina model checker scales up well on these models, failing at the biggest instance, not producing results after 45mn of run-time. These numbers give a good estimate of the complexity of checking safety properties. + +A little less than 10 years ago, a similar study~\cite{sutre09} was performed using models expressed in AltaRica 1.0 and two different model-checkers, ARC~\cite{arc} and MEC 5~\cite{mec5}. These are two tools developped specifically for the AltaRica language. Like with the experiments reported in Table~\ref{tab:results1}, ARC and MEC were used to compute the set of reachable states from an initial configuration of the system. These tools are based on symbolic methods for representing the sets of states and transitions of an AltaRica model. This is usually more efficient than enumerative techniques, such as those used by Tina. On the other hand, neither ARC or MEC take inherently into account timing constraints; whereas Tina relies on a ``symbolic'' representation of time constraints. Therefore they need to model time using an explicit clock (an integer variable) that should be updated in the model. ARC and MEC both bumped into serious limitations when scaling-up the models, even when simple invariants were checked~\cite{sutre09}. + +It is worth noting that, in our experiments, the addition of timed transitions did not increased the number of reachable states and only increased the execution time by a factor of 4. +Even if in our case study no counterexamples were generated because of the correctness of the proposed models, our toolsuite permits, in an untimed model, to compute cutsets and countreexamples showing a timed scenario where the safety property checked is violated~\cite{albore2017IMBSA}. Such couterexamples are generally not easily readable and difficult to debug. In the case of an implementation with FIACRE, it is possible to exploit relations between models representing the information required by the user on the one hand, and information produced by the tools, on the other hand to visualize in a compact view both the outcome of the model-checker and the FIACRE model, which facilitates greatly the interpretation of the analysis process~\cite{Zalila}. A possible future work would be of applying a similar approach to allow the representation of the analysis directly in the AltaRica initial model. + + +\newpage + + +%% LocalWords: ELEC Fiacre Dataflow Altarica evt Xeon + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "main" +%%% End: diff --git a/doc/Rapport post-doc/5-conclusions.tex b/doc/Rapport post-doc/5-conclusions.tex new file mode 100644 index 0000000..37a00ed --- /dev/null +++ b/doc/Rapport post-doc/5-conclusions.tex @@ -0,0 +1,131 @@ +%%%\section{Conclusion and Related Work} +\label{sec:Conclusion} + +Our work is concerned with the modelling and analysis of safety properties +in the presence of time constraints. + + +We concentrate on a +particular safety property, called \emph{loss detection convergence}, +for failures +propagation, meaning that the system applies an appropriate and timely response +(e.g. isolation) to the occurrence of a fault before the failure is +propagated and produces unwanted system behaviours. Similar problems +were addressed in~\cite{thomas2013}, where the authors describe a +process to model FDIR architecture (for use on-board satellites) that +requires to take into account failure propagation time, failure +detection time, and failure recovery time. However, these needs are not matched by +an effective way to check for safety. Our approach provides a solution to +model these timing constraints within AltaRica. We also provide an +automatic transformation from Time AltaRica models into one of the +input formats of Tina. We show that two interesting +problems---computing ``timed cuts'' and bounding the convergence +latency of a node---can be reduced to a decidable model-checking +problem. + +Several works have combined model-checking and AltaRica, the +archetypal example being the MEC tool~\cite{griffault2004mec} that was +developed at the same time than the language. More recently, Bozzano +et al~\cite{bozzano2012} have defined a transformation from AltaRica +Dataflow to the symbolic model-checker NuSMV. While this tool does not +support complex timing constraints, it offers some support for Dirac +laws (and implicit priorities) by encoding an ad-hoc scheduler. The +use of symbolic model-checking techniques is interesting in the case +of models with a strong combinatorial blow up, like for instance model +HYDRO of Sect.~\ref{sec:sect4}. Nonetheless, even though Tina also +includes BDD-based tools, no approaches allow to combine the advantages +of both realtime and symbolic model-checking techniques. + +Realtime techniques are central to our approach. We define an +extension of AltaRica where timing constraints can be declared using +{temporal laws} of the form \code{law (evt) = "[a,b]"}, with a +semantics inspired by Time Petri nets. As a result, we can apply on +AltaRica several state space abstractions techniques that have been +developped for ``timed models'', such as the use of DBM and state +classes~\cite{berthomieu2004tool}. In a different way, Cassez et +al.~\cite{pagetti2004} have proposed an extension of AltaRica with +explicit ``clock variables'', inspired by Timed Automata, where clocks +are real-valued flow variables that can be used inside the guards of +events. +%% +% (Which means that there are restrictions on the type of equations +% one can use in the \code{assert} declaration of a node.) +%% +% They also define an algorithm to compile this extension into +% Uppaal~\cite{larsen1997uppaal}. +Their work is mainly focused on the verification of behavioural +properties and centers on the encoding of urgency and priorities +between events, two notions that are naturally offered in +Fiacre. Also, our extension is less invasive. If we ignore the +\code{extern} declaration then we obtain valid AltaRica code. More +research is still needed to further the comparison between these two +approaches in the context of safety assessments. + +Aside from these works on AltaRica, we can also cite recent works that +combine failure propagation analysis and timing constraints, such +as~\cite{bittner2016}. This work defines an automatic method for +synthesising \emph{Timed Failure Propagation Graphs} (TFPG), that is +an extension of the notion of cut-sets including information on the +date of events. TFPG provide a condensed representation that is easier +to use than sets of timed cuts.Therefore, it would be interesting to +use this format in our case. + +For future work, we plan to adapt our translation to a new version of +the AltaRica language---called AltaRica 3.0, or OpenAltaRica---that +imposes less restrictions on the computation of flow variables. We +also want to apply our approach to more complex industrial use cases, +involving reconfiguration time besides failure detection and +isolation; or even systems with humans and reaction time in the +loop. + +% More generally, the main purpose of our project is to build on +% the results of use cases in order to propose a set of modelling +% guidelines for taking into account time in failure propagation +% analysis. + + + +% AltaRica 3.0 still relies on propagation based variable update, but +% the order in which this +% propagation takes place in determined at execution time, in other +% words, a fix-point is computed. This update scheme extends +% significantly the expressivity of the language, making possible to +% handle looped systems, i.e. systems in which variables depend of +% each other in a circular way, as the order of the updates is left +% free to the modeller. } + + +% Actual industrial systems embed several elements of complexity, that +% affects the design phase, caused by the diversity of technical issues +% and evaluation criteria coming from different viewpoints. + +% % +% Nevertheless, defining and verifying these properties is critical for +% embedded and real-time systems. In particular, time information, as +% delays or durations, are the properties that are central in real-time +% systems design and verification: in fact, temporal aspects can be the +% cause of missed failure detections or undesired reactions to (delayed) +% failure propagation. To be able to perform a safety analysis on the +% temporal properties allows to create systems that will operate as +% intended in a real-world environment. +% % Additional benefits from timed and temporal models are the ability +% % to perform formal verification in early development stages, using +% % automated techniques as model-checking. + + + +The use of timed Altarica will help system designers to verify critical properties when time-bounded reactions are required. On the application side, it is central to use formal methods, e.g. model-checking, to validate properly formalized specifications. Forcing the designer to produce early well formed models during the specification phase yields to have the specifications formalised and pinned down for the next development phases. Then, the validation of those specifications in the model allows to identify behavioral inconsistencies. Espacially, such inconsistencies are difficult to identify in a classical, purely paper-based, specification process. Last, formal verification proves that none of the possible execution scenarios violates the system properties. Such approaches are useful not only for validating an architecture or FDIR strategy once defined, but also for tuning its parameters during the conception phase. Results from the early V\&V of the on-board processes and FDIR design can be fed back into the requirements analysis phase. The contribution of proper (formal) analysis tools to the complex system designs helps in reducing the specification phase, and the early validation of requirements and models. Such extended V\&V toolbox will eventually consent to reduce the time cost of large projects, helping the development of new spacecraft technologies. + + +\section{Future Work} + + + + + +%% LocalWords: Dataflow OpenAltaRica + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "main" +%%% End: diff --git a/doc/Rapport post-doc/IMBSA-paper.tex b/doc/Rapport post-doc/IMBSA-paper.tex new file mode 100644 index 0000000..3d625ee --- /dev/null +++ b/doc/Rapport post-doc/IMBSA-paper.tex @@ -0,0 +1,64 @@ +\documentclass{llncs} + +%\usepackage{graphicx} +% +\begin{document} + + +\title{Formal Safety Verification of Temporal Model Properties via Model-Checking Mots clés Titre à trouver + +\author{Alexandre Albore, Silvano Dal Zillo, Guillaume Infantes, Christel Seguin, Pierre Virelizier} + +\institute{alexandre.albore@irt-saintexupery.com , IRT Saint Exupéry, +118, route de Narbonne - CS 44248 +31432 Toulouse cedex 4 (France) } +\maketitle + +\begin{abstract} + +Abstract is here. + +\end{abstract} + +\section{Introduction}\label{sec:Introduction} + +Ce qu’on présente : méthode et chaine outillée pour la vérification formelle à travers model-checking de propriétés temporelles dans des modèles avec des retards dans la transmission des messages d’erreur. Par exemple, s’assurer de la fiabilité d’une fonction d’alarme quand des délais affectent les temps de la propagation des pannes. Traiter des modèles temporisés et en valider les propriétés temporelles de façon formelle est un enjeu fondamental dans le domaine de la safety. +. : cf. PV +Mo + +\section{Study case}\label{sec:Others} + + Élément de retard avec Dirac + Propriétés qu’on veut vérifier (temporisation et délai sur les messages. Hypothèses sur les délais pour les pertes dans la chaîne précédente, c-à-d s’assurer de la fiabilité de la fonction d’alarme) ; on sait que si on a un retard différent sur les lignes, l’alarme n’est pas garanti, e.g. r1 + r2 <> r2 + r3. + + \section{Altarica and Fiacre} + Tina / Fiacre et Petri temporisé et les propriétés que ça rajoute\\ + Altarica vu à travers l’exemple\\ + Traduction Altarica -> Fiacre + + \section{Empirical evaluation - Fiacre} + Example sans délais (delta 0) : loss -> alarme et $F4_{loss}$\\ + Example avec délais (delta N) : loss -> !alarme et $!F4_{loss}$\\ + Example avec délais non-déterministe (pourrait identifier le temps minimum) + +\section{Conclusion}\label{sec:Conclusion} + +État de l’art (model-checking temporisé, model-checking temporisé paramétrique, …) +Conclusion : plus-value (une suite outillée, fournir un cadre unifié d’outils) + + + +\section*{Acknowledgments}\label{sec:Acknowledgments} + +Authors would like to thank YYYYY. + +\begin{thebibliography}{1} + +\bibitem{Einstein} +A. Einstein, On the movement of small particles suspended in stationary liquids required by the molecular-kinetic theory of heat, Annalen der Physik 17, pp. 549-560, 1905. + +\end{thebibliography} + +\end{document} + + diff --git a/doc/Rapport post-doc/algos/function.fcr b/doc/Rapport post-doc/algos/function.fcr new file mode 100644 index 0000000..46e78ec --- /dev/null +++ b/doc/Rapport post-doc/algos/function.fcr @@ -0,0 +1,17 @@ +type FState is union NOMINAL | LOST | ERROR end +type FailureType is union Err | Loss | Ok end +type Flows is record I:FailureType, O:FailureType end + +function update(S : FState, env : Flows) : Flows is + var f : Flows := {I=env.I, O=env.O} + begin + f.O := (S = NOMINAL ? f.I : (S = LOST ? Loss : Err)); + return f + end + +process Function(&S : FState, &env : Flows) is + states s0 + from s0 select + on (S != LOST); S := LOST; env := update(S, env); loop + [] on (S = NOMINAL); S := ERROR; env := update(S, env); loop + end \ No newline at end of file diff --git a/doc/Rapport post-doc/algos/function2.alt b/doc/Rapport post-doc/algos/function2.alt new file mode 100644 index 0000000..6cf43fb --- /dev/null +++ b/doc/Rapport post-doc/algos/function2.alt @@ -0,0 +1,12 @@ +domain FState = {NOMINAL, LOST, ERROR} ; +domain FailureType = {Err, Loss, Ok} ; + +node Function + flow I : FailureType : in ; O : FailureType : out ; + state S : FState ; + event fail_loss, fail_err ; + init S := NOMINAL ; + trans S != LOST |- fail_loss -> S := LOST ; + S = NOMINAL |- fail_err -> S := ERROR ; + assert O = case { S = NOMINAL : I, S = LOST : Loss, else Err } ; +edon \ No newline at end of file diff --git a/doc/Rapport post-doc/algos/function2.fcr b/doc/Rapport post-doc/algos/function2.fcr new file mode 100644 index 0000000..d3f5a12 --- /dev/null +++ b/doc/Rapport post-doc/algos/function2.fcr @@ -0,0 +1 @@ + diff --git a/doc/Rapport post-doc/algos/pre.alt b/doc/Rapport post-doc/algos/pre.alt new file mode 100644 index 0000000..f326cb1 --- /dev/null +++ b/doc/Rapport post-doc/algos/pre.alt @@ -0,0 +1,12 @@ +domain BType = {Empty, Full} ; +node Pre + flow I : FailureType : in; O: FailureType : out; + state Stored, Delayed : FailureType, S : BType; + event pre_read, pre_wait; + init Stored := Ok, Delayed := Ok, S := Empty; + trans + (Stored != I) & (S = Empty) |- pre_read -> Stored := I, S = Full; + (S = Full) |- pre_wait -> Delayed := Stored, S = Empty; + assert O = Delayed; + extern law (pre_read) = "[0,0]"; law (pre_wait) = "[a,b]"; +edon diff --git a/doc/Rapport post-doc/algos/pre.fcr b/doc/Rapport post-doc/algos/pre.fcr new file mode 100644 index 0000000..7f9c38a --- /dev/null +++ b/doc/Rapport post-doc/algos/pre.fcr @@ -0,0 +1,8 @@ +type BType is union Empty | Full end + +process Pre(&Stored, &Delayed : FailureType, S : BType, &env : Flows) is + states s0 + from s0 select + on (Stored != env.I and S = Empty); wait [0,0]; Stored := I; ... + [] on (S = Full); wait [a,b]; Delayed := Stored; S := Empty; ... + end \ No newline at end of file diff --git a/doc/Rapport post-doc/algos/pre2.fcr b/doc/Rapport post-doc/algos/pre2.fcr new file mode 100644 index 0000000..5a9a072 --- /dev/null +++ b/doc/Rapport post-doc/algos/pre2.fcr @@ -0,0 +1,22 @@ +process Pre(&Stored, &Delayed : FailureType, S : BType, &env : Flows) is + states s0 + from s0 select + on (Stored != env.I and S = Empty); wait [0,0]; Stored := env.I; $\ldots$ + [] on (S = Full); wait [a,b]; Delayed := Stored; S := Empty; $\ldots$ + end + +process delay[go : in FailureType](&O : FailureType) is + states sEmpty, sFull + var delayed : FailureType := Ok + from sEmpty go?delayed; to sFull + from sFull wait [a,b]; O := delayed; to sEmpty + +process front[p,q : out FailureType](&I : FailureType) is + states s + var stored : FailureType := Ok + from s on (I != stored); stored := I; select p!I [] q!I end; loop + +component Pre_2(&I, &O: FailureType) is + port go1, go2 : FailureType in [0,0] + priority go1 > go2 + par * in front[go1,go2](&I) || delay[go1](&O) || delay[go2](&O) end \ No newline at end of file diff --git a/doc/Rapport post-doc/aliascnt.sty b/doc/Rapport post-doc/aliascnt.sty new file mode 100644 index 0000000..452aa0e --- /dev/null +++ b/doc/Rapport post-doc/aliascnt.sty @@ -0,0 +1,88 @@ +%% +%% This is file `aliascnt.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% aliascnt.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Project: aliascnt +%% Version: 2009/09/08 v1.3 +%% +%% Copyright (C) 2006, 2009 by +%% Heiko Oberdiek +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3c of this license or (at your option) any later +%% version. This version of this license is in +%% http://www.latex-project.org/lppl/lppl-1-3c.txt +%% and the latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of +%% LaTeX version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status "maintained". +%% +%% This Current Maintainer of this work is Heiko Oberdiek. +%% +%% This work consists of the main source file aliascnt.dtx +%% and the derived files +%% aliascnt.sty, aliascnt.pdf, aliascnt.ins, aliascnt.drv. +%% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{aliascnt}% + [2009/09/08 v1.3 Alias counter (HO)]% +\newcommand*{\newaliascnt}[2]{% + \begingroup + \def\AC@glet##1{% + \global\expandafter\let\csname##1#1\expandafter\endcsname + \csname##1#2\endcsname + }% + \@ifundefined{c@#2}{% + \@nocounterr{#2}% + }{% + \expandafter\@ifdefinable\csname c@#1\endcsname{% + \AC@glet{c@}% + \AC@glet{the}% + \AC@glet{theH}% + \AC@glet{p@}% + \expandafter\gdef\csname AC@cnt@#1\endcsname{#2}% + \expandafter\gdef\csname cl@#1\expandafter\endcsname + \expandafter{\csname cl@#2\endcsname}% + }% + }% + \endgroup +} +\newcommand*{\aliascntresetthe}[1]{% + \@ifundefined{AC@cnt@#1}{% + \PackageError{aliascnt}{% + `#1' is not an alias counter% + }\@ehc + }{% + \expandafter\let\csname the#1\expandafter\endcsname + \csname the\csname AC@cnt@#1\endcsname\endcsname + }% +} +\newcommand*{\AC@findrootcnt}[1]{% + \@ifundefined{AC@cnt@#1}{% + #1% + }{% + \expandafter\AC@findrootcnt\csname AC@cnt@#1\endcsname + }% +} +\def\AC@patch#1{% + \expandafter\let\csname AC@org@#1reset\expandafter\endcsname + \csname @#1reset\endcsname + \expandafter\def\csname @#1reset\endcsname##1##2{% + \csname AC@org@#1reset\endcsname{##1}{\AC@findrootcnt{##2}}% + }% +} +\RequirePackage{remreset} +\AC@patch{addto} +\AC@patch{removefrom} +\endinput +%% +%% End of file `aliascnt.sty'. diff --git a/doc/Rapport post-doc/altarica-diagrams.tex b/doc/Rapport post-doc/altarica-diagrams.tex new file mode 100644 index 0000000..093dd5b --- /dev/null +++ b/doc/Rapport post-doc/altarica-diagrams.tex @@ -0,0 +1,32 @@ +\documentclass[tikz]{standalone} + +\usepackage{tikz} +\usetikzlibrary{arrows,shapes,shapes.geometric,decorations,automata,shadows} + +\tikzstyle{edge}=[draw,thick,->] \tikzset{state/.style={draw, text + centered, thick, rectangle split, rectangle split parts=2, rounded + corners,fill=blue!10}} + +\newcommand{\STATE}[2]{\makebox[5em]{\vphantom{I}{\ttfamily #1}}\nodepart{second} \makebox[4em]{\vphantom{I}{\ttfamily #2}}} + + +\begin{document} +\begin{tikzpicture}[scale=1.25, + initial text={}, + initial distance=2em, + every initial by arrow/.style={thick,*->}] + \node [state,initial] (s0) at (0,-1) {\STATE{NOMINAL}{O = I}}; + \node [state] (s1) at (4,0) {\STATE{LOST}{O = Loss}}; + \node [state] (s2) at (4,-2) {\STATE{ERROR}{O = Err}}; + + \path[edge] (s0) edge[bend left] node[below, yshift=-10pt] + {{\ttfamily fail\_loss}} (s1); + \path[edge] (s0) edge[bend right] node[right, yshift=5pt] {{\ttfamily fail\_err}} (s2); + \path[edge] (s2) edge node[right] {{\ttfamily fail\_loss}} (s1); +\end{tikzpicture} +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/doc/Rapport post-doc/altarica-function.tex b/doc/Rapport post-doc/altarica-function.tex new file mode 100644 index 0000000..fa38db7 --- /dev/null +++ b/doc/Rapport post-doc/altarica-function.tex @@ -0,0 +1,24 @@ +\documentclass[tikz]{standalone} + +\usepackage{tikz} +\usetikzlibrary{arrows,shapes,positioning,decorations,decorations.markings,shadows} + +\tikzstyle{block} = [rectangle, draw, fill=white, text centered, +text width = 3em, minimum height = 1.5em] +\tikzstyle{point} = [circle, fill=green!80, minimum height=0.5em] +\tikzstyle{line} = [draw, -latex'] + +\begin{document} +\begin{tikzpicture}[] + \node [block] (F) at (1.5, 0) {}; + \node [point] at (1.5, 0) {}; + + \node [] (L) at (0,0) {{\ttfamily I}}; + \node [] (R) at (3,0) {{\ttfamily O}}; + + \node [above of=F, node distance=1.5em] {{\ttfamily Function}}; + + \path[line] (F) -- (R); + \path[line] (L) -- (F); +\end{tikzpicture} +\end{document} diff --git a/doc/Rapport post-doc/app.tex b/doc/Rapport post-doc/app.tex new file mode 100644 index 0000000..8e496c8 --- /dev/null +++ b/doc/Rapport post-doc/app.tex @@ -0,0 +1,588 @@ +\section{Interpretation of AltaRica in Fiacre} +\lstset{ keywordstyle=\bfseries, + % keywordstyle={[2]\itshape}, + keywordstyle=\color{bluekeywords}, + basewidth=0.94ex, + showstringspaces=false, + emptylines=1, + aboveskip=4pt,belowskip=4pt, + mathescape=true, + texcl=true, + escapechar=@, + numberblanklines=false} + \newcommand{\sem}[1]{\llbracket{#1}\rrbracket} + +This appendix can be safely ignored and is not necessary to understand +the approach described in the report. Its main purpose is to give a +precise definition of the encoding from AltaRica to Fiacre that is +only roughly described in Sect.~\ref{sec:sect3}. + +We give a more precise definition of our encoding from AltaRica +Dataflow to Fiacre. We base our definition on a simplified grammar for +AltaRica Dataflow, using the Cecilia OCAS syntax, and a ``semantics +function'' (denoted $\sem{\,}$) to translate an AltaRica expression +into Fiacre. The encoding uses an environment, $\sigma$, to map event +identifiers (\code{evt}) to their timing constraints (defined in the +\code{extern} heading). We omit this environment when it is obvious +from the context. + +We describe the grammar of the AltaRica language using a variant of +Extended Bachus Naur Form (EBNF). The EBNF describes a set of +production rules of the form ``\code{symb ::= expr}'', meaning that +the nonterminal symbol \code{symb} represents anything that can be +generated by the EBNF expression \code{expr}. An expression +\code{expr} may be one of the following: a terminal symbol or keyword, +between quotes (e.g., \code{'event'}); a nonterminal symbol; an +optional expression, written ``\code{[ expr0 ]}''; a choice between +two expressions, written ``\code{expr1} $\,\mid\,$ \code{expr2}''; the +iterative concatenation of one or more expressions, with successive +occurrences being separated by a given symbol \code{s}, written +``\code{(expr s)*}''. + + +\subsection*{Types} +\label{sec:types} + +AltaRica base types include ``Boolean'' and Integers. We do not +consider floating point number in our translation; even though real +numbers are useful to declare probabilities, floating point variables +do not fit well with an enumerative model-checking approach. The +language also provides enumeration types, called \emph{domains}, that +defines sets of symbolic constants that can be used with state +variables. + +\begin{lstlisting}[language=BNF] +Type ::= 'Boolean' | 'Integer' | Ident +Domain ::= 'domain' Ident '{' (Ident ',')* '}' +\end{lstlisting} + +Fiacre supports a boolean type \code{bool}, with the same primitive +operators than AltaRica, equality (\code{=}) and inequality +(\code{<>}), and a ternary conditional operator. The numeric types of +Fiacre include the type \code{int} of all integers and the the type +\code{nat} of non negative integers. As we stated in +Sect.~\ref{sec:sect3}, domains can be directly encoded using union +types in Fiacre. + +\begin{lstlisting}[language=BNF] +[[Boolean]] = bool [[Integer]] = int [[Ident]] = Ident +[[domain IType {I1 , ..., In}]] = type IType is union I1 | ... | In end ; +\end{lstlisting} + +The fact that we can directly reuse the same type identifier in the +two languages means that we can directly reuse AltaRica type +declarations in Fiacre. Indeed, a type declaration of the form +\code{V1 : T1, ..., Vn : Tn} is encoded in Fiacre as follows: +% +\lstinline[language=BNF]{V1 : [[T1]], ..., Vn : [[Tn]]} + +Note that a limitation of Fiacre type declarations is that all type +constructors must be different, therefore we assume that the constants +used in different domains are always distinct. (This restriction +could be lifted by renaming constants using some information from the +type checker, but this has no effects on the expressiveness of our +approach.) + +\subsection*{Instructions} +\label{sec:instructions} + +Instructions are used to described the actions (postcondition) of +transitions and assertions. There are fundamentally four instructions: +skip, assignments, if-then instructions and composition. All the +possible instructions in AltaRica can be rewritten using only these +four fundamental instructions. A notable example of instruction +missing in this short list is the switch statement (that can be +encoded using nested conditionals). Fiacre provides an equivalent +\code{case}-statement that can be used to do traditional +pattern-matching. + +\begin{lstlisting}[language=BNF] +Instr ::= 'skip' | V ':=' Expr | 'if' Expr 'then' Instr | '{' (Instr)* '} +\end{lstlisting} + +Expressions, \code{Expr}, are built using the variables, constants and +the usual arithmetic operators. The syntax of expressions is exactly +the same as in Fiacre, so we have +% +\lstinline[language=BNF]{[[Expr]] = Expr}. + +The equivalent of instructions in Fiacre is called statement. The +\code{skip} instruction is a ``neutral element''; it describes the +instruction that does nothing. Fiacre has an equivalent notion with +the statement \code{null}. Assignments and conditionals are also +present in Fiacre, with the same semantics. The main difference is +that we do not enforce any differences between flow and state +variables. + +\begin{lstlisting}[language=BNF] +[[skip]] = null +[[V := Expr]] = V := [[Expr]] +[[if Expr then Instr]] = if [[Expr]] then [[Instr]] end +[[{I1 ... In}]] = [[I1]] ; ... ; [[In]] +\end{lstlisting} + +The interpretation of AltaRica instructions is straightforward. The +main discrepancy is with composition. For most practical purposes, +composition in AltaRica can be encoded using sequential +composition. In the case where different statements in a composition +update the same variable, it could be necessary to introduce temporary +variables, but this can be already enforced in the original AltaRica +instruction. For example, the composition \code{\{(X := Y) (Y := + X)\}}, that can be used to swap the values of two variables in +AltaRica, should be replaced by the instruction \code{\{(TEMP := X) (X + := Y) (Y := TEMP)\}}. + +\subsection*{Nodes} + +An AltaRica model is essentially a collection of node declarations. A +node is made of three parts: declaration of state variables, flow +variables and events; declaration of transitions; and finally +assertions. + +\begin{lstlisting}[language=BNF] +Node ::= 'node' Ident Flow State Event Init Trans Assert [Extern] +Flow ::= 'flow' (Ident ':' Expr ':' ('in' | 'out') ',')* ';' +State ::= 'state' (Ident ':' TypIdent ',')* ';' +Event ::= (Ident ',')* ';' +Init ::= 'init' Expr ';' +Trans ::= 'trans' (Expr v- Ident -> Expr ';')* +Assert ::= 'assert' Expr ';' +\end{lstlisting} + +In the following, we assume that we want to encode a node \F{} with +flow variables declaration \code{flow V1 : T1, ..., Vk : Tk;} and +state variables declaration \code{state S1 : I1, ..., Sn : In;}. Our +encoding makes use of a Fiacre record type, \code{Flows}, defined as +follows. + +\begin{lstlisting}[language=BNF,mathescape=true] +type Flows is record V1 : [[T1]], ..., Vk : [[Tk]] end +\end{lstlisting} + +The type \code{Flows} is used to define a function computing the +effect of assertions on the flow variables. The behaviour of +assertions is one of the main differences between dialects of +AltaRica. The case of AltaRica Dataflow is the simplest since, by +definition, there should be a fixed order (computable at compile time) +in which to evaluate the assignments defined in the \code{assert} +heading. In this case, if the node declares an assert expressions +\code{assert exp;} then we assume that the Fiacre function +\code{update} is declared as follows, where \code{((exp))} is the +Fiacre expression $\llbracket$\code{exp}$\rrbracket$ in which every +occurrence of flow variables, \code{Vi}, are replaced with a record +field access, \code{f.Vi}. + +\begin{lstlisting}[language=BNF,mathescape=true] +function update(S1 : I1, ..., Sn : In, env : Flows) : Flows is + var f : Flows := env + begin + ((exp)) + return f + end +\end{lstlisting} + +Other dialects of AltaRica may require a fixpoint computation, or at +least a recursive evaluation of the \code{assert} expression. This +different semantics could be encoded in Fiacre as well. Indeed Fiacre +functions can be recursively defined. For better performances, it is +also possible to implement the computation of assertions in an +external library and to import it in Fiacre using Foreign Function +Interfaces. + +The definition of the node may also contain timing constraints +declared using an \code{extern} clause. A timing constraint is a +(time) interval of the form \code{[a, b]}, \code{]a, b]}, \code{[a, + b[}, or \code{]a, b[}. An interval of the form \code{[a, ...[} is +used to denote an unbounded interval (that is a $\infty$-bound). + +\begin{lstlisting}[language=BNF] +Extern ::= 'extern' ('law' '(' Ident ')' '=' '"' Time '"' ';')* +Time ::= Left ',' Right +Left ::= '[' Int | '[' Int +Right ::= Int ']' | Int '[' | '...' '[' +\end{lstlisting} + +When there is a declaration \code{extern law(evt) = "Time";} in the +definition of the node \F{}, we assume that the environment $\sigma$ +is such that $\sigma$(\code{evt}) = \code{Time}. If an event is not +declared in the \code{extern} heading then we can safely assume that it +is associated with the time constraint \code{[0, ...[}. + +Equipped with all these additional definitions, it is possible to +encode every transition declared in \F{} into a Fiacre statement. In +particular, each transition of the form +%% +\lstinline[language=Altarica]{g |-evt-> Exp ;}. +%% +in the AltaRica code can be encoded into Fiacre as a sequence of a +conditional (a test on the guard \code{g}); followed by an action +(evaluation of the expression $\llbracket$\code{exp}$\rrbracket$); +finished by the evaluation of assertions. In this example we assume +that the transition \code{evt} is associated with the time interval +$I$, that is $\sigma(\text{\code{env}}) = \text{I}$. +%% +\begin{lstlisting}[language=BNF,mathescape=true] +[[evt]] = #evt; wait $\text{I}$; on(g); [[Exp]]; env := update(S1, ..., Sn, env); loop +\end{lstlisting} + +Our encoding makes use of some assumptions that were not introduced +previously. Like in the example of Sect.~\ref{sec:sect3}, we encode a +node as a Fiacre process with a unique state. The statement +\code{loop} is used in Fiacre to declare that the target (the +destination state) of the transition is the same as its source. The +expression \verb+#+\code{evt} is a way to associate a ``tag'' with a +Fiacre transition. Tags give an alternative way to name transitions in +a temporal logic formula (for model-checking) and when we print or +simulate a counterexample. In a nutshell, we use tags as a simple +mechanism for traceability between the AltaRica and Fiacre code. + +With all the definitions introduced in this section, the encoding of +node \F{}, with transitions \code{evt1, ..., evtk}, boils down to a +single Fiacre process. To conclude, we simply need to create a +top-level component that creates an instance of this process and +initializes the state and flow variables. In the following listing, we +assume that \code{Expi} corresponds to the (AltaRica) expression +associated with the state variables \code{Si} in the \code{init} +heading of \F{}. In this code, we use the \code{init} declaration of +Fiacre that allows us to initialize the value of the flow variables in +the initial state. + +%,float=hbt,frame=single,captionpos=b,caption=\protect{Code +%skeleton for the interpreation of the Node \F{} in Fiacre}] +\begin{lstlisting}[language=BNF] +type Flows is record V1 : [[T1]], ..., Vk : [[Tk]] end + +function update(S1 : I1, ..., Sn : In, env : Flows) : Flows is + var f : Flows := env + begin + ((exp)) + return f + end + +process F(&S1 : I1, ..., &Sn : In, &env : Flows) is + states s0 + + init + env := update(S1, ..., Sn, env); + to s0 + + from s0 select + [[evt1]] [] ... [] [[evtk]] + end + +component Main is + var env : Flows, + S1 : I1 := [[Exp1]], + ..., + Sn : In := [[Expn]] + + par F(S1, ..., Sn, env) end +\end{lstlisting} + + + + +\section{Method and translation}\label{sec:sectB} + +\subsection{Time Petri Nets} +Petri Nets are bi-partite graphs with two classes of nodes: places and transitions. +Time Petri Nets are en extension to classical Petri nets that include time features, % TODO Cite Merlin +namely two real numbers, $a$ and $b$, with $a < b$, that label each transition and indicate the time interval a transition is active, being \emph{de facto} a temporal guard. + + \begin{definition}[Time Petri Nets]\label{def:TPN} + A time Petri net (TPN) is a tuple $\langle P, T, B, F, M_0, \tau \rangle $ where: + \begin{itemize} + \item $P$ is a finite nonempty set of places $p_i$; + \item $T$ is a finite nonempty set of transitions $t_i$; + \item $F$ is the flow relation + $ F : P \times T \to P$ + \item $M_0$ is the initial marking function + $ M_0 :P \to \mathbb{N} $ + \item $\tau$ is a mapping called static (firing) interval for transitions + $ \tau : T \to \mathbb{R}^+_0 \times (\mathbb{R}^+_0 \cup \infty) $ + \end{itemize} + + +% \item $B$ is the backward incidence function +%$ B:T\times P \to \mathbb{N}$ +%\item $F$ is the forward incidence function +%$ F:T\times P \to P\times T $ +%% However, as new markings via a transition t_i are given by +%% M'(p) = M(p) - B(t_i,p) + F(t_i,p) for all p +% The function F resumes and simplifies this transition, associating to a set of places and enabled transitions (i.e. a state), a set of places and enabled transitions. +% The current marking $M$ of a TPN is obtained from the transitions history $t_1, \ldots t_n$, s.t. $ M = t_n \circ t_1(M_0)$, +% with the new marking $M'$, calculated from a transition $t$ and a marking $M$ is given by +% M' = M - prec(p) + post(p) + \end{definition} +For reference, the tuple $\langle P, T, F, M_0\rangle $ identifies a Petri net. + +A transition $t \in T$ is \emph{fireable} when all its input places have at least one token; for sake of simplicity, we do not consider here weights on transitions, as the result is similar, with just a change in the marking calculation. +The flow relation then associates to the number of tokens in a place (which we call $w: P \to \mathbb{N}$ a function of the place) and a fireable transition, the tokens in the target place. + + +\subsubsection{States in a TPN} + +The dynamic aspects of Petri net model are denoted by +markings which are assignments of tokens +to the places of a Petri net. The execution is then derived from the number and emplacements of tokens. + +Given the definition above, a state in a TPN is given by the pair $(M,I)$, where +the marking $ M = \{m = w(p)\,|\, p \in P\}$ can be seen as a vector of markings, +and +% the temporal constraints on each active transition $TC= (\theta_{min}, \theta_{max})$ +the firing interval set is $I = \{\tau(t)\:|\:t\in T\}$, which can be seen as a vector of firing intervals for the fireable transitions~\cite{berthomieu1991TPN}. + + + +Over TPN states and transitions between them, it is possible to define an \emph{extended state graph}\cite{yao}, +which root corresponds to the state coming from the initial marking and fireable transitions +% +The new markings are computed as usual, by applying $F$ on the marking of the current state, and, +similarly, the new firing interval is computed consequently, for a more detailed description refer to \cite{berthomieu1991TPN}. +Thus, the transition rules permit to compute states and state reachability. + +% The reachable states from a state $S = (M,I)$ +% are the states $S'$ such that, $\forall t \in I$ (the transitions fireable) at time $\theta$ leading to state $S'$. + +\subsection{From AltaRica to Tina} +The underlying mathematical model of the AltaRica language is a Guarded Transition System (GTS), an automaton that generalises Reliability Block Diagrams, Markov chains and Stochastic Petri nets~\cite{rau08}. In GTS, states are represented by value assignment to variables, while the states transitions are triggered by events, that change the variables value. Synchronisation between events (habitually asynchronous) is produced by introducing a new event. + +Given that it is always possible to obtain a flattened model from a +composition of interconnected AltaRica nodes, it is then possible to +interpret a (general) AltaRica model by using the GTS model encoding. +Our translation approach relies on Extended Timed Guarded Transition System (ETGTS), an extension of the GTS of AltaRica opportunely enriched to include timed guards. + +Expressing durations over event and non-deterministic transitions triggered by temporal guards, fall out of the AltaRica Dataflow expressiveness and thus cannot be captured nor analysed by its associated tool. %which can treat time as a set of delay assignment, i.e. with a fixed delay associated to each transition. +So, we enriching the syntax of AltaRica Dataflow to model temporal guarded transitions by adding a new event law, as defined in Def.~\ref{def:ETGTS}. + + +\begin{comment} +%%%%start comment +\begin{definition}[ETGTS]\label{def:ETGTS} + An Extended Timed Guarded Transition System is a tuple $\langle S, s_0, E, T, \tau \rangle $ where: + \begin{itemize} + \item $S$ is a set of states; + \item $s_0 \in S$ is the initial state; + \item $E$ is a set of event symbols; + \item $T$ is a set of transitions s.t. $T \subseteq S \times E \times S$. + \item $\tau$ is the delay relation, $\tau: E \to \mathbb{R}^+ \times (\mathbb{R}^+ \cup \infty)$, assigning a minimal and a maximal delay to the transitions bound to event $e$. + \end{itemize} + A transition $t \in T: (s, e, s')$ associates a state $s'$, to a state $s$ by executing the event $e$ in $s$, after a delay in the interval $[\delta_{min}, \delta_{max}]$ given by $\tau(e)$. + + A \emph{run} $\rho$ of a timed Transition System is a sequence of pairs event-time from the initial state $s_0$: + \begin{align*} + \rho &= \{ (e_1,\delta_1), \ldots, (e_n,\delta_n) \} \; + \text{s.t. } \forall i \;\delta_i \in \tau(e_i), \text{ and }\\ + &s_0 \xrightarrow{t_1} s_1 \xrightarrow{t_2}\cdots \xrightarrow{t_n} s_n, \text{ with } \forall i \;t_i = (s_{i-1}, e_i, s_i) \in T + \end{align*} +\end{definition} + + +\TODO{TGTS for us, as delta can be used, but not necessary} + +\begin{definition}[GTS]\label{def:GTS} + A GTS is a tuple $\langle V,E,T, A, \nu \rangle $ where: + \begin{itemize} + \item $V$ is a set of variables, divided in two sets of variables: the set $S$ of \emph{state variables}, and $F$ of \emph{flow variables} s.t. $V = S \cup F.$ + \item $E$ is a set of event symbols + \item $T$ is a set of transitions, s.t. $t \equiv (\gamma, e, \varphi) \in T$ with $e \in E$, $\gamma$ and $\varphi$ are Boolean expressions built over $V$ called \emph{guard} and \emph{post-condition} resp. A transition $t$ applies in a state $s \in 2^{|V|}$ s.t. $s \models \gamma$, resulting in a state $s' \models \varphi$. + \item $A$ is the set of \emph{assertions}, i.e. Boolean expressions built over $V$. Assertions are concatenated to each transition, in order to update flow variables, \TODO{modelling the failure propagation. } + \item $\nu$ is the initial assignment of variables of $V$. + \end{itemize} + \end{definition} + +\TODO{1) define the semantics of a transition, i.e. how to pass from a state $\sigma$ to a state $\rho$. 2) define a trace in the timed graph, with events labelled by the firing time, i.e. a plan for Tina} + +A GTS is a (possibly infinite) graph $\Gamma = (\Sigma, \Theta)$, where $\Sigma$ is a set of nodes given by all the possible variable assignments in $V$, and $\Theta$ is a set of guarded transitions $(\sigma, e, \rho)$, where $\sigma, \rho \in \Sigma$ and $e \in E$. + +blocks and processes, from the GTS to the Petri Net (states, places, tokens). + +\begin{definition}[Temporal GTS]\label{TTGTS} +\TODO{Timed GTS already exist, we can use another name to avoid confusion} +A Temporal Guarded Transition System is a tuple $\langle V,E,T, A,\nu, \Delta \rangle$ where + \begin{itemize} + \item $\langle V,E,T, A, \nu \rangle $ is a GTS defined as in Def.~\ref{def:GTS} + \item $\Delta$ is a delay function s.t. $\Delta: E \to \mathbb{R}^+ \times \mathbb{R}^+$, assigning an initial and a final firing time to the transitions bound to event $e$. + \end{itemize} +\end{definition} + + +\TODO{Next paragraph is possibly untrue, as TGTS can be modified such to include delay \emph{functions} as we did with Fiacre and Petri Nets. We can say that these delays are instantaneous, when we aim at timed guards} +However, the limitation of the GTS formalism resides in the lack of expressivity wrt the delays in failure propagation. +In timed Guarded Transition Systems -- an extension of GTSs -- a delay function is associated to each event, indicating the date when the event occurs. However, the propagation of messages, as failures, dealt by assertions, are not included in the (state) transitions that are delayed. + +in the case of flow variables, they are updated in AltaRica simultaneously, as they represent the instantaneous propagation of a message in a system. Here, adding delays in such transitions, cannot be directly done within the AltaRica models, so we had to hack it. +We introduced \say{delay buffers}, which, in the AltaRica modelling, have a flow variable as input, a delayed state transition, and an output, which value depends on the state variable, which has been updated only after a delay. See Fig.~\ref{fig:delay-buffer} + + + +The extension to temporal guards on the transitions expressed by the ETGTS falls out of the AltaRica expressiveness, so cannot be captured nor analysed by its associated tool, which can treat time as a set of delay assignment, i.e. with a fixed delay associated to each transition. +% Thus, the aforedefined Extended Temporal GTS is obtained from the AltaRica DataFlow model, by enriching it the syntax for temporal guarded transitions, i.e. by adding delays as defined in Def.~\ref{def:ETGTS} to the transitions in a new event law. +\end{comment} + +\subsection{Factored model of ETGTS} +Representing the whole state space can be costly. For this reason, instead of describing the ETGTS as a state space, it is preferable to define a factored version of +the ETGTS, and describing the associated semantics. + +AltaRica separates flow variables and state variables. +% State variables are modified by transitions, i.e. explicit changes of system configuration. +% +Delayed transitions affecting state variables are trivially extended to include a temporal interval in the guard matching the non-deterministic delay we plan to add. Flow variables are updated by assertions in AltaRica models, but this distinction between variables does not appear in the associated GTS; thus, in order to assign delays assertions, a auxiliary state variables and transitions are used to create a (delayed) state transition. + +Let be $V$ a finite set of variable, possible multi-valued, and let be $\sigma$ the function that associates to each variable its finite domain. +Thus, a variable assignment is here a function $f: V \to \sigma(v)$ for $v \in V$, associating to each $v \in V$ its value $f(v)$. +A state in $S$ is then a assignment of all variables $v \in V$. As syntactic sugar, we can express the evaluation of an expression $\epsilon$ over $V$ +in a state $s$ by considering $s(\epsilon)$. + +\begin{definition}[Factored ETGTS]\label{def:factored-ETGTS} + A GTS is a tuple $\langle V, O, I, \Delta\rangle $ where: + \begin{itemize} + \item $V$ is a set of variables, possibly multivalued, divided in two sets of variables: the set $St$ of \emph{state variables}, and $Fl$ of \emph{flow variables} s.t. $V = St \cup Fl.$ + \item $O$ is a finite set of operators, where each operator consists in + \begin{itemize} + \item a Boolean expressions $\Gamma$ built over $V$ called \emph{guard}; + \item a \emph{post-condition} instruction, a partial variable assignments $\P$. Post-conditions where the left members of the assignment are only state variables are referred as \emph{transitions}. Post-conditions where the left members of the assignment are only flow variables are referred as \emph{assertions}. + \end{itemize} + \item $I$ is the initial assignment of variables of $V$. + \item $\Delta$ is a delay function s.t. $\Delta: O \to \mathbb{R}^+ \times \mathbb{R}^+$, assigning an initial and a final firing time to the operators. We consider that, when not defined, the effects of the operators are instantaneous. + + \end{itemize} + \end{definition} + +We say that an operator $<\Gamma, P>$ is fireable in a state $s$ when the guard holds in $s$, i.e. +the variable assignment in $s$ is such that $s \models \Gamma$. +Assertions are concatenated to each transition, in order to update flow variables. +Thus, applying an operator in a state $s$ leads to a new state $s'$, obtained by applying first $P$ then the assertions to the variables in $s$ . % P(s) + +\subsubsection{Semantics of a ETGTS} + + +The semantics of a Temporal Extended GTS, associated to the above definition is a Kripke structure $\langle S, S_0, \to \rangle$ defining an oriented graph, where edges are labelled by the events, and their associated delays. + +\begin{definition}[Semantics of ETGTS]\label{def:ETGTS} + An Extended Timed Guarded Transition System is a tuple $\langle S, s_0, E, T, \tau \rangle $ where: + \begin{itemize} + \item $\mathcal{S} = S \cup \mathbb{R}_0^+$ is a set of states; + \item $\mathcal{S} _0 = s_0 \cup \{0\} \in S$ is the initial state; + \item $E$ is a set of event symbols; + \item $\tau$ is the delay relation, $\tau: E \to \mathbb{R}^+_0 \times \mathbb{R}^+_0$, assigning a minimal and a maximal delay to the transitions bound to event $e$. + \item $\mathcal{T}$ is a set of transitions s.t. $\mathcal{T} \subseteq \mathcal{S} \times E \times \mathcal{S}$. For sake of simplicity, we consider two different kinds of transitions that can be associated to an event $e$: + \begin{itemize} + \item transitions $s \xrightarrow{t} s'$, associating to a state $$ a new state $$, whith $t = (s, e, s')$ + \item timed transitions $s \xrightarrow{\theta} s'$, associating to a state $$ a new state $$, whith $\delta \in \tau(e)$ + \end{itemize} + \end{itemize} +% A transition $t \in T: (s, e, s')$ associates a state $s'$, to a state $s$ by executing the event $e$ in $s$, after a delay in the interval $[\delta_{min}, \delta_{max}]$ given by $\tau(e)$, +% such that $t = (s, e, s')$ and $$ + + A \emph{firing schedule} $\rho$ of a timed Transition System is a sequence of pairs event-time from the initial state $s_0$: + \begin{align*} + \rho &= \{ (e_1,\delta_1), \ldots, (e_n,\delta_n) \} \; + \text{s.t. } \forall i \;\delta_i \in \tau(e_i), \text{ and }\\ + &s_0 \xrightarrow{t_1} s_1 \xrightarrow{t_2}\cdots \xrightarrow{t_n} s_n, \text{ with } \forall i \;t_i = (s_{i-1}, e_i, s_i) \in T + \end{align*} +\end{definition} +\subsubsection{Translation} + +The states are of the form of $$, where $s \in S$ is a total assignment and $s_0$ is the initial assignment of variables in $V$; +$\theta$ is a real positive number. +Thus, transitions associate to pair $$ other pairs $$. % a transition $t in T$ + + +The translation from the ETGTS to an TPN is straightforward. + +A state in the ETGTS represents the marking of the TPN, so +we can associate to each variable assignment in a state of the ETGTS, tokens in a state of the TPN, +with the initial state $\mathcal{S} _0$ defining the initial markup $M_0$. +The set of events $\{e | e \in E\}$ are mapped in the set of transitions $\{t_e \in T| e \in E\}$ in the TPN, +with an arc $(s, e, s')$ corresponding to % $\{p' | v_p \in s \text{ and } F(p, t_e) \neq 0\}$, +the marking $M'$ resulting from the set of markings obtained by applying the transition $t_e$ to the set all the places with a not null token that activate the transition (i.e. $M$). +Wrt to the timed transitions +the firing interval $I'$ after a transition $t_e$ is obtained from the set of transitions in ETGTS that are fireable at $\theta'$ ( the timing obtained in the ETGTS after applying $e$ in $$) +such that $I' = \{\tau(t_e)\: | \: \theta' \in \tau(t_e) \}$. + +Such transitions affect state variables only, while flow variables are updated simultaneously only if are kept, possibly adding them a delay.\TODO{ (dessin de la fleur)} + +It is easy to see that the translated ETGTS is made of a single place and $n$ transitions, where $n$ corresponds to the number of state transitions in the initial model. We can ask ourselves if there is a more compact alternative to such a ``monolithic'' Petri Net. By enumerating the states in the model, we could create a ``stateful'' Petri net with a place for each reachable state, with the relative transitions. Another alternative for our translated model, would be to use a ``concurrent'' model, using different blocks for the different AltaRica nodes. + +In the worst case scenario, the number of transitions of the monolithic Petri net would be equal to the possible variable assignment; +when considering Boolean variables only, the possible truth values assignment to $k$ variables would be $2^k$. +On the other side, if we consider the stateful model, we would end up, in the worst case, with $2^k$ places and the same amount of transitions. +Using the concurrent Petri net, we could obtain $n2k$ places (with $n$ the number of AltaRica nodes) which, in the worst case, would end up with $n2^k$ transitions and states. This worst case analysis yields to the fact that the simple monolithic Petri net is the more compact way to represent the original AltaRica model. + + +%%%% Comment on how do we create a buffered block to transmit faults +\begin{comment} + +% It is easy to see from Def.~\ref{def:ETGTS} and Def.~\ref{def:PN} that any Petri Net can be modelled as a GTS~\cite{rau08}. % Any GTS in Petri Net? + + + +While transitions affecting the state variables updates support a direct expression of the delay in AltaRica (and hence in ETGTS as well), flow variables are updated by assertions, that natively do not support delays. To express a delayed failure affecting an input/output variable (a flow variable) auxiliary state variables and transitions have to be used to model the delay and the failure buffer. Thus, a delay element will depend on three parameters $(k, \delta_1, \delta_2)$, where $\delta_1$ and $\delta_2$ are indicate the minimal and the maximal delay (resp.), and $k$ indicates the maximal buffer for the element. + +\TODO{Following example is useless, as it has been explained clearly in the former sentence} +\subsubsection{Example} +Given a failure propagation represented by a flow variable $v$ as input $v_i$ of an element, the assertion $a$ updating these values would be such that $v_i = v$. To introduce a delay between $d_e$ and $d_e'$, we add to the AltaRica model two auxiliary state variables $w, w'$, and two new events $e$ and $e'$. +The event $e$ is instantaneous s.t. $\Delta(e_d) = (d_e, d_e')$, and the resulting transition assigns $w = v$. +The event $e_d$ is delayed s.t. $\Delta(e_d) = (d_e, d_e')$, and the resulting transition assigns $w' = w$. +The following assignments are added as assertions: $a': w' = w$, $a'': v_i = w'$. The result is delay of a value comprised in the interval $[d_e, d_e']$ between the assignment $w = v$, and the propagation to change the value of $v_i$. + +In OCAS, to produce such a model, N delay elements has to be created, with N the size of the buffer. This is automatised in our tool-chain, as the code corresponding to the delay element for $(k, \delta_1, \delta_2)$ is generated in Fiacre from the AltaRica code (where only the delay is indicated, while the buffer size $k$ is calculated from the elements uphill. +% NB: We can say that if the value v is new, THEN we update w. but can be more confusing. + +\subsection{From Timed GTS to Timed Petri Nets} +\TODO{1) Get definition of timed Petri Nets, 2) define the translation\\} +We build a state $s_0$, s.t. for each transition $t \in T$ in the TGTS, a transition $t \circ a$ from $s_0$ to $s_0$ is added in the TPN. Eventual delays are maintained. +It is easy to see that such transitions affect state variables only, while flow variables are updated simultaneously only if are kept, possibly adding them a delay. (dessin de la fleur) + + +For each delayed transition affecting a flow variable, e.g. a delay in the failure propagation in our example, we add a new element working as a buffer delaying the input messages. + + +Introducing the delay, synchronisation, and new states +1) first in OCAS; +2) AltaRica code generated with timed transitions; +3) Fiacre code, with temporal guards (from the timed transitions expressed before). + +Equivalence between the AltaRica models with no stochastic information, i.e. in Fiacre probabilities are abstracted away. Trivial to see that, when guards on transitions are conserved. Then, the time information is not part of the AltaRica models, and has there been artificially introduced for our purpose of taking trace of it during the translation. (taking trace of the transition names, for traceability purpose). + + +\end{comment} +%%% end comment + + +\section{Command line} + +Sources du projet disponibles sur (C++): + +\url{http://git-ingequip.pf.irt-aese.local/diffusion/TALTARICA/} + +Benchmarks (utilisés entre autre pour l'article IMBSA 2017): + +\url{http://git-ingequip.pf.irt-aese.local/diffusion/TALTARICA/browse/master/altarica\_epoch/benchmarks/models/} + + +In the IRT repository, we have: + +v.1.0-erts18 The version used for ERTS. + +v.1.1 Current version. Some bugs corrected + +Known bugs of v.1.0-erts18 + +Error in printing the guards of synchronized transitions: adds and 'and' at the end of the line when there are empty guards) +Duplicated syncronizations events + + +to compile : +/usr/bin/make KCFLAGS=-ggdb3 -Wdeprecated-declarations epochnogui + +to execute: + + ./src/console/epochnogui --ds 0 --ps 0 --file > + +%% LocalWords: TGTS Fiacre Dataflow OCAS ETGTS +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "main" +%%% End: diff --git a/doc/Rapport post-doc/dirtytalk.sty b/doc/Rapport post-doc/dirtytalk.sty new file mode 100644 index 0000000..228c5bd --- /dev/null +++ b/doc/Rapport post-doc/dirtytalk.sty @@ -0,0 +1,73 @@ +%% +%% This is file `dirtytalk.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% dirtytalk.dtx (with options: `package') +%% +%% M. Klammler, 2010 +%% +%% I, the copyright holder of this work, release the source code of the dirtytalk +%% package as well as the accompaining documentation into the public domain. This +%% applies worldwide. +%% +%% In some countries this may not be legally possible; if so: I grant anyone the +%% right to use this work for any purpose, without any conditions, unless such +%% conditions are required by law. +%% + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{dirtytalk}[2010/11/21 A package making "quoting" easier] +\RequirePackage{kvoptions} +\newcommand{\dirtytalk@lqq}{``} +\newcommand{\dirtytalk@rqq}{''} +\newcommand{\dirtytalk@lq}{`} +\newcommand{\dirtytalk@rq}{'} +\DeclareStringOption{left} +\DeclareStringOption{right} +\DeclareStringOption{leftsub} +\DeclareStringOption{rightsub} +\ProcessKeyvalOptions* +\RequirePackage{ifthen} +\ifthenelse% + {\equal{\dirtytalk@left}{}}% + {}% + {\renewcommand{\dirtytalk@lqq}{\dirtytalk@left}} +\ifthenelse% + {\equal{\dirtytalk@right}{}}% + {}% + {\renewcommand{\dirtytalk@rqq}{\dirtytalk@right}} +\ifthenelse% + {\equal{\dirtytalk@leftsub}{}}% + {}% + {\renewcommand{\dirtytalk@lq}{\dirtytalk@leftsub}} +\ifthenelse% + {\equal{\dirtytalk@rightsub}{}}% + {}% + {\renewcommand{\dirtytalk@rq}{\dirtytalk@rightsub}} +\newcounter{dirtytalk@qdepth} +\newcommand% + {\dirtytalk@lsymb}% + {\ifthenelse% + {\value{dirtytalk@qdepth}>1}% + {\dirtytalk@lq}% + {\dirtytalk@lqq}% + }% +\newcommand{\dirtytalk@rsymb}% + {\ifthenelse% + {\value{dirtytalk@qdepth}>1}% + {\dirtytalk@rq}% + {\dirtytalk@rqq}% + } +\providecommand{\say}[1]% + {% + \addtocounter{dirtytalk@qdepth}{1}% + \dirtytalk@lsymb% + #1% + \dirtytalk@rsymb% + \addtocounter{dirtytalk@qdepth}{-1}% + } +\endinput +%% +%% End of file `dirtytalk.sty'. diff --git a/doc/Rapport post-doc/etgts.tex b/doc/Rapport post-doc/etgts.tex new file mode 100644 index 0000000..8d1a6b6 --- /dev/null +++ b/doc/Rapport post-doc/etgts.tex @@ -0,0 +1,130 @@ +\section{Method and translation}\label{sec:sect3} + +\subsection{Temporal Petri Nets} + + +\subsection{From AltaRica to Tina} +The underlying mathematical model of the AltaRica language is a Guarded Transition System (GTS), an automaton that generalises Reliability Block Diagrams, Markov chains and Stochastic Petri nets~\cite{rau08}. In GTS, states are represented by value assignment to variables, while the states transitions are triggered by events, that change the variables value. Synchronisation between events (habitually asynchronous) is produced by introducing a new event. + +Given that it is always possible to obtain a flattened model from a +composition of interconnected AltaRica nodes, it is then possible to +interpret a (general) AltaRica model by using the GTS model encoding. +Our translation approach relies on Extended Timed Guarded Transition system, an extension of the GTS of AltaRica opportunely enriched to include timed guards. + + +\begin{definition}[ETGTS]\label{def:ETGTS} + An Extended Timed Guarded Transition System is a tuple $\langle S, s_0, E, T, \tau \rangle $ where: + \begin{itemize} + \item $S$ is a set of states; + \item $s_0 \in S$ is the initial state; + \item $E$ is a set of event symbols; + \item $T$ is a set of transitions s.t. $T \subseteq S \times E \times S$. + \item $\tau$ is the delay relation, $\tau: E \to \mathbb{R}^+ \times \mathbb{R}^+$, assigning a minimal and a maximal delay to the transitions bound to event $e$. + \end{itemize} + A transition $t \in T: (s, e, s')$ associates a state $s'$, to a state $s$ by executing the event $e$ in $s$, after a delay in the interval $[\delta_{min}, \delta_{max}]$ given by $\tau(e)$. + An ETGTS defines an oriented graph, where delays can be seen as labels attached to the edges. + + A \emph{run} $\rho$ of a timed Transition System is a sequence of pairs event-time from the initial state $s_0$: + \begin{align*} + \rho &= \{ (e_1,\delta_1), \ldots, (e_n,\delta_n) \} \; + \text{s.t. } \forall i \;\delta_i \in \tau(e_i), \text{ and }\\ + &s_0 \xrightarrow{t_1} s_1 \xrightarrow{t_2}\cdots \xrightarrow{t_n} s_n, \text{ with } \forall i \;t_i = (s_{i-1}, e_i, s_i) \in T + \end{align*} + \end{definition} + + +\begin{comment} + %%%%start comment +\TODO{TGTS for us, as delta can be used, but not necessary} + +\begin{definition}[GTS]\label{def:GTS} + A GTS is a tuple $\langle V,E,T, A, \nu \rangle $ where: + \begin{itemize} + \item $V$ is a set of variables, divided in two sets of variables: the set $S$ of \emph{state variables}, and $F$ of \emph{flow variables} s.t. $V = S \cup F.$ + \item $E$ is a set of event symbols + \item $T$ is a set of transitions, s.t. $t \equiv (\gamma, e, \varphi) \in T$ with $e \in E$, $\gamma$ and $\varphi$ are Boolean expressions built over $V$ called \emph{guard} and \emph{post-condition} resp. A transition $t$ applies in a state $s \in 2^{|V|}$ s.t. $s \models \gamma$, resulting in a state $s' \models \varphi$. + \item $A$ is the set of \emph{assertions}, i.e. Boolean expressions built over $V$. Assertions are concatenated to each transition, in order to update flow variables, \TODO{modelling the failure propagation. } + \item $\nu$ is the initial assignment of variables of $V$. + \end{itemize} + \end{definition} + +\TODO{1) define the semantics of a transition, i.e. how to pass from a state $\sigma$ to a state $\rho$. 2) define a trace in the timed graph, with events labelled by the firing time, i.e. a plan for Tina} + +A GTS is a (possibly infinite) graph $\Gamma = (\Sigma, \Theta)$, where $\Sigma$ is a set of nodes given by all the possible variable assignments in $V$, and $\Theta$ is a set of guarded transitions $(\sigma, e, \rho)$, where $\sigma, \rho \in \Sigma$ and $e \in E$. + +blocks and processes, from the GTS to the Petri Net (states, places, tokens). + +\begin{definition}[Temporal GTS]\label{TTGTS} +\TODO{Timed GTS already exist, we can use another name to avoid confusion} +A Temporal Guarded Transition System is a tuple $\langle V,E,T, A,\nu, \Delta \rangle$ where + \begin{itemize} + \item $\langle V,E,T, A, \nu \rangle $ is a GTS defined as in Def.~\ref{def:GTS} + \item $\Delta$ is a delay function s.t. $\Delta: E \to \mathbb{R}^+ \times \mathbb{R}^+$, assigning an initial and a final firing time to the transitions bound to event $e$. + \end{itemize} +\end{definition} + + +\TODO{Next paragraph is possibly untrue, as TGTS can be modified such to include delay \emph{functions} as we did with Fiacre and Petri Nets. We can say that these delays are instantaneous, when we aim at timed guards} +However, the limitation of the GTS formalism resides in the lack of expressivity wrt the delays in failure propagation. +In timed Guarded Transition Systems -- an extension of GTSs -- a delay function is associated to each event, indicating the date when the event occurs. However, the propagation of messages, as failures, dealt by assertions, are not included in the (state) transitions that are delayed. + +in the case of flow variables, they are updated in AltaRica simultaneously, as they represent the instantaneous propagation of a message in a system. Here, adding delays in such transitions, cannot be directly done within the AltaRica models, so we had to hack it. +We introduced \say{delay buffers}, which, in the AltaRica modelling, have a flow variable as input, a delayed state transition, and an output, which value depends on the state variable, which has been updated only after a delay. See Fig.~\ref{fig:delay-buffer} + + +\end{comment} +%%%%%% end comment} +Thus, a Temporal Extended GTS models a graph with transitions labelled by events and by time. + + + +It is easy to see from Def.~\ref{def:ETGTS} and Def.~\ref{def:PN} that any Petri Net can be modelled as a GTS~\cite{rau08}. % Any GTS in Petri Net? + +The extension to temporal guards on the transitions expressed by the ETGTS falls out of the AltaRica expressiveness, so cannot be captured nor analysed by its associated tool, which can treat time as a set of delay assignment, i.e. with a fixed delay associated to each transition. +Thus, the aforedefined Extended Temporal GTS is obtained from the AltaRica DataFlow model, by enriching it the syntax for temporal guarded transitions, i.e. by adding delays as defined in Def.~\ref{def:ETGTS} to the transitions in a new event law. + +AltaRica separates flow variables and state variables. +% State variables are modified by transitions, i.e. explicit changes of system configuration. +% +Delayed transitions affecting state variables are trivially extended to include a temporal interval in the guard matching the non-deterministic delay we plan to add. Flow variables are updated by assertions in AltaRica models, but this distinction between variables does not appear in the associated GTS; thus, in order to assign delays assertions, a auxiliary state variables and transitions are used to create a (delayed) state transition. + + +%%%% Comment on how do we create a buffered block to transmit faults +\begin{comment} +While transitions affecting the state variables updates support a direct expression of the delay in AltaRica (and hence in ETGTS as well), flow variables are updated by assertions, that natively do not support delays. To express a delayed failure affecting an input/output variable (a flow variable) auxiliary state variables and transitions have to be used to model the delay and the failure buffer. Thus, a delay element will depend on three parameters $(k, \delta_1, \delta_2)$, where $\delta_1$ and $\delta_2$ are indicate the minimal and the maximal delay (resp.), and $k$ indicates the maximal buffer for the element. + +\TODO{Following example is useless, as it has been explained clearly in the former sentence} +\subsubsection{Example} +Given a failure propagation represented by a flow variable $v$ as input $v_i$ of an element, the assertion $a$ updating these values would be such that $v_i = v$. To introduce a delay between $d_e$ and $d_e'$, we add to the AltaRica model two auxiliary state variables $w, w'$, and two new events $e$ and $e'$. +The event $e$ is instantaneous s.t. $\Delta(e_d) = (d_e, d_e')$, and the resulting transition assigns $w = v$. +The event $e_d$ is delayed s.t. $\Delta(e_d) = (d_e, d_e')$, and the resulting transition assigns $w' = w$. +The following assignments are added as assertions: $a': w' = w$, $a'': v_i = w'$. The result is delay of a value comprised in the interval $[d_e, d_e']$ between the assignment $w = v$, and the propagation to change the value of $v_i$. + +In OCAS, to produce such a model, N delay elements has to be created, with N the size of the buffer. This is automatised in our tool-chain, as the code corresponding to the delay element for $(k, \delta_1, \delta_2)$ is generated in Fiacre from the AltaRica code (where only the delay is indicated, while the buffer size $k$ is calculated from the elements uphill. +% NB: We can say that if the value v is new, THEN we update w. but can be more confusing. +\end{comment} +%%% end comment + + + +\subsection{From Timed GTS to Timed Petri Nets} +\TODO{1) Get definition of timed Petri Nets, 2) define the translation\\} +We build a state $s_0$, s.t. for each transition $t \in T$ in the TGTS, a transition $t \circ a$ from $s_0$ to $s_0$ is added in the TPN. Eventual delays are maintained. +It is easy to see that such transitions affect state variables only, while flow variables are updated simultaneously only if are kept, possibly adding them a delay. (dessin de la fleur) + + +For each delayed transition affecting a flow variable, e.g. a delay in the failure propagation in our example, we add a new element working as a buffer delaying the input messages. + + +Introducing the delay, synchronisation, and new states +1) first in OCAS; +2) AltaRica code generated with timed transitions; +3) Fiacre code, with temporal guards (from the timed transitions expressed before). + +Equivalence between the AltaRica models with no stochastic information, i.e. in Fiacre probabilities are abstracted away. Trivial to see that, when guards on transitions are conserved. Then, the time information is not part of the AltaRica models, and has there been artificially introduced for our purpose of taking trace of it during the translation. (taking trace of the transition names, for traceability purpose). + + + + + +%% LocalWords: TGTS Fiacre DataFlow OCAS ETGTS diff --git a/doc/Rapport post-doc/figures/0- AOCS mode Abstract.png b/doc/Rapport post-doc/figures/0- AOCS mode Abstract.png new file mode 100644 index 0000000000000000000000000000000000000000..8e4716d0753e7fffa46e8c30de1c30e91b3363a4 GIT binary patch literal 53332 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⋘>!PS+kstW z7#%{7)KW-HOiU^~(e{nQ`kPHdeJ?KJF*M~0dz!9|J7KnkF4jOu#t4N~s)rcka<@+R zB}^EE>~Hkqf&nc*&TheD>4KMhD->aa{lh z7SMk7sK2hVEj8``G5%#cS=Cu0<$&K|FoeM$>tAVnBlo6*7?8C}QQsTRR{$LY>;OS{ z;dyT^{PiJ3!U2=dQj72jn1*(10a=La-2D7Z7O5_AkblDh99Ow>zG}JV4-jlZFPzv? zG~jR=c}|s=?`%Bq^T|oBOLgiKz$QzE_QpRDQm$h|^Dn)zIg1RVYGcK#y-Pc{d0*G< zRFB%slmT8ax(ho%itBg6cp$>wEU}L|`(*I?D-ycZroS!-!Yo9}P)CY*?kBWtIfH&B z*_3>~!3_*q1P1a4em)~z8DITAS*cq6jb;L&43;Iw|GTY$b0~}KY2pWdhwk+9cXxDr zG;kTw!n*K(!%j0V0S#Y*4H!0@qdvgS>~s!%an*L;bn1_hHC1MBSf;JtpR_^VNk4c8 zfQpWi>u?U|T1g!P$M-33eg|y>5N9CgA|sGNx$6y|`*A0o4UhP=hh0nE=(?NBOx=0( zVgl2YV&{7_6o_0=L0B$A{-^CZ3M0Ce12~=+@XpU3j(!%Pl-w7sxJcbtRRhF->D-IZ z*k}e|WVM&J0%%SuQ=A7UT=T`nf{MU*_pW7#rT%pzFUL>@P;c7k*|UIXl~bz2Q#2|{ zhWao_X#ij>_R+8lV_1ne#fU{7Z%(mUq-=SbQ?$Mm*dI4pd3zD4&IoB*QF2&?Wqjpg zC|w4YPH&MWz-Dx$F41z>>(KEvK&;kAUJHl-z5#M5KhK>f!1(XxVUu2gNE@T$iuIXe zF85zI5De{9XyHcJz2i$41N4FhfIw%=Eh)zFJO8F$YKw|K3ZK?N{s3P+WyVIRPqyRH z9U3Yl_vbUX+z^;LAY{U`L1H~%a&MVE$oa-qhgNaV9KkR;I#(QV#2OMs39!p9_37y~ zz@V7J=H<~lhh7+R-Z$%9GaF$Yt2!g1z9;P_+vVX~GBV&4m$;6fza1lScDa12u$o3> z3(W+u?rq+@U!MadN1bey007`PX+;YFNOHIy+Sh2IgdsBBT=LUNpwcx#hjj;Z_hxOH zSv;T(uTrM5Z#O-Pj1LbDevR#w9$ez;lNj3Jb40yF8~koKb>_9eEG3 z-TdcXRi|6LWK{ZH_t)?JfceE6S75cf2#5jzO_4YFZUcK+rt+Q`eA(>S0VFM;a)L{qjpw-rIHjc({7MRkb204b zO9g~P#PMhc>Dm7#$&|)j708M>CKD9F8c{w507Ol6#RvJ#I)CF)zI8UF5)&_Ws^A`X zU|W#g{`3u+Y2%8Y^8EQs)fL$|&jQHiygu8s)l4M5y~;ryHT+yGF1}^=0mc3MaZ1U` z=Vwgc)O*-YrHEu1zRxZ0^237I)in>i4fIVf|)Lnw#GlqYCB*KgOOXHgw!*fFX5 z#;-5X99zy6_sHb+oBz(mZ7GhHYy}Ol-E?k!X}hijWQg?z?{Y3zJ!AJ|0>(t$?3$%$ zHrTJezfb{$r*p-+PKzv3Sz!A%j}q(VpQaP~GoaMpl%PnxR4sTNar;fg9R_$e7;kieHE*p@lLftb6W3{OsyWzh$nQ0EKOy zBgLJVJsmD)46Ja&HA5+3boa@_a2J@M!|d4Sn*%d&IK_7}+I!vPvee24l5y+TQ@u9W zm_7IT68{i}IQ-`8tf?#vSw|Gir!Wk}c!m;~@lQ3^m8BYf@+ss@HySJ0Ib{nv`T*oh z+~kGzF%PmbH*0(nKO!77z}-I)uWI%VXMc4zYEQT%8s_b*MITSb+MbXw^`dj5taqE` zG5M1yMVHNW=#ZYvY;yUiiCe|G&65tZr6ll@E|Zv1T9zj*u*_X%7(xXO5--g#{=x%n z{b_sOre2ikay5xOduK_JT!BV_85*V)2R$}pS2Yoc~WWhWO)9 z#Y0LVi_dWFNaxYGC7kGZxiwuvLmr4(u^DQ?CU-q`pxX?qCMLnR{sCl2m4gLOFrdOs znm-0JRl!rCBk{|QglHr7N6A&bnaHrS&j-%nYa&uGJB^v$${t=W$Na-FVT{pW(nHdb zsUAU-SW=bC_>M1h0->b4@yEGF=eWIvtzb zhV^D8cAX8U=iAwWuRK9^8z{d~H;)oiKei(7kmsiTRi?{a#`e#2XR;BWkK-fn0mcUP zvHacM!+dLjZCs3x6&aTO*a4Uhf+Otfkz|0u8@)CaZ)xZ+?stD0Xztq&>o_g$onK=K zrvYl@I!ZGPYa}=F-zWCV*{>9HFNiD&a^4Cp6yDDh-i)2zj_JV@!MV=x zxHO)jn*EMvv0!Uhjh6V<@nU*IpVceQDlL*%v18L@jX9yMYi82BH3jqo4wI5nwc@h< z@{I9nNL41bLxw|Z*GiT%L;X{ItwUdCw=Izh};Pqt%?{YAC?#VYeNP3ISHSHxm_27T}N?xReNm+810nv5H82aEA9Qff2` ztxm#B5WG95lkQ!jPrxm6xu)js={<)ImF{`&v4Qqhw^Cq=$gOAi%LGo9%5G}T8Sr57 zL@ulSdxG~kcYpofkQQ6gTwEH%$kw1d<5}7jv}T2D4_nyO5L5J2Q*;XR2-PWXSyJ_0 zm1gnSEf1}qGzHwg4Rs+8XQ0pQ;&0l;szSq$&>o$v9~Fsbz(PeG*lf8F;c*I{n=WzGQsb|770nIrWm&1zq$#91u8 zUk08*`qXGy4|1FLUTBy9HnXP_bE8J5PkBOvLuq2ay!~eFYE;QD<@Q0MXx!z$k>g^*q_|+}v!b-c8LF4{6GmB$4SO?Z7$7 z2jIerKjnfC_gt%g@-tr}jQb$Q*3!nM8&}))dm(&ejr|(IC>bvtd0-m`ty`VQNmAZa znMjtINUrobzQYS@AcrAvoGC@)j}({?{pR72hIFF)aFN@7_eYNaUJ--{l#u~U<{~pu zxs|LqCYf{md0Lcb#s00Ss96K^HZe?+%}bt4!@~yhNR0K)*45uM=@Aike~QVn`E;GE z#m?rAi99?W?AvB(csq+Wjs+x;9ZlECW|TuBGEXr4RqT{e>r-7%0XIc{=|o9f-|ILX zUGLe{G0X5Z-|BbIX*(CFBjF)G9BTdyKD#Ai{xyAq>%I@`W_NeVa_+tn%XjPC^%fez zAhUyZCapyDLVqd|?SYrC-ZDwSgR>BZnA0TIoZ2o~xz8yl_ACN;`n>|L#{^L6EXT&5 zxd+5fjqC)dIlCtgrnCe~3JpKy>}@wIPk7!r*T5b)K$VczF0@UWBi_3huwj_jy&?}A zNj#+_?r?ABe z8mCulBE8;l#*Ux7{wGExy?t%im4lCsRHA&XOL*_}3I(;+S%QCrLv(1Zx<0bJN;rFa zykPrHWEUMfPj~I`;X)JXK^bfRG8e(_%T9fUsFWz=bTN1INyIvD>;^kie`|^!6Bj;U zFmoGe33>~hwy)sZrpHDo(dfD7PfFt{rx3UYVl+C=jthEjYc1*&&NstFH&8Vsd9A4U zfdwV*bm6IM48aG8ob9Qc?PI%GL}CrYSH#mL@nZdtc27(mEc<^VZyRDMvV`^4JfO)} z{e;_R(OtYZp2~Wx2WX%AML_rXJp;fBTkE03n4S|_GWEoNcBKoaYxY6cYziOM)Rc%? z+v%Tbc2>_B!FsX3XsGXqCV4Z+Z?g^M2AcWMpM5&miLRV5iQkj~YP$=Tosq4207A)F zZ?=l)?t3x@j71Sc1)BcEeVqDr`-w~g))KqV!9KtvcWy9g%zxF^_lM^9?irTO{zQ9@LMha1DLBWEQau? zHwG*<0Ehr%cB}^syo|K5kLU&>jBq7e@VlV8;)Gh2gSGapO2x=j^mX?@KVSduRaO=9sLh@{*i3k8g}`Ix=n);)jHP%j?~5dLhQ}5!q$R8-mg3lW zGu4Gz7E4F7Gr8}|Ep|W6H2BJJFim*u`2z41Qb*(1MO37S(Yvu`WvfJ~pU_(r47++sMNS9`)N4F~zjaOl|XLMO(o|HByPh7h2` zQ1=+%1}r<^4D7A!gg9FC`2BhFKKE3C^r!UeTmhA`&sxrAXD7z;>LEK)Y!656y}J-9 zKwaH3N%P57&j>IdR!@66WMYxn*n_{wMBFnm_suQf$SYL7QE5zs>GX*c5FcDZf{y{LmT(= zN&aD;?3=nCL48v3Uh|O0A%Ny*{o0orz*B7#6}V+j`d6ao74wjiQ%^o z77jBS6baw_)_!a%iVF<=a!&1kFdr~7pszjZ*MWVA+W@kUdmq4(|3!l|^IynjNqj#R zbCzMNL8&Azydhv#0Ck?Ptr-yL^D)p{NM{-Ce`_T1t6u{Ssqxf$C>^7UJUuiU!gA^_ z%tuxY^y7dme{Rkgai0A&Mn!&1dAS(Yq2!7yo_mfD@^|ZrL`VN75oi=IS;)>VKHxh{hB`)=n@C<&JZO=r#c*f@Qq+H&cUQLa&Lp!Ra1Q)8(-4403JQ zxq032$mt12<%ze1E0fscM%XrN?e@n ze@f@EY#_p>P=@gjSQnL>(%n+&92|@}*q|N#l!4>-MBRvJ==R>o5G_x4)DX>X!&^?~ z3R~D~XktQE03X37#yBr4%})NkM3kX3Y`CHV{3=SXFrR}Pum$-XGZc+4f&?upNupmH zTR8cD(zA}8DWS3cPVR=yi6@+1HO02ebc+$HZ6xJ0HY$*;Hkl2JI^iUb+D#vSWA_li z39ym!5}@#$540`#eTU)(CNebjjQWYvgrrPwE6$kunW4h!&Cxw~?8#-o-Wjis$sZ!b z`<_SleU~~6Y~Mv?T2}2p*V%W2f7ARmruS0$Y*x?NM`hKEQB!pPS9YdX6R}PGiqw=4 zG1Q}b$<|^mGwL?QAaP2fcS>N-eQ&nHoezM@6o&+hN{%deeG(j4`1t8w4_@;*&I;HG%GU&=)r#LVU;=Vn3mj zl&rHA|C-skxu<41WU3p;U38LGhnGkay*F!8?{%E8`Kil#cA8BuXxhD&7O%I2Xv+CU zBYbB|^VF-Zv~b-NrU&o2z?`rh?qoG)a1K10Bwf$~ZZ=t%i1<`Kh1Vn|R?lWPGHm z-hTZd{SbFW#!e?t&dqvam_o%x45=@^vn}>&d#YbfJf7or%~U<|Pxr8dBE~*cPFn1> zxm)*>BfYLgLO>k-CVK+y)g=~J43_Xm4s{{!x#=&oXbz67ypHLsj-QEeM4L~A8Ycdi zzM$rdzMyR-9Uph_?-1BM=a6@LM$|bY64@M?B;PA&8+Xa&tbx}p zvi&J@xQ*3ZDUjs@fiQAsqmS+EGQb!M#u1MDY!9P(0j&Bk52#^}pPiL_v5&wzm5-Lt3KCm{DWH|Y5 z+@e}>EctC#CIU>AyI^H@HXOAu?IR~_6l?}F==Of~L{*z3w>x&DkNnFi-Ai8D!$3Ti z7_RE496Unn$9d@d+C~x}Kjqv_0{NNOky7%ox{yV0i00Abo!x`q3l%+iPG5}TeF~Zl z%q-h%a%RP@t%{t@ioI;w(R)9ZG=hP+Bk0gx{D*0czn#dt$0zf*F~VnWx6?4L;e#5K9IghANapnWOfdB0G0 z9!uT>45;962C1l!#{OyB*=F@K>BOrVH5k$ss!+v)qLu+@MwKF3HbV?Q%s7QIYxoqnF#HVL=+Z|aus9*Fyu@ESU`D5Fkw3z2_Fj)x4em&|Q z?s*yoR&MaAn5MrwU3#oO_P&C&$4GT9{WwvKfZ~EN8pYoSqidT2e2nb1NdKj$;%@(==NM{zIHW%b zul+4;_xr8s)p=(KmGT>E(K~yMgB$Ok-3aUIsxss^ZOD64xQl8b>z6V?EHWqNXaMCn*uwFU7ehcWYvi<7w=csL0JWI@U zOkLNIg>z{)-d=Qh4`{I}^O1N_yyL?)yoHP`Mu&9#=|1>)lv_ns@tZuz$5?7+^a1!JD8eea-^!+I2R8p<#>gZqW6s9 z*SK)?!Y;nUzJ~A3ER%{k44Hi!d999`K&n&JR5|VQ?CQ@WC5awqw=54%O0~DD$+G+9 zCq+uxo|@adW7_OuYDW#D0qLs-`^V6JWb8AUbPz7 z@zK_8%yTRsVOY5Tn62=XDhXlU*CUiX>5NGpu2eB8&6b!g?BaamwVJiC?v+N(>41;o1wanZ~EOi{00gHu+V}Hs zPzi0w#a6-jF!oRC2@qcz&puuWT(GnPWi*bH-KfIdfi_SKcz2tKkJNEEi@!w2m-1YF zgfcvOA?i0rNDm?sJ?~mAqDz}Z$pKx`&cwC4_l+1C2zpN@4;N~vdp> zri_%clm4?9*hx1mMg_?AZ387m?dQ3{WqOQozaC?TE>JMcfe$1};cLJe*TZ!3SH1&k z;A^HIj%qJmxG*is6LGw-Bz9KM%F5aSR~`CZcMfllt^qs>@<^bDzfd7J@^bWn4izZ1 z!cNyJWoC^KQfyw;A{Ojn%2tQrJ$Cm*T=e<>~f7xQ}MbR+vLa82>CYkWPV_ zkAW-+uV6d4m%Y#X%yGpTqa#;VtOWLkHIVZ(XLZ=RpmH1F0T77!57L=(@88V)J3VX^ zkimPrZ9y(ba@Hcg$!k?Gt$YU{qBGF)C&zr3+qV{EDYC@>RV?Z7g{>a#Zwe-QXmlzL z-0H*!4{pce!(QxSa0P{+nW$5|DMfEZUY&?c>AAixLFa6U?W@xGT`R}Dynt4$Y-gY8 z$EKYvulJERXa_vIT4Dn1ZSg4#AE3s}Cj<&8DQxS{*2W_YW;xOz+3W3+HJ8h|Uwp`9 zsj9^Uvq%zgUGWh-Pdl}KK|#*9HjSMv0NeTIog@eDQw3a1OzGupM>3ac6=6p9T*2 zH0Ku_Ex|>3?{&b{%D$nq)5p4cw-Q|g@T20qbF^AT;MMZC9UP`Mxv;^H`)uXsr!p*evX6vk}N_bCJ!o+Z9Px7@kG1f1g@7AG|SC;3# zNg8mw4v1Ahm!=!asg`)zXZJND$IIp&sfFUz8RM_?FAjw(E5MO41HTycz!@9B5nT2BTi!>yYs`Kr1! z5d!?)_I*7|W274v0XGHhthy*91vr@m+*%}C_P$1SIa$dOe5VQR*k@?`^zqpkEwKLw zfAyl<->_DnMH zy!Hx>V!PQJ6=x5A@^_7oCnV1P`M}@tp4^aG$H==H+ck5JBSGRj=kndAt*w3D@v>G5 zo4tlhL?dcD_Hh9!;C`~zj-*5!e6XFWQ7UQN6g&hJg&9!JhrM_KpAZCstX`J>LoPZE zx;{M+pv88ry1|ZTwt?=San19m{eGS=?ZyfjZUeFv=s~iRw*$)Sfmci@ivIB@hGW$S z2sGF6)9l;Q9V4Hlh&Q7pHhREoBhrMwJWiffejKFyV0fPg=-qvynKj`B%8CdYldXipo8~oWGZ#_E16;0o360rCT4y$CwCW zovW|^0RHz6pif_sRjD&#MhQ21v z?+FV2`8gCl<2H59C9UE^D$9*3V|YU(`emf3&t;*F)n|hD<|f#mazypX;M|YtALE$+ z6%nmcebS7CLx|ZvDkg8d<>p9xDfu{csVD1NkHmS8?r(d_`{n+GD&k)voAB;o4N^nT zukV3CNjbLAb^_)LgPgP0OYD4;dP#|Dk$4_lU-nlOm`$A}muey1IFu(Fs- zjgcrvvt6$AL@jc+1s8bl$oMSx8UcsuZ+l-qsTJzYdaKpyY%=?^o$|GL?tAI~&{2-g&Z7)Cux-8DF1LlkiNYjbg_{xy`oZ&7K#GcgG`%T)P zm$>&6Z=SYiR{*^J_vN{|SBqz9>e~;)ree?3>XIO%wy4!%#FWbZO*O5>h zBOB=>djSVz*9cv@E}d6h~nt4>K5J_jb$=8`hbijqR)FMGLYFE@fNS z@6p_S9`#RSyW^10I3F?LRy4bA|GKgW+UvpEq#`Ny^byVi3p8lc398AuPqrRr2m%{sA}v^0=CZ_Di$|H?^{YDDGSrS}r$%;0=mg z;>9;Q`#beTMWF>|JVv?`YWq)i78;^A?TX7fH^_XS2S> z6jOnEC9-5=oLe+rc<1Zs2E0<;0$ka1%Lv4x}_1jkb+bc^Nb z+`aZf3Xf` z#644_QH4H*#sl_N{>%DWiH9&9dMSN-EON;;yrMLHpZ`#(UACP}K5bP+ZkQkZzc_pI zcqrR9{#z+-D(*;yP_l%i>^mjCcQ$jjkHb%$^1q+JbwYWOOOPSN!9Q73*1q3`po}#7nVxKn^EY`< zyexj7*Wupo>|+_YY|2|$L#B_TBd-i<1nvHTs_>d*)KmW4{t4u&IbWd&F&0BfsqFN(iF_ zS~cmT4NvN(qtnD1&<19EOgCCcf~G>yW_KiFtZ_lY2j4{KbWFB!GNyzpO$&_@2ehTf zZ&KT5`&$V`lzwwoO)@wAaHz-i<5GPr;~a8?Ko>gmmgh@q+`tYAB8FI)GM6=M3zU5< zlkaS{8t{y{Z>HPP9|T5-P>b^duk`8UKK$#VT*U6ay9n#YdfPX zT}jE?^3>8gof~K)Iezp=hl8jO+JCHLy^YIzjIzN}4fiDv#e7OS|4+vz@9-B;fQ|I5 z5_^*(FA&>K#KoEY#r8TH9*+IUwPbcADqgqNLs?1|G&=r&>=+3TKSEWi1kNVsdO~za zr_RPQcQ>A{@93pk5)W;mUXn~yOb&4m=@%wrpDM*N)mp*oKG;!^XGxs&tNn!nAF?wG~#Y>6- z_D&5p%`Y+sF+MBfYRG8)N2nu$*TMzk>#Qy|d6qQL`Mkj^T%}y)j<@Lw?F1jMVcm32 zne1ztYFVW-U}jKZdC$acPiObByV+^bxAkXE`rWR`e!Q=tjdO=vBY60ZL<|cFrFP(Cibfo(yp-N?aDMS5z2!F*PanIEkouxx%j>(KYCAP<6Rh@sn%D z+wz=FZzcZ6mD@C+9rGnPkV9yaljCTgX<2IH7dLE*hKfzv3=n!pJ%^gJAA9-So9<3` zxOa)Jb!tIGTNE>vm_E&Sql^2qte}GPl-3O?uC(cwL1|x#PWYJJW77N4DV5x8@#LO} zhlJz3jXwb`R#$?>&@q0fs8~U~sY8`zxwlutbiGWIJ})->roqfmVycVNo$uOq_Q}mz zuK1cC-9!taKA*;(nh8>9Ztnh9ZlM)R1Mm8$=IArJ8!;L#wlfn*=DO&xVDtYrNye0Uc=&$G>#PZ*5YGyN6DsXzNe$!%3l++4UKk}9rI^*zI%=Je| zPx}bb!2N-3x}R`MlM!+{JE7OtX>io)n1c_W>x$-UQU8;tFwsfNfV@}o?%T0{NNZ}# z{O!7q30+}WYV@cFE*>#Z}K^U)$`SxMO&3t-R%6Oo3%u z*H7tJQb)p2lDaN#>7E0wQL5@1K1XLo`H6*jCPMjS%(-5RQyHO3$&p9T>%#brh4sCK zjxDw(ijS=n5ZHy!rJS*NoklhM;HR)Hb5{NLbgD#l`RmC^419TL>{x!;-277UeOev& z2pbsUX|vM{5N6ZeGX+{FXf7xxyJm;lC+55e^{t#oly|y2Hy!b3;uv_J{dtA&MrfF_ zF6=!MP);b+v$U^#p)0_}|31O}syL=G`O4Vpca4r;`>%CqOzOXXjmzBjW1oYFZeCB3 zAyN{$0ZM~w*VHU;Wu?7+o$}?6qZ?v}xu^IKCaY*|j8J8nDf_Xa*uq@X7g-k6G7z-V zl<<^C4PAu7fF!fSm-^8&93ED1j)Z`gHA!u|-;$3$ls4bgou5&&e}R3*6GvpcUE;ew^G<#+QN>H4o;H{JpI{=Ehn^rAYwy5CT#?KvLe}iC$zu7yvqw$y zi7WRXjRv-$6^QH$VntKQHNG5j#J<$seJ;jb()L4o;>y_41>+_&|NY7^lkB@$pqX^l z`bI`5)Y(DleNaXSZc~3h%ykE11*f(K_nvBP(|DmKYO8I(^@xQPMf#uI9@fkrkv$`R z#gi$Qc4&L+=S(>0TrNENF^~QAd}O?>czdaOy^~ZyT*F7BF~5MzFe`M7*+Be~h0LGd zxxLMSEGRC-d$i5#Gp2$;-Ulc|nm9Ayx$Sy|blwoA^=nb~UwKXtYw@;?z&qE->$=CW z^`I=r^G^n4tqpdb+F{Z4Kgk)>?DO;4xlSkuCKB*<0&k%9P^jyc?gf_ZAvl|YPj)c_ zK-lG~qWVG!%id^=Zo$4Xo2{4e8M)NX(NF1D7l|=ao+cMiqW(_Pt}CJ-^MygR-5FWs z1J#FEj48`XaU%dJo|Cm56>XgE#*`a(2`>wtMZh2Z@j>k%zJWZ}>U7iOwe7R$<9)vzIBf1N z6$TWlp0#|S(ufiEzG0&R+F3Luk0S?P5vt0+)sC~O>trTq%u~Yef1HIC^$)`;RS~bF!e-Vrsp9f8P)(x}-nrmoQ z-z&LL7%WJbK*)5zY+f+KV3vQmjYy0yxL0@tYO%C@rc32bs4p48L0YW$;cL59@; zRr6U_N+wYsmH60}&puqj_2=RXhMi=b*PtKTTw3kmptkMW!J`y|NfSJM#p*+|CI$%> z_*;`*onrO+{hmCk-R`fwJ_BJOfi>H=!!;GKTHyRZk0 znf{p$ucxWsjll%H#w>qu>zk*%A4SOjnT_xncTDc6;|v)r$hj;S-Evp3EZwUl9qVMl z^W%xu!G1QzZ4hm*J2n)3C*Ez^H^2PGqF;-diB*yxif;4wt{=g=H|5$DJP1k?%o~5P zI2}MVnyOyeu5N1g!N|TC4{Il0zMtQEf6<58jB}o`fNl1D)5Q%=1%{UsUWzi8yXs}u&AVsNddT06wUtx*$=@+0Ygm)c z#Ic07{)lOj&OAYtPi2fTe79?{_GxAPVsa^;tk5>`HJ_RFr}zQ)@7zf61~rs@^>7Oa zTtVde5OIthX*2usf#1dU=HwQiGD{X?$?}1_T{Ap=L8F@hmkxh0OZ9BjiFw)a3UTP!F*O(!?Z$7%b7kqKd0#18$?dt+1_e#Sh6o*3Ko;IU`S z^)dP+uQd_!2BXQZmZXf2cRAIqO@pq0O8%C?)k5c}t9|nh-^YUz z*#gm68}9{P=So3^Bt^B*;ItPD=oWGEJ}lMxs>3Go8z+7`XY7{@zoT7lZ{7UVQdq`0 zgFA&+`-Y`M)8v1D%A9gmB4$p3+8V#F5_#9$q%&Z3ep+azX2=G%mzgmLLrv<<)D1DN z`o&~~x)g?04Mk?`jJvjEgwCg~)x^s@bnBd0ZiAuv^azv7N8~s@41vD+8SS8;c0Hw< zp|7x@Z+c2qLwz{Ee!ZB9<#RCE`BcuTp*h%Ien#epp?KI{V#WblPk(&*!CL=&S|31J zt1Hm_5rwsGked{U%!MVPy22 zZMR`^B!p=+^TZ}kWw15gxDC9H#q_|=#AvklE=nbMxz5Jlxq3^RI$PUt=1BJB@A_do+1*gd;MGA=_al#E zr@|G_PVxoFZ{ zTjk&?_2E}a8Q6xU^$Y{IYpXlZu;Bf}3 zRXx^MuShxrpK0udL)Tm|iudo9C>U!1cwB7Q{PJ z+&0;9Ta%w(p{p17k}or=+MUt$U?VFq^ZrtwR z_ey_ii|OQkJRMt}%1zDAG~Oz|3e;K7w|~BsYu>UI>6i}#z{4z!PZx6cAD$q))zl&m z%Gt%GF$u==bz#IhT{bE|u|=sfHxKWfYRMdV66)&dcLr>-Mx3X2{9KIEbiwd1v*9DW zeiv`5C!6as*9OPI9-!nq>a6bs)qat zi%Zv7=^NgE`)=PUvcRvg#mJ&XK<=^t-7~Vrm-h)gFa`S|^G$sca^6SQezxQCzMN?M zRQWU=PSHZMIOL1d`y=^|B_^X2obW9}xx=>TQEE_42`^Jf${#eNfu$cEDi0Vi34PEv z3N)5+zUgaA&ADcnfVsrk5{Iy>uG{)9^Cz7xGz;u_PSkTDHh*8Db0C}XJ$aaF(OZNm zolm+f$`$hBTUGw4%Kmz?izRT8vh{gT8*2UXyL8Eu1Mst~YkkrLE@3WCc2)wfzNgx3_=?Ai#j1~&Z( zx%`WL?eo?X1PSC&|hX9eO-|4aUGdym9B-)qI&Nk4Rak0@xYxBlAngcZCZ zUuNCqw-~mO<0apD9^(Ac`^w6(3ujwgeb(u_6-qbi(bcjVtEia*H$^&~gV>41ES{P_ znyIP7)ZB8*t>nYZS?D+Ac4eg~D5d=C@!Ke&gY$pY6EDd4fWmNI>RJmqRK{=VtxW{% z(Rf#;K-g}w`DFee{f5~=Nt^Hk+FR4BJd0yke{XZ_&KVlj-cVb<=Zbk=vjD5A)A3y- z_I@}{T2%jqMf7bK34QblbsrdR;W7o zi@0aV2Xio1Wnp$HuLQAPX%)aaw0`vSS>@fYGz~P^XOG`Lo>qp_Lg)sciwl!ILvYv;L*y0e{EpCqe;Sg~9gbmP00UjYYP<4l0 z0?fe@y7PX|v=XQD$)g)qqRCbjHy;~W4Wqb_w&(tQD0JtRvNv$6(h=r(J2g0Y;s~`( z!KV?otQQ`il<|da;{7(v2xg@yUms=lO{(5>8pR*FbOJQ8YAD0+*9b#--ZKyr#}E&D!cPo|9! zOpRMJUj5pR#|=bCr1w^(%XkV%(*-PNR7;|eMnkG)w`WToO$b8dG$(h`D~E+G;ZKv` zlpz}pL@HD^3u_H{NgJm3%qVa$lHCxdyEfKz(-uwUqqLkqMA#+e zzaB!@!vVnwOx9MslD=pv9ELD;GaYUq!y?uMur>j3-OPh6W89%I;*LI~A~Uc(*pTXC z4EsYJI3Jrek+40y8@abvQ&$SkA$6FaFYs~B3hu*KxqMHC6;qah51D^>8K}Ymzcr2L z??*8q7@?>Qee%{RvD({&B2&Yecl5+jm&VedlM%!-TwR(f2u!! zR!HUUp?yawqn%#GX5hc*F~_o<0nXqs>)`PH8Vfsnuo3~DJS+CGD)Z5=Yyh&bka;jm z1k9LtNful|+x31MCZLD$0sxA`?RR=}l_^~9H@vbreUlW{6LR(J|Mb6%{{?oSp3t_$ zwZ+X{FgoGU**EoniG7p-79|QP@_&+CUsH%_7@MF7V zW~xEAD@Rr|L{nJ}uwD*Lwha;x{x8=U;kv2+h}Nj2!F~Sg^N*IP`gPv{NJ~&{@%>v& zMfK?)Rg>^dA?Vj{DgN(2DgQ)B|8o`a%KxTBY2eTH|7(R~pFPm|&;L?}+D`xZK+ZTc zXa8NbI`h8}{7=d`iIi+MNR&XrE9w`ZR!8}SZ~W)pug_)%tq5$2Kv%WA!m{0QTi!ic z-pFu$H)L1fT_vE#>pV(M^a#1-$;_f3r{XPlI#~w^Uxn=&C0sL4Nc?kKb5|>{%fLMI zUA%Xzy!QCmqJmwo_@#;_$I(F1(Zw0va^fQwMC~+nw5_)L=+e5Ix82TuLc>CosK8WO z$=Jxw2qRz`WgkGb1t%6B%- z;Obm@-BjFd$i$}bwcZ3o0F_-7Wl7Awx;VtE;kbaZ>I=?3XDX{?nU9?~b`rqCVEBl1 zRA)r=afWwIg(o@A|JB)OBUqFGG2ybuD6%5e|6so6u}U`YPp?l}6dv`~EZCsCOBb`s zT=?dikWjAMc(?gbx8g`1kL;OPsED@Had*)bAIBf#k0}Sow5u|W`fq~;MK_81s|hS= zqd`Yf(=|II6;D5w=`ei_vsb9bauz)jHvPCmzijxb1l}X)i&Nuu%luL96D<_YSw8LF zw6ZJktG>+hy7&7BmBaaELObVr++7soAEmb%LK?(Cg{a*PM-SnjBjl3#tSRK3F97 z&mUS8U`~#H3fA8R1(PYbi2!H}q*7Lbrk3&vhqrtP&5SRMS1^r}U4y)ht6=jTd4!zs+zk+t)F)%bWOL;#1SZ41<4*ID0XQ6J>9=P^G zA(parz^caA*kbpGQDu|G@okWlvfm$?WFMRkYXqVWLg;k**4;{dCR&GUg+vzpE|2#^ z4-(}CD$h&7>lw$aEXKMOw+GQ5AVV1A4y)V~ajXFsjyPKuSJe*4xjZx+6Rnvi+Kpl8 zO;4u$QNN|fD>{1f#oA-Oa)sPj_ol#Z!+jLrb}t|FwZE2%}^4~G*IwN zH7ZzhWs^7Y6=cp5_W_Mu3hi&wH^n}-jTf~vnOjUgT?4=8HyFrNe~o2low3Vhkke{F z|5o|hbRL74q#bEb=N2pKR+Y;qv&H35G%51-)Ms1&0Dh+ejh`L95)u+;AFmk+0QG6G z*LL8JNrIEPR^N?@f@p$rt2^RLjd=(uxn*ag(|Qh!*i84Pg0TH8 z5nIpp-7^#Y+Q*wQIsw-=nbKcsn`Jno`x=RP+p8MOGHSuqyPQRS!ltO5$g(is^(6D< z!%EKKMW3$wxEk|EZ3=p8^!`uA}&+5kpFA~RJ8xKsa*eCw7(BT@%+I1fQ}}j(shWhYL#?S z5ybHn`RxN~k0iODzkhz+i1rRqfhscfi5y=0oEA>GWql8T^aKJW{>k* zJzwOQGh>zrvg+ZSn#|m5F`mEwf+V{x)A|Pmc6PnHqtus(JZBqTgDCr2tMg?LWlKOu z=qy$)pv3KO`-^Ss7>D>r@&OUkDO4`rHQhJM?)C9z=4Se0`{eYFWL4ud2<8+a7MbJb zLeBzoA(7-%{T|42nbF-eXvv4rLMGRSU>yZ#5}J^ARSAPGM6;KhhaGIk6y^{ z|NcrTLwJ*Syt~NzS>&NotMWchMLSFFmcsH!twI$1x+2lT*LHwTkthP*XnzBEU&=3* zukk=}aQ*ssc1(NhWl7WS4ZzaVQ8g%p6s~?&N3+R~l!E=jXXR#g-)P!VE;^y!QjUtE z%qthDrH5X>)&E_ntciI)9BVZr+O;QOhaUNsBy80!N>v>}9M4tq_3Mx8%RI=YzU3Xd znRXbJ4lhz{9l*{Ue(inM$);t#!oK^YymH$e1|51T+$U%KunAztkO7UYaFC<_LI=@9 zftFcWD8lO@kQ}}%46X6)Q!t0H@?wlsxNqPmd}wQ+#WFmI^y^&9+s!^DyAYYy0*r** zplJ9t=6|zkifnvjZbnp82-V}Y<=4N#H=6Kp!^&~4c95oUGM>a9dQvFyfV2Xt>7W%(jPlDdq z|<`CYqVGS zw%xnU@rV3b9Gv^QEg)8=47?D@qyHLsyCI4w{-ZR>b%V!k_d4#{oR*f{;gi8PnvX{+ zo7Zoem2r2CXip|r9ZV`=E&3Aeh&6PnDIcwO)|ynoJru%D^()Y4F?(-?=nV&x>SU2a zqjM6YdcmVrdZt+%-X>Wblev zBkgV@g8jwFO*a_PXD^JH-0T0HsB98aPUsgY`0j)y(N+bcB=h%ojH1<&ST+L^s$8*9VNi5P^q(3MdIC zjI2yI)y_}Dqfr6)D#F?k@P(B4k);!k5B&rI)Rr^34+?XsTuy@ZqNr$qz8L0B_8ey& z7kdA@`l(7VZ-ur}v~_4Od3Z+S8o?rUBY5-$xuly1&r;aDapa#QUSv?$lH1HqjN%?R zG^0%OvAYcZ_)ryeLs-!o+Pf&2z~5Uex^H~LAOC%|$$j%gR{0wGbyEN%_!l%U!7G1m z#f%OwiaeonB0@FZ1q=z#ktd)#35z|(tM}+AVz40~;Hufc`fR^`bXfV=(U&NcuKUH}=@+nQ{ja|b&*?W)Ihp@rg^>V$@2<9%JXuNRCuj-a@-y#mv^X+<7dO6Qds6LE&v zHFGSd0a5q|i9T-mT-U9&n>7b+ba@B2pDYJ<%!lS|)LSF>TPlT0-o);431&Ga_I-70 zP&ZMO!%b`Lcn_~DAx25oNV%dN;${E+nX0xHOB_L>X3el>?d=4frok8yH|Acd$6np{ z25g+Yy(|q73>3r#fRzY7g3xKyam1X}RKuOH!;NUwfAw_w3MIjr#>4Z_VoN?%XhSfy zi*zT+d3d!k6h-)zb4~BIWY=#OEi;|gxu&=a@Ytf#;-b3OWiW3>zpBnLU$=F!m1%fH zQ@~928rn*04LxH-SR>$?N~~yZ4>w^;A2uq3I-fqeL9oTc4Ba5IHPw(9lZGaEuaJ#J zU4t%dYTEl~^_?HLv5U*w3s7{iVmsz-q#fLSqmsC0xH-8RnzNGzb875fe4zlF&5Z*Z zxg7;NjBl>i9my;)J;h0dU5@~#;m~m#vP+CN_+cePQnM3**!-^L7H)B#E2Z(vKDKB- zC@N7K8)k0fp9skfDjOR;j4#Z9fB@4>Toc1W!C^MUurn~tO*F(!986Y9mmg?`-g&;I z+^)jqBRF-o1$kiC2)AEri|ZmGUHxbM?wVu^k+&2Pt;bVSr|ua`NW}zoRoPBbqf0a0 z2@Jt_+gvbcMw)`7n*zwKrQ7t~B=8*Sz%(K!)(4OcaGQNA(3}}onwX`}ISwS~j zaw^vqh2Wg#q|(Y>-Aip4hNnr!`{LI+0t^!(o54!Exid|A_$)X;1FUZ5gf;i!Cifw? zDY0i~HT5jr25^}g?QPi`wSNn4xdKGBVmCr3Gm*I(T1NPb7Js9t{`wIZBbf`(r7 z*2D;5O=`o2x&CN8-iX|yif&+(?eazWf9?TOA{7;&RJ?|E2V>y5Me<_Ud$2KSfeEla z)lf!Hh$SN{{|-iW({6(iR(a)ggWfv1`Kquw4{KnJWkA76glR>$I!`v?#C|}>x1(-K z3V&~~y0wU+nOS=uQco`O@<36j*R5S_%Yl1ZB+MsN1^!==-|ZOoquJ~RKnwbxtRyI$Qegsxa;--O z+0e}wYRj7y`g>NIGOf~+nsoU>oDoVZTU+<~wtC|p_p?i@?U0M)?XowdzotGp!4yfV z*J1H@9aRo30h=pXVXI$-LR}`#kVD0OSHNaJ9jS-d`~_)VaXNhW!RZbx5lm>URA>l| zxHy{RvRFpc!eyep82zGZtjWS!n-uUUZ}QMw#>aS0!u${~@~E}{g|B2kj~PRh zy*~b=q4Yu$pyYP=6JXGr76#g~Dbx8LaRmgaj3-ewQ(}4BRZw;ucuct-d>libywd*uqreVrTW);Fq8vsnYxlLsj}M=#^S2-N# zj#1&-`&*b2sGN}jsrlVx@Wh6pNk<7(CwG*~?{w9majqGoU5?&d3VNTT?Dp>sMP{E4 zA`T1~4&_4_VXBW?5gI6WV`xb>%VjZ%_OfG`G@m)Vl{}>IseHhywIi*VV?cXOjldgx z7?}vxzvTAa#Viq!A>SyFYSL8Psfa3bN;* zjeI%h)8n;bmyi(agEjnt9@JBK=qCsrLjB#UjUsU+g%T)*{^(I3j`&(dSCUYMUKcpe zt;WsmVaxjnH&+t7Fgo_LzFEX{-G?4%lqtgn>5EW#X#9I@;-9DbA&PRU#*#K2ph;D? zZs@kWl}r;Ry)rOrID-aj2}Xi48H#~eBrFX_u;A`J!HQHgjZLZU&EL)nUaME%4{fpW zfljqBuNq3HKLC~g;B5mvX1tKQ7O?EDyT44~R$heicrKnr1up4P?I;vU;pB)O+mj}~s%K?CyI^Tw%buR4Kk z%zd4bqvcSk`WSOH5#M6RL+M#PuKz6Tu=ByOhmn9C{fpV~)r8qeKnH48jhGa?#GZ9! z(&$o_Vui7p$Gh0bg*p*>4`?9VVFqI$;d6-x0yz*_tX3!T0#^bekKCa0`-8H{qgihh zcJ2Us$1vCA3$lM1bbzMT5Gb9o8mCfs9oS!HIxTR4dUY(N4P&q~Yrf76Du{`6x4PfV zTS+aQJ^c-;Lxhh)8BbF%hD`B0UK81#c6zzsO}GdXj=EywN9}q+!l1(`s$>BWc66ei z7_m!wyalhPK$w%A@e{X~`zjAeMjUL}vKz&v$p6U9D z!_;$7;J6K4><<_}T8UTAshg&ECsSGVfh|u)%;AGN@r35nCoDNKan$AiW%RlG`I!K@ zkM}rl+tyZfdf-ATC^D%r^Yo+7onmB6^JL_dzv3N6oWv!)DGwuIp)|oHZ>tjb`>p0U zv!fOknr}KEj9*cH(Q{SqCcWILHEGC9hQewKk7Pp@t<>VWmbY<_y-e`_I+lxrdwrmj zTWxnRxtZq$14pHR9^rP@{yaaX$2+tt-KSHafS3bHTSjVXYV+UOy|1n`Ys7f}2LCuz zeWxGzbV{Ele|*ZzJ(RhA3?w1D7p;v8-6231&Hd5(o$c3Q zzCnGG*3rVp*OQU;WuFr7iHhoDJr5(eyR`4IF`NOc6WMu>@}Xp?6+Ca~1&=7|D%L;; z+?@SIaC706;BmS65q*9%?|}uUm>|oC^mQd^(^7*vD^~|(Hk4+R#&Ev7xAz^%cJtlX z50luQG^t4$4(Tg?yT)g(_p@wcz6%v4tYOdvUmC;Q1j43%eMK#6yIJ+2K3RtnxBsGy zhlnSjR{MdbwpY)IFYq+2Kb5lC-!>r|k; z!Mw=9FOhjdD4yT|yqzF31hLT1xiN}>(A>}>^x6LU%okU zgvIFGd3gXUa5{jhYB!%y6w7}*Se}RO=L!I^Q{oHrTo$K)#TW54Q`C7#{fSvhhH;}y zL~3)u#bm9S=oL7WHq8U|qc(0NmM0A9$wl8d30=knBEGB)x?s*sn(Mp!1!qqpG4J?1 z;e#|^IRd6GyW8}4ez=NB|eme|9RSl|NXS%M(e9TgF13-h!C}c zbfvb)3~;XEOM!k5RSh(v-?1Un|L56hT4hy#en7<4b%8Xr5Mx) z2)DOtLW!ki9oSjQ!Oj;SRBi`$KAP;YWv`m8lncJTzCJtS&Xmly*pd`@WE0RB0udL+ zq|O6hu)Veer8qW~rQEkTe{+K|K($3_;JV3@F3AJtDAX8>7`OVb6B#L075xmiR z#2PR1Cu${%a%=mV6P5kH^<*>my)<$5ckpx8)XTXnFL#3=MKM7grUGFzw{M$7E7G1pIg<$gUTPpnt8JwQO^#`0L6oX zC~oME7$vS#8T|UjETwtzx-j5d;DG8PL2$Xa$nu$KE{ip8x;cGq+BQJIX9iAmczA;k zSb#-&O#NX8>LN`iG{~xZ92`eIX0~peWVZI$n!qOnb&WT;9=iaINqbL_5bs@#j*jjC z$POG+c;gnFeM2J=<<9Q@c^l}B4s|OaiMteV>{L)^ zcF0araE2Ug_3epkAC;lqEj0t=b%8B6&^S3jM%5>>iAePa6&ZWHF4=9@FU~H_dhdav zpZ60Q?BoBJi~7@^3R!6m6CuD~oa%J;UdA>8)$Yd4C!kg`Q|cS>7bMognNdwdw~+T3 z@yirlOvLu5n&_I@y(9l}dKtPIaeo!;rr5RrIttnj7b{cNSIG7!jdBvF3f~5^^ZX-F za{6!p?0{i1gehO$mN{GJ%)kQB?Na{sHuv4b7AC3>kdBNxI{b(%9;#_&2o($gbJ9Ei za_NCCMAd)e=YuxK)@%m70JJ%v8(UtYp*uRp~eWkd>)3S>=(d^&^w#^qH9^t(u0RnTjwm6N#RyIB)2V06M(Jr*@R`31Dx7Yg(}{a6TWHWDXlKTNUpuA4WV zvD!&OOWAIF41EfGSZhbxL-y)r_-jXc zVkv1K+QLYS<9(r$H>vHf19^^1l!3-zl$WrH8H`tlNy{-n^VU5;v2wU(KU55GvvCuW zg#|iSdEVdo-o5Cf%`{#*`XaqCz1lG~HA}dxyZgJNY+UsT$L_1zUangEunMnncwB9j zs-L5yfy214F(2RZ?9*?K(dD@biXx_6NFntXK%Wv5AMZ$)bnJ2*)A;z$cSB|~QY0VS z6~kq=>hkrUi_M+Q-yKiGPnFfg%>+kZi_vmGndKj_f$y-j3lJxHwHXzZOl>5jbOcKx zl}pBlr|LW7TGfYCl9>yOuiO`3{m3btkIMX0qwkP5|7E9@#o08aFff-%LVtRqu~EMx zcoQ-Aao1}d54NurqbYpCD zd&ipJ_~@&=P@_-G;9IKTF+Qcrt7WIoy3iD*t(M%nS?&K*;lUHJ6PeVs3x3z{RXmth zxlyAUJ^R#XXQFs9L>E%Ym|3{v(=ruBkSH3Qd&u%~-v_!Qra4J_q!jwxm5bqc)@tc z;uWDjV~EKTpQ%cW$$~1Mc_KeBj7xdi&D^!}h!2@)R4L6BciJi@C0bvbyYb?rdOGG^ zXJY-T`&QTR6F5h{z6xZYTf`8#q}A(0eYv$fw|H3Z)$40%gjRtWJ*zc{c%Ceez)=Xa zfr5r@buV}gafm&)F*D?54LCCjM$20xQQnbTD}k=95-xUg>nm)2yQCu$h}6nJnMoJb zEQOIyM9f`hZ6y`Kg{+xtmn*7?<3=hChYzI$L|9aQ(b4Quohpn94#`3BVRyQRevZSr zf3E*pDSf^~Uy-V5g;)z*u?|pYqK`_e33Jo*LB(*9#EDPZs}V&EosDPA(@ilQeHX^6 zk3Ps;In^7L=dYId#tM;cdEiPMVF?t*2$YB7mVZ3iG-)Yo)Oi|}dAkf@om$fLo&KmV z>WQ&_e5FgLsrv8iL2Qw#(z*hd-%eCyw*=d3!?9l4H~Xpbdt1&EPnkx_kfMu1CB$=) zo&lZN)K~odsD~70 zmn+0|+8j61{@-s7m8T)H-;aDw7D@wo==cjO6N1G#bbfz-=5-Q|?-PZBp1BwRpP16K7jZT*_B0zkZds!NLN5Ef*K?a2Y>z-6NSz6$Tqepz~uLy{aHv!tTED?D4QVg23)qvE=+; zj|NUzTOF)_cscp(wTzup!Sl0dDNdxcNU!lqEJNnGk^%Sr=I>mJfAEr*9KUN`zgY#f z-~j&x(0UUlf^Fd+#lWF7rNL7Wgl4-Ri?|us>zjF5YWh*G?y_nq>lkUVym;V5`(ZaZ z|MCkzyQSU8hc@rct#6iQmD%*q(G+?5kMUQoDvn^yu1xZ8^b`xQQjn<6+5k{bd>sC& zETt>iw|$Fu?M&5|heAnJDt?&R?#5%pjn>5L0FW^GGauc8b(6itKHvnS zZLL%n-OUF5U*AM_P5glyqb+-*%2%vk!%Sm~^JjTPs=urE{!LbW};()Tvvf_d4KUjg~j;LS9-+W{|XrBmInrkF?gHYaz7T-|xW6#EYmCY$9? zQ{;cgBw~yhu-xo{Mzc)OD_Kq3je2N>0brEIySrlEB1o7CYoX)G4y?E1c#99+oS8Rl zuzpb4IB(j*=X?QQ)fK@X@Sx>t7(vlr(3ZP=uVx7IXuHi&%5^Nbkoq{}puNnbQ}-L{ z#I_l_?00<2;IWK+SgHN%a~|4O4?p4mzy8|tJB7nW z6~qiqJ>cU)cNEgg9AZY5^)*!CqNn>Ncw+#bQqe9nvcMw6QA6_Fnm0(mg4;vMFXj*YqTC_PIq)lhH0a2Z&-lk~EuAl~ zGFn;YP?ZW-D$~0(_4FYaK6708CL@K?77M{^Of2%}T;8WROwG+FIXZ=oa;nopy4l_z z{xTLx_V*uCLq-&EKyi~zNE@R_Z&_lH%Yb6CfQwVfKR(3NRfOx2L2zDyMlIDRiag%0 zX}I_0YdyV=N7BN(=fj1>xkKf!pmC$aMDfzqpRw>?!{yG75MzFKqnNW$gTmj-5$mNO zZ{9yJpzB_aB(?rOti5$qRbAUYs-j@fDAGtP-5nw*-Q5CG8v&7S5v02tK~lOqq&D51 z0+O5V<~KJ!`n=!!{l*#NoN?A4>fY|P){J}3dB=5MH@niXQ;^vmY=7o#ga?L+kuy|l zvZ`%1p%;sosObhe{OvbAerW(tn-KxP>=}9r|9uu_-2THkU9rA4GxV20WeXbcL5?-I z?-Y;{prt96*bY&TIA|{nS5=N&%uTI8>F~*q=*t)VXkCe3$#}s$SnlTt@V1s2QOm+l zs#N7-FPM4P5r0#GX1xcBKU@@E+I8I&&)rfCn0od@TE_Yrf%rqL?*_;nUeW+()PztYDy2c!+QWh+p1(dHJ^XD*j?%@8BML<|F}ArCT+~_ zBFxfq&tXmJ%s$DW#BA+j)gmCqm!mt;%3Y`wjNGeO`Eh<$yNI}U;inB0@Ksz;Egi0a zvjd{eRoj2?sSyQ*_j~=jqs{K2hj6h_zEn4?D|_rN7TQ{g+xNCo@3j*lv?G}2Yt5a9 zPwt>!VLV8mp%2l7yK3{flN5aQGT%UosR?VsQke}5bSBMWfpSchBk=Q3mC>qvCUTQq z+ReOLj84G-IqpS6{@ddq%M#iJLZi&wL6_lDIQgE%Ex<>W`n)`+bJv=~ruR*m5P z8!VgIJOp*sNRRZv&@doFI=}-C`deR}(y`%nd6ktb72rTtE!5ZPl?LwlrJ|k2a%Ldm z2e69`bd1cLR6+=WfWT?QDxYvWcHaUVDVfU8pP+odP$n+ur+y_RHS#W!0C2Py22h$! z*et2V-a@=}0Loixpm_D*d{5?Q zbP*&V{?q%ujS$NkMP*3l8R83~ry?$D?Rx>4{x!0aX7hx%=DvTZ<@i;MnOwfoSkC_Z zJTA{~@pRakuMCPJKF9$8CVX(-+Csov`*q5If}f_i_WQ>fINCKalODk;!$7cK+4ID? z7b~>2=ET5R__AbO?mR-+=8HTZ^hJ6NLtJe1*X)3S#fR_66Lw1FWvkeqKF$&vD581L zp5P#_6lwGva3mSD@!k5wAF3rb$t8uPqL0Z;SGqjBQgoxeqK<#>Yx*Ywai_A2884Pz zv8`rmP2?BZy8n+vnT_vz4lp^x0Q?4luaq^iZ)|ncU(N5Px|B91*vYzu?r!ReMYs|x zanAOKoN22UuDk{2%ZPT#8GSBik_=%%=47Sd)x2D&65TEke+GDl9Qhr@)daYX3F2N7 zHFp&ibVGFL7^4d!j%DbcB+aS}g=uu9)`av&QrO~C&BSMJ^@^%IAF(8m(WW1QJWI~l ze;%PrciZEYT3#G(-}?uwY8xb>1}W1>U^&<7IK+&!S7ddpL#y8WryOxZRde*IwRL`+5ku>!wl z2{-;H#tjEQMY`|elN_cb8NO2$d=61N5>C2eS+1iBfzmHb! zsN|Hc+Q^MIF+&ganZj47gXSE>nFg*Xs9Z%tQN9l!f}EmN*PEV*BcZ^f4RH3e?D0Fd zN=E^KwQ)7&LqsWyty{Gh3dJGBk3?q3x?1&-as$mzze15eBu}G>b4O**+Ju?W73rt% zlr|{j?`d`2D~FQ5Tgf5nL-w&idPRR82gB{lOd3-#nSKVW{w`;(OHM)Gq9UdV5bMyo z(_iwp9?l-gO+f$Q);TJETHh=@6&bEh+<4UC0h`*hk%B1TT<*!gcZ+o$poubI95Z1s z;NS`YQ37eWFJVlNk8^IZm+WT|(3AgFFO)BPBK$gA>NnY_SBhp2PLNB;%05%Vf`2Ev z-BjJ%FT4f(PQe(gt1moGCTajO=WGUma%z@-{_tRba;yLOO!3b@-dN2K?(p<9Ta;1% zeLm^_w|u!*@nUxISk~2(Yi*%(phy>vpU+f|te~h~ta7>aDiQZv^n~r+F_D`z!5aYc zTz^0MZ$H=S3+JOd0K%KFZ3%btG{hESYYO~LGy=TkO!`29|K|$rbJ?=`55?hMrsP|U za6SK@>;KQM|G#7|nG68Z%u2}<=LHQmDN$Zi_K*`{623TQC#BG^RbkCdrDVlnDy&|2 zaYfF2x`GOVi4)IB%I`s%nbZYbG#SGDeq}<|+=WW%dfTCHBc|ahZkC zTOh1hZ&si3(e@6V&vKrEgLPK9E;F`?f41jQ!ls}0E2P;P8@^zQf`SW&UFteYJU8Mv zZg@R!a5~V#5B0Go!vny8+_^;lpI#R@8Ji276xIaLvEfC!-S}A8{t(heDSjN~G=EOM z_S!BucSAfT?M%s`2TnZuoD#Q2o7f4i;PB9#50dyAOxsu$cc?7a#i&J111`9#{nOe5 zE;bF;H_<9fW8L{uYm>)?tbGZz5`~pb>cBgrriq!{2LgJKDcpEjYIu-3YIhK;Hfejt zF-b%#n;6i<=x6{RkJlD#dG@!Hte+oEME8*XET$RlOOvzVLQqY9xLB}q>^fLi6FqE~!2FMX&* z(brxD&7Sx(Wv$qFw>S-z?nyt*_#~$5Hx%pq^P9?pQE4(Q3J@K;*(9s&@TJ+yR7gYW z!N|5Q8|;iIzf)m}JJW;P|BK%d{E$O*SPvgz+nnF6_F$%S+0M0Tc>0R$%b4kB9^SS09YV$sSQCcLk(%iz z+JKdLGh0~lH=o+D_9D>D9I3NloLhyt?euj*zsud|X{>(qdM8Y*5ls^jHIe#o1aH~n z%R|))d9EjsZzszQRnf(|thga%P%^UMgFzC!-}~r=wVB z**h1m>*L`^mzLBn60<@zY7VdqqNol99V@bRzKLjo!uFG+LUKI&PAvnPd8HoYh(pKi z(R1E2;Ic6m_UbmJS?kQ&D3f=VLN5Ey-hSm+?QD$|dk}N459?eUUKDEF)+jNr<$ap# zfB-FJ!AAYVC-tT&$yv5E{w{(_z4umLY=HV|*x2uWC}$bIF*LaT5ypff?od-%6uFb# z>JU4jOY`f{v|!jwnv0|YpRggoTPV!d)MS5+Vn5E6n77~sCqvTZG*z#P%Gu~(*>(!O z#EeW8?BV&tJdx40I#`PXa`(hoWPHSHi=D5NWrJB>|43XRHhkp(!vLA}cNP&d0;_Ih)FrSPY*dIpo}J}$Q9Oh!WH zp73=D{ZhSg2DNC9K6i4_QnVv~4R!*QlteNcMuH`yKPWv@V4KIfX!VTr=1Nu4&A5$` z7ufhL)kl|AN0Bpqs)1oMzA>DfetC+^j&=VV7Q`Qm(k7fvRJA8}xODE;*~p&nSG&&^ zDXe998F*sYsJhfxuT#e&nxe{QC76k|tETb|b8S=Ri(aJ`@-sNLglU#H)p3(a$62LC zsY{Y$aNLvC%o{LLO?w}|7wS2Kb!qeB7)MVDbK9opw#n11H}!6| zd7Q!3eRqsXgo93oKjyK{|84jPX!t;NX8&@|X$*I29+$F?glB7t^Ywdwo$)n) zd$(klwaHM6R?H|zty}8*K(VlMS%L2}y=tu}^&|Yox1cV%6-k^ZCLc5dBWm%1)EfKj zCg%LNnAZ7o#Z%3M&4nC6s>V*+J+sa}1Y0bQqk3{@Yuq0`5A6Kz7V%QU4oR^!U(q>` z@Ih)GNvuyFjaDY@v#<)bsvqKZva|S55~S~qP%T7~Jf3{)J@taNU5~xSjKV`?lU8Cf99wR@#VL&$7Adv%&C~L*{c8@`UZj5 z_*!-d=6X{40gosR|4PQj5X4aA?4c@$eK01*&6P*f&H5~LG>lTxZ}M#gl8I|OZHe}m zj9e=@5#Nt%PAM6K+aG7giqjl#ZdZsKDk@(zqC@!67v%H%n!L?|^3Olve~Ib?L6q|c zSy}Jr>SrXMIIU-A9ytG&Qc}{?vKC1M(p2o~c`y8KRi+1SfIP4J@$Z&kU<^#Yy}214 z7_S6+)Q35j<5=`AkU8`LN@({CFE9@M-v|A;dC-KzN}?rr$ik#)L90JQz45D*Ob+vD zA1&L7R!{Ul56(j|#6!m@>$ijwX0jl`BSw65Y{+S9sQ{FvEra#gR&sTlJ14+(eE`8anB~81YP)HZ!@+=vC7?K-50jw(adAty)Ofk*{AF>Z1KYhUq-@M-iU$n;qO6;cDNA;)O5K4Hr^DwfNcCuw$9$GjK#ap-i zNOIaTS*{EZxSJjLVNi@}9@K~7G$r^mq;f+{L!W$%14RYyc@x^k(OK!gU!%+=OP$>q?Cx~zd!f~~n09(n#$oR>wem@b;P0j z;r9mIB?!QvDKM{J1#lQ4H#dR&x}(X|W&boc58|sG@9MVCfQdyr4EShsYUn{IT zp4GVicOJ0deWVy=Hon(^4A0lx1qURlNf{#A9WPf_}&)oS~ ze{cr8jPq0irw{V0*QsX+}}ru;28#?R8Mu%-vJbcA(%t`GL01 zk2-s~Wd~|O9QE(pO`1>k!SO~GYUcnqdmY%MfAP=M~5IK-Gk4*k2;(=pAZfe zCc*Zf2iWD1UeS<-FiZF@u*AcMJxCtvS)}%7WJrJS9%UiJcp!lhYbUCr_8tw(a5cZp`)?KA;UFoDm;G6{+6?LHxfO0JX%yMy9L8cYZ zEgBNo|8(DI{`5zzNAJSh_xJjJ)ZEM7B|`2o=!u~FvYW!Cni8}Nj=f>~3}aWi;u!q( zANHM+qb=$pkZ0|(bJfy^ZAwf~wJ~lslV7}l_Oj4q_`?20!Q(B~f+5xY^*JF=&F4~F zIy|(1x4OD_>v{__LRt>B$y0GbO&&Jd+w&w5OJ>8VYnFdRDpk4(Z2Y8X*|9jEo5^qj zGMJM4*xL2XS-svdd(E~-#*{+Sy##GhF`^4!Wjl*)FpzHQ4kduGAvwhPY>My5jOvv7!8s9!%6XTf|_!K(9NgB$@+!3tbL==sO z2r-xGbG5e^_?}!XM!kndW(Fjnt*qOGOcOP(C=pp z269%!YrJA)SI=^1L_v<IpIfNO zMk9v{?T?)P;( zD%9!2(IJOWue{Cg*WS=D)pC{KgZKciTW4e@mFDc2tzQ%I7M`DC0(> z%5MJG04h?m1+RtOg=x}zaAK;yCr{_EdQY*#!%Y}P8H`@SqZ*YFa^Mq5!pLV5cRP$9 z-LW%%=>amSAI_V7vwP{*I`^uRZ`IYa^1b`gCnM57XRLmX_uf=##r;nkouP1DffQ)8 zcO(>)g}CqC4v@Ty5zg*+$L0QHA`%a@C#?5WZRS@mYm>abE?i-)>%MQeXhKtKglQsj z(iAo+Q{Z_F*Im^V$>|>rGJMj)A`P(S)sJjpm^4=(Mx7jXhlS1->rvh2au3M)Uqt-;;t1& z^OmEgzZpB(FQoc{LCDS-32CbN$f||rnxp*7NVb1grSp*f)y$X#USu97%I!Zx3m-fuUr1M z9RtGzE^U7=^_7oR3Glc6{f0EvCO;Fp{wVT)_2F-ue0)li5@uvWn;RQ%mA{|R%kat4 zZ{>)?kRa$I!LAvWe1eZt*&hIZryN=N`zodDKO8~(Vp7s| z<-n`9$oz`qStpjEPgyx5p(a0jA<$gQ#9IEvSoa46Las1{=4)es8O8{uU zYTb`D=@)j^Ngw%nC?qUA(^(+t0gh;o9xRMJs)FguC*$>(mMkM%>WQ3%cmYnPj9YmF z9hN$IhXi)oR)M}OvZ3#2I0x@O!IsoD4#?6m#TulQ z9AA}$ac$Ku<26@SATG|v;vA2vPML0XOf`7bBs<@S>ORGK1%Je_n(OuX+)ej4FXUPD z9I705Q7(&+=BiE+r(@6Tcu#Af-3juN##Atmk|rzh|-K%&KBewFz_p~HziJvIbQEl6H9#r&i1uacnf|J|NU=`n*U`Fp1S{e@^E=C z@4h5lzpC7>KbQ0|m?}2|IB_2Iz&BF&;Y;E)g(@>B)`s@`W&Mu4b5VE)kXMe6#M;ZKVL`05xow*|${^REcMUTtPyjpPilUJf2Q zIy#PKW&CiXztz!qJD8RQuCo}I{i;xORd{OnDfvPNy!2gY_viEB2BTpCLmb%(&V@>{ zok1;aKPU4B5g7@}CSsivvLNoO=X_G2#lvgACbW{~m(;E>4htgVl1-kmA(IR0Bk8Du ziFH06vOt(}HKg=0t_#OQ-1{7=aP3pwv-UJ8=(K0w@j_$F_0e|qj@Gz|QF$eNJ*TOrKahwc*Yg5;>EqRZ1r*%&o~@d#phgKhD1MRy zw$oRrC*C0R$7wPPmT+m(rNCido>*!$-?`JpmXSa!*~Iy9$?*_nMAkmA+)x1>Z}36@ z3u+^Pf4_g_3pw6T7V!8M?3x}6WD=4$W9vq7^x!~uo1^wN!<0S)79^A(^-A(GCo9ZVOx2)1Sk&$K6q$i#_)RCmd+ZCe}yk)0} zWhlFFO-uSzkjTz-)Z%XCVig_K3Kj%a2wE8>49+Cz%d6=P?i!N0ep3gV^G%+))FN;m zoGM!J66zu7Dq7dcyXaKvG7V*hKly82?jEv`YWNwsr5U=QO%T1Itb<}2> z?ohosy{B#hJ}uAhvZD2w?Xwa^^BvhoI*tjTGz(p0p_xm~pJpbrTB)1%u%M)gk-k{6 z{^=fADloB%)Gx--s!pt5Q84!Kf_4%~!2jq+Uz64)Y_n!t(B5S(9&BxlB*Mb8X=15u z$#pZVXD%zhpzIfe(w4hI6^RpRK zu374jq~c%Rs?P#-m|#jKkSrRX}{ zQF~`0KeZ{+*DuwcU%rM>m&bpsFLvp{t>UdB(97)V;w8{z-Mj}PQoBGLI6xg3=X$5?7&5Hz^bdTO^6 z3(VB+seQ4I!uHE`7rj-}rELY~zTGW3*1RzoT`jRe!}sMG^T07On{>zM2dq0uhhH5F zP*!d7=3Ro0C*NdS#n;IZLeYAx6W`4wq0mG3gbwNLeEh!Q5lr>=ChC7V)YP3_S`Vpy zm1p-Ma(~q9Shs>uh6g@DL^AuTmJ_DI2)odgq@l$;>-`>%0+$RyeY{I_9)mjNRWB=Q zT*ORLuda}enLy30r|m87s@rc4KN(a#e1@v%1`fp2@8ik zQU!dCBMbIXev5t*1o(j^*Ra>5RJYf19lpBV_xH_Hju~COQvT-BD`k*a443j}q!5dl zBfhr98=>7Lqu+GkooKblInE9rJ|C`-n9UrnSzLvNvMLx1x!dK~Wd=CdITpT~Fbqfb z2p@LZOmi&g$vU3Yi9Mcd&^BmuCs>5W*%E}dcLdp0A&t~bn<=Ymm}bI8(Ka23ZN1HT zDr%MEGN*zvzalWB;PIU%9;Co0tJ6^_&0Lt)fpnq7&G*xU$XoJ!qT&Ud2Qe-g8T~_6 zimqAe3uNagoTljSR_JA6gt5eXu;@|N{&Ox;fyYtdgI6MNjW4J#Rr>6r%wKSG2sBA< z2%!6#3$yMKi_-GHZ=$eDn=8`pD9vZ(5`fg$|Ok(7aL zHm6+QE2SW=(nYB?TcvfA<*XnnI@p6dGrKRV@Re9%DyMzV5cGWV!Wwc>2D!>C@-$m_ z&e^>*-sbuwmj4$0hVbv)k()=CDjPI)O4ht@Bt^dWcwbYgev zt!7n5cwsZ&c9NcL6DM~>XH-BWG`7jpx7D7^NxTP{6X!f?bz}8YyV~ak>vcyugxh6% zt|Z%3qq6qip_LQcWQO&wG7hSQ(5Y_AS`9*IVEZcG9eg}zJ4=j9DLFj}FyS zK5CZG&=}@MsL5a+HD7-gb(Z7%Fyk>jh{Qp$G+rK>h1HH-@OT;r-EH z9Fk%Wk?N8ezAx41M4hKk_MJimTBV*+?Ap?1ImDj$LdYx?^wQqBWk1faBu(|OXnT7g zOs=oPgqDh=|8Bv#OuJK3AeE^7Q_(y}j>}xy(dE6eZHlt(CuQ4@hU?F}f|(A{R+Z5D z^(7#&(=Iq|PrH#R*nB^n4YkJ{%E@<;_!jz|Us7*TWpj3`Tgqr7n7ISJNFw_n=1?N`NWX=L81StACAA%xO8*$YRX zX0gL6B3d>HtA%ALU5ovuR`T#D_kI!tXQ2Gh5X`?<&H_>v9W=3`y;FN`=1U zrC7l@h4lCPwJ36jA&~(nS>8}GCIRPQ$MG}b(?Q}WqO#<)8;L3?`n-4U&=RLidWi&U zaIYsj(Ba5FW%z#2n-NF03k8+rGlSkNy&T5FY_m9%#HtUsy@WmnJc7(U<;<&iM4HdbFuEdwcUK{DMe`{QkNN$)5B+|Dp6DKbwku^7pLW#iCjN zHw4>iOs2vn8#CW{=||7M)Xt4>JMWpxU-YWj8}Z0r=Vfio7<|*8+Wz2@Y;9NQ7|j9= zubZpwdh+h+wU(LF@UFHYRHH6>Eg(z|>VRMNCZfrKh3#=uSW3wEtKM=-dt!F9;7qv2 z0*>a=?UkXnSj51jQfak zWZR)gOtP|DSahmN9OHW3u%m3;by3oz+I!8^m_z$^S>C$YY9CNv@e^9uZt<2i+!JQW z$oTO+(bIm})n+!WG>}bk{hWlAH#Jy+XwPQz0g~28#WD614uzq{r&Kv7v4i}MCrT(T z3IrCt*TIUs=@ETZ>laV!`N=N5W0>MMnul2#g>;DnUCk4VXF&#al^X2O2k;m`k7apW zqHU&*A-@&0p`Mjd*W|NG$7F8FIw4gT%*V5taXm15@j1R?gKZ+^S8gcxVx8r$wgxNv zciz|pS*UD_#)DIImvR`5#Aa4f%453OG3%;#^hNb1|3>+u2^CPhhRmQt1V9G+SG~u? zh|hounVGBN-9J%XonF%Mbz}OzqvIRvk=Dka**-sY7`cqZ#nS4H;;xy}pYQQ5K+foJ z;&^Zrs+>rA@Nai1A4+&Pz7-yO7?Z%l_Gs^%i46@Bk~oz+=4<4dP2>}G_^gNINgR0? zQt_it)(`hhvOk)NkHhdD=zJjfHvH;&cg4Z4=n{!Z(KZjdnp&kxixIp+@lHjf$c>5$ zs?9UvjCiVt$VnMT3dRD%kh%TNPFy;7Aq+7$6=Ic!8Ne_s57?a4tcp0M}#)a~oPJUGDcbp1i@Y0zda>$mDnzGd#;3-PYo7k|Qj8bs2ky80y*^^zFZML*%NW{G_ z9(>40jmq@IJ6w?<7t*LNp~E~Tyvs}D>So$1(-SYtBibe{yU!owIiab&s%dkzxPF25 z)J59hj!_Oc*`^%gCwsjXTym@498YY*%9*#l>86%8{fiYGz33&yZ9HwZkC&I;wV_-t^Y(2kV4-?5-c{ zAEY{DdAr5KYM@Z9*+-~y+hrOf@omsyr#wfuHHSR4Bd;(!90wVPJckCR{Z7v24gGSS zSGIC{TclDsL3CW)Z}Zmu1vflPgaOj#&RmB-eZ8$9?Yhx00{uA*OgaQ$Jnq=XW!CkX$w)ITI{X1IsHgw+5kHN8!4a5L zXs#o(GhGRbIK0~zSW~7A|DXZ8`Opb#UA$JPi`p{Jh=@5z78HifB(5h9CGO_r@H(js zt=h$e6HlRUVm>7b=4neO2!;|a%KtW_H7f{%e*(*T(XxWS*Nm6{vp!+pHuSq&8H81; z!MZLfDakemY&c>%FrdOI^h&|clK(JTzrlbvC_Ay*{Rx1Oq6DjS3w zi_JGHv265BEMnrpJO`di{uuv>S}B?<_NGVjmzppfe}zHj|6(K$;wH<)zr$m7EUtE`Q~qf* z09sLLYF#(-lgnmo)iJNpN?cfxSfC!1vf{~`s@HKakN<7%{#SqCd$6-vKgP#-A$%Mh z4!C#nmtj{_0jy!;eyq>*$rwg4F@y4EG0Kn12;j8P*X-Q2pJt+8vNxaEwePf<+P$AN z^^upzF0x{Xo{*%1bLi^{xmbp~#W@IVLC9P$%GIafkPL@?s-dq_+P&4A_ILZtxWKgi zzKyqH$)0!1-n?sfx_WUpBBwskwu5!`Gym^+Kvvz!;m1+>$u;}YdGgR>aXg&)+Q!nhBODq@HL<9uup1QHP`@>h&W^BVV>Ta=ds44RWFbsl?L=OKy(Z zcGgC*G8D_n5M080SZnSubCw>pE!L3R@ICaVv%t~IUQIsq%)e>?C(IBs(iRn>fg|`5 zv#P04o*pSXB($p~6ctS{bH+d=q&(_Kxr;fS6eDeAb2x(*8;iSL#~p*VeK)pa@-Aa> zNb_J!EG?O@L7k{D%V>=Wl19BC_+qp-_i^)P;wy->1uJSMPEdoE(WRJp>{T}Ei~^*wF`hPaVrv~CsqwkH5JOnhr+h!284HJ1q1WCi@jQW$fy*u^ zZ0>Za=VEYQi**iWA2BS6{9_&i`OQ#!rUrE}ol!!B_*8<`8Bfllq(TltwuRanXy;U~a$m(@ij2jypKr&#FM>Eu+ijr=NKo)bq ztv?4VFu_*{l3ZdbOltWq?N@#a9mean2t}g!B$cix1{T%{izvBWk@1pKKYm($xxrld zebM7%HTNbP0n#tKvv*T*O{Ze*@pPRQJ6O+*B%h_;$C`jyt((lQ6O z=qe82}vd zhivzY>(rMOvsi3O>KGa3<2|f-TauzZ9nWc<^axt%E0Hm4Ww4+yC!(!6p1RwWK3hp` zzA_!%R}-`^>u6T9Q^6(ur~v8d<_A9GFIN30y8st9zKy5Vt_W{`>kC zcFGrK;$IoEt`W}@Br=QSn}>vrJH;70m%Nw?i1jpy9;YET(K3Et@n+gAHxo;UP)Bl% zCGyNvLgpn!Uqy%-$=&c1t1Wie6p0h`6V_$G!%=%_-brq-)QqqiT-idS6W+ws5L7uT zT+YG%9&_v!4w1zA;{M}R5n)JR`xVqZd(g8=e9DT4h=Pa1*V;L}ET{uHu1G+XFR>7l zIsKQzhdb3j9U|=o$g}->%_gP76sw6e`zoL-Doa*b=iC_D$rV$U$`fv};wuBDJVA^3 zBh$l9OdlqxQq08<7Y=a4+fuH&QdTJ-U3OQm83Y(l`0J!+zB^ytj5atHD7p-VU?dH0 zO0y=NBjW@~+(!9Q1l)aJtfpJiD?+W5o{AA@Y3+wNxVG8k#mi}yEOVl0qaCWjU@4>L zaUd!ZXf3-hJQ|!uZ}L4Oqd6=@K}Oo`?q!bnuLru~d@Z6TlO2OpI4@od)&xA*4_Q3r zVF1NkaZOd*Ieg_wS&_T@){w$eorBbm7roUNA>nt2N@q6O*H_sW3>wxA`lUU!v`qXT z8|rm9dxa<7G9FPZ^7QiX=}D7RU{q#)*L-o2K<$ERYMH25hgz&^oA%H?3F=soNu3+u zagBx`U0I(QMC|q0`%1yX>RY%c z_cZcxzLnFNW+eI5(ns7w<8@A>6y1RI6{h6!xX%OMH$dXlDEZvo!0s`!D9D&c_}Gfd zp;gvC_wIsCLgZ1hrZS1Ri3w5PzUs=MB0>jp7VCJIVhb#4EKju=K7uq^D<9eM*GF=b z9HWeFN>bu3*sIwrS2>@;Q7M+%ze?8ECeXI&AAo|kw~v=mbJ|oO`)q@}?5y znx4e{<{u`KJXp**8=0I$;i6L`N_+xT3`EH~BYi2euojOoOUF%}FERmA8ePHkWU7i% zW0$<6ZhU!9v@2@OUuSAn2n*A-84A@Mli?1T_Z<5=SAMJFqbgWFfdu3zv{ItFghWz% znD-E}&d7?&<)m@3Kpx`(? zX{U=@7Zv1Pmq5scr?O8HC+Mt55r6ITj63BE0kAMi^Al})-n+#gvf zlijQ8`gxI{xezVznz>IKI)Pn3wIW-59ar$r@oY)>c#EUVWySKj`AX5GCF`q6$1?Ac zc^gx@W?1_8&00IG?#hALZoyu_WwF`swEaprnU z?7I%O1e#iTm$i&Rmq}FiDL>j2Yy`MY)i_%GZ%mwrLT0BIS9C*RI=KsDmX744<;{@_y@J#T^gyO>sj1C znjHP!+pPZcFhpg$ywtn~zC}UC!o!CHF$c55$UmHrf-tP=f<0={xJY+|Lh$5vjN3Uy zYQ7a51-%J<48dDPTo(U|)O|Vp5MWR^`S(JDf7&&i6N0+s zDv7!PF<5|Tikr&@rn3n$>)A7J!^sX6du^|S1*{B{a7hnT2NROisBlb0=2`%E?m@Fv zO?Nk@yKJ~VzAgmiO5n98s=a<})$l+7@5WR3&==x|5u1}nl_CY-VJT^`R7Ctq$D!SS`RTyQo2 zuqb})omB!1E53@HG}X30JiPp|_{k)ToAWo^qLy6(y`tc(qCI2}cXuWhfPf$7N=uv& zB~Nt|i0?Rax$+_kh6)7W5HN%m^%#2kjF#|>2xRgss^l1L`}ag-<@NVAHdeZABY-YO zlJ__RqQPc3o7b8ly_#vHPgafU_Wr(Mr^f%yVW4b)r>U3WCzf$rM;eIjG#pC)9iA;C zw-RbdPenxqP_Z(r%fBCVJ{)Dz|84e=!Ps9C;Rs;RgoiE1Yl$(~KF<*X*pF9_CMJd) zkDe4j-K3)GUIOksdtO%zxYWdUvY|lwSVMrhDm?6LI?_#nfl(H9$gh)~;eMDqOV5S^ zhqMU~ljP1B0o+R{2Y~dPXu=^D!oPy0yI9}u!~ZEPtQ9QvJ0GDe^TkrUu z9r6#JUAPQx`~JNK;!OMQ@c$1q+J6CbOuxItV;KDBJs2eD_Zj~OY;LpEg3d$sIUGX% z?{x=IQ=Zv&vKr4#Kl%6D)Wfe*H?lbc8`ZFA1@zXR0HPfQ_>3IkMO;6Caw-eq$rt3z zu>op8j{do-HO@1?R0w9=WVg+Lu1sgInQ(NeoI| zwmebMbQidoM>C}V+f_N!LK%cq%9GjSdT*(C_Ia=_6CdmzE%-AmfQ*M`KzbYuk{qVt z0{{Dxvs(+eb3oV2`j!r1ogV-xAgBN*-VBF*BQ;!ZTI>!4yGF2~{%NC6mVtVVNh31C zx-=-TXQG9R$lk$e50WStIXH}7!GERh-nVu$V^^?*l?`kIyq(vc)#28TniAo{+Hej- z07m+fNcK;1NoaxmA|Fm%SKJFS;BH7FI^gsMK8F_op}ZHTf>5yu)4ji&7kQkRi2o6V zDs@>u8Bv)34B-4BZFq1n-y*zD4nV|wZ0@$Z8UF7=wy5DgWN|TqYI{!PL6Y>|2}Dth z?0gSsECiX69YcK#yK4c0H=p6Q0ORL-CFYbway7*jWuL}LAoXMQO3or!ax4rU_T0$J z_~?0wL^cY`-S)E}OMrfJ!~d_NkC+V(2IXI$bM;mKSvn-$3{n@~X5f_o=*rKZ9%yYK zC0ZYh1?}kee#06_OcMH=m_(}Hx21TUuoa+_msBU9mjTf=5JyE0*sV&)dXVH|ix2Sb z79{bP_mUizO|Zl_4UcDzg`a((o!#-W`+i)4Ao*O*C|n(JznSa3I&PEX+?|Y9hF-&W zaqbyDeS^*@cvP(5zUKg;Z*y8^N{Ihl=c_K(<1W{&r`z&Auc@9Q>2(*T4JXXyY6`w3 zxZVy5)Ow%sNq?k4oh>dyr#dNrrWwfgb$i{SHynWvD7HXu7HP3+LmzzUSb#quI%op5 zPqK#tIrrMfzExBZpKp{T$CBkb6hD$pNu)jZH zVe!sV;KDqUz*_IZ+%lLDJ21j#3?mfjyI}lyN`OdGhIa5Ui-WJhF+)&y&V_|9W;>XS z(4XW*Nn4cog5a=P?(u1F$IVt?W?WYG1TJRlE0U6?pK4E@mT_qsBTO7G-`#MDL=g&F ze*AEL9UXbv36#+X-1hqFTfBz znLTOKMMk-lc|YUGm*jfJ#1fpvVz5FP8e~xnLHq~8eR?lCAcf;P5l6YJcQlctzwqIC zlJu>Tj5SgdP!~2CiS#=PK+rmq3w+F>aKRIW@1LZp(qUSP7Dt29MOqITfx{-(*3X3j zM>WOeSLi45mpoHC+IO0iFl|a`MB@j(7i*inQkk$I|9nte_Xhi8wW91Mo*9<L;ZFG~p1+tiy;|Br> z`E@5_g2igqs>pFjWN8KF)4lW~|ETaC#rnI|P93gKDNFR&b%dEcrD7i-$7O$1>kf>o zjGIKvw`7rLVY=%r!iXb9mW=f5`xb|vaYN!xSnEewDcG*zeO-H6Ujr9LYHfO7p7if- zM1iBSA6j1b9)_?6lROZ*=N@`bBpmCujrk0gmpZP9X9hL9e`u-lQAE$I$LuUWn=)5u zH5*=_0!MewRy&zYE5ts>tXn>3 zWz2HT(ZjL1z|H`|>C_DA&mqh1G-%X zN~Gb$qpuBUT#4byY&XM{#nRs8>|T2U#TZCO%0!R)`VQ~1BrN7_Stc*uBRw%HdRh`3 ze7cCe^62n|sUk6x=tevl+PJ&N)HhD7JqoPXa3@ymbF9YpT;H71Y|R(uqPnh*$ju~T zBEF=XwCQTiuIGjCDf-ivL${*u{xS@;f78!!9%cV}FoxB4Ge2Fx^pqDbKjo*7e*)|a zWGWQ1NKi7O+<$=5vXq&A_(`3jDrNuEyPe_-*x}N_8e`-G!Hlz3o_=->xM%$=*5Q5@ zYR6tE^5;EQ765pbTYerHwke)K)H2!G^s z7VVSr0zCe7{=`9h_K&E-`am0pjo9zDUN?1iJ|uDq=y@!c*`X(W89^UOv5>P}4N_xY zn?1%IbRHOIZQ>@=s>gz7v6ekf8;#snx{tC_FQm|ZAhUeTGm*U8uuO_kRef~^i#2)q zD|5e>2aN#~MCew$1gK$tILY9CL1{2>?O8`$d8Z*Mm-8_9OJzgHGKi#}x~?T~qEy`{?n1u(N=Xvv8gIT=aW zj74;WW)!jq2bq`2yN?aZ=WdD|E01A(Q||~=NkbV!Twf*%JecxoZLw1t=gEyty5JLt z>V!I6UmnLZrAo_@kPYVxQuI_U@sO6Usw12-PIw*S58Bh+@ptyd=A%)ZsJKj|5o$F; z{*9P+27pSW1(52-V>_9Br6F;~1n0x{hvyR3)zwi(`1o)qlV>TL=fbJ1Q{!!QLkRhW_y1?6Lk)bcRX^Dft{K}zd?lF85bk081!xMr^;Y>-yA;$|tW z(<|)Pusp1VeXiSGj5lwBAJt#ZGY0u48*3X)F%;dx zy24DJm7$|H_n$(q->F#a;C8S}|0wPFzJjF%ob0De=p4%3d)ONqC)*xM1mQp}uJ=8oJP&Slgb~ zIC2i7-QznQ4$x94vf(MeV$HsGIt86{5(lX4yGX%DhWEA!c^73ciGP~g!pyC{4p_-i zk-htQSI@rV0rHMCNnq_1d)7sl)fSLCqmhb9sgg+AZf<^7!kf-tgU}^cTN0AT)wVO| zPHh!1E)&$lY$T@s)vg=4>yGfY&jn7R&(bF2nAu41?Hn?MetOo&zOLULxZ67$7!PwH zksHdcw%OU1C5~RF7$PG1N*yVjm9b`r6abfNU4tvT5m`6CbR3kvQ!dIzFv6Q#8K2*<9fi$@{ph|In6Tz?v}!X z+lYa~jACyytesRRfzjQT>2s=}M8D>E6et#1nQK_Q$g@_r-9CnUkPN$Vdz-muh}ipG zsMSfd>Gr37lW&i?wtUK%(JlGBwYpy@p^Qzo>oVh6WIH)9Xx8?)1d8b?q>OmexOLcf zPTu`f58Ic@%1?t&>`Tryi{FeN$xV%apqT~RV5yx`yqgm_1RWU&6F~~IrSr!d0Homj zJb#QN8o|zgzMk!p--A?d!a4vJVn%ZhqA9MZDX3?l5Aza2f}s z_20t?=%saKyEe7osKGVimOoR$e?G4Q#`SJ|WN~nK>5J{hE?bv89wt(68BfuVb(LDY znefF~;Ad5RMp28|0f@cP0-ftv*jX?JDJ7e9JE~Bj%Yw;dv=5d~!HFFw7OI_UyUZzN zi06oyCqC-4lw?b#e$Gzfn?J$X4HvuSNBls?6RqQ@QlPH$h5vAXYYPTT*<iMlA>O z^Euja;5!Y?yIYFZwqPh(Q>L{@KES;${2?N$^s5Jxu{xjb7~itWBk_bO#xp{{v;wh^ zZ~MwL?0z2#-^2GzAotCKf)v!^UB3<1$*rl*S=r>><@torYTd5t{{ynXo|>mRpepb$ zp&*sDP}bUFq1}d8Q`}Mh5<)viCSHHLOrQ#uziJK*thxk*FJv--+s1t(H*phQ2z<{- zvql+!p5g}(0(_&v94QND@y!FHXWU~SaixT@DaT<|aaQPuZ^!KDT6=6lvMvZ#|r zv9)A)So`p!jZ(WE4rSsnJG(@N+ScW)Dd9uyU1frkB%-#}=>>GyO=PhdU()_!;h9SH zXQ?Y1?^of?W`qseTkb$zBd*iQ4+4hSd3Zi#M+jmdF}0&=G+ZGGq^us+^f=E^K>C3q zQAx~oO!7}X{ONpjY?sU( zERFajfB*U~Kt9f1%LW1?4w2giPClS|s0#i%^Tc(lwEk`T)yX&zsNt&=53gu%q5N@$ zPs#5P(oqA2X~;2*A8%bFqm4fBF<>p6i^=|u(+ zk!5?{&#Of%e^ck|!PGPA@T8|OpC9jq!O-DvM<3mn@CZRLZ&!jWh~y|8XPr)Wz5#H6 zvH?d0PM_<;j1)$lVVyY3FXZ;%_KI11oLv^ zNAe~LIAstx_vKD1&3;J>)o;+<3c@2*vE?2UGRL9%7dG_xb9pFaKd4CFlY6somFn|1U40fpM^(i^Swc`1Ge$;Ql3rma9ezi@ z$;Sd4XYo|OIL=2o{GL>w2Y&jfZx4rU;t(6-Yz91(l3&=r!-Dus_)aDl_phYEHLZW; z;kkgXaU<)~-Y?Em+EW~I^ejS?lQ%V)YDnkdWQXxT>T?5c=3IvuRt+RJWZ3&Befa-Z;O4NS8IES zg??q5*fk{lxM07%;$CRTi+3RRAQXfOD#96+b?;4o`9heX=@myz-uXQ*296SAPnOP$ zFG~{+QE( zSR}>Q6GfxLz-~vs0x3+k`efK9iD1~eSiV``w<{nOrMqVQ_Rx_N8wBbh$_#{VtB;@k(ibw z%MRhQ*B1qp<3_G;iMWzF^Wq(tv2A1G&Wn;!A2?nb%g-gFRf(BHL-9h*E7%*feDnNt zc#FAAX->ZkAh|btlAEhT#b!hu?k9!-c^>uXbS_@47_wS3C9ZI%%A%9|k2I5R=WCxA zRhCEVwwchz{f_ME|$Y7G~@?A{#T2^oK+4HUOkh0o~2b<3h>b) zm84MG=&<9}6qFe5iw&7^gz{(d=$iS_7TW=#|)fzJG6nzbnK9)Y>up`>hn_wG^gZ~P8o zF0q`vm%|OSF@w0|eUFpsE~uhr?~7<;U@4e6#6W`PxeV`7Cn@!J!-ga+Yh7jU*f|?; z)s8!8z(FIsQh#zj4+^MqY})_D%&4@GNq{QrV+6<`^jdmk_{GZLkeDWxG}ci<(kdv_ zur&Ictf0S7`PkX`lGlbWk@GKi3kz*%9G86;r;g749qrnM3SLa%7)X8K$E}l?duUP|G57WTjWS@~8sbfAHtc-V_Y! zLx4pBl5zx{eu9|Fsd2DafYZjrbbwLjx@s)SO?X-Rdo5*dr~ywbihD7lEIz3YB~T9U zclEy~kUR7x64NAo0SQ|F{6h9LxeKq8Hkm<271o$U;|QEII$>NNbh54tBnlo)Cl{LC z=R%)Hxz|G#tIeURFepu8w<^*;xo>mT(!6`lYH&Vw1$Mo-qvv0M=>ZQ_Ef%lcLP<|< zf}gxxp%IutUpBSc#=cyY=C7BXC^ojhc7o{*zbH~xV(_yIHa}W)2%F3O`w8!tzUi~* zmn79^RJD}W-{p-)lBot0Yhw||=)#Zoz%Nl=~qmt^LmdkL4Uu(}8pzhbq zq$h53#&oo01$Mlo$U)`ud$O9}LvdAxikdCGCZxu)-c>bm7X~BSxE5uqz)SQlDh0Wt z-5*Vs15&c28xXt?j~@8dq$!I_)?Bw-{=T4ia!%29nC9Dq-9%_cQ~Fbi zECIk*OI5Sar|bDbsK^Qbmq0w_){@1wn{2Q}hy1gdDS^wc@D*#P{|=SVU2aMcZ{U}r zz#BGt+xYCT>%;GyNxyXL0b`3NNfWg1%{)EsQCD<|i9PaS7c)Gd31a^^6QdwaYI<|n zl@6heFUyDwW@aTKt11sQ8!*C1(de$^Z$KwZ6F1D|{jPti?ZfPdIkQh$Vy%M416!R5 zHs14Ok&`HYuVL9Edo~v}(O5Fd`<+l9oS;n}r z*v%Oim?Jee9bhEU>p)eCFf@2+R$7me-c2 zr@uil_-~i`8TuO@O{l_LSOr96KJS=R3ZFZyM3+n1*@*#M*^pqf1-&TzqS3ncEK4`B zl-H2kcLsn6m^i}rXdp?hnSUea)TAp&jO#F@fNXM)iwjF9lVNF|dbG`gXw6wUPaI=e zBzAqcglhcr+h5JrVqsOX*uY<>%FAb7bRew!vsi0b+XsjiQBjQL&nCs0DKNysMAp2B zGVW$=1fpmqqdE@dxCU9J_9=n^PqeKqMR^Wsa9}?ya=N}>T;4|f%ur97REPqV|2 zhCdvmPFSfTNY@wFL5q{7D_QkNsC){g@%JW(nYu7b{ks{q- zXH)PhFbFs7xM*)B4&8#2v5+lI5$rC1x6}Gqj)|7)JjInnJJiPb=Nh-PipN%AQ@`W` zPQ=6!5Loj9)&3r3qUW8)f%p&_v53*e-~kdg+qrnmfO@K+;;256g1S?7P6vufCL**C zU$3`+wNn$J7hVk{*6`SbN_M_HzZ;ubf%PermZ`+{_=nY?PTdbcTe0f~w>*t;#!!{z z&L;$Gf#v>~%DF@$!Yyud80W*-MVr;_l|jPz{^1Rr6@5rXEta#+Q5a7Tog{d0FRGg% zrXQ#H#;)g`B3n?mSU_g_9S;vtllUV=Z=GD7$t zzp@KM+2+5w!&Ui&YV_0NaAwNNzn?Lf1k%?x2;~;gn8cREnd$i`i6`)7@grNQZbUNx zSl)SS`Ez?A%0fmNs0hDHxtcPDl-D{}p-1GV5T?GP%%nlHsDAHzncGwBPa;gLH#A`$ z&mHBSbCCL!m&ruwH};e$i*IVkQwOg9)a4+=q9$rC%ju(ZU^u5fHG1ucRfR)ADnL?u z^0X4VW=Y_>J#7qb(7!)T`c`81BUnoYIJroEOzP^O}BSOu859&Nct+DSF$^X zBxj=-etNG>-^`D*G3g+9sRNV@@2cTVSp7{pFOPMZcy8P&4%P@Uk0{vr!ybx8o>k>l z;fNdB_sv32d}soKpYj=2z8F0B(mB?~E2VE42ETjq!G;~wVhAC8B2GFND{2{}Csf<_ z*0x~e6w=mAKF$|WeUY*KBT5HKBG_xS=tGh{S4xt>ifluSs1j?r;(u)#Ke`)l4#!^9Z#=6}tN!gE$;w zrPnk)BTS@}rxDsjj}Jd6MA~F7K?H?)!~!ap>XVh&N@b<>numkIg~G$zCnUEF{-t6t z%19?-1^}Npl?$Eo5^aDeU>{QB<{Z*yR%ywvfBydC{G>23+b~^TIBQ{J`!5Rxo!J*a z*B|f-J)Azu$&U5yBYgPEVECi^hvq-agkUX9x*oQ+{ql>gby~qP57X$Zr*^UH7aM72 z*$lJ;y(@#GBfU&A7N?i%dIjd{@`?)uWbvhR!BtLc1!ulyJcitE;kIywbazRS8quQQ zT#nk2qteN91;4JxGHh=}N#C?@sjknG3*pw{?LolK=D7DotzCQ^ThU!5weM|8FBTfT z-22YI|IbGG*;LRFfL8dShpltL|M=5Aki^|Fady9ddH63$c#Nk*-iY+@J{{6ogfY$M5e z!h8I(;chDjMfzEw2TJ@qa{uTL+&(1yagA2bt}v{la-CmEw>V$j%-g)R(?szh|PQeVho- zFS@*VzaO$H$pX`lxP60XV`wHLu~HwF~*`T+SpZ$Oz$=_%IuJLASDWNEpqrm zmL&+Sb&-Fy1Z=fwp+=ZoE;(Lk=bxAJvVsb#jkx`5xK#XnB=fp77_S@( z+$bU?FW%6Ytn=jF{PxOOuHKv<7%0~L6ahT$EU>_2H2IRAMrR7Y2gtnIw3oXMa~gXonjU6LWnjPF0~J**rZI5I|#lO*x@`yPyTcSuQFr8(Tim%nOAj z5KAfUanfzWQRy0*0J&d=#-x?buN7^{($aMT!5byH|KDIkL4KZdjRph03V0aPUa1WZY=nB!E7d7B>9NQDq;aCwbZ?Th=rf19Pc zOll)zlwG=!eyv8Ucg8MzfZb8Rp6|`YG#G2k8h&8_Mw&0XlTc!sHbpYcTSrHgn|Mno zS&2y#O7r~JsBHJNm*oC^ffFQAQ3Lnp>)PH<$x9DTO(vH|ne}Y1x@=Ph@DGRrZ3(iQ z(!Cnfwzr(Sx%Hpll+KN!p18*TVfAh!i2tQ2p&Ic{Cj4X5 z2ln_-s!`qbi%g$lq5piKP0slQqebkV<-N*1z;C-fK-@3>|7db`3RKZwAbj&`aec}V zOK8Wlwm%Op2Ny4~kjdj$nt2bna3<*)J4BhT2-a0jjEyWixXVrG{ZqzHJtiM|yy_yX zPU%ZdM0MGY@MQv(TBX!5fsp)5ujFHn`8Uxu$80vob3C{?g&CMnKhB<`BLRp?K`e%+ zMEB{;S`Fq;+MP53TiytrZU_d*@}#U6(rNvnm6n0QB;GuTY*OSCRnX_*81vdtqUgdF zY4Y`7_@u)vK1qGOlc=-W{ah?idIfX4dbo}5Yx25vWb=nmSDm`qfBQvZUDvrf!?zCm zzDw%m9*NijS4ZQ=hEzpEfP$I_D5z|bn9W-bEOj$TV=UMF^EGGlOW5(YcW83a*Ry7p zMLu$y4X4Ii#+1jS=i5M{$p7cdedH!`8?X-PoOeWkrEvqW4gNEpas32DB~v2d9j^RT znrmNRE!+WiRGmxgNZ(u%=MizJZKFqG{>j?b1?V+KU+lXT3X~jrd`doe8krGkVgh8g zKedj_HNt&d0XMmu&x$x|@1CDYbYDqQ;TwYX293!QvnvF4&p26+&y@b+H#x(mcBE+* z)eASU6ya49QihQTgJ9I8loT$?QZRga{sQ#KNeG=xX@DGSV@}E9gL3$T3C=sFqE=)h zMW$=)rm~&Sa9%OM%#hV%k_8HWAzshKbw%fx6bi8b& zyH|nI+M`0S5jxA7K#l=TE;F#h*Jo8it}A~=UY$~=DJ+dj-H@OBIBZ`sWAhA8uLpD0 zFB?106f*j(O+diqRYc(CJTV7+s||U_aSQ-L&wRlB8}pQUuFSy`_{qwjB-ZiV+Q+_T zwuFSU{4U{5hO`8n)L;`!*fEFX{&@1a4!EsRq#JjtG{Z{Vsn+ZobK?i`WqzH)@Go%$ zRvvFx_K<;XUo%AdA{sj)xBXuG<)2_N1P?dLVxi!t^1VgS^cH_z%)JF-xfKyWkSqdg ze|DI)O*JgqOsZS&qis$BnrSCG#N4p&HD-k9c|7!EQy*Z>7p2g|5Thb-1bhr+=5#mk z88!ljk;Gf4z;ZF|CElzQhZXJQRCKRltWG_B|KOd`BhK@uc}nZ~qu<%3C3gk_pLBcD zjj|Eljk2MC{}bhDi5^PrHUr+nx1HA6>(d20&ad)1Ec4SeG|@V3X}bQG>Z!8@%E8DL zGm?>oH1FQuySd(LJC>m!q8{^=5KMc+PWTo0u?J7JUmrtRUG5n!wgZeqBeY#^&^S#K zO8f*7XKB=0z&`$22w)Z7$aV2R9A9A>i%t93Inqmgxga}&Q&m#!(LW#M3)A?WCPbTh zix{38;to6QWvPHklUjS)OFK54!deRSGae|hG)utQ5(#f9rg5GfrJ>Uon=5PH+-sad zODh9z49tk$%O~AEnj?F???xPS(kp&R*yLZ!2OMDDAN>y2n`MVxtj*j0y0(SaZztt} zuV7d0ltD3DQ; zpcrY)kAecQD#ann#d86l?6DZGBwXpI!{!9AQ zuzML9THTq4U1xabu8{YI?|Bw$SKpVUl=~T-U)JRv@TE>1)nP&-v&H3kex5Ag+l8a%r#gNddZ`-@=IrO7W?1*b zh`};6&C&r-%ikjDHkk`K%WLG9KhbX8v&3!+ayVSrMoyoPRMN*TQ5u6p3aL*rmbkD2`6-OSlo#*(GcY?;mDb*UU3h#zuq z68sHiL=)aXz5g~yTsInJGsU*4Fqd}gYDFsa43yBg_-#YEQHv+$8Q!iCB2)>yv)nhG zi&yiDNXu>|<-z;ze#IKqFDHHH<`(kMpoAs&qpv$p?Tk+eRc~okW3E3%Q@T zByN|5D1nr0svw?!%|9t5GwrWjX~U(Rqli##BxP5{4tl8@e)>PMAKsa`h_0&HtNvTr zGid<--VfNx*+Qhd+_uSR8D|6LN!k@d1U&A~2sQs@XBt5lF*fRB zB_i%rqx&dX&e&II9{!n+JFIe}f`FH8o?4TUpva7auW*vh%7fv3G+-hlJ1Pu z$EOUdsaA!uyzlTi&d+;73#$bI0r<$gEM%K#4YB^VO-H+&K)Ux0*?J`9ID5_ zyVGsnB~ig>Pi<)6e#e0S@%IZWn zqR@@MW2eB!mOV&&PQJ?oy_fP=u=qY2>1Q$r>!p7a|8)X`Z6QyWei%WPBa=R@hG{3Z zwe$Djw_$g?{*~Rk>oZcQ?HaP(**~doCl%UJyD9#TES^(sC$;=%E3u<)!yi$)x9%>A>3)BenD@hXfbU{-;(p7fOM zioVX~9rc34Ur{=QSfiM5*v;h<+kRj&>-2M}mg8`Ki~3blW}EiC=D))>gY#%-cKr!s z-K9k!kY@X#HaK5D5fTw~fE4MR9xF;B)G3{qW*LFtkVG=+!$+ z@t%W&p9{|)36kv=v(GWG^%Hfh&Sm|rkCj`MnVax1|K`9NIF~cO>5e(2TbdLy>wheA z=6n23_*(pHMKjsd+mykFxTWR*W=ERZCM^m_ei^+>QlW|pauphqt*mb3?^k+XxOySE znSh&G*uxY}7m6)%q*PK;vJQpk)JfF;Ii3%jRjD0r;Ku*rQP0qVB`FI}Dh4E}b;(O- z5~A``${s=Ow4ZjJx!n>zX&8HCxfh5%K6FXIA(lj(`~y+%q~7YMR=#`ONr>T!DW{uw zhfDUt_LHi}U!=`Mr!(s6lTZo~yI^Q#(ujDi6Srz~sMOJ?_XLp-zG5pM9!`8JZ3u_x z?gT>D-jI^Un>|(xCRIUbu36tV<&JdmX;*f7?v}4~W;v zCQbE~q###%TH0%VlH0rslzVr#!7(uHZoZXdswXIva28Wo0lKp-V$}IKDKU*}eKz3oMOGKd| z#R1ONU4r_DV@!CD`cR^YQOAN9L6vfe%}@7`rB5*Q*vRF-K3aBZM=ck);zi9q|_rq6O z|LZChA;y6MC!S0$(HG8PK-wrtx`Wh>`CRM-52o-fAJeyx3GHkjhb#)zV#>Wqzc=SopKVKZr1bFWYx_)p3ojFfi*{{X0DW0t}< z;v!p;e-6WCN<;IQ+vQA1s$jh(6;)9H;tOwfIxw0!Osg_;p`<53G>j=k_Dj>fWWyVk zzn(WoUy6}XmH8@LYzq`{%KboMC@350L6H`Jjp2+Q&t73lA2AoYmbdaToyUJ+guOd& z;(lS^;C+)#&=8xe#UI_J@TQxtMbAP1jESHF$8Mc|!k6-djE4!r>!|G0<=1g;yg%72 z$t5t>`)7?(I01|Z&L^~QaLWf3GK!Q<73vVb;h$9R^7rX29m%w}C>n|M zr!G^UD$c6F>Z08Rxi%P{k=3gb$}KjI^4n`jmvC=mmit)|yjYl9=AKd#p03#0l@tl` z@7Q@iHkNp-C52N{L6SAxr#8B()a3;KY3>_z3W>h@yM|kbj)#SAA=lY4e^Exr8F%e$ z?Ny(kPx2yR??(gNpO5A0)3h1TRSBnk=s*<#6M3j~yNtaXO^uvH%RFZBx$nD@N#cow zm*htWGXzggBkPEp7`0XVJxPwAX<&pI`PTv`CyRMYpenTiZ3doFP4`C_9Y5L$8hG8n zk3RFQBgZx7xtGUjbe`$)g*sjOu<%GJqYPAH))u=j;hQ6;R^47ynN5X79(aKY)MshN z-xK{OYk_Ap_k2h6E^v*BK+MGJ+_{pbz^$=jBK+sU-JqgvPO`Vu>75T4>+xT~OBx8s z<)C1hpt=Rkl%)v#5$_1c&)|62O?Bd!l{v|PZ@CHENue8B1!L#!kD$yy@o`P=6X219 z$!$sAz(^@SA!+d$RjEOb^Ah|+j&&gQCv;i8U|qJh6BYe{xr19VC&+$w_fqTJt)BwE z&N84Xw|V_jFOc^eF2^$X*a%{qsDGO-uqD+qLIgld(K4PdZy6RRDI`NTb95j9Th)8>Sq5E0qvZa`T?=Rm?&@2Jpg6x}YgRRLAZeP{=7nccG6B%8l-UPw@ z9KB6mwzl{LAe$XXvn9hV_MG>hLW#i(ze&AgNtIqHo7?-U7|~fPS7iE2I(XtfQ;yn4 zf`m}1$I-u!kM6wsjv}Tw04glA@9xp0hG_L2GQ@~VK*6g>OZE_-{xKu&TLe{{4TcPjCvHugza$9CUqXXrPLaJ=suXSNwThxvr4on(9SLZ7vR z#a6p!^il|nF6ifD~ER^XPm75^__b8Wb~Tg7{OF^yCGS?j8E_SBy0<1!)PO7}xR<7`P zt>+ASs>_5IBaHcT(xuS=~I3-wdJ(i1Bh z%FiCWZlj2*WN!ti;fT8>XtifcsT&3TD(j|Jgoo#pWkCb?_2C0P>yM~OGfGQc zB>>HEqrzPYC2z%SY@jIA)Ul%OF78=S@}8t*t&?v8Gk)mXk#rXHZIiB5_wpRI7AJwV zhG*qAz$wkOq+F;r-ZkbU-e}i!koiZ9Y_*uQ6t&^{loIb`3Ety4UGyXI9>{B~(IPYr z`tmjVjePk7j3cL3(LWOYHO{?E;yfq6Uw+ingw`beKqG+X!=yKOCn}yumeh|*=zpvx zVw#z>z!&puoPr~supmDam0jAt=rA}z?%WMyUSSvBQzxbiWIVn@pIc2=EONX`E|JI{ zBt6LXO61@r;y-~$Q#1po6v9~YbG2A{8M<Rhk z@z2SS(JFTq@Yt(?qbULxNk9?v{{Bc(dGOvw2}|hbsW}KyVGP;ptZo%{obRs+g`MHZ zieJcB`U{UxQcdJVq+mLp>awx?np~`av?W_@iAN$Ji2~OjjU#65@G>(PJ?7+SPVVz^ zn+NBQJ3Ck9P_1mPDgpO3#Cq_A+GfGLMKoh1&hoA7q!V{-d}OocczG_(5VU4@wTmPT zra6(5XEDJ%ZUBvR{MzpsXr;z73~yS4bTcvkLOdl@Pi(jv+4IovXqhE;X07 z`p=f;TPhmwPxMIafV8Tl6t%5HkpS7gtIw9AuhVsD#SuQX@pS&2v=H70$QFw`^_2?s zno~oZ{P3wdR76hG`c2WJ|64XE%Z9(;Sh*(P2_z zH1rszZLX?2&h9WpWJv~T7fh+d$j8l4KMf3=n)ga-O33DcKGFE7$g+~!Fu`kdr~|w{ z@|@DEku%n-M1=jwPTS@f#iY`?Bjw?z&XvsCoUh@mjOv9=)h20KD(bJddLJd3q#v4< zI%jaESzYGdreqSUo-=D7rLG>Nu6s=mh%LC6E?2d24Y=q^fYz-Er53vezJM@RRpq}V z-K&^%n3GBuj`W~$mhCk2$&aupro1W9!_#DH>EtagI2HI&d?MknHZgDV|3!8EMJ+>k z+KBM9WWl{~iqo0Vkx|t>YeBteVzW6{=fB|A%0A7@<9R)oJ81PUQFD_d)414F4dNod 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 VNF-03L%+amRzY39NY*g$KLEZ;E$;vT literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/2-3 - ASH mode.png b/doc/Rapport post-doc/figures/2-3 - ASH mode.png new file mode 100644 index 0000000000000000000000000000000000000000..cf9b35d7df9fd50b59b396906c0c1c6d9628449b GIT binary patch literal 19923 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 a_^?lO^yPNs1^8$Po|d|vTCvKV;C};N8JRl( literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/2-5 ACM automaton.png b/doc/Rapport post-doc/figures/2-5 ACM automaton.png new file mode 100644 index 0000000000000000000000000000000000000000..fd62c3b08be9b782d1319430595f9fd956986df9 GIT binary patch literal 22340 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 VtdKUh8+efMLhy2oeEiR`{{vDvFE0Q9 literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/ERTS - AOCS mode.png b/doc/Rapport post-doc/figures/ERTS - AOCS mode.png new file mode 100644 index 0000000000000000000000000000000000000000..a5cf7821ba78b25badea7941dcc78c25798361c0 GIT binary patch literal 94752 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 S_n7XG!Tjtz`Tif1^#221@u1%T literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/EUTELSAT-172B-SATELLITE.jpg b/doc/Rapport post-doc/figures/EUTELSAT-172B-SATELLITE.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e364300632ee960e99b73185e70ff2ec887ee574 GIT binary patch literal 278946 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
(;j#%H2(@+X)rJJKfBU<~j9mH2mLI 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 z zdwxHdr%iRUY+=0@f+yM}T#d^0mtXPh4`3lUC?auzWZ?A5jr?n$a`y*Cj%bp|7IR5~5^8Wxis0G88n`YHx z)kwmx=hLU*_)|VsSoWZ7ed5RE{{Vph0H5nc!<4tdkcKfdg?Je}dV~IZ`r@4!k|2WJ z#Cd<1hQS2-f1FiUolA{}V(lB4AH02W{(o9SF<_yi*q`0bMty%z^NKDmR$7e7G)5+k z5(v%_8v*l^(C5_tv|LDJj7%a(L$1;C5C|UrxbOWc8QEJ7@-sUwaC66QzMOwgS`ts) z$+er!3;~gF>5s!BuEN`_0hn#tFy9W_@ZO3_wBEH0IWaZHI>_?|RT5Cvr<0FvS#_0MS zV~(A%{&84VryBI!CI0{o=kheCDN~m+G_?x}bp1-=%I*nmZ(}Tz!cgWWT!sW^BalG{ zkU>*|4kC@M);SzTsGoCU@Coh+&nicM<==NuzOwOZ>2~)wcDiP>8%Jg@r`}x+-*4rw+u2kBmV%`SmEnRSEW^Z@%(((^`UiX zrD?(YulliX$c3YMC59G}#?=xgdmcgcAK_IlbUR4mb@`B^aUz_vWC8(Po&fGCvC2MW z0}4k7S0MG{r@vAE0N1Cyiz2{*^Eb+3$8@hoxz>da9=;P&(bgWlGQqUhT-1FKJX&TS+XDPj;4b&=%> zH-F1B^Ji~8FYlSQxHx++fv> zLdH!t@$KaUa$tr~Ky@Q3;~*R|kU_^FiiSMKQc|kmH{D~`9N>>i;x!pcuF4oI5Ex;A zJw`#n{6PGxTR`ze&xdVwh%N1`E*Dg@Hd3|ilvfQJ7gsG2bv|5~Km)EA0&qraBA%8I zrHfz_kOl{}6g#wxS=h54rH)M$h9zIN)goP5*7EO9w!MNQADL!DMHI?_4Xx#sVYm)T zkVz!xHLc?de+$QB;kkS{cX>6`+G@71Z*>+0z2K46mN))1WK?m$#{InGHJ9Pv59&TE z)~xi6CemB&M)FmL3wT#^$mHMvKDBh?DzZ?fuG_Nn6s;88jOu)|NjnCS+C~bh3mlvP z03SdAABA<_6}}MoyWo$DW$@39bZN9LYB-W(Z7~NixXQ3)BoKX%P)AT}j-@Ed50*<% zO*M3EY91n&Q_%E%I(RHn4K-$tCbhJV8;Liz{nJXRx?B^5-bqjh8%1N$MM+J!xKTwN zy8aXhD5)+j=Cinx3F3Gsjfy;SDOOe;K?k9&i;GVVN208d>Uxy=vs=dh0B1G`kR--e z5=Lb6i7F!zvanp1Vx?DZ;_NG!b$-Uq#^X)Yr@7RA%Xb1HwYBmY{?x_5W!yMTs#&sn z;~naS6owR4{RdWE6IFus>@4*)i*{{q(ViE|k@E#$PBW3uP%4E!g6b8mroNdrhpAiL zq;~hqvf|eBY>w_%D%SW7uqy}Oyn;c90DfaxG^%#6BnANVJq^4a%f$ zT;x^puY+|@hyEtJ&~=zT̝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 Swn|}AlecbaDHkbP1^o|0PYCb; literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/Function2_1.pdf b/doc/Rapport post-doc/figures/Function2_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..12d13bf719aa6f3b0d15df2ddd009a1e044148e8 GIT binary patch literal 5648 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 Zzl0?s2}vOBWfu;Wg91cEG|y@Q{s#zAP!<3H literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/Function2_1.png b/doc/Rapport post-doc/figures/Function2_1.png new file mode 100644 index 0000000000000000000000000000000000000000..bc9e97539b2860496ba1e3378a23fbd097a111e5 GIT binary patch literal 4875 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 literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/Function2_1.svg b/doc/Rapport post-doc/figures/Function2_1.svg new file mode 100644 index 0000000..d11ed01 --- /dev/null +++ b/doc/Rapport post-doc/figures/Function2_1.svg @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + I1 + I2 + O + + + diff --git a/doc/Rapport post-doc/figures/Function2_1.tex b/doc/Rapport post-doc/figures/Function2_1.tex new file mode 100644 index 0000000..f61c39a --- /dev/null +++ b/doc/Rapport post-doc/figures/Function2_1.tex @@ -0,0 +1,306 @@ +%LaTeX with PSTricks extensions +%%Creator: inkscape 0.91 +%%Please note this file requires PSTricks extensions +\psset{xunit=.5pt,yunit=.5pt,runit=.5pt} +\begin{pspicture}(277.28570352,147.28573176) +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linewidth=2.24441051,linecolor=curcolor] +{ +\newpath +\moveto(78.66506154,118.62066234) +\lineto(204.33494527,118.62066234) +\lineto(204.33494527,29.37935985) +\lineto(78.66506154,29.37935985) +\closepath +} +} +{ +\newrgbcolor{curcolor}{0 0.627451 0.16862746} +\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor] +{ +\newpath +\moveto(155.05655629,73.51595653) +\curveto(155.05655629,66.61239716)(149.46011566,61.01595653)(142.55655629,61.01595653) +\curveto(135.65299692,61.01595653)(130.05655629,66.61239716)(130.05655629,73.51595653) +\curveto(130.05655629,80.4195159)(135.65299692,86.01595653)(142.55655629,86.01595653) +\curveto(149.46011566,86.01595653)(155.05655629,80.4195159)(155.05655629,73.51595653) +\closepath +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linewidth=1.29999995,linecolor=curcolor] +{ +\newpath +\moveto(16.64285,99.07143176) +\lineto(64.93478,99.07143176) +\lineto(75.92857,99.07143176) +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor] +{ +\newpath +\moveto(62.03098996,104.83967288) +\lineto(77.65499392,99.09433072) +\lineto(62.0309891,93.34898981) +\curveto(64.52705172,96.74103678)(64.51266935,101.38194574)(62.03098996,104.83967288) +\closepath +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linewidth=0.89374997,linecolor=curcolor] +{ +\newpath +\moveto(62.03098996,104.83967288) +\lineto(77.65499392,99.09433072) +\lineto(62.0309891,93.34898981) +\curveto(64.52705172,96.74103678)(64.51266935,101.38194574)(62.03098996,104.83967288) +\closepath +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linewidth=3,linecolor=curcolor] +{ +\newpath +\moveto(13.8023,99.20921176) +\lineto(73.8023,99.20921176) +\lineto(73.8023,99.20921176) +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linewidth=1.29999995,linecolor=curcolor] +{ +\newpath +\moveto(16.64285,49.07142876) +\lineto(64.93478,49.07142876) +\lineto(75.92857,49.07142876) +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor] +{ +\newpath +\moveto(62.03098996,54.83966988) +\lineto(77.65499392,49.09432772) +\lineto(62.0309891,43.34898681) +\curveto(64.52705172,46.74103378)(64.51266935,51.38194274)(62.03098996,54.83966988) +\closepath +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linewidth=0.89374997,linecolor=curcolor] +{ +\newpath +\moveto(62.03098996,54.83966988) +\lineto(77.65499392,49.09432772) +\lineto(62.0309891,43.34898681) +\curveto(64.52705172,46.74103378)(64.51266935,51.38194274)(62.03098996,54.83966988) +\closepath +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linewidth=3,linecolor=curcolor] +{ +\newpath +\moveto(13.8023,49.20920876) +\lineto(73.8023,49.20920876) +\lineto(73.8023,49.20920876) +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linewidth=1.29999995,linecolor=curcolor] +{ +\newpath +\moveto(207.35714,74.07142876) +\lineto(255.64907,74.07142876) +\lineto(266.64286,74.07142876) +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor] +{ +\newpath +\moveto(252.74527996,79.83966988) +\lineto(268.36928392,74.09432772) +\lineto(252.7452791,68.34898681) +\curveto(255.24134172,71.74103378)(255.22695935,76.38194274)(252.74527996,79.83966988) +\closepath +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linewidth=0.89374997,linecolor=curcolor] +{ +\newpath +\moveto(252.74527996,79.83966988) +\lineto(268.36928392,74.09432772) +\lineto(252.7452791,68.34898681) +\curveto(255.24134172,71.74103378)(255.22695935,76.38194274)(252.74527996,79.83966988) +\closepath +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linewidth=3,linecolor=curcolor] +{ +\newpath +\moveto(204.51659,74.20920876) +\lineto(264.51659,74.20920876) +\lineto(264.51659,74.20920876) +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor] +{ +\newpath +\moveto(20.05469472,109.49108471) +\lineto(23.41406972,108.96374096) +\lineto(23.41406972,107.92858471) +\lineto(12.94531972,107.92858471) +\lineto(12.94531972,108.96374096) +\lineto(16.30469472,109.49108471) +\lineto(16.30469472,132.57702221) +\lineto(12.94531972,133.08483471) +\lineto(12.94531972,134.11999096) +\lineto(23.41406972,134.11999096) +\lineto(23.41406972,133.08483471) +\lineto(20.05469472,132.57702221) +\lineto(20.05469472,109.49108471) +\closepath +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor] +{ +\newpath +\moveto(37.10547597,109.49108471) +\lineto(42.45703847,108.96374096) +\lineto(42.45703847,107.92858471) +\lineto(28.37500722,107.92858471) +\lineto(28.37500722,108.96374096) +\lineto(33.74610097,109.49108471) +\lineto(33.74610097,130.85827221) +\lineto(28.45313222,128.96374096) +\lineto(28.45313222,129.99889721) +\lineto(36.08985097,134.33483471) +\lineto(37.10547597,134.33483471) +\lineto(37.10547597,109.49108471) +\closepath +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor] +{ +\newpath +\moveto(19.95703847,10.20537914) +\lineto(23.31641347,9.67803539) +\lineto(23.31641347,8.64287914) +\lineto(12.84766347,8.64287914) +\lineto(12.84766347,9.67803539) +\lineto(16.20703847,10.20537914) +\lineto(16.20703847,33.29131664) +\lineto(12.84766347,33.79912914) +\lineto(12.84766347,34.83428539) +\lineto(23.31641347,34.83428539) +\lineto(23.31641347,33.79912914) +\lineto(19.95703847,33.29131664) +\lineto(19.95703847,10.20537914) +\closepath +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor] +{ +\newpath +\moveto(42.55469472,8.64287914) +\lineto(26.51953847,8.64287914) +\lineto(26.51953847,11.51397289) +\curveto(27.83464263,12.73793122)(29.03906972,13.83168122)(30.13281972,14.79522289) +\curveto(31.23959055,15.77178539)(32.22917388,16.67673331)(33.10156972,17.51006664) +\curveto(33.98698638,18.35642081)(34.75521555,19.16371247)(35.40625722,19.93194164) +\curveto(36.07031972,20.70017081)(36.61719472,21.50095206)(37.04688222,22.33428539) +\curveto(37.48959055,23.16761872)(37.81511138,24.06605622)(38.02344472,25.02959789) +\curveto(38.24479888,25.99313956)(38.35547597,27.08037914)(38.35547597,28.29131664) +\curveto(38.35547597,29.98402497)(37.97136138,31.27308747)(37.20313222,32.15850414) +\curveto(36.43490305,33.04392081)(35.17839263,33.48662914)(33.43360097,33.48662914) +\curveto(33.04297597,33.48662914)(32.65235097,33.45407706)(32.26172597,33.38897289) +\curveto(31.8841218,33.33688956)(31.51953847,33.25876456)(31.16797597,33.15459789) +\curveto(30.81641347,33.06345206)(30.48438222,32.95277497)(30.17188222,32.82256664) +\curveto(29.87240305,32.70537914)(29.60547597,32.58168122)(29.37110097,32.45147289) +\lineto(28.68750722,29.24834789) +\lineto(27.39844472,29.24834789) +\lineto(27.39844472,34.28741039) +\curveto(28.38802805,34.52178539)(29.35808013,34.71709789)(30.30860097,34.87334789) +\curveto(31.27214263,35.04261872)(32.3138093,35.12725414)(33.43360097,35.12725414) +\curveto(36.2981843,35.12725414)(38.4466218,34.52829581)(39.87891347,33.33037914) +\curveto(41.32422597,32.14548331)(42.04688222,30.46579581)(42.04688222,28.29131664) +\curveto(42.04688222,27.22360831)(41.90365305,26.23402497)(41.61719472,25.32256664) +\curveto(41.34375722,24.41110831)(40.9466218,23.53220206)(40.42578847,22.68584789) +\curveto(39.90495513,21.85251456)(39.2669343,21.02569164)(38.51172597,20.20537914) +\curveto(37.75651763,19.39808747)(36.89714263,18.55824372)(35.93360097,17.68584789) +\curveto(34.9700593,16.81345206)(33.90886138,15.88246247)(32.75000722,14.89287914) +\curveto(31.60417388,13.91631664)(30.38021555,12.83558747)(29.07813222,11.65069164) +\lineto(42.55469472,11.65069164) +\lineto(42.55469472,8.64287914) +\closepath +} +} +{ +\newrgbcolor{curcolor}{0 0 0} +\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor] +{ +\newpath +\moveto(232.22266347,96.76787914) +\curveto(232.22266347,94.94496247)(232.35938222,93.29782706)(232.63281972,91.82647289) +\curveto(232.90625722,90.35511872)(233.37500722,89.09860831)(234.03906972,88.05694164) +\curveto(234.70313222,87.01527497)(235.5950593,86.20798331)(236.71485097,85.63506664) +\curveto(237.83464263,85.07517081)(239.24089263,84.79522289)(240.93360097,84.79522289) +\curveto(242.6263093,84.79522289)(244.0325593,85.07517081)(245.15235097,85.63506664) +\curveto(246.27214263,86.20798331)(247.16406972,87.01527497)(247.82813222,88.05694164) +\curveto(248.50521555,89.09860831)(248.98047597,90.35511872)(249.25391347,91.82647289) +\curveto(249.52735097,93.29782706)(249.66406972,94.94496247)(249.66406972,96.76787914) +\curveto(249.66406972,98.57777497)(249.52735097,100.21188956)(249.25391347,101.67022289) +\curveto(248.98047597,103.12855622)(248.50521555,104.36553539)(247.82813222,105.38116039) +\curveto(247.16406972,106.40980622)(246.27214263,107.19756664)(245.15235097,107.74444164) +\curveto(244.0325593,108.29131664)(242.6263093,108.56475414)(240.93360097,108.56475414) +\curveto(239.24089263,108.56475414)(237.83464263,108.29131664)(236.71485097,107.74444164) +\curveto(235.5950593,107.19756664)(234.70313222,106.40980622)(234.03906972,105.38116039) +\curveto(233.37500722,104.36553539)(232.90625722,103.12855622)(232.63281972,101.67022289) +\curveto(232.35938222,100.21188956)(232.22266347,98.57777497)(232.22266347,96.76787914) +\closepath +\moveto(228.14063222,96.76787914) +\curveto(228.14063222,99.08558747)(228.42058013,101.08428539)(228.98047597,102.76397289) +\curveto(229.55339263,104.44366039)(230.38021555,105.83037914)(231.46094472,106.92412914) +\curveto(232.54167388,108.01787914)(233.8763093,108.82517081)(235.46485097,109.34600414) +\curveto(237.05339263,109.86683747)(238.8763093,110.12725414)(240.93360097,110.12725414) +\curveto(242.92578847,110.12725414)(244.70964263,109.86683747)(246.28516347,109.34600414) +\curveto(247.87370513,108.82517081)(249.22136138,108.01787914)(250.32813222,106.92412914) +\curveto(251.43490305,105.83037914)(252.28125722,104.44366039)(252.86719472,102.76397289) +\curveto(253.45313222,101.08428539)(253.74610097,99.08558747)(253.74610097,96.76787914) +\curveto(253.74610097,94.45017081)(253.45313222,92.43845206)(252.86719472,90.73272289) +\curveto(252.28125722,89.04001456)(251.43490305,87.64027497)(250.32813222,86.53350414) +\curveto(249.22136138,85.42673331)(247.87370513,84.59991039)(246.28516347,84.05303539) +\curveto(244.70964263,83.51918122)(242.92578847,83.25225414)(240.93360097,83.25225414) +\curveto(238.94141347,83.25225414)(237.1575593,83.51918122)(235.58203847,84.05303539) +\curveto(234.00651763,84.59991039)(232.6653718,85.42673331)(231.55860097,86.53350414) +\curveto(230.45183013,87.64027497)(229.60547597,89.04001456)(229.01953847,90.73272289) +\curveto(228.43360097,92.43845206)(228.14063222,94.45017081)(228.14063222,96.76787914) +\closepath +} +} +\end{pspicture} diff --git a/doc/Rapport post-doc/figures/Function2_2.pdf b/doc/Rapport post-doc/figures/Function2_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..38888d339e304fb955642691980b70c360280b18 GIT binary patch literal 8084 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 KM8@%duKq8 + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + nominal + lost + erroneous + + + diff --git a/doc/Rapport post-doc/figures/Gnc mode simplifie.png b/doc/Rapport post-doc/figures/Gnc mode simplifie.png new file mode 100644 index 0000000000000000000000000000000000000000..e936bfd8046149e7f1ea1283301748fa711576bc GIT binary patch literal 42279 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 WYPd4k^dJj**)>^Zne59(nEwO4^u(0_ literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/Modele0.png b/doc/Rapport post-doc/figures/Modele0.png new file mode 100644 index 0000000000000000000000000000000000000000..a6f09f5c781660a142b94649b43dc631e7464fe5 GIT binary patch literal 3179 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 literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/Modele0F4.png b/doc/Rapport post-doc/figures/Modele0F4.png new file mode 100644 index 0000000000000000000000000000000000000000..3940f2a7540e5310ffa0b23e52295212baf2fca7 GIT binary patch literal 4875 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 DzL3>( literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/Modele2.png b/doc/Rapport post-doc/figures/Modele2.png new file mode 100644 index 0000000000000000000000000000000000000000..480e2193e4faaf145d3bc415566dbd36337f318e GIT binary patch literal 7628 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 Lf48YR>7VjHcTJb{ literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/passerelle.png b/doc/Rapport post-doc/figures/passerelle.png new file mode 100644 index 0000000000000000000000000000000000000000..36088d94fec9215bb7c6709373b4a008f05d1761 GIT binary patch literal 94903 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 O^RB$w?Oa)-=l=&@4JDoc literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/satellite_telecom.png b/doc/Rapport post-doc/figures/satellite_telecom.png new file mode 100644 index 0000000000000000000000000000000000000000..87cc13d56676010aceae2b0eecc604cf9585f6d9 GIT binary patch literal 1008761 zcmeFZWl&t**XErB0wj0{?sS0Q?j9@z3ju;Q?(QzZ8ix>qTW|>O4uQtKk*0AA65Oqk z>EzD+f2L-hshSV(w|AeJ;IcGEA`>gBjmkD zkDer;p&*Xe4s8xX8bF+Af!b9)H1kyWKW3uCq-W@Luwes!fhi z>ZPk~%R%!lfjdjdL38s?`Mv9YiM7P9{kt)DJCK6XCLJF&b;zObmB?0liU60h+2&>@ zoYPr}yi${yAhO4(>fe`AD**4_zi`S?(bnkD>1|vsmJ$#$V)!TU-pc!V}O5uDeQ+L#?-1BR%twK^{c&+`0wY7?-1kt zQIUYutyG(3k&y4thY_EzqeMJ}?*m5Q81<5T_?p?@KU;7CMm!lFEgM*sRh^6e!apa+ z08jZLo=^#0B&N{Evc!YPw12MAFnJCe@hGQFsto(SPfz$da{c|hD*XRl{Qn#I|F6Tw zbq1qF^qP%RAt4+7#QZ-I+x0hMIWCc#*&P0pCv1Q6#B~O=-=$( z`!_(7Ti*QNA20P@sB9Tf<8O8|1IPTE11;!(a$qqYL~i$juP2<3F+s=u8E`hChedZr z($NOS@o!cr8vIV_Qt#f%7M8g(8!#4)JrZN-&hYmMQ*IfRQebSA>3^Lz_3=NawOYfcy3lB{{hE;chgm6({-WIQE`>AT))9#e-1yWM1zeM)a_qc%Nk6eYr}qILF$w&=mjlH= zXr2WGsPy78L;ni*A!%DoeXm==Od+6m7 z9ChiwPsd}|zGA(?zBOV-?*U!Ub3^%RGE1+E^5IITs_t>z!5GcmZbfSppFSLY$?H!2 zc0YRN_(I2iWwGG_bh+$HO6hl`>~nJ*dUX@2e0M@xR(z_g~MwT<#HjxTjn4I#qAIJ(0hfuE^|k z9uo;M&-8tvEb2;NK9<=9#-{9v1E5wu{9xT%sKeB0uyDk;fJ&M ztNn^h@DN*DSi`ap=3&PvU+ZOT2l4s+ZG7y}$c#SGjN5(Rp~F4g{y2VRr{}cMRkAjk zBlqCB-BPoO4fVJE=(Hrv$peD&XUsMGQn}%NIMg|J1Kd0cJP;P%>|_U1X?#+*ztQe& z|4(ApbyWhKm3Ve7^hx+$x}Wc;>oz)cvhQ0YW*EYXiMYB-hjVhTc9R^}2c>-;Ml`Nw zybp=EV15s4==|;%+*td|(Icc#D*swo zY9b{X4v71Q_rjDiK73AuV(kmP%C>b9e(}N>hmbM^*7&x&TjpyxEE%m^I^0&R5e5QC zkkR)_XWRO4e_1yk7v;cWu*LhFIe`TfEX;PlRKVDtM3O{311HBxayah2R!HN<5^y#% zvc2crTW&*&%@hqF%=9Mlzh0LIU0KXfL@a{~?u>=s&shcrebML740?$88IW6UPC z67Rpr$?hvJ@JvFpSunsrb;XH1l!JV|7+n#DLo zp~bq<^X_>$u>BLd*xjeY-`RA#hv##3FLX6;?cbT@cWHgQd0lvX1)z7d7*n#DZ^XKm zCotNa3MUdUdF17~AEiY81tLmKAXlXl__j8haK4*JswbG5YMj*XJ`<(gkK*XqF*K=x zNw`gSW%U;ZpSx^hv%rs@X^K(Si(Y6?LX0hVr04O$=!Ju;h4IRP2`aXu?n_jUCc(~` zNqmX+Of>W}X_L2~s%Ue-fl)W^W7`(GlTi$Km9N|>c+0fHgS_2V7E)BN79%^lN$u~6 z4_o0VqPN>XpYwBi{)b7v9H4*Khz>V=)M#$8Q9?eJEwa8o+3f=;+l+U!G@I!E6jixe zt|t9)67wbpEzfQ#7@MP+jCV&6Z7;rKp*ZkKp-yh&qy3GWn{P)Q83z@yEYt>mFREc_QAn7 z)Qo~sINFsguQ(%cJf)uE1B3(7YQy`FsJernl5{^`lWJR|d4og9fCH~;SPzO??=E6j zd3YVf?r(q9Bn0>|IbGx*+(_|ml9%@hgIv}2*9ig7Q(|%R7y? zV%BHa?w|O>;Y?R+L$MC4Ywo?nLSC7R=cGx}E&4BXacz}1i=?NXYCFdWt8#sXirWt+ z1T*sP{apz+mxBM4fL0?ILaxNj;V~?1DUD{Fj&`dz(~*s5r3QwsD~@lVz(%< z8G;e}q%&0RZoIwtL@p_o`xuiE!zIB*@1;Vn0NolqTf(@ThapGelu{^g;?Jwnh7vSO z^FvRU+U?MuUl3doAxHQIQQ=q6AR~KqjxCe7`yKQ`N!p+4`0Kmp3TqL5m;73UKAptA zV;ZcpLrnhSQ{$0Aw`?#G95;Cvp zMf;tHErVTtw3+EfxJ9SY<@iba^_pty!v*QpT}2kSI2X0b>em|#%5l=;IBJI~>wp5x zogBG4_;`Vqq(_S&5gp-(3}7p-fzBdxW5>6 zMO%OK5X?F`b#wgG&;n@nOGEfmQxQ|)Rj0jRZ^Mq|Zh*9V5en&%tX>ob+gRyT}L zDK)&2J@`rGz3>2%P$4x+~+I#~Y%Um*Q&yo`7dSy^(I47`UMir%-&R13~ zLw{aCh=lxJyX`G}O7eS<_qm>?Z}i#^+zudp;uZ7Fr=5yLo`AYO*%i6xzX|~bfj>23 zskSu?!l_^hg^(JF!S}ds@3H-VKmgc=J!`t)uTC})G&{GE)ve7>?EcEHWKeRA=QUk+ zVOS!9h2KhG1>wfe`POpZL{%#7uf>t!MHEp{B6~Ld7@Ea8z+zdQC?HPP=HYO#nI*E- z=6SOVjfTvXhl|_HbIUMsZX&a2$8pH^>L77j>rpB`RZLxED+(N zRBQKvl7$p1T_STnUSNp?#ZY z`vXREeuHGiF!$N7R683}A(Mhv+0IrpA3o%)u1;%z)j@T`ipC+^37}{bH2QUN?Qv2p zdvr{HxO%d2nuBVG#th0ZEy(Sy)5CxW{vJLY#PCH0MOtqUnS#muDNRZ*Td z>U$Jc_*=y&87BpzwQd32$9f>St^Ea*(X!NUuJNejtrEW6{@*CHd7GEnhx&;Cs>3~1 zw0nE0IgXQF7E^hwsc0nfsqc31LC;=i(CP)xzdfZpAI~uaa<_HFNYtQQX7?buq8Ejl zo$rP_1i*Ohsdi?M{A#Uy#P+0s13ymPs<_IT1bE3Zdd}VC?PCuDS#vPAZw9*a+~mFy z8cE&I2=YFHI6g*;Jd-e*cR1V63eO+fTt9ZkUI)i6b@s@Meb_~Rmtt7RweyNI+NgUr z;=h@rr{(Fdy%4?G1_;CVYBZ~8DBHZx#XrY}8ji=|&am>5J;Rj%X~}Z^ zn(GSzhzN`(t3Y|mY;nO67@`flBT*^V+_`01L4p>#4Ok?L8mNjp(;OI_&kKodSEL@d_TywH%yliVF<B?BSMc$@@?wUC13vK8XeV>HZFf65nb#(V7qsR1e91 z8}XduV)9E4gqG)78|Q~{AujyI$$4Tk;0F_S8l={hEh}t7?Spsn3Od}uZO04zLpAGU zsgtMc%sQz}(B|Vii@72S624+{W>4FtH{;a-Rmk-ruzHL0N7}V^VTn()>8!^K;;LK{ zFBojO1ZDFYWVir|NVPUgKayuKgJ6+WiAOGTm{Nbbs9f+eQrRi^4Zg9Ljy zwe1U`z056nuQ^!&pHqoK&VFhla*RYi*s>QWqfH~|8r4?>@#XM^5-Fq$V@#UIbVekg zJDf~CZatZkzdGc5=$tMQTO}x8gO=?!y4DzMu8-)1$N=R)8QX$L|5@%qO-TPVYfxcu zj2RSSBN(V4#A(<6TG0Pqc**w?D16+Fr`chMR9&dpQyJh3sn9V$+e;4|o~nPV93yLG z6m^WjmkN}Tml(*~p;@zVBOdvIet8)f8!3{mLqOyx-DpO`%^ufV84-Cav5*4#Cy9>@AHS6glk%F^G;wk3a(h%@7TaCgw9f84%FnDNO6q-K+g+jW^PJM}4Exq+RcE2m6PM2(i0kY0 zl+Rwb#^tl88~J~F5U?7}e>HPf{YAMAonI{JlLqdu)?+;$?k(rCW^39`SMbn&!c9YYo`*T1Ua`Yidk8LcoMsyZ0vi_6$JTO2#(y{#nnDH zRJ}~b7!(CgjCXj`V;n5v15nR9YpVcpLe7jQgd=^;36YgvuB>LmgI$f`NF2r&M5S6C zXoZv_VGT=u#LIU_A%@V$8kpdNxjOkA>~aE^_W{rToALl3v{+|76SYxUOS?^rI#HQ> zWZ!W|K${S6$za zVUIJVNbv?N>g_qvw>FXx>Nz|^y%F3!DDq?0=oMRi%7e0O$HdHTGi}``)&ID|dX1f*`{jeO`bh{LuG^P58cFt~7=3 zab(|RZ}qdbN-J$Kn{=Ul&Q#;KN6xh(^+_sV$^U z!<{pv?v--(cxj@YBb$%hZG*SPQEMYF-e~(g5~M>8x5b%=e=}Yu$$ev94<6Se=dhHb z+|x`8UH9fS+Pdk{%-};3n9b#2DWNQg+6hTnmliU?mR;I|X!83KRrg`{7Oe)w@o1B= zX$SXFcw;jR;@#@+{-KTS=I24JlHSqpf(<`;d?r;?SvtM6@6#U3%$v{1Y2 zGH#mE8s8_oX>wNqK924LM5Ch``HqU0rY{nDsx})#w_TzRmkENnXdrF2RDv?s-+-0$ zFOU{+b`OKE49sgIog}NNIJz*8R}aF_FU56(>5Xz*aY^?hw=Kk^WUi^1y9hh8MbR*h z2|Q>taR@d;`q9{=(2bC*Rx@d^vEz~o`zO(htCrqIUP_p?7+~xzVQB?%vYV=552tYB zG;zroL53my8KTcm3o!Z?8QA*u&3RD?9Ip02UTy7Bai-N z3^%s=Xg^G}jE!D^DZR9((x1ljq(+(|zSrDvX~7fLvs)o8q%*8yWxxIu z@9CmATpE0iq9dLA-v||_7(z8aCp0Zr#y2MtO0Je?vewu6{3GcvD|&Y!(Nz4@a8dsJDMEb0ODTbU#4E)reG$;`*aMfSldulYs#v2>V^% zQFaQEXe+5q)OLU&*xR7L@_>jtj}!%CC(sXxlik1o1qFMsd%Tlo@iT@5eH76GE&w&3 z#@d0T7c*bWDTCe9gw9NHJM?_0z;FhnySJDg8iZZ`LsCd%Et{OF%6`acPd6*nw#2E* zb>m6Z2!|OIcQO7nIwvM9c~Qm4(Lx2C6nKZ#ywuI;x>Oy zurb_|IFc6Ka4^AXoVsYCXojRnp~3qd0cif|*OR^R{%Kf$w`8s-(N)|-ky3i2(bhD3 zw}l=L)8(ls)XcgLD7CXDsvsnNE(CzZBC zUSwi^7;J54-ahBk8X%7Ec*N#Y2f?%NOKkquj$fmHcw+!b5vuJJ)?d|{*lnUTn}t{o zQJJ+zy-6HnR}VNq2}Eey#WBc>l9dRFS79IYk46%0C`*@-4v`+`n*7N%g?K36Nft4Y z5!19PIfPiJ4*z$VRlN9jw&vRViH?I)j((pk<{X+KmQpy+`TnXeSotw&SAxVY6(9ZCl|$kYt!yZq@f0B;~7Jre`Tk6niuSC zqNOn^NK38{jB;%A3bzyK{DT*?&0&xe4KK;k+1irflabBO`wJ$FWI&;s-x9Z~H-uP0 z&}A!;((^7&iW z_t8>Dpp5a$p1E@(9o{`F&gL}MbF*PG#GM$Eo;838T($`MZrzLPbM2YPZ!V0ITNGDe z(|ufCQ)9lK^OeF|UxS-Oq2n3WfA5S5Lnu{Uwq`r8|68^(=T5n9(+3s|p=+Bq9gr4% zqbYA;dD{DRg-`DlSh=45vRlmK+nm6VTw^T9n|Wr1x5innN6Q-S_C>dQW9SR|pr4%X z5B#dOcVVX$5k9YG&{TR6ti@CEtA9L>YcuW6$Dhq;r*-(@GeoX0BJeD~r&-ef4uv&6 z@SGxH$ngXL$dHlrnlFqYqPz?dY`zO6S^oco06txE_s}@d7PeW9AEP3^@-hI&@Fjy9bR3+ z4_D%2??c$c;Mnc(O{Uwky9bAjuIs>EfL05y<6@34vn}-}sambah*G^XIt`h8=%V_k ztnsItb&!QK2}OM_-`zVfv%rB1AI>ES)DDXw>bFGx&+t$-^O_PBY`&k(+8rFcRQel0 z2*F&%XjqRch2H9SUgmK26VU{H{$|V|Sg_GV$g10&z?3Ad8&I4_~q|MNstLQqPDo(_to#GRXR>;mjXLpl+2Wh z-w)<%*4yAFvH~seh7y^(Bl06F>HHa>6?y^D)*p>dZ>C}Oj^u7Oi@_q;c0HXULXNlD zNFHaa>sLKZHCNMI%Bz+eiAo$CQq?`m3Rb9X;3& zaJEtZOU!aT{#YG8sd*x0RytF6>Mss zzSB`s8*nUa322-dU+gaCbKm3#8Co%&X*E1uZ0g~7AU9-01*WA61(ep#lvZvtM z7O#znuy`5W$GuVPOf}nfdf>8>B!|0`r?-b4`fGRY%f0&gcU*q(u2X*Rn^zb6emJ`t zTgC%jPm{&0QOr!0JI@&K;zT@!3zRZGspN)c%f_;9Pt?Ur$jFdPObSu)@DT4K6nq5g zS;Nc0B_#|m+IEnV2}w*T>VGd48fmK;1_M!jBdMc-K|m@oZ-qr{H9~&e!oZ5aMUEj>C+`QSYJv0x}6LHerC(=r$g7 z=TSBgEgC{lQ!hnm`YjVh!zTl!09B>YpI=boxKCckBz9|0d@g=9A`oac2Lz8GAlmuK z7y>`KUo9ihV~w&Xx7lFZ{g&8@dxsa+n8-Q55~WyR8zSHe>X@obR(%xG_zA!$7t)u* zG21X!+<{}r+bHUI1su}w;9v_WnNXVlnGm^#HZ+j7w(72~{(9n$P2bog)HOZwn6>-@ zrS@>g>=_fLyN0X>ztE2nh|)O9!KmAjLse*DB$BXnV*u>Z%{efukSWkd1efAxX#eL& z!6;WmQXwcr=ZA9)_+XUtp4w-|l@3eHr9=7=h>Yk=iSIk=V$14fs<@}{_lK+B?k?M} zN3uO&i``%8>o(oQTUe+1nse;iEmR6;#b(aP-cg%IJ)Qo_^vrbcE55qZ!Y?~2M45G< z7(pTkWq+tNu|koCvuoaZU^iig{MMf8@NRAq3nIcgfX~Fc$0*KS5`!VYiC7n2e=uLb zkH8=oC{ePh0CrDjwf9}>`-5U1&RLgyHe!G0=1R9DywdU9X*ffaI5!ka+&-0hrV5Gk z!=4xdt?+ZYW^u~6$o`$%rl;PuRu(i z+@HK?xN-G(__)EzM^w3@jz*+}xKUUAI6;kJINcGI$?UlH-62#Qj2QcCxldKlPA@@O zEnH88fl_yi(Yx6$;T)?LSvb)#`!B}JRG*`q|B8WtQH^$LIbgM>w4>=Ff%^lk6S;MiQ}f z%iyTqG0gcB)Qm1MOntgwC`}+wacg$$WUp7@UphNh*ibn;EyreyG%U>2c+u=^8}iqS zRPrc}8X;a5kueA++83#VrEMMW2A}HQ{u1(mpBG+Tw)lgy^loXD$OS%~GbI^qemy1< zt;F^+882-@22Z_dy0Bw-{Y%bb8U>&aPByi{m;S>-{ZW`~9AAD;#S5n~FNzj_Wb& zb5jPvU1SwBsmOGAq~mW~$BXpHYwd0xwd(F+;zdRYaqjo`(?~M?hlYiG&C@i70zqD2~uP5q|6 z+iPT<@$qS`dr1!Yyr{SMMXDB}IC*dNpo?!vUD`#{H z9kz#4`rY=j?=f=`4HVTR7f)SGVcNiEV_J!GNNK$bSLXXEm71NCt5p~0KP)jPA>A#-9RZ+F{BHYGQi=z*7pR|E%2gpKsim&_8x!`m z+#pIW;0}8%9G*7Nq{>bw;LE#LfCuTLTT(%Z5U0fmALPK0?}AB@Hl^pLu7NX*@(HBLdt{1%tC`eRTJ5*49Cdm5=i1 zdcIlrxq-rG3$2^0^4-2wMtyzd@=j4I6bo{6W(U~OBfN--#zi2#1Chx}msw%q>nY3I z<-Wt!2~)4MJ%9DIzzsc*JbO5e?9JPy4%5$tmdMgC>Nw&T>DjsDWL#IEEKL z^?qa3rRghPN}p6YYi$V~t*j=WwqUB5H5<(p-acUw;{jJPJ-dlh@&}No|MK*7QFPa< zw?az>n_Mln_6kX8*w-DrWCe$PQ5cJOlL#1^=o#|WvM=!Y3cchh^EJ(IoiW+h{x?yc zG0>=S*Lv? zaNH6r1@Oasj7vJ}(;bu}q*IbZpg-Ic zTnPY-PZ$3eL%b5@w)-&iEw0nI_ams-vA3PS?_(-oaVP=iZqBbeSBzAiM(h#FMr;;} zBBmX6jj0OO)TvyLIYLWH99LVl_cI@(SN9isErNa~v%3(?$fJ;_B&6hE3N|P=`rbLl z1%#npO4#_|ti`{NOz-=~4tixV;fc`0MFyonHG1B+GfCQe)b+i)e`og@$p0$#tj zk4YX3u;ZVmWM_O?AQWnNK){Vv79u}oo|K>fIXxh|8HNSUmNJsMTcxLrv9UF`4q?|t zmMb2TooW^{Z?}Zs%X~33A9+MGs8cw1v{>jDng$Q++NioASNou|^o-Mp12zX^i{0Xk37=vlvgrpb ziFgy)yX5D8D{e@tM*)Zmk0(paP>Vjvh#+zc0jW1;g&KAX)LK{!8(A-X!%Ceh3F>t{ zl$?aKplGGhVMb}$j+UkU7-(MK zY|gR8YzB1Z-0v18_K4nvN`M7(ZsE-EmompLN+rFQq%}{FL^7ha+!&szAUGG-990`I zog?jYd55oVupvxZ`X)yw7K@0p71irPiEp?$JU-O;G*R8-AW3;;{h>8hK53w`h59u@ z6+vV}5Bo0Kod@Hye+o*g7j?(I<;_&{>Pv5j(k$_xPi73ku0!9P+*D$Jz??ky_hjFqJxy9wE3k9RNF60JXFBm7OIKFB7v*kv zNQuX$J-%~mo%Np{ z7-0=(6nDDb-55%;@343SnskEw&Jce01F}RGofrwE8vp~{ljBthi+_+Q3IeX%kOr|9 z%WWsb1umr&Z)YxzqRB^Lyb120_W|y$yph+lw6u%_^>V6uYg=hoo=sKX)>7}KLS;*O z&&Tr+{G4EZlVyi=NI#t5%SY^Qrn{hqq=AVqvrt=-?C17B=U0A=-szk#=An5a9QP7G>LQ2b z1KvPmq;!Er?7^>nNR9LJ<~({pt}{(_?-_V_)|kU`2W>c=i=qVjb8QNMy;|3C|9II4 z&QPugf7alje%5l52um{}D>BRA0V}y=JSKIc&1q3F8VvOUm$p31H$IIeF4)_iORORn zz}kov;o?-BHsH;U$l{Ar&Vyo>pyxuLGI2a^AIhchZ7|tBK=HjnP zYeiuykrd10{H@uroX^k>(3Idy56Q4bx4LJn#;}A5w1gyCz&P+x>xvI*jFdDo;%2BS zg1SnhdH&J%5J?m$RkPP$nTt@@=2TK%y4~M;w!#luJWdAas~jikhEqAnwZN#PZ0XyR zw2PWIa%>q08wAHUV$&1`TL>+SmQ8#Vp~AR4G0l_K)!ns6TZxJoK?tj$mlBzwed}HT z276?QaNn47ADju*IK_M98 zoNN7`5f`LrQEYSf1gz9eT=PhWhhyhpqM0GE4cOy~f|x{aE-=7)#Kk!o%|^qY?~{eS zi0EQTW90Bcjpokck_Egm%tnbL^O-gc4g(ZDj`ItT{V6*l(Fq?yN%`1TH_MoE?!v7T zu{g)djlty$4M_d%%-q+BOJffzQ-CC zT2G!x`qIbUSyIUFIBLbM2leKp=S%lNCzj+qPkgLrKFq3pOfd@r-)5+$%)Gn);Qd8K z7L-x`z*uwZjc=uVeK|k3mER2Li?%xX4$7$G_;-7Q`sX4H&K-pGXp!t@0)-$D^`7X} z3exQ+Uq|OL9(|>AUl6R`5c4B*YUr$LuiuX*0@XDULij}yY}VR z#F6^gSn>I7_TX#JA0y>W#|VnM*Z&G&TrLfUV>p*a^V8LgCNCmLTd8O&Uq!4L%k$To z2k$f!YbH*2EIgT6lFE#k(|B;;E;dYx-2x-%JL9Q|P0#z2TWq1zHRHp{iW)QQzYvzU zBqfA#h>CY=Iax)P>p9$2zV8!721lMUUlhdx;q1DsA!N@|vyLB?^dnpETwNr)F_b7O zgB^!!D+=5k9qG7P1-^m{Rjh%sl-O{_QY3IV5S*TMRj&{vEs%up7X=6 zo&E)4t2F48TSAuXHF;jDYjE8zq8;n?#ub*6d7EG8zoX37wtEjij4|kM) z@RlTp+kR>r?aZKC0lZ3nZ)7KW?4H(RBo1!{N(IVkJXMfuC+xnMXins@?<8OxKufeJ zgq&k;g*IU%g7a&VESo|R=O>iNF9vgEwwYBobtXV^U9i&o8sM|Qq zPhJnFvy)BsVs+-l-AQY*MUl>-t5%~J+}A=h1?@RcoNKDM-32$t(m>DfWDR#}k72E* zETbaFXiFZu_&)bNeT@#svJ0)A>St(e27x!L5!<9gFHDWKN)3PD8}J^wyo}1I&UqIj z^oMS^qc(>pi8Wg9U?+SJo{RFMg2Y&oY0pZq0(VbQ`z9?o^l>^ z((`0bGDUCpIY0&qB@%M(S@^uX$Zn4vF)rmE-hzm3D4PzPOr5z$q&C#u4mp#XO6UO$ z+wV`_c#fZczE+x_I4QLOD7)L9z{p0~xhZ}oXB+GE(f`|-KF-;iy1N3TNb{k;VU{=9 zsM&j~7V3Wo2MBv!a6>l~y1qQ~t@L@LT$%~RPTR!l8SOEy6!U*_!AcnveTrhR+8C2O zCH5k>1=T>!-9KuV6clIFq5qxKtHE75ww|>=%vC(J@?+SkZ4}NHe0B0W>q6>O$Rv{M z>iZ7XJ(2~~(B8|=d{ZEQLlJtP8BM7ru$G{fCUr(yUV;l($sXkUO$9h*ZIIm#vxg;T z251l}O3!Tu5*THfok5tJpihJx_g;;<;$OE!RFkJo2YIKVpdDMq1hW(7(Ov-n0xwhc zySjPFfOE1r8hsuZ2bmFZcbx1j){ormH6!BTyvCQk`I;>rbWVk_G8f5y$%4&%W-*7c z>A%2neBQNal%PGwAa<)OgQ$VQuC*TdDAV44lO#NehcwhvhuKDu`|>8MFuA`prJlKPmqlSPtKsV zOUfA2P?M>&#z)KTlO{ZueNDYQL)reZG%Qz}1eE+F*6s4B76__dF!#D6+j9uL*ZBm7BbevF( z*IVy31=@rN6t~0D9U1z`vm$6!IVW|gR4!3xlJNKTuR@x0fq6m`FIwYB4x_OURGpwU`dnh3U#wOUP5grq&I`OC+$@}^ zbx~1R%Rw(5&$NRT05WgVVqN(qKvqcKhoquFfk1jQK_Bx6J zMm$-4V=$T*pvi6hGLbF$6Fxef;q1aQO>Spqr$Tc>NL1CD$BT~}X2#$N0az6;w$Kb) z=jQFTW{S`V`(8oper&N;8;7xv*l-r_OV1iv!{fcUWG>rR1qx)L3+ZHgi!Im{ttX84 z@MU{(`%i5QRPkq%p*q$}GfOWOkN=7kE!E2@2sbV3X2?{E?2TG6>lj&!`jG@@FecjgR>2}7v zBQoD*oj&1%SM_-e*e6{1P>o(l75A=*rl-p3=NUuHb77t~f!5M~pY7)UA^^hOc@)sK zVXku*HR-vtOpzk1H9jqY$#%HR3%uuCAfwCX_w=pLv@f$e@c~k(hiKF5?5bzhS1?Xl zGZrs#W++JZ{UMEr;GmUD_1GzGVbZ8r4Ylv+GJm)NWQw#tCN;y9zW*w!DcmmPRKrmS?+g5<)Dx{E}Kc&iCPScd_fk}byD2y+4Jg>3Y83j+AL|7YV+d`5h{VdNUtr} z>Ky-6RbE|wxaVWlZG1o8+(Qf3dq<9qu)+u&Or<^BJfN}H8{zZb!OSA*V|OP#_2BON z)pba>V_x(s@0c2rU-gYd7|O9_o{=Lnk&(kS@ExyNFe&SV)J^KxkEun49unOaA#+zc zP?oMJJHs$Ji+FGo#mBYE8~vwKysRu)CsY+GiL##!rEB)kEMbtuDB)Rxuf6G^+J_UL zXI`CBO?mLNmVW)JEa$13-YQzxHqBuust-!bc6kB3T@)|l%Z3g>y|h}|cfwlfPF;tL zi3olXkdoi7Ke8>do%2Kb%ih`vVXiQhx&5M+bxl&3Je%#@i>ufa=CD{kg}=B~kD zXqhc5T;qb{-(@S{!%!}_cf`<#@5JK(&S;n#YBm`I(GG`9c8v3mmZgWXzu?3dLui0=Q zP5GW{h6-Trt7?5OHdV^aEG$r2x0OgLTu7Q>82Wr3w^6+HKE2G}|Fy4N4a}vlo@V!Z zNug95D^Hv7M~*BVg#13_jA<&tGL(2U7emHp)l$+oMaMFKwYZdI+x>T|;&YTa+2LHzGAKPgab^8`$hih_!SMoJNI z%25cBxE{F3^G%5z-c|ZM^Gz>FAevdWApVYNEWvR{pq^?h$uvnVG(tSFaHu1%aW10H zTD^}TpBg+W4E>Lc^dcduYI6?P)Dj$V3rf3dK!y!9i*zLuhs9RM)AEf zmoIQI5V6gYl%GF-^@HQ~U=fCkZ6PQjA?HqOiVU&VacB`t`3z?PrVUiqZ6r3CRKUZQ z>aX<@<;Trah6Pi3n3C4Chh#y!Yc>HVACsCsh`iRd#d}j9f|a77wPR3TlRB0`b*c`@ z2fU6cPb$}`uVMviv2V%sGTFLX9=`PSZT2d0Y`&U9t82L>D_(W7Nthz|cdmT;u04FJ z^n1HofmJc%Z-DEGu%LL+_&X%~voDuXnx4oin;O~HfAmxtDSFY$3ExEi!5{ySh6fBF#flC zf3Jp>;^rh*s-~{rLcvLx5+OY^Y6DYuf7krjB)KKPilF~k6W{m)OAF^`v2<6nSged} z7y50pI!j10VqGc|D3qK;ssFZ%u2XD>=-H0GD5QN^8}>~59WYkBGOy{j;WKVL|znL39piXeW zL1)Lia7%;m-FLPSRk3j*_tPlO-WEZq)<65(Tb>i7xSoMD=iaHG*Ojc$IjW|=-q8qO zXqMj|EN8Y`ZKjAow6MJ&CKRc_3oJil-wIHa80n@CmA~EYQ>FH*>5CdwXvSj(>3VcR zNqR7=cRQ^t>hT<$u zlS%B#Be|0XKTwi?tAh~sEyTnD~Z5tUpS|9Mi+Xvk)3yI%c7AK zic!N8yCW{=n$J(NHBlMQX8C2N|KCKfv;dK}QC|!uFrk<%A#Q1zVE<#iA*z=jr9_B& zhL(DBRPXDEx?PU?-ySAs_s?RSYA(MRNq|k?v)_N*))f)V-NM2U%rMNCF!x*J;!iX< zvz$|#5vx}@2La{!h4U>X*CD!CJ+s>FEWb=hc*+D6dVKCPs48lzPde~QiOt;u=iE=U zr=2X8wVO6it2g^oxc0CkNv_fxN1EvJeOh(u-*yvT1Z$_9qEy_Ze8qWdN3}~G zhmt1H%Kg(5%3yc4tpG@aq`W7om4S+Y%7L}EjN|93zosw{<&WG4ijpj$rn-Er`T~{H zDPKAhisshW3O!`{FLqpUn}w&0t&f|Jgz|Gv!Rlft%O60`<;h9)wpRl zY+2{E$>q^i!PYOTm#l=|C(nhx_>a{3Docl+cIay_&@_=n+7#H~xA(=u^*0R5m6Qh(fS!u0xm!=|;aBLm1)w;)h`GIix z{?OXzZkg@qn((2MKFcQzTg(R=(NSQx-o-W?L6`OV^p`#GE86Y}TTceFjta%vg2nES z-Hoh~Xcn`iZ)Ws8iS64j2wTr@O0MQfE7tcLmVUI@KOpuH!+Aw-SF*0o*0GPz3A5JV z_8q-rVm_fvg#It^^ZyV2pJ4v>MZLsZ3k=PF_FyNht8cay$oi zM)I@uQ02CQ!8bFB>d~d~bcNRitNc{xco=UXFhiVHyAt}6Oq?l#P?)=nQ*PL&_9vwUyuea`M%uC|t!yLIf_Ba-y} zo^{+zb9o#z75;WEtql~8uI)q1i(?KPu$tWV=Q zoSvPW5~5q^a58By_wL;0!z$@0(`G7qq0!b=zNaXA3(e2G-E6=CB0>&7SM<^a{gAgP zM54E{{9bh2O*{Yb$RMmrs|c$S=<@!UFLx=+{{*-F`UZV{ZuH@beANGe#qWh~n+HXM zU06Mb*%YvIL?|Ijlk)0Xz~WqhOdD;_G7Xtp z5@hB&2TN2Dd#1YaU7E_hBxl37g~k0ckjctqh+$c_orZ*QNN&bQdLu8i=*Io9Uy(wS(#ll|;TKe@zEjRDkE|M%ZisDE6Q%GGiM86sc@S`BAp%vyzhZ!{C(@g1N3s{Ub{@vs5>E|P6!VRn+g)}N2} zf3WwLeNnb;`#-EAf>Hv~3?L{-GYp*~EhVCK4MR%9Ff>T_P)dh@lmgP-Ln$yc3|-O# zBHjLXkMlaO>-RbCw{X7z<^lT_>$a}T@?9KtgRTHgnbQsZK(-`~tEFmp36?zt413Un zqzjSq_5P$d#B*=H(TWLD#UkeRQbu22y!uyMaP9ZsN=nf(hCYwXR+&l3=`>l*V9XDx zp4MtEo6#ZfI%iN*h13EvAY`n}WtYh3YPIKHFU8?o8KDdF5b!4r5<<{02~2^wyQ?CP z&wf5Y^quZ1J$GJNRtg$z%dwYfZ}MYv(n8MDHod-wC-NG+ z0!kqI{Cs%uyS=w}0RRrb&FPLLYI=}RrmAd_q}KB=)x~^VIWhdl=hA4FJaj^j83zR| zTwrXE*1@=!Ox)3$lu*!*>O(9cwn&kB{v z-Xw&ih`KQ=5YxOjHWJU%3Nx?P2$z3t_koGbezjW&d`}Y$#m7Gi&2B3U_?C_5<1@Fs zw);Q>(7Skup$6wk%N&TEoNL0WqFO54obzF`POi@Ho2n!YK{M3#;?o_n^i$6)nc78cmNVtu%tORzrvzX>?s9$43{$h!URlZliMX#n@;hDO{oRx9 z-vj6-0!XC2s7!pX@1y@5#aK^eI~`IEwpOJegdK)QSNn5IqgvT9)C86=H0=)zJLi|b z66NMOwJ$q=>d6j5r=p|3q21c1_)bYq)uvy~e&ZUBZFrHG|Inr#V>VZGPec9_t>!)T zWy%bKK~`=DO?lM{GuC8$&OrfAk`IO4uddBOZ{eQX&s-#NEoXOYH9yrlxkLn4*?y>K zF@Rv7B!S-`P{`pJdxA$g2vpgTk1a{fwIl0wX)eG6(AUh~F013XO#dNBXR+S+A>V&s z>czS8INUw`%R7^ZGN1pwVLx+f_+70N_*^Vs zo?Y(vcSH?I$7uBuLw7FT_N8XVRIr47k{*ofSCXAVg5nmWNC9~kDI;lgACpP&nI|)5 z3dJP%aQoLksxMqGmM8zHz5<5>?H|W$2KTXW6j3je%6(Fk3&nfP$~DZS{g7>&f{HY- zUMT<*+X7-Vr)N_LiMUXt2|o8m4b9Ws&MH&5X6ZV9l~!9ps-zq#U-+SRGj*C2b#dB* z8Ic9U*6-SRI}tI6yVJM%{iZsbT{P*SGVu#0plX9yE{q&v%NFaoX08*KBCWmo6}fYH zhSOYsrl#do-@Ewzh79iWZY8P}Wi$v>dpU6CSCwn#4WY@m*Yfq#)xp3|jXIXIqBL#7Lm43yZ$Q1rC5o5Xfly;D3{Vk)rsT#kOph@Jd`Q~_rKD! z$ImbZOR$H}PKW~EG)F#sxQQ$6?|ydCKxbfkMrn8LJ0EjkZd639nalIWq_ZfQ)S=i4 zu5@dqGYD8IW?03$7y2u>a6gYv!Y{771kdVO+WRLkud~4MGD`30B5rV+pcezqx~

0mRhBFE|KszD8`Mp__C~LHWS}`QtrAwRp>oaqykNj2Y zWJjJPvd{?VbkS081 z%=w(K$s5<;#xiYe{Bv7{0PD~CgkBeuma-Mt#@_Qa0DWQ!qH%wtBZ#bZA6;nNsX>(T z->Co4(mbrxw*3FO6ve*lxyxr;xf3Mw7`F?X_(YyA`r)+wId&CsJ7Uu2HVR+H@nVtU zzsrN*96Hk99TlncAZ^qBwA?n*A97B9ExO>Ki> z)$|KFFz#=nX>4fuE$|TUBiw`QV#$53GDs{%(pP6O zP>h}>UxKC;Sj%zl8Q<=^_fR&+vnP!L76AuwtWg&@gZeX(&&Hw$rY4*F(^_luc;<_L z2<22xIKPRP7JA27IaKm^R%_P;lqBp+Ddiu1^1Voth{3ie<{frUfu}+MntJ|Ls1H6G zvNcR&ASPR~GC~Kpv=hX_9|7|GmP&5x>92CNA%f>1($${tAnAgUzj6If+5lJlCu4 z^DH#N$;JA%ci4L9{f(vZJH*HpOob@+ALSdQy0$9Ch1)=wQs70ucFb_Dg>29|H^Z~c zBuafD|6BHHlD7cQ@-ikDoM9jw^3{l-UbH&+uk0=Ux-o{yc47Q0);RDfw+M1W=6ECgm4-9S%^^&)YpM$as|W*2~vI z!YI34w6aS`lSrIOxW5W(E1U(#Me#r03# zYAGidH0JuT_5H$s0pfgn+yX7-sg!abZROVxbcC!|zI*agY4v35#u2E*UdW_ zkpz8Ng>YAroMh$V_*fiTi;I>8eAIx5)lCF@39{HLaJZq z5Iu=dyK6RE00wXxY}O-@(W3kdw4d}2FRVGNN3nh~k^&S4Vh#$2e-@!7pJ#YINjY*3Q4Q%T4ndKufGAzk_#wAZY2({@v$ASz1N(h}!9$c%RT))b}D+ z(yb_3guICm^#0fp?0ykU0gnzb5wx;veLt`5d^B7WwdSYx$%0NAhd*K5_CwF>w~u$s z95fD{^~#e9<Rdk9xH}bR}zgHX)%zphUf+ z2_2K=k2=O3t=E@e`|U??bu}T&?vP7w=7HF(>-C86=YS3#j}|i67q^p^WJmoLU<$>j zQO5uZyRHaVKo3Khh@J%iJO+X?JFFz1JcBN*Z=Oq5+ritQN%3HXf|Mwj3T9eRezo9u zxJcPZfK(t!;Nv(aA^9sYm1g|9_;t1I9C<)>>E#a!vLxD*jl$ced_^+2Jw?8Jr^0^W z`FPdxwe`fAA10zPAz)+I%*s&5#ZE*lYG*fTfngrkNRDp!I59$bH{m&NSNM@U-0oKH z>Yay_TR~m5%bT;(=ZZ&Wyw!b6VWY(;n7CGVNsH!48U%}%%X&aM`9cb(mvA-+B9``oE<0{uMl)%R(VGH2PCjO=Vu zxoQA|qS`S9;B|tIr4?i3LZfNB~ zvlO>rKM8=v1q|WnQWIV|x(o=5Q>eZDkRPR`xs#ifw}Aao9x10&z%!>k-pqODhZdlA z;gYRYk-vFp%5l$4;sfDvp&x4|O?osn9g%ny*qms>u99Nn6C@9U`a-V0S8=bA&s8J` z0Lmcm=pT4p&IsD)=h|N8LUVt80Go2oI5R){24(wmuUNN7(%v3Wq8pEP}`P`_>q5LM<))=>*_MkQhAw0zH_SsOCp&n==Tg z8_uyTErVcoTbPVmj#twCm1Y0e!}_PP=1y)iZuL1oiDETB`>UQlUGOH^Kxd*xE&BOB z`Ac^xhR{~6&2$In*u$SCyH?-uV_!wf1U zscDpKjFJfIC?SkKz>0*eA6<#`Cs~%&IQU4X34ICcQQM|bF;1_0SZ!y@6=46kmRn!) zJ!L6fZvOkE@3hr6=3JTizAtB^(WG0YBLhlfx46@V`7BQ~8}1Eq8GOOvPW-qI8d(Xr z9Bv%Bc6xY>0N}+7pO6*Nle5J&;C>$VNY#G)&#VfMB}FMy*&}+$plQy@@k!z8pjGfY zxQS}E;5~9S64X&DtlVtvPKJcrt#8dIWH*d!b$@R5K*DI8@LhB}V zP?~WiyKx{}Ts^?p2Ykpi74ojh=nFGkl@yEOuK~6nz*W%$UuK75Ir+YELFI{fA(PQy z+agPSy$V5TBQb~=3O!00Uk5f;hgN?KB-I|y%58~yUG0b^P;Hv^EdrYneYi>9?1{yt zbq~?)VUAI`-|`W|?=V=9CYD4XO>pEc`}zpNtQkWfmQ2X`VlZswr=NZIT;4n_|Qe7S#V8i{2jnSok{CBGK9sG+4mWSDnZI{r``m zF(LwE;Wiu(ewZx0d0R-=^5wbxVdQh2o=nrdLUC@{Qd{Lsw8hcp%n+^oWmO=NIQhXj z!tygP02BQAvRkmzOl*sgGp6D#aB_dgpU~yxtX(fuDa`Yriwn>*{qga=B=nt*c;_5% zU@l}&E(KlAA^?*S4jo9z&QvN2%@mj%fa#s4KD%#|GTiV5%4S8Uxv=i~j=b{vWv9Nr zV0I<&O(7HH=c)18#oO;4O8$1d{*t2q=Xw^3_`#HiT)3xFkZH(zxf(0Ia(%kkOTgRw zo<%X%?6S5L(~O`&wR9lC#|D>EJX1x$+iJpL14voCl;ot82l$YOFO*pChz@V+YoRe>B z4y)h3IDcDHW})Y`DgU!exU%e@y-dD(cb#bZalEk}q}<*>aUbA$+R^6e+@5Gi0do?p zvJ!ViPs7SBubDIaj+hp_E-idcQBgDo)CWY8CPaML@Fq7c?taaYeApKTTi>^t z4#PAAjje!Rr~s4$dHqt>YFG()SN)yz!wa;WtAJTDhJz^6MmrUwUz=9;@8Kg z5%R=PcsJ&DCSR_OH{n3E;;(9a_|C(?vfZFAp+}%xfW|gK-{GM4aA_2O;pBLE;R{bj z`b2>5s+jdyIkEm2nHGP~HkE`Ta-f>kZCJHSnBvmBOpt8L`ou`K11InT&_#BOy6sHJ zWHwT6FF4-+su6y6FBs$h{-Lv+Y{jB(urP(^@ZnKfx#JDFW}9dPshSm2^mg5lXzO43f7F z3oM{pSH-#wPWQBb4)%1;rKSjYK4R4X1s&5JIIoYadK}kCFO3aJcZNhsFRiQbZ#n?p z=$%|%o~YJOsfa20dTKmNlzN!Jp0x=CX(t1;ptob9<=kcMTRV#F%st(!2AU$ge4pls zpQ;ak%#n336a3-L;ClM%vJbImmjr?eS-pW<0$)8GzB%wza!q&(zMfJl;@$O;hKf^fps-6{N{6VP@MU-@E4X3KaGDF%A?-tG zq3mpA9jprYp)SE}3{-#V6`Q9Pd!Z{)(|6_kvDT z`(Z@fpCNu)Kz~L4#f(CU-%A7;|0uvN;-NA6q%Fix0#9!c8EasMY}%N zH@AI)D@$4PnwUz+IDi{Z#0WE)};SDA9t_Hwiv zly1wvX7EP>h^?u1L#oei!Bz3eW|=;-g?zFNvpyQK3(EnBgQMY6e-(4Rr*>WF=S&MqtH(S0nu+GUKCp2O<$|*Qtv#`>{1BrkLy`qYKtjvSQHtq-SO>@evth zo1>Qxse8FvTfDB`r9)In{Pfe;Cgh8;GIKcO_rSHRiaDt0S6?;cxL8thNF72vu-Ws0 zI1{S4ngnoKg)(U7H{`-pzd};sP*vxF-O}3htJ&B3Z67Fy_$Y8=Apfec3uyjgqkhCQ z2Zg^n9;{nj9@H`ENhGoFIhm{I>;KV}P+=4&-M}_EgpDmF2sORz%)tow-_o{pm))y> zGtmFC=L)=AZf&Mmk}-ipM@8IqkrALP+QfTM0Pigs*`i)-JJ8ltYoX>cX2EnTsCiPVy?}arjV=XG7NHrckrBV}=mS~ZVBSDk--pyI z-1~CnOk4v5@ubG#lwJ5{C`ow+24-H3_(H1Ju$FkrUqJ(i4r)vbsPdkL>5n3Y6o?Iz zi&b=2ZfahLJk}~64tIsKu)NF-U5rq+ z%3@bs*9&B-Ff~YhMT6@RzRG-Dj@;9Sr_3smq$0X!jdvOIV(*Uo1MHRI7+erw-jfC3 zEgk?GUOhA&m6E$TlYuPu-;Aj`D6Lu-csG-Va zP@G^9jsh|E{W8v794)ZVE3r_L!LI$~c|J2a5<`AEQb+slx4%;3_0Q5fVCZEr41$2qg`r2g^gM_`F9=0pJy5 z6)UkE`e+%@&_{^BPQ=H+*XB2Gbh}T5j$xf7l$?$@|PwJ1MQC7_iv0Yzebf^N# z_Qc@3W<7HSNvVjWlgZGH(Q3lm`kJdV9^FTKJNqdbs}^Ws$2C@jr5&DCNsPoj_i z3z<>NkEk>@`+U6(ETzM%*QxwyeF@Z?Cj#jIm952TRV+^5eQH6q-6vj>ur^P$io7VAnTfl+hX; zqgzJhK9(dUDHHuE7Ip6s{vFRt(gc<4@L zAu#-P4aPuE2(S^c@w$BOTrQNVU7d66eMTY_1a}Wz3QVOyylF^z&$0MAYuW?K1Wne_ zLGrDwW*XTFQ?WH+{3y9r0Qc0sGM!h>WDrb1IY=Mz)V0_2{K`4-zOImCb2y`IinBlv z51aQRmx36%G7L|uB=LFfKuuI3Y(9a;EZsh%$^$`3IY`TW(hJ*7D8@9t6RIukN7Zug zIA5KCn~z3+{RX;5G(AP?;~M}R%9HDj5HQNpazv`UxR!Y{O2V?f@cA>i1GcuubouGY zPp&6M9?m6n2r*fOTv}lcbskFDG662u_-PRiB-)7?ZuwEp%45EVB_~CBeLMAyh3?lV z(dK6>v=7P@-LE+sYdO__BXqLwd(dqQC!W6>$P$p8LQg)enRGW?8~Rf=f8bxAXDO2q5{0T{xMC8Nb}bUF2n^! zDn-(n2{_IJamPX*vv~)1Tot3bJ!ScH%He2{5(9ustTTv09}`sAqF&e;NRrSc4YtoT z7h}rdjUri5*9Hep)>C5ip4N<6J}dOb-n(wA({7`LPc`ZK^S@Q+Ba-d?h5xZWuwysbGW!pZAkY~LTuL-O^NC;hIt!qqax12+eLnamB)Lv(QZ0 zr?iNt(3=2bZ4Tzx1iq=dFL7?*DUDDA6g}@yyh_wy6~)&(dTgQpXEght>BkceS@b4z zA78@IE0(cv%Q>Sah2UXtH~-n`4-+9Vlu)(%@+1fJR&FDAb=dNZe{#Ci^uww3GmCpi$1VwZsl5t<@Sa5CC}(+vr0Idz6$53QW|8xc#Q+E~+!OOM2g=50k{tM(uywX*_f50!;O0e$ z@j7&(oIC{xj>&-PkZs2vZiknl-v*R9xCg$QEMCtn!!`vp_z}wftDXJ#y_~27D2-o+ zCVIk;IcQ!c2c$2qu7_wi-6R4GCr0$j+;WX>8y`Vcr5Nn$y@x9Oqga}}naA!gt+=u$ zKwmeGyEr;}nr~woT<#)D=_5e>il(zbpD{(YAL`BGXvVr8t=chuJ0fM6lQyqO-c)Hy zi4aR0b30IqMsqWsA%LeiXETE=Qk@;T`GGP7y;afIrzEFfX8(Y8ZNTM+Sb-$BBks=vb6^Tznx-rxc{ zn7COwgM$m$WkLX^!kiDm#Spv;Fh=_WfrncmiO|4yh+CBxY$BthFH@-9gS`v$c#B$) zi9+_GTJcZT_s!WBZm(18*abmD6#W(68c zic#BK9w{kEJMXm{@A8!}w)Ew)uo4eFKiOnRQFDZ6@>7dyg;5t6Ih?%WN{7(yB&(wK zh(twdy`Q2bs&8Ax+I4OP?Kt^pNHKUhu@nE&4P_Bejym(nz%)HzJ1wPj=8P#1noTnO zvn~-7R?FKhD?YWd-_a5ZJw0vv16uUE+})*tS7w(g_bd|qGs-HqNbx4Eg67}!eGoo* zcd;E@wl|rhhY0Bj>rNTdoRb)#fs>UgvpKoM@Hve)SGSK$9K66G0Q6Q|y<%fZR{Y9u z^7arZ-%CbQ4TI6o@?h@2e$F}{)H7=y@{qjqRmm;4w-$oZ8_vV-n(ZXvTh%=gX{f1L z;@N-L8{A~AIHg-(UrS+6!`ms>Rv&dkx*_T%hw5OVKRJ5wfNDhN%a;B?eN{B>aRcH6 z38fTRjeaJkK!Ey*6;m->j@F#t$bF(eOD@A2`6uPug8?`0UxL~clV!3!Tb%>1>YFWH z>$!_IKCBted;S+Mi7Eej>%W(KMuKV+ov?N7JjK#_Y`xnWr{UEi-q~4pTkkJ_Pr@*F z-tHeEd3?4ns8k1Eb`1Qs=}Vsm?Ht@&>X=|DcSliU4JGN*laIP<^Kr^;yB}hWMCmVe zknJ}NCt~jaP zIKgK`i3*lxJt@X1;?7KzmQe=o42klB9E%DRO)IJKU<>`RVEH+S*fG|NO*9V?ghuOcDFMqWO zTaM@@V!hq|IDGoYt;&g-i|S+S=HORfzTKr?L z30uT(vR$({Cgkc}aBilVeA-=+CbkC&gc)6;b+d1(8=}4{ZM<|I$0N;kELyZ?&Dvxn z8Tqvb&h?kiFvCzlc7LV}(;%Kk%ZRE^to{(hehGuZ%4|KqReUK&fEt~EN80L7!JUbvTrl_7 z0@IG_tQ0XZTrI^K)SU8`u23P~Gt(ppf3>jWRxNc;}oWNeQtUC&ZqkF!W6l%BZs zduQt!OF3+W$u4V_YNx=x_eZf&g@-=l0R1c|@6x?}i9vZYohFK>7^-AX7he0@FFf{G z)-amU42JWNjw(E*o+-q%s~eBy@ndS`hz=#n&(%ZB`FX10(iM)c^ z-2`wsVkfF6?z^_A6bzSZ4aScS)3}j|2EFX|urv}S6pzwWe8dw00GVl0vfC_W1a~4o zrD#9Z9LHyIEx}eT4p5dgohTy4Wxp%Edhzj_^Ns(X&O*l4$f=v7yJ)Fqiu5V<-YXhku!X9kDkwejeA=j- zzmBoCj6QUJr>fi$WsNluz7y7U(zjkA(rO{0?vVO^m9BSrKTQ+UW(V{DiQ6X|TFU(_ z-B$;z2!Klc1E~?8CGbQ)*?TXQ`nyjxM((9c5w!E^)4MF-$9L~XKm(n+2*_p?a(!RY zzt&ofPofP&7FQ@~#3*cxKZ7ery*O1L*_;wI{+Y~mpoaPkO-+fPQ28K;Pf$oCzgPWO zR{|!Y%|jhjdOj^u|CFlm}2XF{aGod&r#fZD=2_xL%?k%6hA?{(*; z;6kA;wIh$dI={j_~+Jnx+YprT`KdmBw8ANpPExTp?9C-_-AW@WNj` z{dg+eD-T&t?R2kBja9Oah$At_LV?y~Z(%oTd3{1Xss_G?>&zepip*yxk?-f49*3C3 z(y~@G`vejW-4&^?6LfOX2u;M}4$9X<>#ilU>_l8Pn&RcY38a6}O@^GE%~S5PaM&rqZ( zSGT-Zp=#@zGHD5my*cJE_B^K&x$Gmho94qKSSRePjz~?BV#kRBijs>p*$UfLU5TS5 zbNV@cV(&@f-VP!bXZRttM6tYgodXJsG`mWGz(Cd}>N$~wtBP}3% zk+w0y{n z5~H>=Dlo15bR_ou-7I(qzq=~jJPx|NB>dnM45IaqNPhLBro#@LPxfDCNR<;7o^YeK zt~vKNb0z|7L|mOp@eM+>ymgkb9Yh{jjDy7S8BOzfkICOwAf3HRD5!?JrooVb^YZ;l zF^T!**Z+Fx3qC+ofV4l|lnMvT+kt_`PCcy94-D+aWKJj`mzUso7?L=(h`P~)aKB2nIh^uk?scdY2dPMv(4fu zwMVs7G-(k|C+~Qz*;ZxELvU@K+m4vSf=KMnR4Xc9 z#bo*N&ov$6)gi#XbXBZyJSF4mr;8CC^M>vn?dc|skakS3yV14N7sK_Q9O|wxQgJ%je<$JQ zf|KRv!ICA?dM{S0`c5GUS2rw7XQhJ0e5sUAwMCJnlnlD#bdpme(&9*g{H2eCi6^hd zU)wsLZ1P;K%;kAp?zT~R`hjZd-eKaOsiIw)(}5Y#KhIKj6yHR4E~}w)2@PV>_*o9h zZdCaJ5p@exXP}-GV>bEG9HTeDI#B|Ff%7A2-g=2eno8^=JZ3koK-Cf(nsZweWV{=1R%7AFKG+)Jn zA^?ZVrcb*=LjZiAU+PuA$>dC)wtwelK<_cDFPR^KByHo8empP)gaq#1C65?+8-;rt zfeLtxZ2>dtkyoCpkZC~(2s~RVw5<-^0MpYrpKC^q#|yQ**RRD~Gvw4z<5K@>OQsKq zHV9}@fcl?SysmRF>W$gi=w8scr^D+X!Yk!V!24&}IYXq8VMkj{X0JIwm#>K=X@j_{ zhXPgMdQFX8lwi0Nj_GbaW^uOGqD0z*!n8=#yHY_~`

MAa6kL4^iQd#S!w7N!Igjn z9Fy}2%zsH_@f+fvzbEa@x1_)Qj${&x`}h-auYVw- z>{}vBKN3^&fykn_gcqo-5y}Y4DJ4`9PQ`DDmhlyoS%zP#@*rL&Y44<-Pehl#l{#Mu zUJ_OEf~eBxlJ)lKA{1ai#BxmHNX9-)LJfIL2o2AS9Vvfr(u6Pr%wc4l}oCE;)s3 z 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 BWYLxo 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 z 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 LDpJq_Tj>7-%?>}R literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/space_systems_2.jpg b/doc/Rapport post-doc/figures/space_systems_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d449dca80cb6dfeb7d9594b0f571682fdcec19b GIT binary patch literal 77369 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

S}4JJG&e( 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%0A(M=zPt7 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 literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/table1.png b/doc/Rapport post-doc/figures/table1.png new file mode 100644 index 0000000000000000000000000000000000000000..464a9013fab23a830e4d03eb4925f1a375e7d538 GIT binary patch literal 10573 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 literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/texput.log b/doc/Rapport post-doc/figures/texput.log new file mode 100644 index 0000000..a6f2950 --- /dev/null +++ b/doc/Rapport post-doc/figures/texput.log @@ -0,0 +1,21 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) (preloaded format=pdflatex 2016.4.22) 7 FEB 2017 14:20 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**main.tex + +! Emergency stop. +<*> main.tex + +End of file on the terminal! + + +Here is how much of TeX's memory you used: + 3 strings out of 494924 + 106 string characters out of 6179708 + 45773 words of memory out of 5000000 + 3399 multiletter control sequences out of 15000+600000 + 3640 words of font info for 14 fonts, out of 8000000 for 9000 + 14 hyphenation exceptions out of 8191 + 0i,0n,0p,1b,6s stack positions out of 5000i,500n,10000p,200000b,80000s +! ==> Fatal error occurred, no output PDF file produced! diff --git a/doc/Rapport post-doc/llncsdoc.sty b/doc/Rapport post-doc/llncsdoc.sty new file mode 100644 index 0000000..5843cba --- /dev/null +++ b/doc/Rapport post-doc/llncsdoc.sty @@ -0,0 +1,42 @@ +% This is LLNCSDOC.STY the modification of the +% LLNCS class file for the documentation of +% the class itself. +% +\def\AmS{{\protect\usefont{OMS}{cmsy}{m}{n}% + A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}} +\def\AmSTeX{{\protect\AmS-\protect\TeX}} +% +\def\ps@myheadings{\let\@mkboth\@gobbletwo +\def\@oddhead{\hbox{}\hfil\small\rm\rightmark +\qquad\thepage}% +\def\@oddfoot{}\def\@evenhead{\small\rm\thepage\qquad +\leftmark\hfil}% +\def\@evenfoot{}\def\sectionmark##1{}\def\subsectionmark##1{}} +\ps@myheadings +% +\setcounter{tocdepth}{2} +% +\renewcommand{\labelitemi}{--} +\newenvironment{alpherate}% +{\renewcommand{\labelenumi}{\alph{enumi})}\begin{enumerate}}% +{\end{enumerate}\renewcommand{\labelenumi}{enumi}} +% +\def\bibauthoryear{\begingroup +\def\thebibliography##1{\section*{References}% + \small\list{}{\settowidth\labelwidth{}\leftmargin\parindent + \itemindent=-\parindent + \labelsep=\z@ + \usecounter{enumi}}% + \def\newblock{\hskip .11em plus .33em minus -.07em}% + \sloppy + \sfcode`\.=1000\relax}% + \def\@cite##1{##1}% + \def\@lbibitem[##1]##2{\item[]\if@filesw + {\def\protect####1{\string ####1\space}\immediate + \write\@auxout{\string\bibcite{##2}{##1}}}\fi\ignorespaces}% +\begin{thebibliography}{} +\bibitem[1982]{clar:eke3} Clarke, F., Ekeland, I.: Nonlinear +oscillations and boundary-value problems for Hamiltonian systems. +Arch. Rat. Mech. Anal. 78, 315--333 (1982) +\end{thebibliography} +\endgroup} diff --git a/doc/Rapport post-doc/longabstract.tex b/doc/Rapport post-doc/longabstract.tex new file mode 100644 index 0000000..1c90873 --- /dev/null +++ b/doc/Rapport post-doc/longabstract.tex @@ -0,0 +1,25 @@ +\section{Introduction} +\label{sec:intro} + + + + +% In the following, we first focus on the industrial needs of temporal +% properties that motivate our research. We then describe the +% representation languages to represent time as an intrinsic information +% of the system modelled, and their expressivity. On a simple study +% case, using constant-delays as the simplest timed interactions between +% elements of a system, we show how temporal properties are verified via +% the Tina model-checked, and how such analysis helps engineering design +% in its early-development phases. We conclude with a discussion on the +% state of the art, and comment on the future work and extensions of +% this approach. +% in AltaRica modelling language, and how an extended version of it +% allow us to express time intervals, where events occur +% non-deterministically. + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "main" +%%% End: diff --git a/doc/Rapport post-doc/lstlang3.sty b/doc/Rapport post-doc/lstlang3.sty new file mode 100644 index 0000000..e415893 --- /dev/null +++ b/doc/Rapport post-doc/lstlang3.sty @@ -0,0 +1,1067 @@ +%% +%% This is file `lstlang3.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% lstdrvrs.dtx (with options: `lang3') +%% +%% (w)(c) 1996/1997/1998/1999/2000/2001/2002/2003/2004 Carsten Heinz +%% and/or any other author listed elsewhere in this file. +%% +%% This file is distributed under the terms of the LaTeX Project Public +%% License from CTAN archives in directory macros/latex/base/lppl.txt. +%% Either version 1.0 or, at your option, any later version. +%% +%% This file is completely free and comes without any warranty. +%% +%% Send comments and ideas on the package, error reports and additional +%% programming languages to . +%% +\ProvidesFile{lstlang3.sty} + [2004/02/13 1.2 listings language file] + + +% Lignes vides moins espacées +\lst@AddToHook{OnEmptyLine}{\vskip -0.5ex} +%\lst@AddToHook{OnNewLine}{\vskip -0.5ex} + + + +\lst@definelanguage[68]{Algol}% + {morekeywords={abs,and,arg,begin,bin,bits,bool,by,bytes,case,channel,% + char,co,comment,compl,conj,divab,do,down,elem,elif,else,empty,% + end,entier,eq,esac,exit,false,fi,file,flex,for,format,from,ge,% + goto,gt,heap,if,im,in,int,is,isnt,le,leng,level,loc,long,lt,lwb,% + minusab,mod,modab,mode,ne,nil,not,od,odd,of,op,or,ouse,out,over,% + overab,par,plusab,plusto,pr,pragmat,prio,proc,re,real,ref,repr,% + round,sema,shl,short,shorten,shr,sign,skip,string,struct,then,% + timesab,to,true,union,up,upb,void,while},% + sensitive=f,% ??? + morecomment=[s]{\#}{\#},% + keywordcomment={co,comment}% + }[keywords,comments,keywordcomments]% +\lst@definelanguage[60]{Algol}% + {morekeywords={array,begin,Boolean,code,comment,div,do,else,end,% + false,for,goto,if,integer,label,own,power,procedure,real,step,% + string,switch,then,true,until,value,while},% + sensitive=f,% ??? + keywordcommentsemicolon={end}{else,end}{comment}% + }[keywords,keywordcomments]% +%% +%% x86masm definition (c) 2002 Andrew Zabolotny +%% +\lst@definelanguage[x86masm]{Assembler}% + {morekeywords={al,ah,ax,eax,bl,bh,bx,ebx,cl,ch,cx,ecx,dl,dh,dx,edx,% + si,esi,di,edi,bp,ebp,sp,esp,cs,ds,es,ss,fs,gs,cr0,cr1,cr2,cr3,% + db0,db1,db2,db3,db4,db5,db6,db7,tr0,tr1,tr2,tr3,tr4,tr5,tr6,tr7,% + st,aaa,aad,aam,aas,adc,add,and,arpl,bound,bsf,bsr,bswap,bt,btc,% + btr,bts,call,cbw,cdq,clc,cld,cli,clts,cmc,cmp,cmps,cmpsb,cmpsw,% + cmpsd,cmpxchg,cwd,cwde,daa,das,dec,div,enter,hlt,idiv,imul,in,% + inc,ins,int,into,invd,invlpg,iret,ja,jae,jb,jbe,jc,jcxz,jecxz,% + je,jg,jge,jl,jle,jna,jnae,jnb,jnbe,jnc,jne,jng,jnge,jnl,jnle,% + jno,jnp,jns,jnz,jo,jp,jpe,jpo,js,jz,jmp,lahf,lar,lea,leave,lgdt,% + lidt,lldt,lmsw,lock,lods,lodsb,lodsw,lodsd,loop,loopz,loopnz,% + loope,loopne,lds,les,lfs,lgs,lss,lsl,ltr,mov,movs,movsb,movsw,% + movsd,movsx,movzx,mul,neg,nop,not,or,out,outs,pop,popa,popad,% + popf,popfd,push,pusha,pushad,pushf,pushfd,rcl,rcr,rep,repe,% + repne,repz,repnz,ret,retf,rol,ror,sahf,sal,sar,sbb,scas,seta,% + setae,setb,setbe,setc,sete,setg,setge,setl,setle,setna,setnae,% + setnb,setnbe,setnc,setne,setng,setnge,setnl,setnle,setno,setnp,% + setns,setnz,seto,setp,setpe,setpo,sets,setz,sgdt,shl,shld,shr,% + shrd,sidt,sldt,smsw,stc,std,sti,stos,stosb,stosw,stosd,str,sub,% + test,verr,verw,wait,wbinvd,xadd,xchg,xlatb,xor,fabs,fadd,fbld,% + fbstp,fchs,fclex,fcom,fcos,fdecstp,fdiv,fdivr,ffree,fiadd,ficom,% + fidiv,fidivr,fild,fimul,fincstp,finit,fist,fisub,fisubr,fld,fld1,% + fldl2e,fldl2t,fldlg2,fldln2,fldpi,fldz,fldcw,fldenv,fmul,fnop,% + fpatan,fprem,fprem1,fptan,frndint,frstor,fsave,fscale,fsetpm,% + fsin,fsincos,fsqrt,fst,fstcw,fstenv,fstsw,fsub,fsubr,ftst,fucom,% + fwait,fxam,fxch,fxtract,fyl2x,fyl2xp1,f2xm1},% + morekeywords=[2]{.align,.alpha,assume,byte,code,comm,comment,.const,% + .cref,.data,.data?,db,dd,df,dosseg,dq,dt,dw,dword,else,end,endif,% + endm,endp,ends,eq,equ,.err,.err1,.err2,.errb,.errdef,.errdif,% + .erre,.erridn,.errnb,.errndef,.errnz,event,exitm,extrn,far,% + .fardata,.fardata?,fword,ge,group,gt,high,if,if1,if2,ifb,ifdef,% + ifdif,ife,ifidn,ifnb,ifndef,include,includelib,irp,irpc,label,% + .lall,le,length,.lfcond,.list,local,low,lt,macro,mask,mod,.model,% + name,ne,near,offset,org,out,page,proc,ptr,public,purge,qword,.% + radix,record,rept,.sall,seg,segment,.seq,.sfcond,short,size,% + .stack,struc,subttl,tbyte,.tfcond,this,title,type,.type,width,% + word,.xall,.xcref,.xlist},% + alsoletter=.,alsodigit=?,% + sensitive=f,% + morestring=[b]",% + morestring=[b]',% + morecomment=[l];% + }[keywords,comments,strings] +%% +%% Clean definition (c) 1999 Jos\'e Romildo Malaquias +%% +%% Clean 1.3 : some standard functional language: pure, lazy, +%% polymorphic type system, modules, type classes, +%% garbage collection, functions as first class citizens +%% +\lst@definelanguage{Clean}% + {otherkeywords={:,::,=,:==,=:,=>,->,<-,<-:,\{,\},\{|,|\},\#,\#!,|,\&,% + [,],!,.,\\\\,;,_},% + morekeywords={from,definition,implementation,import,module,system,% + case,code,if,in,let,let!,of,where,with,infix,infixl,infixr},% + morendkeywords={True,False,Start,Int,Real,Char,Bool,String,World,% + File,ProcId},% + sensitive,% + morecomment=[l]//,% missing comma: Markus Pahlow + morecomment=[n]{/*}{*/},% + morestring=[b]"% + }[keywords,comments,strings]% +\lst@definelanguage{Comal 80}% + {morekeywords={AND,AUTO,CASE,DATA,DEL,DIM,DIV,DO,ELSE,ENDCASE,ENDIF,% + ENDPROC,ENDWHILE,EOD,EXEC,FALSE,FOR,GOTO,IF,INPUT,INT,LIST,LOAD,% + MOD,NEW,NEXT,NOT,OF,OR,PRINT,PROC,RANDOM,RENUM,REPEAT,RND,RUN,% + SAVE,SELECT,STOP,TAB,THEN,TRUE,UNTIL,WHILE,ZONE},% + sensitive=f,% ??? + morecomment=[l]//,% + morestring=[d]"% + }[keywords,comments,strings]% +\lst@definelanguage{Elan}% + {morekeywords={ABS,AND,BOOL,CAND,CASE,CAT,COLUMNS,CONCR,CONJ,CONST,% + COR,DECR,DEFINES,DET,DIV,DOWNTO,ELIF,ELSE,END,ENDIF,ENDOP,% + ENDPACKET,ENDPROC,ENDREP,ENDSELECT,FALSE,FI,FILE,FOR,FROM,IF,% + INCR,INT,INV,LEAVE,LENGTH,LET,MOD,NOT,OF,OP,OR,OTHERWISE,PACKET,% + PROC,REAL,REP,REPEAT,ROW,ROWS,SELECT,SIGN,STRUCT,SUB,TEXT,THEN,% + TRANSP,TRUE,TYPE,UNTIL,UPTO,VAR,WHILE,WITH,XOR,% + maxint,sign,abs,min,max,random,initializerandom,subtext,code,% + replace,text,laenge,pos,compress,change,maxreal,smallreal,floor,% + pi,e,ln,log2,log10,sqrt,exp,tan,tand,sin,sind,cos,cosd,arctan,% + arctand,int,real,lastconversionok,put,putline,line,page,get,% + getline,input,output,sequentialfile,maxlinelaenge,reset,eof,% + close,complexzero,complexone,complexi,complex,realpart,imagpart,% + dphi,phi,vector,norm,replace,matrix,idn,row,column,sub,% + replacerow,replacecolumn,replaceelement,transp,errorsstop,stop},% + sensitive,% + morestring=[d]"% + }[keywords,strings]% +%% +%% Erlang definition (c) 2003 Daniel Gazard +%% +\lst@definelanguage{erlang}% + {morekeywords={abs,after,and,apply,atom,atom_to_list,band,binary,% + binary_to_list,binary_to_term,bor,bsl,bsr,bxor,case,catch,% + date,div,element,erase,end,exit,export,float,float_to_list,% + get,halt,hash,hd,if,info,import,integer,integer_to_list,% + length,link,list,list_to_atom,list_to_float,list_to_integer,% + list_to_tuple,module,node,nodes,now,of,or,pid,port,ports,% + processes,put,receive,reference,register,registered,rem,% + round,self,setelement,size,spawn,throw,time,tl,trace,trunc,% + tuple,tuple_to_list,unlink,unregister,whereis,error,false,% + infinity,nil,ok,true,undefined,when},% + otherkeywords={->,!,[,],\{,\},},% + morecomment=[l]\%,% + morestring=[b]",% + morestring=[b]'% + }[keywords,comments,strings]% +\lst@definelanguage{ksh} + {morekeywords={alias,awk,cat,echo,else,elif,fi,exec,exit,% + for,in,do,done,select,case,esac,while,until,function,% + time,export,cd,eval,fc,fg,kill,let,pwd,read,return,rm,% + glob,goto,history,if,logout,nice,nohup,onintr,repeat,sed,% + set,setenv,shift,source,switch,then,umask,unalias,% + unset,wait,@,env,argv,child,home,ignoreeof,noclobber,% + noglob,nomatch,path,prompt,shell,status,verbose,print,printf,% + sqrt,BEGIN,END},% + morecomment=[l]\#,% + morestring=[d]",% + morestring=[d]',% + morestring=[d]`% + }[keywords,comments,strings]% +\lst@definelanguage{Logo}% + {morekeywords={and,atan,arctan,both,break,bf,bl,butfirst,butlast,% + cbreak, close,co,continue,cos,count,clearscreen,cs,debquit,% + describe,diff,difference,ed,edit,either,emptyp,equalp,er,erase,% + errpause,errquit,fifp,filefprint,fifty,fileftype,fip,fileprint,% + fird,fileread,fity,filetype,fiwd,fileword,f,first,or,fp,fprint,% + fput,fty,ftype,full,fullscreen,go,bye,goodbye,gprop,greaterp,% + help,if,iff,iffalse,ift,iftrue,nth,item,keyp,llast,lessp,list,% + local,lput,make,max,maximum,memberp,memtrace,min,minimum,namep,% + not,numberp,oflush,openr,openread,openw,openwrite,op,output,% + pause,plist,pots,pow,pprop,pps,pr,print,product,quotient,random,% + rc,readchar,rl,readlist,remprop,repcount,repeat,request,rnd,run,% + se,sentence,sentencep,setc,setcolor,setipause,setqpause,po,show,% + sin,split,splitscreen,sqrt,stop,sum,test,text,textscreen,thing,% + to,tone,top,toplevel,type,untrace,wait,word,wordp,yaccdebug,is,% + mod,remainder,trace,zerop,back,bk,bto,btouch,fd,forward,fto,% + ftouch,getpen,heading,hit,hitoot,ht,hideturtle,loff,lampoff,lon,% + lampon,lt,left,lot,lotoot,lto,ltouch,penc,pencolor,pd,pendown,pe,% + penerase,penmode,pu,penup,px,penreverse,rt,right,rto,rtouch,% + scrunch,seth,setheading,setscrun,setscrunch,setxy,shownp,st,% + showturtle,towardsxy,clean,wipeclean,xcor,ycor,tur,turtle,% + display,dpy},% + sensitive=f% ??? + }[keywords]% +%% +%% MetaPost definition (c) 2003 Uwe Siart +%% +\lst@definelanguage{MetaPost}% + {morekeywords={abs,addto,ahangle,ahlength,and,angle,arclength,% + arctime,background,bbox,bboxmargin,beginfig,begingroup,beveled,% + black,blue,bluepart,boolean,bot,boxit,boxjoin,bpath,btex,% + buildcycle,butt,cc,ceiling,char,charcode,circleit,circmargin,% + clip,cm,color,controls,cosd,curl,currentpen,currentpicture,% + cutafter,cutbefore,cutdraw,cuttings,cycle,dashed,dashpattern,% + day,dd,decimal,decr,def,defaultdx,defaultdy,defaultfont,% + defaultpen,defaultscale,dir,direction,directionpoint,% + directiontime,ditto,div,dotlabel,dotlabels,dotprod,down,downto,% + draw,drawarrow,drawboxed,drawboxes,drawdblarrow,drawoptions,% + drawshadowed,drawunboxed,else,elseif,end,enddef,endfig,endfor,% + endgroup,epsilon,etex,evenly,exitif,exitunless,expr,extra,fi,% + fill,filldraw,fixpos,fixsize,floor,fontsize,for,forever,% + forsuffixes,fullcircle,getmid,green,greenpart,halfcircle,hex,% + hide,identity,if,in,incr,infinity,infont,input,interim,% + intersectionpoint,intersectiontimes,inverse,joinup,known,label,% + labeloffset,labels,left,length,let,lft,linecap,linejoin,llcorner,% + llft,loggingall,lrcorner,lrt,makepath,makepen,mark,max,mexp,% + mfplain,middlepoint,midpoint,min,mitered,miterlimit,mlog,mod,% + month,mp,mpx,mpxbreak,newinternal,normaldeviate,not,nullpicture,% + numeric,oct,odd,or,origin,pair,path,pausing,pen,pencircle,% + penoffset,pensquare,pic,pickup,picture,point,postcontrol,% + precontrol,primarydef,prologues,quartercircle,red,redpart,% + reflectedabout,reverse,right,rotated,rotatedaround,round,rounded,% + rt,save,scaled,secondarydef,self,setbounds,shifted,shipout,show,% + showdependencies,showstopping,showtoken,showvariable,sind,% + slanted,special,sqrt,squared,step,str,string,subpath,substring,% + tertiarydef,text,thelabel,time,top,tracingall,tracingcapsules,% + tracingchoices,tracingcommands,tracingequations,tracinglostchars,% + tracingmacros,tracingnone,tracingonline,tracingoutput,% + tracingrestores,tracingspecs,tracingstats,tracingtitles,% + transform,transformed,true,truecorners,ulcorner,ulft,undraw,% + unfill,unfilldraw,uniformdeviate,unitsquare,unitvector,unknown,% + until,up,upto,urcorner,urt,vardef,verbatimtex,whatever,white,% + withcolor,withdots,withpen,xpart,xscaled,xxpart,xypart,year,% + yscaled,yxpart,yypart,zscaled},% + sensitive,% + alsoother={0123456789$},% + morecomment=[l]\%,% + morestring=[s]"% + }[keywords,comments,strings]% +%% +%% Mizar definition (c) 2003 Adam Grabowski +%% +%% Mizar is freely available at URL www.mizar.org for the Linux x86, +%% Solaris x86, and Windows operating systems. +%% +\lst@definelanguage{Mizar}% + {otherkeywords={->,(\#,\#),.=),\&},% + morekeywords={vocabulary,constructors,$1,$1,$2,$3,$4,$5,$6,$7,$8,% + @proof,according,aggregate,and,antonym,as,associativity,assume,% + asymmetry,attr,be,begin,being,by,canceled,case,cases,cluster,% + clusters,coherence,commutativity,compatibility,connectedness,% + consider,consistency,constructors,contradiction,correctness,def,% + deffunc,define,definition,definitions,defpred,end,environ,equals,% + ex,exactly,existence,for,from,func,given,hence,hereby,holds,% + idempotence,if,iff,implies,involutiveness,irreflexivity,is,it,% + let,means,mode,non,not,notation,now,of,or,otherwise,over,per,% + pred,prefix,projectivity,proof,provided,qua,reconsider,redefine,% + reflexivity,requirements,reserve,scheme,schemes,section,selector,% + set,st,struct,such,suppose,symmetry,synonym,take,that,the,then,% + theorem,theorems,thesis,thus,to,transitivity,uniqueness,% + vocabulary,where},% + sensitive=t,% + morecomment=[l]::% + }[keywords,comments]% +\lst@definelanguage{Modula-2}% + {morekeywords={AND,ARRAY,BEGIN,BY,CASE,CONST,DIV,DO,ELSE,ELSIF,END,% + EXIT,EXPORT,FOR,FROM,IF,IMPLEMENTATION,IMPORT,IN,MOD,MODULE,NOT,% + OF,OR,POINTER,PROCEDURE,QUALIFIED,RECORD,REPEAT,RETURN,SET,THEN,% + TYPE,UNTIL,VAR,WHILE,WITH,ABS,BITSET,BOOLEAN,CAP,CARDINAL,CHAR,% + CHR,DEC,EXCL,FALSE,FLOAT,HALT,HIGH,INC,INCL,INTEGER,LONGCARD,% + LONGINT,LONGREAL,MAX,MIN,NIL,ODD,ORD,PROC,REAL,SIZE,TRUE,TRUNC,% + VAL,DEFINITION,LOOP},% added keywords due to Peter Bartke 99/07/22 + sensitive,% + morecomment=[n]{(*}{*)},% + morestring=[d]',% + morestring=[d]"% + }[keywords,comments,strings]% +\lstdefinelanguage{MuPAD}{% + morekeywords={end,next,break,if,then,elif,else,end_if,case,end_case,% + otherwise,for,from,to,step,downto,in,end_for,while,end_while,% + repeat,until,end_repeat,or,and,not,xor,div,mod,union,minus,% + intersect,subset,proc,begin,end_proc,domain,end_domain,category,% + end_category,axiom,end_axiom,quit,delete,frame},% + morekeywords=[2]{NIL,FAIL,TRUE,FALSE,UNKNOWN,I,RD_INF,RD_NINF,% + RD_NAN,name,local,option,save,inherits,of,do},% + otherkeywords={\%if,?,!,:=,<,>,=,<=,<>,>=,==>,<=>,::,..,...,->,% + @,@@,\$},% + sensitive=true,% + morecomment=[l]{//},% + morecomment=[n]{/*}{*/},% + morestring=[b]",% + morestring=[d]{`}% + }[keywords,comments,strings] +\lst@definelanguage{NASTRAN} + {morekeywords={ENDDATA},% + morecomment=[l]$,% + MoreSelectCharTable=% + \lst@CArgX BEGIN\ BULK\relax\lst@CDef{}% + {\lst@ifmode\else \ifnum\lst@length=\z@ + \lst@EnterMode{\lst@GPmode}{\lst@modetrue + \let\lst@currstyle\lst@gkeywords@sty}% + \fi \fi}% + {\ifnum\lst@mode=\lst@GPmode + \lst@XPrintToken \lst@LeaveMode + \fi}% + }[keywords,comments]% +\lst@definelanguage{Oberon-2}% + {morekeywords={ARRAY,BEGIN,BOOLEAN,BY,CASE,CHAR,CONST,DIV,DO,ELSE,% + ELSIF,END,EXIT,FALSE,FOR,IF,IMPORT,IN,INTEGER,IS,LONGINT,% + LONGREAL,LOOP,MOD,MODULE,NIL,OF,OR,POINTER,PROCEDURE,REAL,RECORD,% + REPEAT,RETURN,SET,SHORTINT,THEN,TO,TRUE,TYPE,UNTIL,VAR,WHILE,% + WITH,ABS,ASH,CAP,CHR,COPY,DEC,ENTIER,EXCL,HALT,INC,INCL,LEN,LONG,% + MAX,MIN,NEW,ODD,ORD,SHORT,SIZE},% + sensitive,% + morecomment=[n]{(*}{*)},% + morestring=[d]',% + morestring=[d]"% + }[keywords,comments,strings]% +%% +%% OCL definition (c) 2000 Achim D. Brucker +%% +%% You are allowed to use, modify and distribute this code either under +%% the terms of the LPPL (version 1.0 or later) or the GPL (version 2.0 +%% or later). +%% +\lst@definelanguage[decorative]{OCL}[OMG]{OCL} + {otherkeywords={@pre},% + morendkeywords={name,attributes,associatoinEnds,operations,% + supertypes,allSupertypes,allInstances,oclIsKindOf,oclIsTypeOf,% + oclAsType,oclInState,oclIsNew,evaluationType,abs,floor,round,max,% + min,div,mod,size,concat,toUpper,toLower,substring,includes,% + excludes,count,includesAll,exludesAll,isEmpty,notEmpty,sum,% + exists,forAll,isUnique,sortedBy,iterate,union,intersection,% + including,excluding,symmetricDifference,select,reject,collect,% + asSequence,asBag,asSequence,asSet,append,prepend,subSequence,at,% + first,last,true,false,isQuery}% + }% +\lst@definelanguage[OMG]{OCL}% + {morekeywords={context,pre,inv,post},% + ndkeywords={or,xor,and,not,implies,if,then,else,endif},% + morekeywords=[3]{Boolean,Integer,Real,String,Set,Sequence,Bag,% + OclType,OclAny,OclExpression,Enumeration,Collection,},% + sensitive=t,% + morecomment=[l]--,% + morestring=[d]'% + }[keywords,comments,strings]% +\lst@definelanguage{PL/I}% + {morekeywords={ABS,ATAN,AUTOMATIC,AUTO,ATAND,BEGIN,BINARY,BIN,BIT,% + BUILTIN,BY,CALL,CHARACTER,CHAR,CHECK,COLUMN,COL,COMPLEX,CPLX,% + COPY,COS,COSD,COSH,DATA,DATE,DECIMAL,DEC,DECLARE,DCL,DO,EDIT,% + ELSE,END,ENDFILE,ENDPAGE,ENTRY,EXP,EXTERNAL,EXT,FINISH,FIXED,% + FIXEDOVERFLOW,FOFL,FLOAT,FORMAT,GET,GO,GOTO,IF,IMAG,INDEX,% + INITIAL,INIT,INTERNAL,INT,LABEL,LENGTH,LIKE,LINE,LIST,LOG,LOG2,% + LOG10,MAIN,MAX,MIN,MOD,NOCHECK,NOFIXEDOVERFLOW,NOFOFL,NOOVERFLOW,% + NOOFL,NOSIZE,NOUNDERFLOW,NOUFL,NOZERODIVIDE,NOZDIV,ON,OPTIONS,% + OVERFLOW,OFL,PAGE,PICTURE,PROCEDURE,PROC,PUT,READ,REPEAT,RETURN,% + RETURNS,ROUND,SIN,SIND,SINH,SIZE,SKIP,SQRT,STATIC,STOP,STRING,% + SUBSTR,SUM,SYSIN,SYSPRINT,TAN,TAND,TANH,THEN,TO,UNDERFLOW,UFL,% + VARYING,WHILE,WRITE,ZERODIVIDE,ZDIV},% + sensitive=f,% + morecomment=[s]{/*}{*/},% + morestring=[d]'% + }[keywords,comments,strings]% +%% +%% Reduce definition (c) 2002 Geraint Paul Bevan +%% +\lst@definelanguage{Reduce}% + {morekeywords={% +%% reserved identifiers +abs,acos,acosh,acot,acoth,acsc,acsch,% +adjprec,algebraic,algint,allbranch,allfac,and,% +antisymmetric,append,arglength,array,asec,asech,% +asin,asinh,atan,atan2,atanh,begin,bfspace,bye,% +card_no,ceiling,clear,clearrules,coeff,coeffn,% +cofactor,combineexpt,combinelogs,comment,comp,% +complex,conj,cons,cont,cos,cosh,cot,coth,cramer,% +cref,csc,csch,decompose,define,defn,deg,demo,den,% +depend,det,df,difference,dilog,display,div,do,e,% +echo,ed,editdef,ei,end,eps,eq,equal,erf,errcont,% +evallhseqp,eval_mode,even,evenp,exp,expandlogs,% +expr,expt,ezgcd,factor,factorial,factorize,fexpr,% +first,fix,fixp,floor,for,forall,foreach,fort,% +fort_width,freeof,fullroots,g,gcd,geq,go,goto,% +greaterp,high_pow,hypot,i,if,ifactor,impart,in,% +index,infinity,infix,input,int,integer,interpol,% +intstr,k,korder,lambda,lcm,lcof,length,leq,lessp,% +let,lhs,linear,linelength,lisp,list,listargp,% +listargs,ln,load,load_package,log,log10,logb,% +low_pow,lterm,macro,mainvar,mass,mat,match,% +mateigen,matrix,max,mcd,member,memq,min,minus,mkid,% +modular,msg,mshell,multiplicities,nat,neq,nero,% +nextprime,nil,nodepend,noncom,nonzero,nosplit,% +nospur,nullspace,num,numberp,odd,off,on,operator,% +or,order,ordp,out,output,part,pause,period,pf,pi,% +plus,precedence,precise,precision,pret,pri,primep,% +print_precision,procedure,product,quit,quotient,% +random,random_new_seed,rank,rat,ratarg,rational,% +rationalize,ratpri,real,rederr,reduct,remainder,% +remfac,remind,repart,repeat,rest,resultant,retry,% +return,reverse,revpri,rhs,rlisp88,% +root_multiplicity,round,roundall,roundbf,rounded,% +saveas,savestructr,scalar,sec,sech,second,set,% +setmod,setq,share,showrules,showtime,shut,sign,sin,% +sinh,smacro,solve,solvesingular,spur,sqrt,structr,% +sub,sum,symbolic,symmetric,t,tan,tanh,third,time,% +times,tp,tra,trace,trfac,trigform,trint,until,% +varname,vecdim,vector,weight,when,where,while,% +write,ws,wtlevel,% +%% identifiers with spaces +%% for all,for each,go to,such that,% +},% + sensitive=false,% + morecomment=[l]\%,% + morecomment=[s]{COMMENT}{;},% + morecomment=[s]{COMMENT}{$},% + morestring="% + }[keywords,comments,strings]% +\lst@definelanguage[IBM]{Simula}[DEC]{Simula}{}% +\lst@definelanguage[DEC]{Simula}[67]{Simula}% + {morekeywords={and,eq,eqv,ge,gt,hidden,imp,le,long,lt,ne,not,% + options,or,protected,short}% + }% +\lst@definelanguage[CII]{Simula}[67]{Simula}% + {morekeywords={and,equiv,exit,impl,not,or,stop}}% +\lst@definelanguage[67]{Simula}% + {morekeywords={activate,after,array,at,before,begin,boolean,% + character,class,comment,delay,detach,do,else,end,external,false,% + for,go,goto,if,in,inner,inspect,integer,is,label,name,new,none,% + notext,otherwise,prior,procedure,qua,reactivate,real,ref,resume,% + simset,simulation,step,switch,text,then,this,to,true,until,value,% + virtual,when,while},% + sensitive=f,% + keywordcommentsemicolon={end}{else,end,otherwise,when}{comment},% + morestring=[d]",% + morestring=[d]'% + }[keywords,keywordcomments,strings]% +\lst@definelanguage{S}[]{R}{} +\lst@definelanguage[PLUS]{S}[]{R}{} +\lst@definelanguage{R}% + {keywords={abbreviate,abline,abs,acos,acosh,action,add1,add,% + aggregate,alias,Alias,alist,all,anova,any,aov,aperm,append,apply,% + approx,approxfun,apropos,Arg,args,array,arrows,as,asin,asinh,% + atan,atan2,atanh,attach,attr,attributes,autoload,autoloader,ave,% + axis,backsolve,barplot,basename,besselI,besselJ,besselK,besselY,% + beta,binomial,body,box,boxplot,break,browser,bug,builtins,bxp,by,% + c,C,call,Call,case,cat,category,cbind,ceiling,character,char,% + charmatch,check,chol,chol2inv,choose,chull,class,close,cm,codes,% + coef,coefficients,co,col,colnames,colors,colours,commandArgs,% + comment,complete,complex,conflicts,Conj,contents,contour,% + contrasts,contr,control,helmert,contrib,convolve,cooks,coords,% + distance,coplot,cor,cos,cosh,count,fields,cov,covratio,wt,CRAN,% + create,crossprod,cummax,cummin,cumprod,cumsum,curve,cut,cycle,D,% + data,dataentry,date,dbeta,dbinom,dcauchy,dchisq,de,debug,% + debugger,Defunct,default,delay,delete,deltat,demo,de,density,% + deparse,dependencies,Deprecated,deriv,description,detach,% + dev2bitmap,dev,cur,deviance,off,prev,,dexp,df,dfbetas,dffits,% + dgamma,dgeom,dget,dhyper,diag,diff,digamma,dim,dimnames,dir,% + dirname,dlnorm,dlogis,dnbinom,dnchisq,dnorm,do,dotplot,double,% + download,dpois,dput,drop,drop1,dsignrank,dt,dummy,dump,dunif,% + duplicated,dweibull,dwilcox,dyn,edit,eff,effects,eigen,else,% + emacs,end,environment,env,erase,eval,equal,evalq,example,exists,% + exit,exp,expand,expression,External,extract,extractAIC,factor,% + fail,family,fft,file,filled,find,fitted,fivenum,fix,floor,for,% + For,formals,format,formatC,formula,Fortran,forwardsolve,frame,% + frequency,ftable,ftable2table,function,gamma,Gamma,gammaCody,% + gaussian,gc,gcinfo,gctorture,get,getenv,geterrmessage,getOption,% + getwd,gl,glm,globalenv,gnome,GNOME,graphics,gray,grep,grey,grid,% + gsub,hasTsp,hat,heat,help,hist,home,hsv,httpclient,I,identify,if,% + ifelse,Im,image,\%in\%,index,influence,measures,inherits,install,% + installed,integer,interaction,interactive,Internal,intersect,% + inverse,invisible,IQR,is,jitter,kappa,kronecker,labels,lapply,% + layout,lbeta,lchoose,lcm,legend,length,levels,lgamma,library,% + licence,license,lines,list,lm,load,local,locator,log,log10,log1p,% + log2,logical,loglin,lower,lowess,ls,lsfit,lsf,ls,machine,Machine,% + mad,mahalanobis,make,link,margin,match,Math,matlines,mat,matplot,% + matpoints,matrix,max,mean,median,memory,menu,merge,methods,min,% + missing,Mod,mode,model,response,mosaicplot,mtext,mvfft,na,nan,% + names,omit,nargs,nchar,ncol,NCOL,new,next,NextMethod,nextn,% + nlevels,nlm,noquote,NotYetImplemented,NotYetUsed,nrow,NROW,null,% + numeric,\%o\%,objects,offset,old,on,Ops,optim,optimise,optimize,% + options,or,order,ordered,outer,package,packages,page,pairlist,% + pairs,palette,panel,par,parent,parse,paste,path,pbeta,pbinom,% + pcauchy,pchisq,pentagamma,persp,pexp,pf,pgamma,pgeom,phyper,pico,% + pictex,piechart,Platform,plnorm,plogis,plot,pmatch,pmax,pmin,% + pnbinom,pnchisq,pnorm,points,poisson,poly,polygon,polyroot,pos,% + postscript,power,ppoints,ppois,predict,preplot,pretty,Primitive,% + print,prmatrix,proc,prod,profile,proj,prompt,prop,provide,% + psignrank,ps,pt,ptukey,punif,pweibull,pwilcox,q,qbeta,qbinom,% + qcauchy,qchisq,qexp,qf,qgamma,qgeom,qhyper,qlnorm,qlogis,qnbinom,% + qnchisq,qnorm,qpois,qqline,qqnorm,qqplot,qr,Q,qty,qy,qsignrank,% + qt,qtukey,quantile,quasi,quit,qunif,quote,qweibull,qwilcox,% + rainbow,range,rank,rbeta,rbind,rbinom,rcauchy,rchisq,Re,read,csv,% + csv2,fwf,readline,socket,real,Recall,rect,reformulate,regexpr,% + relevel,remove,rep,repeat,replace,replications,report,require,% + resid,residuals,restart,return,rev,rexp,rf,rgamma,rgb,rgeom,R,% + rhyper,rle,rlnorm,rlogis,rm,rnbinom,RNGkind,rnorm,round,row,% + rownames,rowsum,rpois,rsignrank,rstandard,rstudent,rt,rug,runif,% + rweibull,rwilcox,sample,sapply,save,scale,scan,scan,screen,sd,se,% + search,searchpaths,segments,seq,sequence,setdiff,setequal,set,% + setwd,show,sign,signif,sin,single,sinh,sink,solve,sort,source,% + spline,splinefun,split,sqrt,stars,start,stat,stem,step,stop,% + storage,strstrheight,stripplot,strsplit,structure,strwidth,sub,% + subset,substitute,substr,substring,sum,summary,sunflowerplot,svd,% + sweep,switch,symbol,symbols,symnum,sys,status,system,t,table,% + tabulate,tan,tanh,tapply,tempfile,terms,terrain,tetragamma,text,% + time,title,topo,trace,traceback,transform,tri,trigamma,trunc,try,% + ts,tsp,typeof,unclass,undebug,undoc,union,unique,uniroot,unix,% + unlink,unlist,unname,untrace,update,upper,url,UseMethod,var,% + variable,vector,Version,vi,warning,warnings,weighted,weights,% + which,while,window,write,\%x\%,x11,X11,xedit,xemacs,xinch,xor,% + xpdrows,xy,xyinch,yinch,zapsmall,zip},% + otherkeywords={!,!=,~,$,*,\&,\%/\%,\%*\%,\%\%,<-,<<-,_,/},% + alsoother={._$},% + sensitive,% + morecomment=[l]\#,% + morestring=[d]",% + morestring=[d]'% 2001 Robert Denham + }% +\lst@definelanguage{SAS}% + {procnamekeys={proc},% + morekeywords={DATA,AND,OR,NOT,EQ,GT,LT,GE,LE,NE,INFILE,INPUT,DO,BY,% + TO,SIN,COS,OUTPUT,END,PLOT,RUN,LIBNAME,VAR,TITLE,FIRSTOBS,OBS,% + DELIMITER,DLM,EOF,ABS,DIM,HBOUND,LBOUND,MAX,MIN,MOD,SIGN,SQRT,% + CEIL,FLOOR,FUZZ,INT,ROUND,TRUNC,DIGAMMA,ERF,ERFC,EXP,GAMMA,% + LGAMMA,LOG,LOG2,LOG10,ARCOS,ARSIN,ATAN,COSH,SINH,TANH,TAN,% + POISSON,PROBBETA,PROBBNML,PROBCHI,PROBF,PROBGAM,PROBHYPR,% + PROBNEGB,PROBNORM,PROBT,BETAINV,CINV,FINV,GAMINV,PROBIT,TINV,CSS,% + CV,KURTOSIS,MEAN,NMISS,RANGE,SKEWNESS,STD,STDERR,SUM,USS,NORMAL,% + RANBIN,RANCAU,RANEXP,RANGAM,RANNOR,RANPOI,RANTBL,RANTRI,RANUNI,% + UNIFORM,IF,THEN,ELSE,WHILE,UNTIL,DROP,KEEP,LABEL,DEFAULT,ARRAY,% + MERGE,CARDS,CARDS4,PUT,SET,UPDATE,ABORT,DELETE,DISPLAY,LIST,% + LOSTCARD,MISSING,STOP,WHERE,ARRAY,DROP,KEEP,WINDOW,LENGTH,RENAME,% + RETAIN,MEANS,UNIVARIATE,SUMMARY,TABULATE,CORR,FREQ,FOOTNOTE,NOTE,% + SHOW},% + otherkeywords={!,!=,~,$,*,\&,_,/,<,>=,=<,>},% + morestring=[d]'% + }[keywords,comments,strings,procnames]% +\lst@definelanguage[AlLaTeX]{TeX}[LaTeX]{TeX}% + {moretexcs={AtBeginDocument,AtBeginDvi,AtEndDocument,AtEndOfClass,% + AtEndOfPackage,ClassError,ClassInfo,ClassWarning,% + ClassWarningNoLine,CurrentOption,DeclareErrorFont,% + DeclareFixedFont,DeclareFontEncoding,DeclareFontEncodingDefaults,% + DeclareFontFamily,DeclareFontShape,DeclareFontSubstitution,% + DeclareMathAccent,DeclareMathAlphabet,DeclareMathAlphabet,% + DeclareMathDelimiter,DeclareMathRadical,DeclareMathSizes,% + DeclareMathSymbol,DeclareMathVersion,DeclareOldFontCommand,% + DeclareOption,DeclarePreloadSizes,DeclareRobustCommand,% + DeclareSizeFunction,DeclareSymbolFont,DeclareSymbolFontAlphabet,% + DeclareTextAccent,DeclareTextAccentDefault,DeclareTextCommand,% + DeclareTextCommandDefault,DeclareTextComposite,% + DeclareTextCompositeCommand,DeclareTextFontCommand,% + DeclareTextSymbol,DeclareTextSymbolDefault,ExecuteOptions,% + GenericError,GenericInfo,GenericWarning,IfFileExists,% + InputIfFileExists,LoadClass,LoadClassWithOptions,MessageBreak,% + OptionNotUsed,PackageError,PackageInfo,PackageWarning,% + PackageWarningNoLine,PassOptionsToClass,PassOptionsToPackage,% + ProcessOptionsProvidesClass,ProvidesFile,ProvidesFile,% + ProvidesPackage,ProvideTextCommand,RequirePackage,% + RequirePackageWithOptions,SetMathAlphabet,SetSymbolFont,% + TextSymbolUnavailable,UseTextAccent,UseTextSymbol},% + morekeywords={array,center,displaymath,document,enumerate,eqnarray,% + equation,flushleft,flushright,itemize,list,lrbox,math,minipage,% + picture,sloppypar,tabbing,tabular,trivlist,verbatim}% + }% +\lst@definelanguage[LaTeX]{TeX}[common]{TeX}% + {moretexcs={a,AA,aa,addcontentsline,addpenalty,addtocontents,% + addtocounter,addtolength,addtoversion,addvspace,alph,Alph,and,% + arabic,array,arraycolsep,arrayrulewidth,arraystretch,author,% + baselinestretch,begin,bezier,bfseries,bibcite,bibdata,bibitem,% + bibliography,bibliographystyle,bibstyle,bigskip,boldmath,% + botfigrule,bottomfraction,Box,caption,center,CheckCommand,circle,% + citation,cite,cleardoublepage,clearpage,cline,columnsep,% + columnseprule,columnwidth,contentsline,dashbox,date,dblfigrule,% + dblfloatpagefraction,dblfloatsep,dbltextfloatsep,dbltopfraction,% + defaultscriptratio,defaultscriptscriptratio,depth,Diamond,% + displaymath,document,documentclass,documentstyle,doublerulesep,% + em,emph,endarray,endcenter,enddisplaymath,enddocument,% + endenumerate,endeqnarray,endequation,endflushleft,endflushright,% + enditemize,endlist,endlrbox,endmath,endminipage,endpicture,% + endsloppypar,endtabbing,endtabular,endtrivlist,endverbatim,% + enlargethispage,ensuremath,enumerate,eqnarray,equation,% + evensidemargin,extracolsep,fbox,fboxrule,fboxsep,filecontents,% + fill,floatpagefraction,floatsep,flushbottom,flushleft,flushright,% + fnsymbol,fontencoding,fontfamily,fontseries,fontshape,fontsize,% + fontsubfuzz,footnotemark,footnotesep,footnotetext,footskip,frac,% + frame,framebox,fussy,glossary,headheight,headsep,height,hline,% + hspace,I,include,includeonly,index,inputlineno,intextsep,% + itemindent,itemize,itemsep,iterate,itshape,Join,kill,label,% + labelsep,labelwidth,LaTeX,LaTeXe,leadsto,lefteqn,leftmargin,% + leftmargini,leftmarginii,leftmarginiii,leftmarginiv,leftmarginv,% + leftmarginvi,leftmark,lhd,lim,linebreak,linespread,linethickness,% + linewidth,list,listfiles,listfiles,listparindent,lrbox,% + makeatletter,makeatother,makebox,makeglossary,makeindex,% + makelabel,MakeLowercase,MakeUppercase,marginpar,marginparpush,% + marginparsep,marginparwidth,markboth,markright,math,mathbf,% + mathellipsis,mathgroup,mathit,mathrm,mathsf,mathsterling,mathtt,% + mathunderscore,mathversion,mbox,mdseries,mho,minipage,% + multicolumn,multiput,NeedsTeXFormat,newcommand,newcounter,% + newenvironment,newfont,newhelp,newlabel,newlength,newline,% + newmathalphabet,newpage,newsavebox,newtheorem,nobreakspace,% + nobreakspace,nocite,nocorr,nocorrlist,nofiles,nolinebreak,% + nonumber,nopagebreak,normalcolor,normalfont,normalmarginpar,% + numberline,obeycr,oddsidemargin,oldstylenums,onecolumn,oval,% + pagebreak,pagenumbering,pageref,pagestyle,paperheight,paperwidth,% + paragraphmark,parbox,parsep,partopsep,picture,poptabs,pounds,% + protect,pushtabs,put,qbezier,qbeziermax,r,raggedleft,raisebox,% + ref,refstepcounter,renewcommand,renewenvironment,restorecr,% + reversemarginpar,rhd,rightmargin,rightmark,rmfamily,roman,Roman,% + rootbox,rule,samepage,sbox,scshape,secdef,section,sectionmark,% + selectfont,setcounter,settodepth,settoheight,settowidth,sffamily,% + shortstack,showoutput,showoverfull,sloppy,sloppypar,slshape,% + smallskip,sqsubset,sqsupset,SS,stackrel,stepcounter,stop,stretch,% + subparagraphmark,subsectionmark,subsubsectionmark,sum,% + suppressfloats,symbol,tabbing,tabbingsep,tabcolsep,tabular,% + tabularnewline,textasciicircum,textasciitilde,textbackslash,% + textbar,textbf,textbraceleft,textbraceright,textbullet,% + textcircled,textcompwordmark,textdagger,textdaggerdbl,textdollar,% + textellipsis,textemdash,textendash,textexclamdown,textfloatsep,% + textfraction,textgreater,textheight,textit,textless,textmd,% + textnormal,textparagraph,textperiodcentered,textquestiondown,% + textquotedblleft,textquotedblright,textquoteleft,textquoteright,% + textregistered,textrm,textsc,textsection,textsf,textsl,% + textsterling,textsuperscript,texttrademark,texttt,textunderscore,% + textup,textvisiblespace,textwidth,thanks,thefootnote,thempfn,% + thempfn,thempfootnote,thepage,thepage,thicklines,thinlines,% + thispagestyle,title,today,topfigrule,topfraction,topmargin,% + topsep,totalheight,tracingfonts,trivlist,ttfamily,twocolumn,% + typein,typeout,unboldmath,unitlength,unlhd,unrhd,upshape,usebox,% + usecounter,usefont,usepackage,value,vector,verb,verbatim,vline,% + vspace,width,% + normalsize,small,footnotesize,scriptsize,tiny,large,Large,LARGE,% + huge,Huge}% + }% +\lst@definelanguage[plain]{TeX}[common]{TeX}% + {moretexcs={advancepageno,beginsection,bf,bffam,bye,cal,cleartabs,% + columns,dosupereject,endinsert,eqalign,eqalignno,fiverm,fivebf,% + fivei,fivesy,folio,footline,hang,headline,it,itemitem,itfam,% + leqalignno,magnification,makefootline,makeheadline,midinsert,mit,% + mscount,nopagenumbers,normalbottom,of,oldstyle,pagebody,% + pagecontents,pageinsert,pageno,plainoutput,preloaded,proclaim,rm,% + settabs,sevenbf,seveni,sevensy,sevenrm,sl,slfam,supereject,% + tabalign,tabs,tabsdone,tabsyet,tenbf,tenex,teni,tenit,tenrm,% + tensl,tensy,tentt,textindent,topglue,topins,topinsert,tt,ttfam,% + ttraggedright,vfootnote}% + }% +\lst@definelanguage[common]{TeX}[primitive]{TeX} + {moretexcs={active,acute,ae,AE,aleph,allocationnumber,allowbreak,% + alpha,amalg,angle,approx,arccos,arcsin,arctan,arg,arrowvert,% + Arrowvert,ast,asymp,b,backslash,bar,beta,bgroup,big,Big,bigbreak,% + bigcap,bigcirc,bigcup,bigg,Bigg,biggl,Biggl,biggm,Biggm,biggr,% + Biggr,bigl,Bigl,bigm,Bigm,bigodot,bigoplus,bigotimes,bigr,Bigr,% + bigskip,bigskipamount,bigsqcup,bigtriangledown,bigtriangleup,% + biguplus,bigvee,bigwedge,bmod,bordermatrix,bot,bowtie,brace,% + braceld,bracelu,bracerd,braceru,bracevert,brack,break,breve,% + buildrel,bullet,c,cap,cases,cdot,cdotp,cdots,centering,% + centerline,check,chi,choose,circ,clubsuit,colon,cong,coprod,% + copyright,cos,cosh,cot,coth,csc,cup,d,dag,dagger,dashv,ddag,% + ddagger,ddot,ddots,deg,delta,Delta,det,diamond,diamondsuit,dim,% + displaylines,div,do,dospecials,dot,doteq,dotfill,dots,downarrow,% + Downarrow,downbracefill,egroup,eject,ell,empty,emptyset,endgraf,% + endline,enskip,enspace,epsilon,equiv,eta,exists,exp,filbreak,% + flat,fmtname,fmtversion,footins,footnote,footnoterule,forall,% + frenchspacing,frown,gamma,Gamma,gcd,ge,geq,gets,gg,goodbreak,% + grave,H,hat,hbar,heartsuit,hglue,hideskip,hidewidth,hom,% + hookleftarrow,hookrightarrow,hphantom,hrulefill,i,ialign,iff,Im,% + imath,in,inf,infty,int,interdisplaylinepenalty,% + interfootnotelinepenalty,intop,iota,item,j,jmath,joinrel,jot,% + kappa,ker,l,L,lambda,Lambda,land,langle,lbrace,lbrack,lceil,% + ldotp,ldots,le,leavevmode,leftarrow,Leftarrow,leftarrowfill,% + leftharpoondown,leftharpoonup,leftline,leftrightarrow,% + Leftrightarrow,leq,lfloor,lg,lgroup,lhook,lim,liminf,limsup,line,% + ll,llap,lmoustache,ln,lnot,log,longleftarrow,Longleftarrow,% + longleftrightarrow,Longleftrightarrow,longmapsto,longrightarrow,% + Longrightarrow,loop,lor,lq,magstep,magstep,magstephalf,mapsto,% + mapstochar,mathhexbox,mathpalette,mathstrut,matrix,max,maxdimen,% + medbreak,medskip,medskipamount,mid,min,models,mp,mu,multispan,% + nabla,narrower,natural,ne,nearrow,neg,negthinspace,neq,newbox,% + newcount,newdimen,newfam,newif,newinsert,newlanguage,newmuskip,% + newread,newskip,newtoks,newwrite,next,ni,nobreak,nointerlineskip,% + nonfrenchspacing,normalbaselines,normalbaselineskip,% + normallineskip,normallineskiplimit,not,notin,nu,null,nwarrow,o,O,% + oalign,obeylines,obeyspaces,odot,oe,OE,offinterlineskip,oint,% + ointop,omega,Omega,ominus,ooalign,openup,oplus,oslash,otimes,% + overbrace,overleftarrow,overrightarrow,owns,P,parallel,partial,% + perp,phantom,phi,Phi,pi,Pi,pm,pmatrix,pmod,Pr,prec,preceq,prime,% + prod,propto,psi,Psi,qquad,quad,raggedbottom,raggedright,rangle,% + rbrace,rbrack,rceil,Re,relbar,Relbar,removelastskip,repeat,% + rfloor,rgroup,rho,rhook,rightarrow,Rightarrow,rightarrowfill,% + rightharpoondown,rightharpoonup,rightleftharpoons,rightline,rlap,% + rmoustache,root,rq,S,sb,searrow,sec,setminus,sharp,showhyphens,% + sigma,Sigma,sim,simeq,sin,sinh,skew,slash,smallbreak,smallint,% + smallskip,smallskipamount,smash,smile,sp,space,spadesuit,sqcap,% + sqcup,sqrt,sqsubseteq,sqsupseteq,ss,star,strut,strutbox,subset,% + subseteq,succ,succeq,sum,sup,supset,supseteq,surd,swarrow,t,tan,% + tanh,tau,TeX,theta,Theta,thinspace,tilde,times,to,top,tracingall,% + triangle,triangleleft,triangleright,u,underbar,underbrace,% + uparrow,Uparrow,upbracefill,updownarrow,Updownarrow,uplus,% + upsilon,Upsilon,v,varepsilon,varphi,varpi,varrho,varsigma,% + vartheta,vdash,vdots,vec,vee,vert,Vert,vglue,vphantom,wedge,% + widehat,widetilde,wlog,wp,wr,xi,Xi,zeta}% + }% +\lst@definelanguage[primitive]{TeX}% + {moretexcs={above,abovedisplayshortskip,abovedisplayskip,aftergroup,% + abovewithdelims,accent,adjdemerits,advance,afterassignment,atop,% + atopwithdelims,badness,baselineskip,batchmode,begingroup,% + belowdisplayshortskip,belowdisplayskip,binoppenalty,botmark,box,% + boxmaxdepth,brokenpenalty,catcode,char,chardef,cleaders,closein,% + closeout,clubpenalty,copy,count,countdef,cr,crcr,csname,day,% + deadcycles,def,defaulthyphenchar,defaultskewchar,delcode,% + delimiter,delimiterfactor,delimitershortfall,dimen,dimendef,% + discretionary,displayindent,displaylimits,displaystyle,% + displaywidowpenalty,displaywidth,divide,doublehyphendemerits,dp,% + edef,else,emergencystretch,end,endcsname,endgroup,endinput,% + endlinechar,eqno,errhelp,errmessage,errorcontextlines,% + errorstopmode,escapechar,everycr,everydisplay,everyhbox,everyjob,% + everymath,everypar,everyvbox,exhyphenpenalty,expandafter,fam,fi,% + finalhypendemerits,firstmark,floatingpenalty,font,fontdimen,% + fontname,futurelet,gdef,global,globaldefs,halign,hangafter,% + hangindent,hbadness,hbox,hfil,hfill,hfilneg,hfuzz,hoffset,% + holdinginserts,hrule,hsize,hskip,hss,ht,hyphenation,hyphenchar,% + hyphenpenalty,if,ifcase,ifcat,ifdim,ifeof,iffalse,ifhbox,ifhmode,% + ifinner,ifmmode,ifnum,ifodd,iftrue,ifvbox,ifvmode,ifvoid,ifx,% + ignorespaces,immediate,indent,input,insert,insertpenalties,% + interlinepenalty,jobname,kern,language,lastbox,lastkern,% + lastpenalty,lastskip,lccode,leaders,left,lefthyphenmin,leftskip,% + leqno,let,limits,linepenalty,lineskip,lineskiplimits,long,% + looseness,lower,lowercase,mag,mark,mathaccent,mathbin,mathchar,% + mathchardef,mathchoice,mathclose,mathcode,mathinner,mathop,% + mathopen,mathord,mathpunct,mathrel,mathsurround,maxdeadcycles,% + maxdepth,meaning,medmuskip,message,mkern,month,moveleft,% + moveright,mskip,multiply,muskip,muskipdef,newlinechar,noalign,% + noboundary,noexpand,noindent,nolimits,nonscript,nonstopmode,% + nulldelimiterspace,nullfont,number,omit,openin,openout,or,outer,% + output,outputpenalty,over,overfullrule,overline,overwithdelims,% + pagedepth,pagefilllstretch,pagefillstretch,pagefilstretch,% + pagegoal,pageshrink,pagestretch,pagetotal,par,parfillskip,% + parindent,parshape,parskip,patterns,pausing,penalty,% + postdisplaypenalty,predisplaypenalty,predisplaysize,pretolerance,% + prevdepth,prevgraf,radical,raise,read,relax,relpenalty,right,% + righthyphenmin,rightskip,romannumeral,scriptfont,% + scriptscriptfont,scriptscriptstyle,scriptspace,scriptstyle,% + scrollmode,setbox,setlanguage,sfcode,shipout,show,showbox,% + showboxbreadth,showboxdepth,showlists,showthe,skewchar,skip,% + skipdef,spacefactor,spaceskip,span,special,splitbotmark,% + splitfirstmark,splitmaxdepth,splittopskip,string,tabskip,% + textfont,textstyle,the,thickmuskip,thinmuskip,time,toks,toksdef,% + tolerance,topmark,topskip,tracingcommands,tracinglostchars,% + tracingmacros,tracingonline,tracingoutput,tracingpages,% + tracingparagraphs,tracingrestores,tracingstats,uccode,uchyph,% + underline,unhbox,unhcopy,unkern,unpenalty,unskip,unvbox,unvcopy,% + uppercase,vadjust,valign,vbadness,vbox,vcenter,vfil,vfill,% + vfilneg,vfuzz,voffset,vrule,vsize,vskip,vsplit,vss,vtop,wd,% + widowpenalty,write,xdef,xleaders,xspaceskip,year},% + sensitive,% + alsoother={0123456789$_},% + morecomment=[l]\%% + }[keywords,tex,comments]% +%% +%% Verilog definition (c) 2003 Cameron H. G. Wright +%% Based on the IEEE 1364-2001 Verilog HDL standard +%% Ref: S. Palnitkar, "Verilog HDL: A Guide to Digital Design and Synthesis," +%% Prentice Hall, 2003. ISBN: 0-13-044911-3 +%% +\lst@definelanguage{Verilog}% + {morekeywords={% reserved keywords + always,and,assign,automatic,begin,buf,bufif0,bufif1,case,casex,% + casez,cell,cmos,config,deassign,default,defparam,design,disable,% + edge,else,end,endcase,endconfig,endfunction,endgenerate,% + endmodule,endprimitive,endspecify,endtable,endtask,event,for,% + force,forever,fork,function,generate,genvar,highz0,highz1,if,% + ifnone,incdir,include,initial,inout,input,instance,integer,join,% + large,liblist,library,localparam,macromodule,medium,module,nand,% + negedge,nmos,nor,noshowcancelled,not,notif0,notif1,or,output,% + parameter,pmos,posedge,primitive,pull0,pull1,pulldown,pullup,% + pulsestyle_onevent,pulsestyle_ondetect,rcmos,real,realtime,reg,% + release,repeat,rnmos,rpmos,rtran,rtranif0,rtranif1,scalared,% + showcancelled,signed,small,specify,specparam,strong0,strong1,% + supply0,supply1,table,task,time,tran,tranif0,tranif1,tri,tri0,% + tri1,triand,trior,trireg,unsigned,use,vectored,wait,wand,weak0,% + weak1,while,wire,wor,xnor,xor},% + morekeywords=[2]{% system tasks and functions + $bitstoreal,$countdrivers,$display,$fclose,$fdisplay,$fmonitor,% + $fopen,$fstrobe,$fwrite,$finish,$getpattern,$history,$incsave,% + $input,$itor,$key,$list,$log,$monitor,$monitoroff,$monitoron,% + $nokey},% + morekeywords=[3]{% compiler directives + `accelerate,`autoexpand_vectornets,`celldefine,`default_nettype,% + `define,`else,`elsif,`endcelldefine,`endif,`endprotect,% + `endprotected,`expand_vectornets,`ifdef,`ifndef,`include,% + `no_accelerate,`noexpand_vectornets,`noremove_gatenames,% + `nounconnected_drive,`protect,`protected,`remove_gatenames,% + `remove_netnames,`resetall,`timescale,`unconnected_drive},% + alsoletter=\`,% + sensitive,% + morecomment=[s]{/*}{*/},% + morecomment=[l]//,% nonstandard + morestring=[b]"% + }[keywords,comments,strings]% +%% +%% AADL definition rolland jean-francois +%% rolland@irit.fr +%% +%% +%% +\lst@definelanguage{AADL}% + {morekeywords={% reserved keywords + aadlboolean,aadlinteger,aadlreal,aadlstring,% + access,all,and,annex,% + applies,behavior_specification,binding,bus,calls,% + classifier,complete,composite,computation,concurrent,% + connections,constant,count,data,% + delay,delta,device,else,elsif,end,enumeration,% + event,extends,false,features,% + flow,flows,for,fresh,history,group,if,implementation,% + in,inherit,initial,inverse,% + is,list,memory,mode,% + modes,none,not,of,on,% + or,out,package,parameter,% + path,port,private,process,% + processor,properties,property,provides,% + public,range,reference,refined,% + refines,requires,return,server,set,% + sink,source,state,states,subcomponents,subprogram,% + system,thread,timeout,to,transitions,true,% + type,units,urgent,value,variables,when% + },% + morecomment=[l]--,% + literate=% + {-[}{{\(- \hskip -0.2em[\)}}1% + {]->}{{\(]\hskip -0.4em\rightarrow\)}}1% + }[keywords,comments]% +%% +%% B +%% +\lst@definelanguage{AMN}% + {morekeywords={MACHINE,REFINEMENT,REFINES,SEES,INCLUDES,% + SETS,CONSTANTS,PROPERTIES,VARIABLES,INVARIANT,BEGIN,% + INITIALISATION,OPERATIONS,PRE,SELECT,THEN,END,IF,ELSE,WHILE,DO,VARIANT,% + CHOICE,OR,ANY,WHERE,VAR,IN},% + sensitive=true, + literate=% + {[]}{{\([\hskip -0.1em]\)}}1% + {>}{{\(>\)}}1% + {<}{{\(<\)}}1% + {->}{{\(\rightarrow\)}}1% + {<-}{{\(\leftarrow\)}}1% + {<--}{{\(\longleftarrow\)}}2% + {-->}{{\(\longrightarrow\)}}2% + {=>}{{\(\Rightarrow\)}}1% + {>=}{{\(\geq\)}}1% + {<=}{{\(\leq\)}}1% + {/\\}{{\(\cap\)}}1% + {\\/}{{\(\cup\)}}1% + {\{\}}{{\(\emptyset\)}}1% + {not}{{\(\lnot\)}}1% + {:}{{\(\in\)}}1% + {:(}{{:(}}1% + {::}{{\(:\!\in\)}}1% + {:=}{{:=}}1% + {<:}{{\(\subseteq\)}}1% + {<<:}{{\(\subset\)}}1% + {/=}{{\(\neq\)}}1% + {/:}{{\(\not\in\)}}1% + {\&}{{\(\land\)}}1,% + morecomment=[s]{/*}{*/},% + morestring=[d]",% + commentstyle={\textit},% + }[keywords,comments]% +%% +%% isabelle +%% +\lst@definelanguage{isabelle}% + {morekeywords={add,also,and,apply,assm,assume,assumes,axioms,begin,by,case,constdefs,done,end,else,if,fix,from,have,hints,imports,lemma,let,measure,moreover,next,note,obtain,proof,qed,recdef,rule,section,show,shows,subsection,then,theorem,theorems,theory,thesis,this,thus,types,ultimately,unfold,where,with},% + sensitive=true, + literate=% + {~}{\(\neg\)}1% + {==}{\(\triangleq\)}1% + {\{\}}{\(\emptyset\)}1% + {\\}{\(\land\)}1% + {\\}{\(\ldots\)}1% + {\\}{\(\exists\)}1% + {\\}{\(\forall\)}1% + {\\}{\(\in\)}1% + {\\}{\(\cap\)}1% + {\\}{\(\lambda\)}1% + {\\}{\(\Rightarrow\)}1% + {\\}{\(\not\in\)}1% + {\\}{\(\not=\)}1% + {\\}{\(\lor\)}1% + {\\}{\(\rightarrow\)}1% + {\\}{\(\subset\)}1% + {\\}{\(\times\)}1 + {\\}{\(\cup\)}1% + {\\}{\(\bigcup\)}1% + {\\}{\(\subseteq\)}1,% + morecomment=[s]{(*}{(*},% + commentstyle={\textit},% + }[keywords,comments]% +%% +%% +%% LTL +%% +\lst@definelanguage{LTL}% +{morekeywords={U,V},% +sensitive=true, +literate=% +{[]}{{\(\Box\)}}1% +{=>}{{\(\Rightarrow\)}}2% +{<>}{{\(\diamondsuit\)}}1% +{-}{{\(\neg\)}}1% +{()}{{\(\circ\)}}1% +morecomment=[l]{\\*},% +morestring=[d]",% +commentstyle={\textit},% +}[keywords,comments]% +%% +%% TLA +%% +\lst@definelanguage{TLA}% + {morekeywords={ASSUME, ELSE, LOCAL, UNION, + ASSUMPTION, ENABLED, MODULE, VARIABLE, + AXIOM, EXCEPT, OTHER, VARIABLES, + CASE, EXTENDS, SF_, WF_, + CHOOSE, IF, SUBSET, WITH, + CONSTANT, IN, THEN, + CONSTANTS , INSTANCE, THEOREM, + DOMAIN, LET, UNCHANGED},% + sensitive=true, + literate=% + {[]}{{\([\Box]\)}}1% + {>}{{\(>\)}}1% + {<}{{\(<\)}}1% + {->}{{\(\rightarrow\)}}1% + {|->}{{\(\mapsto\)}}1% + {<-}{{\(\leftarrow\)}}1% + {<--}{{\(\longleftarrow\)}}2% + {-->}{{\(\longrightarrow\)}}2% + {=>}{{\(\Rightarrow\)}}1% + {>=}{{\(\geq\)}}1% + {<=}{{\(\leq\)}}1% + {/\\}{{\(\land\)}}1% + {\\/}{{\(\lor\)}}1% + {\{\}}{{\(\emptyset\)}}1% + {not}{{\(\lnot\)}}1% + {\\E}{{\(\exists\)}}1% + {\\A}{{\(\forall\)}}1% + {\\in}{{\(\in\)}}1% + {::}{{\(:\!\in\)}}1% + {:=}{{:=}}1% + {<:}{{\(\subseteq\)}}1% + {<<:}{{\(\subset\)}}1% + {/=}{{\(\neq\)}}1% + {/:}{{\(\not\in\)}}1% + {==}{{\(\triangleq\)}}1% + {===}{{\(===\)}}1% + {\&}{{\(\land\)}}1,% + morecomment=[l]{\\*},% + morestring=[d]",% + commentstyle={\textit},% + }[keywords,comments]% +%% +%% +%% FIACRE +%% +\lst@definelanguage{FIACRE}% + {morekeywords={bool, nat, int, interval, enum, end, record, array, + of, queue, type, is, true, false, new, not, full, empty, + dequeue, first, and, or, enqueue, none, channel, in, out, read, + write, process, states, init, var, priority, from, null, any, + where, while, do, if, then, elsif, else, select, unless, on, to, inf, + component, shuffle, sync, par, port, property, leadsto, within, + after, absent, wait, always, function, begin, loop, + return, union},% + sensitive=true, + literate=% + {->}{{\(\rightarrow\)}}1% + {-o}{{\(\multimap\,\)}}1% + {=>}{{\(\Rightarrow\)}}1% + {>=}{{\(\geq\)}}1% + {<=}{{\(\leq\)}}1% + {||}{{\(\parallel\)}}1% + {:=}{{\(:=\)}}1,% +%% {[]}{{\(\Box\)~}}1,% + morecomment=[s]{/*}{*/},% + morestring=[d]",% + commentstyle={\textit},% + }[keywords,comments]% +%% +%% ALTARICA +%% +\lst@definelanguage{Altarica}% + {morekeywords={bool, nat, int, interval, enum, end, record, array, + of, queue, type, is, true, false, new, not, full, empty, + dequeue, first, and, or, enqueue, none, channel, in, out, read, + write, process, states, var, priority, from, null, any, case, + where, while, do, if, then, elsif, else, select, unless, on, to, inf, + component, sync, par, port, property, leadsto, within, + after, absent, always, extern, law, + trans, state, flow, domain, event, init, assert, node, edon, + case, else, reset}, + emphstyle=\color{black}\bfseries, + sensitive=true, + literate=% + {->}{{\(\rightarrow\)\,}}1% + {-o}{{\(\multimap\,\)}}1% + {=>}{{\(\Rightarrow\)}}1% + {>=}{{\(\geq\)}}1% + {<=}{{\(\leq\)}}1% + {|-}{{\raisebox{-1pt}{\(\vdash\)}}}1% + {::=}{{\(\ ::=\ \)}}1% + {<>}{{\(\Diamond\)}}1,% +%% {[]}{{\(\Box\)~}}1,% + morecomment=[s]{/*}{*/},% + morestring=[d]",% + commentstyle={\textit},% + }[keywords,comments]% +%% +%% BNF +%% +\lst@definelanguage{BNF}% + {morekeywords={bool, nat, int, type, is, union, end, null, if, + record, then, function, var, begin, return, process, states, + from, loop, on, select, component, par}, + emphstyle=\color{black}\bfseries, + sensitive=true, + literate=% + {::=}{{\(\ ::=\ \)}}1% + {[[}{{\(\llbracket\)}}1% + {]]}{{\(\rrbracket\)}}1% + {->}{{\(\rightarrow\,\)}}1% + {v-}{{\(\vdash\)}}1% + {|}{{\(\ \mid\ \)}}1,% +%% {[]}{{\(\Box\)~}}1,% + morecomment=[s]{/*}{*/},% + morestring=[d]",% + commentstyle={\textit},% + }[keywords,comments]% +%% +%% +%% +%% GenoM +%% +\lst@definelanguage{GenoM}% + {morekeywords={wcet, in, out, inout, port, codel, task, throw, int, + enum, ether, yield, activity, doc, validate, start, stop, ids, + interrupts, ms},% + sensitive=true, + morecomment=[s]{/*}{*/},% + morestring=[d]",% + commentstyle={\textit},% + }[keywords,comments]% +\endinput + + + + + + +%% End of file `lstlang3.sty'. + + + diff --git a/doc/Rapport post-doc/main.tex b/doc/Rapport post-doc/main.tex new file mode 100644 index 0000000..e65d711 --- /dev/null +++ b/doc/Rapport post-doc/main.tex @@ -0,0 +1,198 @@ + \documentclass[oribibl]{report} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\usepackage{natbib} +\usepackage{hyperref,verbatim} +\usepackage{listings,dirtytalk} +\usepackage{lstlang3} +\usepackage{amsmath,amsfonts,amssymb,stmaryrd} +\usepackage{graphicx, wrapfig} +\usepackage{latexsym} +\usepackage{units} +\usepackage{xspace}% +% \usepackage{wrapfig} + +\usepackage{xcolor} +\hypersetup{ + colorlinks, + linkcolor={red!50!black}, + citecolor={blue!50!black}, + urlcolor={blue!80!black} +} +\definecolor{bluekeywords}{rgb}{0.13,0.13,1} +\definecolor{greencomments}{rgb}{0,0.5,0} +\definecolor{redstrings}{rgb}{0.9,0,0} +\definecolor{codegreen}{rgb}{0,0.6,0} +\definecolor{codepurple}{rgb}{0.58,0,0.82} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% LISTINGS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\font\bigttfont = cmtt12 scaled 1120 +\newcommand*{\ttfamilywithbold}{\fontfamily{lmtt}\selectfont} + +\def\code#1{{\ttfamilywithbold #1}}%{{\small\ttfamilywithbold #1}} +\def\vars#1{{\small\ttfamilywithbold #1}} + +\sbox0{\small\ttfamily A} +\edef\mybasewidth{\the\wd0 } +\lstset{inputencoding=latin1, + basicstyle=\footnotesize\ttfamilywithbold, + columns=fixed, + basewidth=\mybasewidth, + commentstyle=\commentaires, + keywordstyle=\bfseries, + % keywordstyle={[2]\itshape}, + keywordstyle=\color{bluekeywords}, + % basewidth=0.94ex, + showstringspaces=false, + % emptylines=1, + % aboveskip=-2pt,belowskip=-4pt, + mathescape=true, + texcl=true, + escapechar=@, + numberblanklines=false, + belowskip=-0.5em, + aboveskip=-0.5em, + commentstyle=\color{green},%{bluekeywords}, + belowcaptionskip=-1em +} + +% \usepackage{fancybox} +% \makeatletter +% \newenvironment{CenteredBox}{% +% \begin{Sbox}}{% Save the content in a box +% \end{Sbox}\centerline{\parbox{\wd\@Sbox}{\TheSbox}}}% And output it centered +% \makeatother + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\usepackage{tikz} +\usetikzlibrary{arrows,shapes,decorations,automata,backgrounds,petri,patterns,spy,decorations.markings,shadows} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newtheorem{prop}{Safety Property}{\bfseries}{\rmfamily} +\newcommand{\PRE}[0]{\code{Pre}\xspace}% +\newcommand{\FUNC}[0]{\code{Function}\xspace}% +\newcommand{\ERR}[0]{\code{Err}\xspace}% +\newcommand{\LOSS}[0]{\code{Loss}\xspace} +\newcommand{\OK}[0]{\code{Ok}\xspace} +\newcommand{\MIN}[0]{\code{F3Mux}\xspace} +\newcommand{\ALARM}[0]{\code{Alarm}\xspace} +\newcommand{\SWITCH}[0]{\code{Switch}\xspace} +\newcommand{\FF}[2]{\code{F{#1}\_{#2}}\xspace} +\newcommand{\F}[1]{\code{F{#1}}\xspace} +\newcommand{\I}[1]{\code{I{#1}}\xspace} +\newcommand{\D}[1]{\code{D{#1}}\xspace} +\newtheorem{definition}{Definition} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newcommand{\TODO}[1]{{\color{red}#1}} + +\setlength{\belowcaptionskip}{-1em} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\makeatletter +%\renewcommand\bibsection% +%{\chapter*{\refname\@mkboth{\MakeUppercase{\refname}}{\MakeUppercase{\refname}}}} +\makeatother + +\begin{document} +%% +\title{Model-Checking Approach to Analyse\\ + Temporal Model Properties with AltaRica} +%% +\author{Alexandre Albore} +%%\institute{Institute of Research and Technology (IRT) Saint Exup\'ery, Toulouse, France \and +%%LAAS-CNRS, Universit\'e de Toulouse, CNRS, Toulouse, France \and +%%ONERA, 2 Avenue Edouard Belin, 31055 Toulouse, France +%% } +%% + + +%%\frontmatter + +\maketitle +\setcounter{footnote}{0} +%% +% \noindent\textbf{keywords:} Verification of Safety Requirements; System +% Architecture Specification; Realtime Model-Checking.\\ +%% +\begin{abstract} + The design of complex safety critical systems raises new technical + challenges for industrials. As systems become more complex---and + include more and more interacting functions---it becomes harder to + evaluate the safety implications of local failures and their + possible propagations through a whole system. That is all the more + true when we add time to the problem, that is when we consider the + impact of computation times and delays on the propagation of + failures. + + We describe an approach that extends models developed for Safety + Analysis with timing information and provide tools to reason on the + correctness of temporal safety conditions. Our approach is based on + an extension of the AltaRica language where we can associate timing + constraints with events and relies on a translation into a realtime + model-checking toolset. We illustrate our method with an example + that is representative of safety architectures found in critical + systems. This example shows that considering propagation delays + early during the validation of a system can help us uncover failure + modes that cannot be detected with the untimed models currently + used. +\end{abstract} + +\tableofcontents +% \section*{Acknowledgments}\label{sec:Acknowledgments} + +% Authors would like to thank YYYYY. + +% and could have a beneficial impact on the early validation of system +% behaviour +\chapter{Introduction} +\input{1-introduction} + +\chapter{State of the art} +\label{soa}\input{2-sota} + +\chapter{A Model-Checking Approach to Analyse Temporal Failure Propagation with AltaRica} +\label{altarica}\input{3-imbsa} + +\chapter{A Case Study: FDIR in a Satellite AOCS} +\label{aocs} +\input{4-aocs} + +\chapter{Conclusions} +\input{5-conclusions} + +\bibliographystyle{abbrv} + +\bibliography{paper,tina} + +\newpage +\appendix +\chapter*{Appendix A} +\setcounter{chapter}{1} + \input{app.tex} + +%\chapter*{Appendix} +%%\input{commandlines} +%% Good results and proving that a mathematical model underlying model representation allows to use properties and tools for automatic safety assessment. + +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/doc/Rapport post-doc/main.toc b/doc/Rapport post-doc/main.toc new file mode 100644 index 0000000..63e105a --- /dev/null +++ b/doc/Rapport post-doc/main.toc @@ -0,0 +1,48 @@ +\contentsline {chapter}{\numberline {1}Introduction}{3}{chapter.1} +\contentsline {section}{\numberline {1.1}Toward an automated model-based approach to system validation}{3}{section.1.1} +\contentsline {subsection}{\numberline {1.1.1}Classical safety analysis techniques: FTA and FMEA}{4}{subsection.1.1.1} +\contentsline {subsection}{\numberline {1.1.2}Modern safety analysis techniques: MBSE and MBSA}{5}{subsection.1.1.2} +\contentsline {section}{\numberline {1.2}Automated Evaluation of Safety Temporal Conditions}{5}{section.1.2} +\contentsline {chapter}{\numberline {2}State of the art}{7}{chapter.2} +\contentsline {section}{\numberline {2.1}Modelling languages for Safety Analysis}{7}{section.2.1} +\contentsline {section}{\numberline {2.2}Safety Assessment on Temporal Properties}{8}{section.2.2} +\contentsline {section}{\numberline {2.3}Model-checking approach to safety assessment}{9}{section.2.3} +\contentsline {subsection}{\numberline {2.3.1}Tina model-checker}{10}{subsection.2.3.1} +\contentsline {chapter}{\numberline {3}A Model-Checking Approach to Analyse Temporal Failure Propagation with AltaRica}{12}{chapter.3} +\contentsline {section}{\numberline {3.1}Model-Based Safety Analysis with AltaRica}{13}{section.3.1} +\contentsline {subsection}{\numberline {3.1.1}AltaRica language and versions}{13}{subsection.3.1.1} +\contentsline {subsection}{\numberline {3.1.2}AltaRica modelling}{13}{subsection.3.1.2} +\contentsline {subsection}{\numberline {3.1.3}Time AltaRica: Adding Timing Constraints to Events}{15}{subsection.3.1.3} +\contentsline {section}{\numberline {3.2}A Definition of Fiacre Using Examples}{16}{section.3.2} +\contentsline {section}{\numberline {3.3}Example of a Failure Detection and Isolation System}{18}{section.3.3} +\contentsline {subsubsection}{Safety model of the architecture without FDI}{19}{section*.2} +\contentsline {subsubsection}{Safety model of the architecture with FDI}{21}{section*.3} +\contentsline {section}{\numberline {3.4}Compilation of AltaRica and Experimental evaluation}{22}{section.3.4} +\contentsline {subsection}{\numberline {3.4.1}Empirical evaluation}{24}{subsection.3.4.1} +\contentsline {chapter}{\numberline {4}A Case Study: FDIR in a Satellite AOCS}{26}{chapter.4} +\contentsline {section}{\numberline {4.1}An Expression of Industrial Needs and Requirements}{27}{section.4.1} +\contentsline {section}{\numberline {4.2}AOCS Case Study}{27}{section.4.2} +\contentsline {subsection}{\numberline {4.2.1}Architecture description}{28}{subsection.4.2.1} +\contentsline {subsection}{\numberline {4.2.2}AOCS mode automaton}{28}{subsection.4.2.2} +\contentsline {subsubsection}{OFF mode}{31}{section*.5} +\contentsline {subsubsection}{Acquisition \& Safe mode (ASM)}{31}{section*.6} +\contentsline {subsubsection}{Attitude Control Mode (ACM)}{31}{section*.7} +\contentsline {subsubsection}{Collision Avoidance Manœuvre (CAM)}{32}{section*.8} +\contentsline {subsubsection}{Orbit Control Mode (OCM)}{32}{section*.9} +\contentsline {subsubsection}{Formation Control Mode (FCM)}{33}{section*.10} +\contentsline {subsubsection}{Equipment}{33}{section*.11} +\contentsline {section}{\numberline {4.3}Case study modelling}{36}{section.4.3} +\contentsline {subsection}{\numberline {4.3.1}AltaRica modelling process}{37}{subsection.4.3.1} +\contentsline {subsection}{\numberline {4.3.2}Details of the model}{37}{subsection.4.3.2} +\contentsline {subsection}{\numberline {4.3.3}Empirical evaluation}{38}{subsection.4.3.3} +\contentsline {chapter}{\numberline {5}Conclusions}{41}{chapter.5} +\contentsline {section}{\numberline {5.1}Future Work}{42}{section.5.1} +\contentsline {section}{\numberline {A.1}Interpretation of AltaRica in Fiacre}{47}{section.A.1} +\contentsline {section}{\numberline {A.2}Method and translation}{51}{section.A.2} +\contentsline {subsection}{\numberline {A.2.1}Time Petri Nets}{51}{subsection.A.2.1} +\contentsline {subsubsection}{States in a TPN}{51}{section*.17} +\contentsline {subsection}{\numberline {A.2.2}From AltaRica to Tina}{52}{subsection.A.2.2} +\contentsline {subsection}{\numberline {A.2.3}Factored model of ETGTS}{52}{subsection.A.2.3} +\contentsline {subsubsection}{Semantics of a ETGTS}{53}{section*.18} +\contentsline {subsubsection}{Translation}{54}{section*.19} +\contentsline {section}{\numberline {A.3}Command line}{54}{section.A.3} diff --git a/doc/Rapport post-doc/paper.bib b/doc/Rapport post-doc/paper.bib new file mode 100644 index 0000000..0b8f83f --- /dev/null +++ b/doc/Rapport post-doc/paper.bib @@ -0,0 +1,427 @@ +@inproceedings{albore2017IMBSA, + title={A Model-Checking Approach to Analyse Temporal Failure Propagation with {A}lta{R}ica}, + author={Albore, Alexandre and Dal Zilio, Silvano and Infantes, Guillaume and Seguin, Christel and Virelizier, Pierre}, + booktitle={International Symposium on Model-Based Safety and Assessment -- LNCS}, + pages={147--162}, + year={2017}, + volume={10437}, + organization={Springer} +} + +@inproceedings{albore2018ERTS, + title={Timed Formal Model and Verification of Satellite {FDIR} in Early Design Phase}, + author={Albore, Alexandre and Dal Zilio, Silvano and de Roquemaurel, Marie and Seguin, Christel and Virelizier, Pierre}, + booktitle={9th European Congress on Embedded Real Time Software and Systems}, + OPTpages={147--162}, + year={2018}, + address={Toulouse, France} +} + + +@article{nusmv, + title={{NuSMV}: a new symbolic model checker}, + author={Cimatti, Alessandro and Clarke, Edmund and Giunchiglia, Fausto and Roveri, Marco}, + journal={International Journal on Software Tools for Technology Transfer}, + volume={2}, + number={4}, + pages={410--425}, + year={2000}, + publisher={Springer} +} + +@article{bozzano2010safety, + title={Safety, dependability and performance analysis of extended AADL models}, + author={Bozzano, Marco and Cimatti, Alessandro and Katoen, Joost-Pieter and Nguyen, Viet Yen and Noll, Thomas and Roveri, Marco}, + journal={The Computer Journal}, + volume={54}, + number={5}, + pages={754--775}, + year={2010}, + publisher={Oxford University Press} +} + +@inproceedings{PRISM, + title={PRISM 4.0: Verification of Probabilistic Real-time Systems}, + author={Kwiatkowska, Marta and Gethin, Norman and Parker, David}, + booktitle={International Conference on Computer Aided Verification (CAV’11) -- LNCS}, + pages={585-591}, + year={2011}, + volume={6806}, + organization={Springer} +} + +@inproceedings{brunel2017performing, + title={Performing Safety Analyses with AADL and AltaRica}, + author={Brunel, Julien and Feiler, Peter and Hugues, J{\'e}r{\^o}me and Lewis, Bruce and Prosvirnova, Tatiana and Seguin, Christel and Wrage, Lutz}, + booktitle={International Symposium on Model-Based Safety and Assessment -- LNCS}, + pages={67--81}, + year={2017}, + volume={10437}, + organization={Springer} +} + +@article{KNP04b, + author={M. Kwiatkowska and G. Norman and D. Parker}, + title={Probabilistic Symbolic Model Checking with {PRISM}: A Hybrid Approach}, + journal={International Journal on Software Tools for Technology Transfer (STTT)}, + year={2004}, + volume={6}, + number={2}, + pages={128--142} +} + +@Article{arn00, + author = {Arnold, A. and Griffault, A. and Point, G. and Rauzy, A.}, + title = {The {AltaRica} formalism for describing concurrent systems }, + journal = {Fundamenta Informatic{\ae}}, + year = {2000}, + volume = {40}, + number={2, 3}, + publisher={IOS Press}, + pages = {109-124} +} + +@book{Stamatis, + author = {Stamatis, D. H.}, + title = {Failure {M}ode and {E}ffect Analysis: {FMEA} from Theory to Execution}, + date = {2003}, + publisher = {ASQ Quality Press} +} + +@article{papadopoulos2011engineering, + title={Engineering failure analysis and design optimisation with {H}i{P}-{HOPS}}, + author={Papadopoulos, Yiannis and Walker, Martin and Parker, David and R{\"u}de, Erich and Hamann, Rainer and Uhlig, Andreas and Gr{\"a}tz, Uwe and Lien, Rune}, + journal={Engineering Failure Analysis}, + volume={18}, + number={2}, + pages={590--608}, + year={2011}, + publisher={Elsevier} +} + +@phdthesis{walker2009pandora, + title={Pandora: a logic for the qualitative analysis of temporal fault trees}, + author={Walker, Martin David}, + year={2009}, + school={The University of Hull} +} +@article{pagetti2004, + title={A timed extension for {A}lta{R}ica}, + author={Cassez, Franck and Pagetti, Claire and Roux, Olivier}, + journal={Fundamenta Informatic{\ae}}, + volume={62}, + number={3-4}, + pages={291--332}, + year={2004}, + publisher={IOS Press} +} + +@article{stamatelatos2002fault, + title={Fault tree handbook with aerospace applications}, + author={Stamatelatos, Michael and Vesely, William and Dugan, Joanne and Fragola, Joseph and Minarick, Joseph and Railsback, Jan}, + year={2002}, + publisher={{NASA}, Washington, DC} +} + +@book{FMEA, + author = {United States military procedure MIL-P-1629}, + title = {Procedure for performing a failure mode effect and criticality analysis}, + date = {1949} +} + + +@inproceedings{figaro, + author = {Bouissou, M}, + title = {Automated dependability analysis of complex systems with the KB3 workbench: the experience of EDF R\&D}, + booktitle = {Proceedings of CIEM}, + date = {2005}, + OPTeventtitle = {eventtitle}, + eventdate = {22–25 October 2005}, + venue = {Bucharest, Romania} +} + +@inproceedings{daws, + author = { Daws, C. and Yovine, S.}, + editor = {IEEE}, + title = {Reducing the Number of Clock Variables of Timed Automata}, + booktitle = {17th IEEE Real-Time Systems Symposium}, + date = {1996}, + venue = {Washington, DC} + +} + +@article{uppaal1997, + author = {K. G. Larsen and P. Pettersson and W. Yi}, + title = {UPPAAL in a nutshell}, + journaltitle = {International Journal on Software Tools for Technology Transfer (STTT)}, + date = {1997}, + volume = {1}, + number = {1}, + pages = {134-152} +} + +@inproceedings{uppaal2006, + title={{UPPAAL} 4.0}, + author={Behrmann, Gerd and David, Alexandre and Larsen, Kim Guldstrand and Hakansson, John and Petterson, Paul and Yi, Wang and Hendriks, Martijn}, + booktitle={Quantitative Evaluation of Systems, 2006 (QEST 2006)}, + pages={125--126}, + year={2006}, + organization={IEEE} +} + +@article{bernard2007experiments, + title={Experiments in model based safety analysis: {F}light controls}, + author={Bernard, Romain and Aubert, Jean-Jacques and Bieber, Pierre and Merlini, Christophe and Metge, Sylvain}, + journal={IFAC Proceedings Volumes}, + volume={40}, + number={6}, + pages={43--48}, + year={2007}, + publisher={Elsevier} +} +@inproceedings{bieber2002combination, + title={Combination of fault tree analysis and model checking for safety assessment of complex system}, + author={Bieber, Pierre and Castel, Charles and Seguin, Christel}, + booktitle={European Dependable Computing Conference}, + pages={19--31}, + year={2002}, + organization={Springer} +} +@InProceedings{poi99, + author = {Point, G. and Rauzy, A.}, + title = {{AltaRica} - Langage de mod{\'e}lisation par automates \`a contraintes}, + booktitle = {Actes du Congr\'es Mod\'elisation des Syst\`emes R\'eactifs}, + year = {1999}, + publisher = {Herm\`es ed.} +} + +@InProceedings{rauzy02, + author = {Rauzy, A.}, + title = {Mode automata and their compilation into fault trees}, + booktitle = {Reliability Engineering and +System Safety}, + year = {2002} +} + +@incollection{bieber2004safety, + title={Safety assessment with {A}ltarica}, + author={Bieber, Pierre and Bougnol, Christian and Castel, Charles and Kehren, Jean-Pierre Heckmann Christophe and Metge, Sylvain and Seguin, Christel}, + booktitle={Building the Information Society}, + pages={505--510}, + year={2004}, + publisher={Springer} +} + +@Article{rau08, + author = {Rauzy A.}, + title = {Guarded {T}ransition {S}ystems: a new States/Events Formalism for Reliability Studies}, + journal = {Journal of Risk and Reliability}, + year = {2008}, + volume = {222}, + number = {4} +} + +@article{prosvirnova2013altarica, + title={The {A}lta{R}ica 3.0 project for {M}odel-{B}ased {S}afety {A}ssessment}, + author={Prosvirnova, Tatiana and Batteux, Michel and Brameret, Pierre-Antoine and Cherfi, Abraham and Friedlhuber, Thomas and Roussel, Jean-Marc and Rauzy, Antoine}, + journal={IFAC Proceedings Volumes}, + volume={46}, + number={22}, + pages={127--132}, + year={2013}, + publisher={Elsevier} +} + +@inproceedings{thomas2013, + title={Model-Based {RAMS} \& {FDIR} Co-Engineering at {A}strium Satellites}, + author={Thomas, Dave and Blanquart, Jean-Paul}, + booktitle={Data System In Aerospace (DASIA 2013)}, + publisher ={ESA Special Publication}, + volume={720}, + pages={33}, + year={2013} +} + +@article{arnold1999altarica, + title={The {AltaRica} formalism for describing concurrent systems}, + author={Arnold, Andr{\'e} and Point, G{\'e}rald and Griffault, Alain and Rauzy, Antoine}, + journal={Fundamenta Informaticae}, + volume={40}, + number={2, 3}, + pages={109--124}, + year={1999}, + publisher={IOS Press} +} + +@inproceedings{bouissou05, + author = { Bouissou, M.}, + title = {Automated dependability analysis of complex systems with the KB3 workbench: the experience of EDF R\&D}, + booktitle = {International Conference on ENERGY and ENVIRONMENT (CIEM)}, + year = {2005} +} + +@inproceedings{bittner2014, + author = {Bittner, B. and Bozzano, M. and Cimatti, A. and De Ferluc, R. and Gario, M. and Guiotto, A. and Yushtein, Y.}, + title = {An Integrated Process for {FDIR} Design in Aerospace}, + booktitle = {International Symposium on Model Based Safety and Assessment (IMBSA)}, + year = {2014}, + venue = {Trento} +} + +@booklet{arc, + author = {Point, G. and Griffault, A. and Vincent, A.}, + title = {AltaRica Checker Handbook - A user-guide to ARC version 1}, + year = {2010}, + location = {Talence: LaBRI - CNRS UMR 5800 - Univ. de Bordeaux} +} + +@report{Griffault06, + author = {Griffault, A. and Point, G.}, + title = {On the partial translation of {L}ustre programs into the {A}lta{R}ica language and vice versa}, + type = {Research Report}, + institution = {LaBRI - CNRS UMR 5800}, + year = {2006}, + number = {1415-06}, + location = {Bordeaux} +} + + +@inproceedings{mec5, + author = {A. Griffault and A. Vincent}, + title = {The {MEC} 5 model-checker}, + booktitle = {International Conference on Computer Aided Verification}, + year = {2004} +} + +@inproceedings{rugina09, + author = {A.-E. Rugina and J.-P. Blanquart and R. Soumagne}, + title = {Validating {F}ailure {D}etection {I}solation and {R}ecovery {S}trategies using {T}imed {A}utomata}, + booktitle = {12th European Workshop on Dependable Computing (EWDC 2009)}, + year = {2009}, + venue = {Toulouse} +} + +@inproceedings{chaki2004, + title={State/event-based Software Model Checking}, + author={Chaki, Sagar and Clarke, Edmund M. and Ouaknine, Jo{\"e}l and Sharygina, Natasha and Sinha, Nishant}, + booktitle={International Conference on Integrated Formal Methods}, + pages={128--147}, + year={2004}, + organization={Springer} +} + +@inproceedings{cadp, + title={CADP a protocol validation and verification toolbox}, + author={Fernandez, Jean-Claude and Garavel, Hubert and Kerbrat, Alain and Mounier, Laurent and Mateescu, Radu and Sighireanu, Mihaela}, + booktitle={International Conference on Computer Aided Verification}, + pages={437--440}, + year={1996}, + organization={Springer} +} +@TechReport{Altarica2.3, + author = {Antoine B. Rauzy}, + title = {Alta{R}ica {D}ataflow Language Specification Version 2.3}, + institution = {Ecole Centrale de Paris}, + year = {2013}, + month = {June} +} + +@InProceedings{epoch, + author = {Teichteil-K{\"o}nigbuch, Florent and Infantes, Guillaume and Seguin, Christel }, + title = {{EPOCH} Probabilistic {M}odel-{C}hecking}, + booktitle = {{M}odel {B}ased {S}afety {A}ssessment workshop}, + year = {2011}, + address = {Toulouse, France} +} + +@inproceedings{bittner2016, + title={Automated synthesis of timed failure propagation graphs}, + author={Bittner, Benjamin and Bozzano, Marco and Cimatti, Alessandro}, + booktitle={Proc. Int. Joint Conf. of Artificial Intelligence (IJCAI-16)}, + pages={972--978}, + year={2016} +} + +@article{bozzano2012, + title={Symbolic {M}odel {C}hecking and safety assessment of {AltaRica} models}, + author={Bozzano, Marco and Cimatti, Alessandro and Lisagor, Oleg and Mattarei, Cristian and Mover, Sergio and Roveri, Marco and Tonetta, Stefano}, + journal={Electronic Communications of the EASST}, + volume={46}, + year={2012} +} + +@article{berthomieu1991TPN, + title={Modeling and verification of time dependent systems using time {P}etri nets}, + author={Berthomieu, Bernard and Diaz, Michel}, + journal={IEEE transactions on software engineering}, + volume={17}, + number={3}, + pages={259--273}, + year={1991}, + publisher={IEEE} +} + +@inproceedings{Zalila, + author = {Zalila, F. and Jenn, É. and Pantel, M. }, + title = {Model Execution and Debugging - A Process to Leverage Existing Tools}, + booktitle = { 5th International Conference on Model-Driven Engineering and Software Development}, + year = {2017} +} + + +@incollection{synoptic, + author = {A. Cortier and L. Besnard and J. P. Bodeveix and J. Buisson and F. Dagnat and M. Filali and G. Garcia and J. Ouy and M. Pantel and A.-E. Rugina and M. Strecker and J.P. Talpin}, + title = {Synoptic: A Domain-Specific Modeling Language for Space On-board Application Software}, + booktitle = {Synthesis of Embedded Software}, + date = {2010} +} + +@manual{sutre09, + author = { Sutre , G. and Herbreteau, F. and Fleury, F.}, + title = {Traduction de Synoptic en {AltaRica}}, + year = {2009}, + organization = {LaBRI} +} + +@article{merlin1976, + title={Recoverability of communication protocols--implications of a theoretical study}, + author={Merlin, Philip and Farber, David}, + journal={IEEE transactions on Communications}, + volume={24}, + number={9}, + pages={1036--1043}, + year={1976}, + publisher={IEEE} +} + +@article{yao, + title={A {P}etri net model for temporal knowledge representation and reasoning}, + author={Yao, Yulin}, + journal={IEEE Transactions on Systems, Man, and Cybernetics}, + volume={24}, + number={9}, + pages={1374--1382}, + year={1994}, + publisher={IEEE} +} + + +@book{ECSS‐E‐ST‐70‐11C, + title = {Space segment operability}, + month = {31 July }, + year={2008}, + number = {ECSS-E-ST-70-11C} +} + + +@book{ECSS-E-ST-60-30C, + title = {Satellite attitude and orbit control system ({AOCS}) requirements}, + month ={30 August }, + year={2013}, + number = {ECSS-E-ST-60-30C} +} + +@book{ASRA, +title={Avionics {S}ystem {R}eference {A}rchitecture ({ASRA})}, +publisher={ESA contract {4 000 102 927}} +} \ No newline at end of file diff --git a/doc/Rapport post-doc/readme.txt b/doc/Rapport post-doc/readme.txt new file mode 100644 index 0000000..47161bd --- /dev/null +++ b/doc/Rapport post-doc/readme.txt @@ -0,0 +1,30 @@ +Dear LLNCS user, + +The files in this directory belong to the LaTeX2e package for +Lecture Notes in Computer Science (LNCS) of Springer-Verlag. + +It consists of the following files: + + readme.txt this file + + history.txt the version history of the package + + llncs.cls the LaTeX2e document class + + llncs.dem the sample input file + + llncs.doc the documentation of the class (LaTeX source) + llncsdoc.pdf the documentation of the class (PDF version) + llncsdoc.sty the modification of the class for the documentation + llncs.ind an external (faked) author index file + subjidx.ind subject index demo from the Springer book package + llncs.dvi the resultig DVI file (remember to use binary transfer!) + + sprmindx.sty supplementary style file for MakeIndex + (usage: makeindex -s sprmindx.sty ) + + splncs03.bst current LNCS BibTeX style with alphabetic sorting + + aliascnt.sty part of the Oberdiek bundle; allows more control over + the counters associated to any numbered item + remreset.sty by David Carlisle diff --git a/doc/Rapport post-doc/remreset.sty b/doc/Rapport post-doc/remreset.sty new file mode 100644 index 0000000..b53de58 --- /dev/null +++ b/doc/Rapport post-doc/remreset.sty @@ -0,0 +1,39 @@ + +% remreset package +%%%%%%%%%%%%%%%%%% + +% Copyright 1997 David carlisle +% This file may be distributed under the terms of the LPPL. +% See 00readme.txt for details. + +% 1997/09/28 David Carlisle + +% LaTeX includes a command \@addtoreset that is used to declare that +% a counter should be reset every time a second counter is incremented. + +% For example the book class has a line +% \@addtoreset{footnote}{chapter} +% So that the footnote counter is reset each chapter. + +% If you wish to bas a new class on book, but without this counter +% being reset, then standard LaTeX gives no simple mechanism to do +% this. + +% This package defines |\@removefromreset| which just undoes the effect +% of \@addtorest. So for example a class file may be defined by + +% \LoadClass{book} +% \@removefromreset{footnote}{chapter} + + +\def\@removefromreset#1#2{{% + \expandafter\let\csname c@#1\endcsname\@removefromreset + \def\@elt##1{% + \expandafter\ifx\csname c@##1\endcsname\@removefromreset + \else + \noexpand\@elt{##1}% + \fi}% + \expandafter\xdef\csname cl@#2\endcsname{% + \csname cl@#2\endcsname}}} + + diff --git a/doc/Rapport post-doc/splncs03.bst b/doc/Rapport post-doc/splncs03.bst new file mode 100644 index 0000000..3279169 --- /dev/null +++ b/doc/Rapport post-doc/splncs03.bst @@ -0,0 +1,1519 @@ +%% BibTeX bibliography style `splncs03' +%% +%% BibTeX bibliography style for use with numbered references in +%% Springer Verlag's "Lecture Notes in Computer Science" series. +%% (See Springer's documentation for llncs.cls for +%% more details of the suggested reference format.) Note that this +%% file will not work for author-year style citations. +%% +%% Use \documentclass{llncs} and \bibliographystyle{splncs03}, and cite +%% a reference with (e.g.) \cite{smith77} to get a "[1]" in the text. +%% +%% This file comes to you courtesy of Maurizio "Titto" Patrignani of +%% Dipartimento di Informatica e Automazione Universita' Roma Tre +%% +%% ================================================================================================ +%% This was file `titto-lncs-02.bst' produced on Wed Apr 1, 2009 +%% Edited by hand by titto based on `titto-lncs-01.bst' (see below) +%% +%% CHANGES (with respect to titto-lncs-01.bst): +%% - Removed the call to \urlprefix (thus no "URL" string is added to the output) +%% ================================================================================================ +%% This was file `titto-lncs-01.bst' produced on Fri Aug 22, 2008 +%% Edited by hand by titto based on `titto.bst' (see below) +%% +%% CHANGES (with respect to titto.bst): +%% - Removed the "capitalize" command for editors string "(eds.)" and "(ed.)" +%% - Introduced the functions titto.bbl.pages and titto.bbl.page for journal pages (without "pp.") +%% - Added a new.sentence command to separate with a dot booktitle and series in the inproceedings +%% - Commented all new.block commands before urls and notes (to separate them with a comma) +%% - Introduced the functions titto.bbl.volume for handling journal volumes (without "vol." label) +%% - Used for editors the same name conventions used for authors (see function format.in.ed.booktitle) +%% - Removed a \newblock to avoid long spaces between title and "In: ..." +%% - Added function titto.space.prefix to add a space instead of "~" after the (removed) "vol." label +%% ================================================================================================ +%% This was file `titto.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% merlin.mbs (with options: `vonx,nm-rvvc,yr-par,jttl-rm,volp-com,jwdpg,jwdvol,numser,ser-vol,jnm-x,btit-rm,bt-rm,edparxc,bkedcap,au-col,in-col,fin-bare,pp,ed,abr,mth-bare,xedn,jabr,and-com,and-com-ed,xand,url,url-blk,em-x,nfss,') +%% ---------------------------------------- +%% *** Tentative .bst file for Springer LNCS *** +%% +%% Copyright 1994-2007 Patrick W Daly + % =============================================================== + % IMPORTANT NOTICE: + % This bibliographic style (bst) file has been generated from one or + % more master bibliographic style (mbs) files, listed above. + % + % This generated file can be redistributed and/or modified under the terms + % of the LaTeX Project Public License Distributed from CTAN + % archives in directory macros/latex/base/lppl.txt; either + % version 1 of the License, or any later version. + % =============================================================== + % Name and version information of the main mbs file: + % \ProvidesFile{merlin.mbs}[2007/04/24 4.20 (PWD, AO, DPC)] + % For use with BibTeX version 0.99a or later + %------------------------------------------------------------------- + % This bibliography style file is intended for texts in ENGLISH + % This is a numerical citation style, and as such is standard LaTeX. + % It requires no extra package to interface to the main text. + % The form of the \bibitem entries is + % \bibitem{key}... + % Usage of \cite is as follows: + % \cite{key} ==>> [#] + % \cite[chap. 2]{key} ==>> [#, chap. 2] + % where # is a number determined by the ordering in the reference list. + % The order in the reference list is alphabetical by authors. + %--------------------------------------------------------------------- + +ENTRY + { address + author + booktitle + chapter + edition + editor + eid + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + school + series + title + type + url + volume + year + } + {} + { label } +INTEGERS { output.state before.all mid.sentence after.sentence after.block } +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} +STRINGS { s t} +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ +% newline$ +% "\newblock " write$ % removed for titto-lncs-01 + " " write$ % to avoid long spaces between title and "In: ..." + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} +FUNCTION {fin.entry} +{ duplicate$ empty$ + 'pop$ + 'write$ + if$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + + +FUNCTION {add.colon} +{ duplicate$ empty$ + 'skip$ + { ":" * add.blank } + if$ +} + +FUNCTION {date.block} +{ + new.block +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} +STRINGS {z} +FUNCTION {remove.dots} +{ 'z := + "" + { z empty$ not } + { z #1 #1 substring$ + z #2 global.max$ substring$ 'z := + duplicate$ "." = 'pop$ + { * } + if$ + } + while$ +} +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} +FUNCTION {emphasize} +{ skip$ } +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} +FUNCTION {titto.space.prefix} % always introduce a space +{ duplicate$ text.length$ #3 < + { " " } + { " " } + if$ + swap$ +} + + +FUNCTION {capitalize} +{ "u" change.case$ "t" change.case$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + % Here are the language-specific definitions for explicit words. + % Each function has a name bbl.xxx where xxx is the English word. + % The language selected here is ENGLISH +FUNCTION {bbl.and} +{ "and"} + +FUNCTION {bbl.etal} +{ "et~al." } + +FUNCTION {bbl.editors} +{ "eds." } + +FUNCTION {bbl.editor} +{ "ed." } + +FUNCTION {bbl.edby} +{ "edited by" } + +FUNCTION {bbl.edition} +{ "edn." } + +FUNCTION {bbl.volume} +{ "vol." } + +FUNCTION {titto.bbl.volume} % for handling journals +{ "" } + +FUNCTION {bbl.of} +{ "of" } + +FUNCTION {bbl.number} +{ "no." } + +FUNCTION {bbl.nr} +{ "no." } + +FUNCTION {bbl.in} +{ "in" } + +FUNCTION {bbl.pages} +{ "pp." } + +FUNCTION {bbl.page} +{ "p." } + +FUNCTION {titto.bbl.pages} % for journals +{ "" } + +FUNCTION {titto.bbl.page} % for journals +{ "" } + +FUNCTION {bbl.chapter} +{ "chap." } + +FUNCTION {bbl.techrep} +{ "Tech. Rep." } + +FUNCTION {bbl.mthesis} +{ "Master's thesis" } + +FUNCTION {bbl.phdthesis} +{ "Ph.D. thesis" } + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"Jun."} + +MACRO {jul} {"Jul."} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sep."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + +MACRO {acmcs} {"ACM Comput. Surv."} + +MACRO {acta} {"Acta Inf."} + +MACRO {cacm} {"Commun. ACM"} + +MACRO {ibmjrd} {"IBM J. Res. Dev."} + +MACRO {ibmsj} {"IBM Syst.~J."} + +MACRO {ieeese} {"IEEE Trans. Software Eng."} + +MACRO {ieeetc} {"IEEE Trans. Comput."} + +MACRO {ieeetcad} + {"IEEE Trans. Comput. Aid. Des."} + +MACRO {ipl} {"Inf. Process. Lett."} + +MACRO {jacm} {"J.~ACM"} + +MACRO {jcss} {"J.~Comput. Syst. Sci."} + +MACRO {scp} {"Sci. Comput. Program."} + +MACRO {sicomp} {"SIAM J. Comput."} + +MACRO {tocs} {"ACM Trans. Comput. Syst."} + +MACRO {tods} {"ACM Trans. Database Syst."} + +MACRO {tog} {"ACM Trans. Graphic."} + +MACRO {toms} {"ACM Trans. Math. Software"} + +MACRO {toois} {"ACM Trans. Office Inf. Syst."} + +MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} + +MACRO {tcs} {"Theor. Comput. Sci."} + +FUNCTION {bibinfo.check} +{ swap$ + duplicate$ missing$ + { + pop$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ pop$ + } + { swap$ + pop$ + } + if$ + } + if$ +} +FUNCTION {bibinfo.warn} +{ swap$ + duplicate$ missing$ + { + swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ + "" + } + { duplicate$ empty$ + { + swap$ "empty " swap$ * " in " * cite$ * warning$ + } + { swap$ + pop$ + } + if$ + } + if$ +} +FUNCTION {format.url} +{ url empty$ + { "" } +% { "\urlprefix\url{" url * "}" * } + { "\url{" url * "}" * } % changed in titto-lncs-02.bst + if$ +} + +INTEGERS { nameptr namesleft numnames } + + +STRINGS { bibinfo} + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{vv~}{ll}{, jj}{, f{.}.}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + "," * + t "others" = + { + " " * bbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} +FUNCTION {format.names.ed} +{ + 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{f{.}.~}{vv~}{ll}{ jj}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + "," * + t "others" = + { + + " " * bbl.etal * + } + { " " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ +} +FUNCTION {format.authors} +{ author "author" format.names +} +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { + " " * + get.bbl.editor +% capitalize + "(" swap$ * ")" * + * + } + if$ +} +FUNCTION {format.note} +{ + note empty$ + { "" } + { note #1 #1 substring$ + duplicate$ "{" = + 'skip$ + { output.state mid.sentence = + { "l" } + { "u" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + } + if$ +} + +FUNCTION {format.title} +{ title + duplicate$ empty$ 'skip$ + { "t" change.case$ } + if$ + "title" bibinfo.check +} +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {n.dashify} +{ + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.in capitalize + ":" * + " " * } + +FUNCTION {format.date} +{ + month "month" bibinfo.check + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + remove.dots + } + if$ + duplicate$ empty$ + 'skip$ + { + before.all 'output.state := + " (" swap$ * ")" * + } + if$ +} +FUNCTION {format.btitle} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + } + if$ +} +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.prefix + "volume" bibinfo.check * * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + { emphasize ", " * swap$ * } + if$ + "volume and number" number either.or.check + } + if$ +} +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { output.state mid.sentence = + { bbl.number } + { bbl.number capitalize } + if$ + number tie.or.space.prefix "number" bibinfo.check * * + series empty$ + { "there's a number but no series in " cite$ * warning$ } + { bbl.in space.word * + series "series" bibinfo.check * + } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { + output.state mid.sentence = + { "l" } + { "t" } + if$ change.case$ + "edition" bibinfo.check + " " * bbl.edition * + } + if$ +} +INTEGERS { multiresult } +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { duplicate$ multi.page.check + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + } + if$ +} +FUNCTION {format.journal.pages} +{ pages duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ + { pop$ pop$ format.pages } + { + ", " * + swap$ + n.dashify + pages multi.page.check + 'titto.bbl.pages + 'titto.bbl.page + if$ + swap$ tie.or.space.prefix + "pages" bibinfo.check + * * + * + } + if$ + } + if$ +} +FUNCTION {format.journal.eid} +{ eid "eid" bibinfo.check + duplicate$ empty$ 'pop$ + { swap$ duplicate$ empty$ 'skip$ + { + ", " * + } + if$ + swap$ * + } + if$ +} +FUNCTION {format.vol.num.pages} % this function is used only for journal entries +{ volume field.or.null + duplicate$ empty$ 'skip$ + { +% bbl.volume swap$ tie.or.space.prefix + titto.bbl.volume swap$ titto.space.prefix +% rationale for the change above: for journals you don't want "vol." label +% hence it does not make sense to attach the journal number to the label when +% it is short + "volume" bibinfo.check + * * + } + if$ + number "number" bibinfo.check duplicate$ empty$ 'skip$ + { + swap$ duplicate$ empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + swap$ + "(" swap$ * ")" * + } + if$ * + eid empty$ + { format.journal.pages } + { format.journal.eid } + if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ +} + +FUNCTION {format.booktitle} +{ + booktitle "booktitle" bibinfo.check +} +FUNCTION {format.in.ed.booktitle} +{ format.booktitle duplicate$ empty$ 'skip$ + { +% editor "editor" format.names.ed duplicate$ empty$ 'pop$ % changed by titto + editor "editor" format.names duplicate$ empty$ 'pop$ + { + " " * + get.bbl.editor +% capitalize + "(" swap$ * ") " * + * swap$ + * } + if$ + word.in swap$ * + } + if$ +} +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + key empty$ not and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} +FUNCTION {format.thesis.type} +{ type duplicate$ empty$ + 'pop$ + { swap$ pop$ + "t" change.case$ "type" bibinfo.check + } + if$ +} +FUNCTION {format.tr.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ bbl.techrep } + 'skip$ + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ "t" change.case$ } + { tie.or.space.prefix * * } + if$ +} +FUNCTION {format.article.crossref} +{ + key duplicate$ empty$ + { pop$ + journal duplicate$ empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * warning$ } + { "journal" bibinfo.check emphasize word.in swap$ * } + if$ + } + { word.in swap$ * " " *} + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.crossref.editor} +{ editor #1 "{vv~}{ll}" format.name$ + "editor" bibinfo.check + editor num.names$ duplicate$ + #2 > + { pop$ + "editor" bibinfo.check + " " * bbl.etal + * + } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { + "editor" bibinfo.check + " " * bbl.etal + * + } + { + bbl.and space.word + * editor #2 "{vv~}{ll}" format.name$ + "editor" bibinfo.check + * + } + if$ + } + if$ + } + if$ +} +FUNCTION {format.book.crossref} +{ volume duplicate$ empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + pop$ word.in + } + { bbl.volume + capitalize + swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * + } + if$ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" * + } + { series emphasize * } + if$ + } + { key * } + if$ + } + { format.crossref.editor * } + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.incoll.inproc.crossref} +{ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { format.booktitle duplicate$ empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + } + { word.in swap$ * } + if$ + } + { word.in key * " " *} + if$ + } + { word.in format.crossref.editor * " " *} + if$ + " \cite{" * crossref * "}" * +} +FUNCTION {format.org.or.pub} +{ 't := + "" + address empty$ t empty$ and + 'skip$ + { + t empty$ + { address "address" bibinfo.check * + } + { t * + address empty$ + 'skip$ + { ", " * address "address" bibinfo.check * } + if$ + } + if$ + } + if$ +} +FUNCTION {format.publisher.address} +{ publisher "publisher" bibinfo.warn format.org.or.pub +} + +FUNCTION {format.organization.address} +{ organization "organization" bibinfo.check format.org.or.pub +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title "title" output.check + new.block + crossref missing$ + { + journal + "journal" bibinfo.check + "journal" output.check + add.blank + format.vol.num.pages output + format.date "year" output.check + } + { format.article.crossref output.nonnull + format.pages output + } + if$ +% new.block + format.url output +% new.block + format.note output + fin.entry +} +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + add.colon + } + { format.authors output.nonnull + add.colon + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + new.block + format.btitle "title" output.check + crossref missing$ + { format.bvolume output + new.block + new.sentence + format.number.series output + format.publisher.address output + } + { + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date "year" output.check +% new.block + format.url output +% new.block + format.note output + fin.entry +} +FUNCTION {booklet} +{ output.bibitem + format.authors output + add.colon + new.block + format.title "title" output.check + new.block + howpublished "howpublished" bibinfo.check output + address "address" bibinfo.check output + format.date output +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + add.colon + } + { format.authors output.nonnull + add.colon + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + new.block + format.btitle "title" output.check + crossref missing$ + { + format.bvolume output + format.chapter.pages "chapter and pages" output.check + new.block + new.sentence + format.number.series output + format.publisher.address output + } + { + format.chapter.pages "chapter and pages" output.check + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date "year" output.check +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.bvolume output + format.chapter.pages output + new.sentence + format.number.series output + format.publisher.address output + format.edition output + format.date "year" output.check + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ +% new.block + format.url output +% new.block + format.note output + fin.entry +} +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + new.sentence % added by titto + format.bvolume output + format.pages output + new.sentence + format.number.series output + publisher empty$ + { format.organization.address output } + { organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + format.date "year" output.check + } + { format.incoll.inproc.crossref output.nonnull + format.pages output + } + if$ +% new.block + format.url output +% new.block + format.note output + fin.entry +} +FUNCTION {conference} { inproceedings } +FUNCTION {manual} +{ output.bibitem + author empty$ + { organization "organization" bibinfo.check + duplicate$ empty$ 'pop$ + { output + address "address" bibinfo.check output + } + if$ + } + { format.authors output.nonnull } + if$ + add.colon + new.block + format.btitle "title" output.check + author empty$ + { organization empty$ + { + address new.block.checka + address "address" bibinfo.check output + } + 'skip$ + if$ + } + { + organization address new.block.checkb + organization "organization" bibinfo.check output + address "address" bibinfo.check output + } + if$ + format.edition output + format.date output +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.btitle + "title" output.check + new.block + bbl.mthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + add.colon + title howpublished new.block.checkb + format.title output + howpublished new.block.checka + howpublished "howpublished" bibinfo.check output + format.date output +% new.block + format.url output +% new.block + format.note output + fin.entry + empty.misc.check +} +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.btitle + "title" output.check + new.block + bbl.phdthesis format.thesis.type output.nonnull + school "school" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization "organization" bibinfo.check output + } + { format.editors output.nonnull } + if$ + add.colon + new.block + format.btitle "title" output.check + format.bvolume output + editor empty$ + { publisher empty$ + { format.number.series output } + { + new.sentence + format.number.series output + format.publisher.address output + } + if$ + } + { publisher empty$ + { + new.sentence + format.number.series output + format.organization.address output } + { + new.sentence + format.number.series output + organization "organization" bibinfo.check output + format.publisher.address output + } + if$ + } + if$ + format.date "year" output.check +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title + "title" output.check + new.block + format.tr.number output.nonnull + institution "institution" bibinfo.warn output + address "address" bibinfo.check output + format.date "year" output.check +% new.block + format.url output +% new.block + format.note output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + add.colon + new.block + format.title "title" output.check + format.date output +% new.block + format.url output +% new.block + format.note "note" output.check + fin.entry +} + +FUNCTION {default.type} { misc } +READ +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} +INTEGERS { len } +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ll{ }}{ ff{ }}{ jj{ }}" + format.name$ 't := + nameptr #1 > + { + " " * + namesleft #1 = t "others" = and + { "zzzzz" * } + { t sortify * } + if$ + } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} +FUNCTION {presort} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.organization.sort + { type$ "manual" = + 'author.organization.sort + 'author.sort + if$ + } + if$ + } + if$ + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} +ITERATE {presort} +SORT +STRINGS { longest.label } +INTEGERS { number.label longest.label.width } +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\url}[1]{\texttt{#1}}" + write$ newline$ + "\providecommand{\urlprefix}{URL }" + write$ newline$ +} +EXECUTE {begin.bib} +EXECUTE {init.state.consts} +ITERATE {call.type$} +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} +EXECUTE {end.bib} +%% End of customized bst file +%% +%% End of file `titto.bst'. + + diff --git a/doc/Rapport post-doc/sprmindx.sty b/doc/Rapport post-doc/sprmindx.sty new file mode 100644 index 0000000..8f17772 --- /dev/null +++ b/doc/Rapport post-doc/sprmindx.sty @@ -0,0 +1,4 @@ +delim_0 "\\idxquad " +delim_1 "\\idxquad " +delim_2 "\\idxquad " +delim_n ",\\," diff --git a/doc/Rapport post-doc/subjidx.ind b/doc/Rapport post-doc/subjidx.ind new file mode 100644 index 0000000..cd678e8 --- /dev/null +++ b/doc/Rapport post-doc/subjidx.ind @@ -0,0 +1,70 @@ +% clmomu01.ind +%----------------------------------------------------------------------- +% CLMoMu01 1.0: LaTeX style files for books +% Sample index file for User's guide +% (c) Springer-Verlag HD +%----------------------------------------------------------------------- +\begin{theindex} +\item Absorption\idxquad 327 +\item Absorption of radiation \idxquad 289--292,\, 299,\,300 +\item Actinides \idxquad 244 +\item Aharonov-Bohm effect\idxquad 142--146 +\item Angular momentum\idxquad 101--112 +\subitem algebraic treatment\idxquad 391--396 +\item Angular momentum addition\idxquad 185--193 +\item Angular momentum commutation relations\idxquad 101 +\item Angular momentum quantization\idxquad 9--10,\,104--106 +\item Angular momentum states\idxquad 107,\,321,\,391--396 +\item Antiquark\idxquad 83 +\item $\alpha$-rays\idxquad 101--103 +\item Atomic theory\idxquad 8--10,\,219--249,\,327 +\item Average value\newline ({\it see also\/} Expectation value) +15--16,\,25,\,34,\,37,\,357 +\indexspace +\item Baker-Hausdorff formula\idxquad 23 +\item Balmer formula\idxquad 8 +\item Balmer series\idxquad 125 +\item Baryon\idxquad 220,\,224 +\item Basis\idxquad 98 +\item Basis system\idxquad 164,\,376 +\item Bell inequality\idxquad 379--381,\,382 +\item Bessel functions\idxquad 201,\,313,\,337 +\subitem spherical\idxquad 304--306,\, 309,\, 313--314,\,322 +\item Bound state\idxquad 73--74,\,78--79,\,116--118,\,202,\, 267,\, +273,\,306,\,348,\,351 +\item Boundary conditions\idxquad 59,\, 70 +\item Bra\idxquad 159 +\item Breit-Wigner formula\idxquad 80,\,84,\,332 +\item Brillouin-Wigner perturbation theory\idxquad 203 +\indexspace +\item Cathode rays\idxquad 8 +\item Causality\idxquad 357--359 +\item Center-of-mass frame\idxquad 232,\,274,\,338 +\item Central potential\idxquad 113--135,\,303--314 +\item Centrifugal potential\idxquad 115--116,\,323 +\item Characteristic function\idxquad 33 +\item Clebsch-Gordan coefficients\idxquad 191--193 +\item Cold emission\idxquad 88 +\item Combination principle, Ritz's\idxquad 124 +\item Commutation relations\idxquad 27,\,44,\,353,\,391 +\item Commutator\idxquad 21--22,\,27,\,44,\,344 +\item Compatibility of measurements\idxquad 99 +\item Complete orthonormal set\idxquad 31,\,40,\,160,\,360 +\item Complete orthonormal system, {\it see}\newline +Complete orthonormal set +\item Complete set of observables, {\it see\/} Complete +set of operators +\indexspace +\item Eigenfunction\idxquad 34,\,46,\,344--346 +\subitem radial\idxquad 321 +\subsubitem calculation\idxquad 322--324 +\item EPR argument\idxquad 377--378 +\item Exchange term\idxquad 228,\,231,\,237,\,241,\,268,\,272 +\indexspace +\item $f$-sum rule\idxquad 302 +\item Fermi energy\idxquad 223 +\indexspace +\item H$^+_2$ molecule\idxquad 26 +\item Half-life\idxquad 65 +\item Holzwarth energies\idxquad 68 +\end{theindex} diff --git a/doc/Rapport post-doc/tina.bib b/doc/Rapport post-doc/tina.bib new file mode 100644 index 0000000..438a6a5 --- /dev/null +++ b/doc/Rapport post-doc/tina.bib @@ -0,0 +1,103 @@ +@article{berthomieu2004tool, + title={The tool {TINA}--Construction of Abstract State Spaces for Petri nets and Time Petri nets}, + author={Berthomieu, Bernard and Ribet, P-O and Vernadat, Fran{\c{c}}ois}, + journal={International Journal of Production Research}, + volume={42}, + number={14}, + year={2004} +} + +@inproceedings{berthomieu2008fiacre, + title={Fiacre: an intermediate language for model verification in the topcased environment}, + author={Berthomieu, Bernard and Bodeveix, Jean-Paul and Farail, Patrick and Filali, Mamoun and Garavel, Hubert and Gaufillet, Pierre and Lang, Frederic and Vernadat, Fran{\c{c}}ois}, + booktitle={ERTS 2008}, + year={2008} +} + +@inproceedings{berthomieu2010formal, + title={Formal Verification of AADL models with Fiacre and Tina}, + author={Berthomieu, Bernard and Bodeveix, Jean-Paul and Dal Zilio, Silvano and Dissaux, Pierre and Filali, Mamoun and Gaufillet, Pierre and Heim, Sebastien and Vernadat, Fran{\c{c}}ois}, + booktitle={ERTSS 2010-Embedded Real-Time Software and Systems}, + pages={1--9}, + year={2010} +} + +@Article{BM83, + author = "B. Berthomieu and M. Menasche", + title = "An Enumerative Approach for Analyzing Time {P}etri Nets.", + journal = "IFIP Congress Series", + volume = "9", + pages = "41--46", + publisher = "Elsevier Science Publ. Comp. (North Holland)", + year = "1983", +} + +@Article{BRV04, + author = {Berthomieu, B. and Ribet, P.O. and Vernadat, F.}, + title = {The tool {T}INA -- Construction of Abstract State Spaces for {P}etri + {N}ets and Time Petri Nets}, + journal = {International Journal of Production Research}, + volume = 42, + number = 14, + year = 2004} + +@incollection{berthomieu2014model, + title={Model-Checking Real-Time Properties of an Aircraft Landing Gear System Using Fiacre}, + author={Berthomieu, B. and Dal Zilio, S. and Fronc, {\L}.}, + booktitle={ABZ 2014: The Landing Gear Case Study}, + pages={110--125}, + year={2014}, + publisher={Springer} +} + +@article{zilio2015latency, + title={Latency Analysis of an Aerial Video Tracking System Using Fiacre and Tina}, + author={Dal Zilio, S. and Berthomieu, B. and Le Botlan, D.}, + journal={arXiv preprint arXiv:1509.06506}, + year={2015} +} + +@inproceedings{bourdil2014model, + title={Model-Checking Real-Time Properties of an Auto Flight Control System Function}, + author={Bourdil, P.-A. and Berthomieu, B. and Jenn, E.}, + booktitle={IEEE ISSREW}, + year={2014} +} + +@article{rangra2014sdl, + title={{SDL} to {Fiacre} translation}, + author={Rangra, S. and Gaudin, E.}, + journal={Embedded Real-Time Software and Systems, Toulouse}, + year={2014} +} + +@article{bouyer2004updatable, + title={Updatable timed automata}, + author={Bouyer, Patricia and Dufourd, Catherine and Fleury, Emmanuel and Petit, Antoine}, + journal={Theoretical Computer Science}, + volume={321}, + number={2-3}, + pages={291--345}, + year={2004}, + publisher={Elsevier} +} + +@article{larsen1997uppaal, + title={UPPAAL in a nutshell}, + author={Larsen, Kim G and Pettersson, Paul and Yi, Wang}, + journal={International journal on software tools for technology transfer}, + volume={1}, + number={1-2}, + pages={134--152}, + year={1997}, + publisher={Springer} +} + +@inproceedings{griffault2004mec, + title={The mec 5 model-checker}, + author={Griffault, Alain and Vincent, Aymeric}, + booktitle={International Conference on Computer Aided Verification}, + pages={488--491}, + year={2004}, + organization={Springer} +} \ No newline at end of file diff --git a/doc/TODO b/doc/TODO new file mode 100644 index 0000000..677a421 --- /dev/null +++ b/doc/TODO @@ -0,0 +1 @@ +nettoyer les diracs: on fait des calculs de proba des mev inutiles juste pour bouffer les diracs \ No newline at end of file diff --git a/doc/altarica-syntax.pdf b/doc/altarica-syntax.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b413d7b39319328da25f9909cbbec1058172512a GIT binary patch literal 205146 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

I0<6RRiGOkDFS@kCSRG|VVps64yjpGN)H5AjU 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 b{oroy=C1CvH7j5&gOSFuZk?*u7LNY`avG}D literal 0 HcmV?d00001 diff --git a/doc/boundedcont.pdf b/doc/boundedcont.pdf new file mode 100644 index 0000000000000000000000000000000000000000..67b903fcdc76c3eba58f305d9952ca9b7ce164b0 GIT binary patch literal 53049 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 literal 0 HcmV?d00001 diff --git a/doc/quickstart.aux b/doc/quickstart.aux new file mode 100644 index 0000000..1a8ce2d --- /dev/null +++ b/doc/quickstart.aux @@ -0,0 +1,22 @@ +\relax +\@writefile{toc}{\contentsline {section}{\numberline {1}Preliminaries}{1}} +\@writefile{toc}{\contentsline {section}{\numberline {2}Use}{2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Model file}{2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Init file}{2}} +\newlabel{init}{{2.2}{3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Query specification}{3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {2.4}Algorithm selection}{4}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.4.1}Discrete time}{4}} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.4.2}Continuous time}{4}} +\@writefile{toc}{\contentsline {section}{\numberline {3}Output}{5}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Textual output}{5}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Graphical output for continuous time algorithms}{6}} +\newlabel{nobounds}{{1(a)}{6}} +\newlabel{sub@nobounds}{{(a)}{6}} +\newlabel{bounds}{{1(b)}{6}} +\newlabel{sub@bounds}{{(b)}{6}} +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Output examples for continuous time algorithms}}{6}} +\@writefile{lof}{\contentsline {subfigure}{\numberline{(a)}{\ignorespaces {no bounds}}}{6}} +\@writefile{lof}{\contentsline {subfigure}{\numberline{(b)}{\ignorespaces {bounds}}}{6}} +\newlabel{output}{{1}{6}} +\@writefile{toc}{\contentsline {section}{\numberline {4}Note on queries}{6}} diff --git a/doc/quickstart.log b/doc/quickstart.log new file mode 100644 index 0000000..bca5948 --- /dev/null +++ b/doc/quickstart.log @@ -0,0 +1,246 @@ +This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) (preloaded format=pdflatex 2016.4.22) 5 OCT 2016 17:43 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**quickstart.tex +(./quickstart.tex +LaTeX2e <2016/02/01> +Babel <3.9q> and hyphenation patterns for 5 language(s) loaded. +(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2014/09/29 v1.4h Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option) +) +\c@part=\count79 +\c@section=\count80 +\c@subsection=\count81 +\c@subsubsection=\count82 +\c@paragraph=\count83 +\c@subparagraph=\count84 +\c@figure=\count85 +\c@table=\count86 +\abovecaptionskip=\skip41 +\belowcaptionskip=\skip42 +\bibindent=\dimen102 +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/verbatim.sty +Package: verbatim 2014/10/28 v1.5q LaTeX2e package for verbatim enhancements +\every@verbatim=\toks14 +\verbatim@line=\toks15 +\verbatim@in@stream=\read1 +) +(/usr/share/texlive/texmf-dist/tex/latex/subfigure/subfigure.sty +Package: subfigure 2002/03/15 v2.1.5 subfigure package +\subfigtopskip=\skip43 +\subfigcapskip=\skip44 +\subfigcaptopadj=\dimen103 +\subfigbottomskip=\skip45 +\subfigcapmargin=\dimen104 +\subfiglabelskip=\skip46 +\c@subfigure=\count87 +\c@lofdepth=\count88 +\c@subtable=\count89 +\c@lotdepth=\count90 + +**************************************** +* Local config file subfigure.cfg used * +**************************************** +(/usr/share/texlive/texmf-dist/tex/latex/subfigure/subfigure.cfg) +\subfig@top=\skip47 +\subfig@bottom=\skip48 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2014/10/28 v1.0g Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks16 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2016/01/03 v1.0q Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg +File: graphics.cfg 2010/04/23 v1.9 graphics configuration of TeX Live +) +Package graphics Info: Driver file: pdftex.def on input line 95. + +(/usr/share/texlive/texmf-dist/tex/latex/pdftex-def/pdftex.def +File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty +Package: infwarerr 2010/04/08 v1.3 Providing info/warning/error messages (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty +Package: ltxcmds 2011/11/09 v1.22 LaTeX kernel commands for general use (HO) +) +\Gread@gobject=\count91 +)) +\Gin@req@height=\dimen105 +\Gin@req@width=\dimen106 +) +(./quickstart.aux) +\openout1 = `quickstart.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 12. +LaTeX Font Info: ... okay on input line 12. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 12. +LaTeX Font Info: ... okay on input line 12. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 12. +LaTeX Font Info: ... okay on input line 12. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 12. +LaTeX Font Info: ... okay on input line 12. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 12. +LaTeX Font Info: ... okay on input line 12. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 12. +LaTeX Font Info: ... okay on input line 12. + +(/usr/share/texlive/texmf-dist/tex/context/base/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count92 +\scratchdimen=\dimen107 +\scratchbox=\box26 +\nofMPsegments=\count93 +\nofMParguments=\count94 +\everyMPshowfont=\toks17 +\MPscratchCnt=\count95 +\MPscratchDim=\dimen108 +\MPnumerator=\count96 +\makeMPintoPDFobject=\count97 +\everyMPtoPDFconversion=\toks18 +) (/usr/share/texlive/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty +Package: pdftexcmds 2011/11/29 v0.20 Utility functions of pdfTeX for LuaTeX (HO +) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifluatex.sty +Package: ifluatex 2010/03/01 v1.3 Provides the ifluatex switch (HO) +Package ifluatex Info: LuaTeX not detected. +) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty +Package: ifpdf 2011/01/30 v2.3 Provides the ifpdf switch (HO) +Package ifpdf Info: pdfTeX in PDF mode is detected. +) +Package pdftexcmds Info: LuaTeX not detected. +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty +Package: epstopdf-base 2010/02/09 v2.5 Base part for package epstopdf + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grfext.sty +Package: grfext 2010/08/19 v1.1 Manage graphics extensions (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/kvdefinekeys.sty +Package: kvdefinekeys 2011/04/07 v1.3 Define keys (HO) +)) +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty +Package: kvoptions 2011/06/30 v3.11 Key value format for package options (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty +Package: kvsetkeys 2012/04/25 v1.16 Key value parser (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/etexcmds.sty +Package: etexcmds 2011/02/16 v1.5 Avoid name clashes with e-TeX commands (HO) +Package etexcmds Info: Could not find \expanded. +(etexcmds) That can mean that you are not using pdfTeX 1.50 or +(etexcmds) that some package has redefined \expanded. +(etexcmds) In the latter case, load this package earlier. +))) +Package grfext Info: Graphics extension search list: +(grfext) [.png,.pdf,.jpg,.mps,.jpeg,.jbig2,.jb2,.PNG,.PDF,.JPG,.JPE +G,.JBIG2,.JB2,.eps] +(grfext) \AppendGraphicsExtensions on input line 452. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <12> on input line 14. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <8> on input line 14. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <6> on input line 14. +LaTeX Font Info: Try loading font information for OMS+cmr on input line 26. + +(/usr/share/texlive/texmf-dist/tex/latex/base/omscmr.fd +File: omscmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10> not available +(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 26. + [1 + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <7> on input line 77. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <5> on input line 77. + [2] [3] [4] +Overfull \hbox (15.9971pt too wide) in paragraph at lines 270--270 + []\OT1/cmtt/m/n/10 Check [recall of user selected algorithm] (Pr[f1Uf2](0,h) > += t):[] + [] + + +Overfull \hbox (15.9971pt too wide) in paragraph at lines 287--287 + []\OT1/cmtt/m/n/10 probability: [either a value for unbounded versions or some +thing[] + [] + +[5] +File: cont.pdf Graphic file (type pdf) + +Package pdftex.def Info: cont.pdf used on input line 323. +(pdftex.def) Requested size: 172.5pt x 128.6861pt. + + +File: boundedcont.pdf Graphic file (type pdf) + +Package pdftex.def Info: boundedcont.pdf used on input line 327. +(pdftex.def) Requested size: 155.24895pt x 128.45428pt. + +[6 <./cont.pdf> <./boundedcont.pdf>] +Overfull \hbox (16.25519pt too wide) in paragraph at lines 376--376 +[] \OT1/cmtt/m/n/8 [] + [] + + +Overfull \hbox (7.75507pt too wide) in paragraph at lines 382--382 +[] \OT1/cmtt/m/n/8 [] + [] + +[7] (./quickstart.aux) ) +Here is how much of TeX's memory you used: + 1717 strings out of 494924 + 24547 string characters out of 6179708 + 81319 words of memory out of 5000000 + 5004 multiletter control sequences out of 15000+600000 + 8577 words of font info for 31 fonts, out of 8000000 for 9000 + 14 hyphenation exceptions out of 8191 + 37i,6n,24p,236b,297s stack positions out of 5000i,500n,10000p,200000b,80000s +< +/usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb> +Output written on quickstart.pdf (7 pages, 254520 bytes). +PDF statistics: + 92 PDF objects out of 1000 (max. 8388607) + 64 compressed objects within 1 object stream + 0 named destinations out of 1000 (max. 500000) + 11 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/doc/quickstart.pdf b/doc/quickstart.pdf new file mode 100644 index 0000000000000000000000000000000000000000..591f0184aec2cbdbbbd903e8d5aa113a94db6e69 GIT binary patch literal 254520 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%0A@idb6>(dvtJn*ryndTI`ZDyM$?B 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

nwdlD;YZvLLvQ9IKWLoK|c0ixxRN!;{| zaPB06NSax0TG8~TB8eWn!bVgmrF4aHLbX%t8RpIuyR8G{W|u3@{^)Zza6T#cKM&#$^%hb2 z2V*r`;@un95SOi}OEY@t1hwY7`&5&PI6>=)K0!hg?@K+~Y{uUHxGvv@CW`Srk0$8>u=S@Hnk`6>u1e{=E7_ zyK<9H#Y(H(G;F)CgUWJ1_OxXFFxvUQ9X z^U~b(DbSM^VeCxGcBpxH67;Ge6wSS7Jlc*~NJgiA4!>j+9WoNG4T=ic4WhAal}6xI zS_?PC${<8iXF4#Mdh_HVD>#Gmsu8q z6uk@T1}5t&+9C8<=qEPW?^2=%vs!J({F2WOY=Q(*u~DY9POstv5E+n&bvpfbXh^>c z>pWQ!*btg%wW~etUNFWmVfY;}MuF zJpAt8S$Zr&{*mF$Xp@cwxQqJ}g4Jzv$2GH@e)_j_H6l$5U@Vp8Mj}`?yW@hp?>U3( zaXbZpFhEqHC3}|9!f(Mjg=UZ#UDw01wxs19P*RgNxGRx^)a*6I$rg!2dDJ+{E_gSE zxT_o|77X5VACB4sV#t@#ns_cnvxl)H@8rcrlWa5p&DNpO_TBQsk7ve&Kw{rJ%igNm zB~}2TqoXjbP6@l$Z3WoprHEmnlaKNm$|~^BlGBqUHG>5J_i<+B+B>lII#mo zKU0H`_#A?6m5SusL}>vvi9yX+{eO z>PqgA?|%K4x0^$ubL4%=B8dKUCF&7P;1{R zjd`{MKL{bX6%F%@2#d?2t24IUdgRem$}DB&Af#Mk9~b|m!K2GrOfah-9e{vw+DMoT2M=EBcKN1LQ0(Rc&G+zXzUVQY^rgeH}rp{Q+V!bznF z{f_(-wnilX41_o(rgG+?FJa8;E;)T`VTcrM`n(Xjaocxss&_oq92{DX%=syYAu3-f zzY1Zhe;auLCRL#P2B~;U^b7azQ?1U2$x|CbuZJz+dzauv)3W3q&w(2yNRJw!eMJx) z(WdPA8)ZlJNoN}xri4i?>#u$DjyYtbitXMl;l75WUnyujopWA4mak#W-uuWtO|K`N^weCEdwZSzo0Bm&{AQo{ zG(2pnt+tZ4*PAzmOu>5z>G9DUgF=41I37{XNu+knPXuD^n>K{7(`r%8FH)Q=+QsFa zK%jtMj=qp2LQJeWf6_xX?`5r5RmaC|#D2MsCXC#tBiyaD} zWm2il^R49p9=dal6~(Qv1;R0B75=MauGrZ_o(_5J2VRl8*}hB%|2Hti6f&7;TdhFz z{S9%21}lV7F&BOH=QHvB%l3lJ@bc;yIG~Rf)Y_*9?ag5GgI1NZ_@~H<(e0=OJkFqa zGemzgfq`q0c2{RaWUZ^FGtya_j!r$Wz%CSi8n0PoKodWq9+IWIqZdbvHdId>1)4A> zr9sTt^f|~Hhs>v3neW7sKF1OY)*^{WPj{MphQ4TjeE*Qq;dO2X`DMhShKSUo%YSA&Fs9T+BbnizwF=67PbCXQh$LP#&{1dw-Xe;RuO!;c;E}{AnzJPE8(t)Y^;E-7n9NDgdAP zlN7Pr#Nxp2(Yh+2y|z`qDBDDF%g96r0=UmBN5e{PTS6#N`iUPTin(z+$gzL>vdfUXV82yrp-Pl@DCf#PhY-GWNxi_lt$6v7rW=86 zqIThXxZisKPTUKWj<&kd*_4_yjL!OU83GJDBr^T8~ozF{$6N}+Vdt4@9aTY`CV`~ZW}KyDduStX2IeizYg^*bhwNXyzu zuJRzWJW(aPzHqS4N7zKV;y%lBc&=5jlHen164ioLo}C@XLx5f}o{8XStXe_nZjDY>1OooVN7jJi1oTg zWLO=1jO4ayk#3tNp7=6TFZ2D=);P72RgBl>Wa8oF5(It4<|L=ZchJ47ZVjqjFsIR` zV>a?n*}$l4aED==>M2z2E#gCgRWGeI9F?1;0DiuVPCNEx@K3a1Fnt1VyI=&*RaoAG zuN>2}XNahsYjtHWvKy18Q50U$_|d}N#VJ`mS>KqRzs-!f4atAU*zHPNx8IujkPja9 zqe>rUf@q=loX-*^oFrJBZb3YK2RP_cDar?qund`h`o17a zvuRIdFd9-|>75u*oKw9&{v?o@VdMOULb`xc3;)3@fy$J^_X;!^mR>+r4&!mvQ}+|a zEPS35yKwKOtikuHc0Y$KWwRqj_p!aMGfGxJa&_38f^$rPM)c)!7DU^lHr+(9Mqc{k z=Go;C@%P!zJtv53290G^-;o3KHR_g ztGrpIpn-9|z14*%#WSE+Zm$53+#SdNh&&G}99D2AI7wT>%D99~LG6L)5ufm@B``zt znkdwrb9Hk&`#h)%dXHr5mF{6Ixd`+Zz$&FuXa>(^<4!*iv^#>iIl6L@+7OO)lBG;d z;AKavhTVC$%$f3j`vFhQrE0c7cDcykKN!;Aka4msbc4OV9l`UTb)Zh`GkqYX_k8`~ zR;VkateZoLy63t`;TXNPOQh z0mbO$HV6psBgF8-pd?Fw@e3=%pU1}P^9koaNP(qXkoLhW%#XH`=0W+H)m5mRa*1vr zoL)G^w+YB)SN#*<9LIVy2FkN(YLHw@BhLMJt`L&L$8SV!jX~2A+oz^Y`*~HxLIo7< zouuz1MY?)q><=`>4);EH^B*sj)ebd#+W3cQjTel&kiUnYp34qAXZ=ek1IpE3EZ0k@ z!!k)>UhF=>Z>!;WA#aqi2|(*icxxw?J33^dTcW(CbDy+-W)9si-x}B1mFJx)`89u% zu|2MGO}KCp?NiT4KkJp)oP~BVW5qm*z1sPOjB&LHJcL1zZwPT^%6Cd6Q*Y98B!q|f zK9?cYYEne(A1c5cg5P*7t;_J!Sb!?AmXnw;@t)iKw~IwT(DdUj<#7zk8I1lpdgz;- z#)@ljbT(r}Qt2-<6|bB00)-+YUagX$0Yl-W^72yi>vp1xh;CI%o3x2MutUjQW)XBh z5}UGLGo#Jj%5YE;7}NxHhfPtPt~uIS&XVf;?E3F=ab-Tu#nbjS91$bJ#G~}EPB}wy z9$B+k+sMPLY;a|Cgn{NWDls`;Z^nOwx7kmPi)i!NSNXwtUcGV`ie5UTN5F{HvveMz zv;u-$l6;ltWtrdk@ec5!mI+@@$ z+gW0D&3S6XeQ9DkKgF%#vwGCnsDf|zyuvf%^z0~?zn;cF9wNQu$oq-8HT9V}xm#}+ zNYI1;7$F*Xu<$bDX36InMULF^*X4S^l@>-Hb%9$@2{k5u<}fdTtdXx401XnfvxxWXqLUhJ3tjaN>RL?XbPy>5UsTx2rt~Y;`7D`%U z&G8U2+7$SnejcQuhqhtebijuQyP~)19cpjW%-v0m>d1geR@a_P*>#wY_CAXL-pCiM z6E%+vEap#SNkN37JG!6pT$x^DaMf8a(xOzzIX?<^y9gt(5*7~C!v5e~wx(jTbRdD4 zHXQ#&Q3viP%Ri};ECIPND(RHclyFJ?)tI2%b5>TZf%z!rEdT2|Q4+@1JWN*8y(rZV3`c9Y0Rxd@@Kn?~;FpYNO zJ+hyqQKlL=Xt{>It%j2$I#4tzB z9AGDGC0ko&OVxXeL1281aG@@M7fYReGVH>$H2-Th$lxMZl+MCG!x9kUphxmXqDfJ7 z93UmoTvr=biC3j)hpa%cNhE1a;3B#R#a;Yb?1jIcR?lG6(QVY-(d{(mpT$m3Q><_K5%3>v6XoT#mu-=m$n(uge)nd(sQ12+( z;O8t;!$G5wy=QCJ&b-4U&2G%IL37>NENpwIloC?iEFIrF_8MX3ilrP~(vEHCP5IY15Bmto;38pF8 ziPK)FL|iC78{dl;V_PU(jyIE_B6V*~HXf!H%9avM#X}o4qAd&Z6N8;9YdLSHqv;)B zpSSb6NzAMk`CjtL(JEa5;Ogn98{}leo1Ge{fc?B7*OW_goD*4D+)GvHoeHD1++DRm z91pw5AtYq;Mb)sen?i!x7^UAcPqSi*ufJBnAIei>E^Wiu5ruSqpGNOYLl!4Oq1Sn7Kv#n7m`Jq4PCw2G1jv0r4cBncP2}3g)a+DOKzSQ z>sQ(5d);tI6WslU>5EXw9dv_elY&F?Nm@p3^L|^xsuX9{*;`CSK7B1m#(A2>PO^IX z+&HMZ9xLuZXt|1i6vd9y2ovcw)Mu#~DLD6Bb9 z_5g<`*RnDTK9^|U^F4M8V_YgR#T8d5Ehk)J(@4X8ZSJKvtRjOK9`nm-tIn0$L?ZTY zD=dwjYQ5F2>g|S-GmP}CV5>l$R~#X{?VZMxDZy;bN&3>_JP*vFa>v#-qy(3^oyvPk zusN#tJvp9Z@@weY)hlJ9EHifnaw2`uZQN9^jgWG3%r}E^%1tXMo4YO|7~W#qQzHHb z6zl|MT5zUa4=qfLTV?;atuHiD>VD=fWl@n;4$MSjQa#jp^C-m`U!&Vfc!Vb?) z<(?WFcph6WY}|ft%tZaV9Ie0f0E4S*E}n9gdE?Au@9`z(Qk2`9hK7n$Lf8rSqD;{G z;Pp1E^8j~E&@toGc(jLrN)2lK7+*Po04gooTzkxi-2r}=t7c)$@n6o+J;rq?$+5jq zZ|eNko^>hbf5Lc8y82!YW`g1atcAn$^=H{Sh;KO4AlG~Stn>-R_X}Nt_6Lmw7N>qm zw4VyeKGPAyp=d9UC+Qqpb%_l0A|yG49{^~qZynwUemp0QiuWIHkq8sv zzlENd`-^EC6^rYn5(P5-v^>&d+206}U@IWzC}K>yVsBQ{C4^hzcD66?DYw2QivvEB z3(FL)W5ZJuqlhAh#H;j;OT;PdfJC^opg4DC&SGRAi-&l|H@|W``F)>tlw_o;eqPZV zA>5$te)pau$vb0P>eNXI-~DW4h1hr3+)wAOg1s#vA6Ed``pf`r!J6OAkC>}9@EvKz0xj1;Q-TXubQy^YuVw{czP3iCbB zji9&8>m6W6hj-OlAzcZ7j|_l;VfnmZVYImZz5*RoU)r062;-Uy>!`42c+60{kdq<5 z6T(WMlKLjQT}(Lyq+J&ZoEosx4}oGPDHgQ`JACMCAvI8L)bQ=|)TY{447s^g3^LEK zFK*f*IDPfF$1a>C8)x)v%}7|Dt-|@ zw=z?z=5kOp$?*&r8$es!waUHn0NnBv>GCl$UBAtn=_nm0^Rn#ln3#uwBmGLevM#UUAv@Un}34SVYpD6AtY*;J34s+YS zBd3oR5uet6rr&ZbASaAX8F}W2rfBY^cjF>NF+($uPMbyP!nPjn8K#hQbD8lz4bjiO z%Gy`1fe9;P!J#xopy5PM2l%e)Dd0c5op@Yal<+w!Z2Xi!4|xNq!ybad{5WBT1x$s= z*Rk=RsOMX8{q{64cUk|xo)at-y72+B7cXKM9rRGbr%J_d za9}S*rVbKhb{b$u%)L`FP(iUp7bMDCj`($85wv$v@^PRuF0ZkiFspYVi~`w1!JD)L4jq{0L&m@y)*o@-NA;035H^LTO=HGzJdM0Dw%n zPSmI#%Wte2zG}8`yxu@cL0*|RzHfW}^iaAX-zUR&t>a~&ezuFCn6(u?U`Lz}eo$BL zYA|&iJ_j7;l0QKZa7nOMshN25+p|b=6C82_1oc23#^BxTH~kt#C2qsbB6Ts_#7B8y zFD21eC5@OW@kc|OND4zMHm!-VohwQSzw5e{vBa~@^qNU<@B1u^OvOJ!ZH zyIs_Si5_+F2(P#zeAXf;u&%BAGC)*`)*|_u14VN*o8e))1c-QRyZJ!lVtNRNCz^c> zaiQI5Oeqdh5x&(E2v=7dbP$ENuLKk(&kg<2tDB(;lXa8omDC*vkAk@019nU9 zxGU!%uk$T*iHKy;dj8{mJ;Z%QRAeW1ruB=@sE?5L4r3DWqxogcdmP93DrgI+Ffaz@ zJ#Ga&1p&I)h<&K8Y0I;+-e3Y<)$mFrSksmnkX>pvwi)jgT-Srbv1DLlgNrT!x3s<9 zd-O~%wpL2Y*xYuyf#*8LU1s2YV__Tbtu}`HpdNynngmn08dsvzQ!fYZJW*Gahc%cc!EN#^ay{c_kl$QSt2pC``b9fnuO8B=ME zZJw5QU4*Ebn)4Ez#=c`Ycn-Ua82W7x5IiQQ39b;rOo)A{7V4?D9K|tz z!aH25u$({%Mn_Gn3k&BF&vfGAF$@Q!J4}m=p6PFK;2{uIqPd!6kArk1R4?dMU4e=Z z27D0-u)Ak@!MZ@{?6#^T|1Ai)1p)24xgJ0x)T^i`fx*k7=ra{)8kG6Tb;tgLRuDxR zngKaVgyDg0I3-ZuoEV)A*?R@KCQ0%i15#dObW=zDBdp50V3sCnN`WUQ{O-rUJ(n`& z+^FO+#QN>+U4}vX2#>ClR29ZJQW|B$g)t=stnK zYg_ASQOtmu%N7g+I858PNvAxuzWBBr?>k5F2XgQ_wd`)r*SSe-|EW1OJ2T-KSMHZ2 zLi~4fm?qrTjC0!R**Qs&4{dq>P8Y z>`fh0eIWx3^JxWDFd7RyZp%U+zP44Dv-bworE}11oA(irAb4zY`bmQ?wMlVltm{RN zZO|m7AQIHJRd%5A=Of6L+#jc8t5FuZ**w^}BXa(HMH=%tbZcPgsiA6j&4_OCE~ zveDgAzKqhH+`69W+f>sKKQZ!TACT}cQmvL`ZsBaep50z7aIGB*VQX4@nuh1KB^t(y zr3m?iIInLQlEGvQzGPV9os}GKt^Es)W%p4a;X!wk3e_dwBx*MHwB1Yjw>oR?2^K(p zyM3=)LDQb6G<kyehO9v5 z&_@EnM;xSf4kGims;CYUZY6*~AOPDbjn0Bo1I*2aC~g~EL2MZUq^M-&>__z%J09oP zCMLjGYv=u=fr*Eq+`SxuxQZ}Ll*^(jb3UN)l_}^?A6y_!J;SG5S4WxR7Ly8@AqWeW zdc)o-6^AFH)v*F%(wu_iVd)lcU5-chg@z5k_m{v2CRM7PN%h!v2!prfWFNdqSUv$W zJ02+^*?;?4UW@coja|)#UDugV!735TN$y%17k$P64j1C^I}x~n#yp0^gR zBayz`vg}*MycxXxy!fi>wqai_C2EYrXQ;V7Un zw^}2E)d%)Xxmg^;hXKX2V3vP@K6*Ye{tsg9AAs$e;JnITCa@ZIc+-1GT&KF6_-s`G%pgOZ@hnfX!G$OuSUWqBH~xy9*@{J zchuMpvvqrRYk;`e`}Y0Lnbrx|guXKxi_mvBdYbFoaf@hTWodZ)v-veEDn(07OOsC^ z`|UdUOBNhtwGEKdR5b;lL82l8KuE|)>X)4ixc9wlkK}jayV`%Zsk$(-gwpq}+J1Zb zl$)UalLHvhiyHLzZnyr(YL|2snD5?m&KXS&J!+>H?KgMyTQ>E#m;9G-;@5fZx0Qh2 zl(Lfd8Oay@%lC=T(vkADmwJbEb^Y8M%E)@xwg1FddRh8MLmOX{^6+AjX@5adJWwq^#SoPa*zG})^3dst4`ahAirYLCW-$Kt_8p6rf%fWkZ zl3%6tF4|e&Qlw`32Ie2b$uza~fA!8_d7M~-pJep)4S%@McUR}vhOTGHLFX3N*EqU6 z0d_JULDM!k`o8al*3|%?0{%g31h4?zW4uE%;CZOO(o+B)}QN;fQ>+ zzi{?+0B6WPi=I-$yH7ZZ@2vFzXUhLZU%W@(xM#Q~XP39schBJ5-{4!~jBlu2OQv7c9#r#ZTCdv44_1brRpZD1 z{J!8Cxwm@z%700I>qKnZGH-Hr+eTjZVtD#~&Tale?Mi;C?nm7gv;RQt0-yT_f(uTegy8NuNcVBM*1m6N~{SN(Rh!C2Bg}!pW&wd_wEBy}o_5esp zZAnG#rJPttw*^vJ1a90`g4}DFzmB+@j=d};lACjZ(1BA$5AvqUEQ(Z$oWG$?Cmf@hOz9&E zvd{nRlgrQP#Gl>Sn#nVf?n00lRvdKC6=Fnnv#@3u=9+S^O0J}1cR7qZFw;l$+s%uS z@qR$!kV+WPxTB(pN`?%lVj`Z)v^}`w1Kns`f_J9APl}PUiq`vGdPSuX-bsfHXI9uE zLB#klFV0#HkIv8@)nWP`D9Z&qEn9QH3phtmr_a2BALBJUcdF<^%2;?EzA&7F0pV3T z)j!i;__IkMbF&9fI?Lq#oyw}~|0YZ_h(&shBb$eLU`~qm`5pW^6x0SIRr1mtaYCLu zK?ME-4`G)!A4L|4IkCs2_&usee340vOQs|Kgp}4aY&IRDlnS<>nX7eDFOT=zfHV6O z2=Hg^B%pgD$8oN}zPx2zNvZ-QRVfx`DC|iQ7$VWZrrBlSo-ZU0pW@f7oyyG5T8`RN znI1kZ7b!`lr-BIqn{{mVA6+T(|$PM~!~NSh6u92@wH- zX%xEg)P?S2$KbgLX>CW*8QnSxg(-wvg0h`as7x5dKjAK}4Inv6W4wY{0t3K}4#F6V4X`4%{^2vD!RJk(g%dGM1+e1^=Cl*FuzJM&` zqu!SWX3DJ`WpxjOD@IR_me6ifZ zG?9(}0-l-sH{W1i;$a%AB#N zQ44&{J1C#imu|4GDd&mk`!A49wUhq(rD|U;bP{@oY6xBix3#(w08R}KF+}Apt z-+6IZDLF>HSahQsgNjZ?5X+m@$c;y#^04MQGNneOsF0|0y=Mp{tZB+6z7UW(dG^FFknHt zz+Ck9%yRyxJ`TEp5{3y%8;p-X1LUf#*Umftgs0KRSc6c@T@JF5{k23y2)-;|I-qM& z>3RzSn-M_OVVt+|hKb;RZG&(BG%|yf*(v~{GF)-b*>Z+SQ5a)UVJcX21cupXDzli6 zRcNI*&Xy+Qh-~b@U_V={7RSA$T+B(WD$6hxy>DZ>$25DtyAD~iMa(qT$i3*LwJ`QU zeJTI6aelN@#PQ!S$r?!G9TC3$1%Hzg3jD#YF4028;*`oPLaRG&tiOD{vSX7;7h zS)Xf*9)lGak_HF8u#xR<)^+h`qgKv6qjZCY0O`DSFy+6cV{gsEDHG1~6Bt*p=8&bf zEzQS0IRes?UWid%AULL(_=w>hJ`en6QQZ&xo?wH z8fYW^cT@zriZX3-F9dbd`Y2bR>iZV{AB>$tb1qD{Xk**lv2EM7o$T1QtsUET-q^Nn z+qQGR$sL_DI8|L;{R4XRbg#8UVK+|<;Fi)tw(Q@mY+ss}hMp3;y4P<7H~DKSpu*@) z^wayX4cK1)?G+!YobSNI?x9uF&@r*e;GcT|@4CqNF*8V&L?aBFs2c%-0){2kt&2`bx9j-m1G|m;bZH%q?@pH50QD%xjotg?|O&6C_#~ zd?Tt7b%15SbDx}wVj(Jn z6Oep-PO?kBMJ*RZ@t(Rw){@$T^b2N z3nxLe?%1Qg2s?2H8i;9~ammB^R$|qu!K?zGWF}sw)a)__Lx_2h%$bJK%>0#zcq9}0 zVp|y8P7B@lP;=*f(!sO_3W|jaj)vm`{JbN{zO?cK*`QK7NY2mSj%EYWe~P@%bpXpX zj4$&ykQP$|!X^bG=)Z`eoQ88q4{cK#PTCG#z-`bZF^DAzRqj&4k@%O^%- ztg2c?H?8zCwshNQOU!TE$zdKTx$6{w-l)%W_DH_8-0rd<_o37m!N@5FWB)~RXanhT zWP?64f~Q!y_oMc~H37XGu;LfQgl^WTt}?lsbZ}9u$k=PoX11j%q0%~uHE*W- z2D?BHo4T&Q0c12+m{8vO)mA3r5ht^lBS(Az7JKpM}9zAuV(%C_{k zgJ?&sRT?B-v2BrRo{4d5BZH*db?>?u?=Y^2VW|5sW?!mN3{_c-i(B6qP&{cyx89Fo zwWX8@R=kAn01{ch95Ls{kKE>K_|;|LqHC9DlQEWs=7b^!J7;Wz7+Gs&kTl0%CA*Cd z8q`YN2_<`)@oVG4m+nU4$t3R!dWp{kD@5dsw{s`82+ZLL)tfh862YYtcDT_A#@u}J zs8CQ->jhzcdmUjuZ9V|C_}8^)QqJ2o2Ab@qM)m{wEYzXZG`eoi;#}76Bs1(m`FVPqK=g`|%VN70kb6$z zHM#0%FID;MMN6~~&F}uB>iJEiIOdjWUp}k58Oat_2)S<6Aruq4XmyGh#u_+Ou+U-* zHxlM3xV3_s-8x_Gs)FIzJ?}KhfR+pCYoc4_z(@rTxa?>mSC)$oYl|ci|8f4pV$+%} zG81wCw^V-E-h&($`~m;ZG9!4RSra=Pj8(AA*xh+9GrB@4d=;bNLx#yL`*fBPTnqd% zAFZzyEPLgJF3nQP7K z!1uD5;6d7PUeCv;+D?;-9|V)XZD1#95qOd^{?rP4jrzP{UP;*?JUh&A%u~2hDAa$A zcN2lb_-WG&&Vle}&ZDCZ?3&F6k7hTAb}5y%e?&q@pNa4$XQyuKEk*vT>YT)jt6O>C zxB3{$A8d6WUP0)d(oz9Ci%*(LZv&lE9&NZMqXRXw2meI26$+^xQd`ohE84PJC{;pv zH%nD|>DRHX_?$BT78}@nJkea_nnjz4n2S8^t5ir7VL-Z0>?{Jxlnegcsr(~Cc8={t z)_KIxtQ)>`<^N;Jocj{QO(?x+R-Bxm`^RZQnc4d04Z|zr8+x}Fi8WvZ{=mODTRr0` zBY6b`bI3#0Fdzm#AW^yRsbKGMf9q#SqwZ#*vF24A4i#!$Y8|<<-z#9$8iJk!A1GNw ztD24|+AL%%*FDf!_xozVe{Xa^ee{OG5jW0L_CN6*q5JoONkS*xtgzx%V9%0e+e=H@ zE(-ibGKt%{U%Nr8yYv0|)Z>JjQkFK2@P$mRFAJXQWGc|t`oCuQ>9El1*zyX}AU2=+ zL{6a;YEiLna%FT0`-^T}Ms>#>oiJ8uFw9&#{~jczbD&hb-aIt%p>^Q*Aj0h$(^iVO zfw&#}FYn@~uy&rm;?mDQL^|x(qDZQNJZTkN*=J{X$RSluV>2Jr*b)^nu}~p-eo8`_ zN0aBi)J~~S9iC8yep%*}mV{xaL6EU5Bg$d?0Ln|#Dpl9+1PTm2j|Z}J-d^4l^yuqD zY|<(5+y!z3Hxog~_qs=rJg1`Lb8Mt-_ilMf%#c`z38sgfE+yEO9&=d&$(MDk`Lbz_ z8HZCvZQqtFO}0&vBa|n04kt}|64KXHaTG?&he^B_ps6Up{d>Ogqy+^-F>Ye!jx?qB z1SI|z$=g3S0o)!H1ZF*aP`T~$X(Bh2YjX!qb+lf408VT@K{*1IyHPu8Pn0qTb_cCQ z+*qXjW3g;%QK@;GBp)>Fmv4RqMV;tqP-o;)DbTP7XS9!vtTq}^ zio_Q+tL}Ew*B);Z^i_6Dv%|_bF`G}{Ao857PB=Y+RVH7&bl%>9R-jW3HZJ>P7Y3}7 zHk_0CX_cJe%^R}2GQ78060a|Ofal9QlAZ8P>LR_)tOIgSwI&}5PWo?^ZdPRc;6;Ur zhagV0#mB7nb($B^a;z$rlz93wLP zB1lUn9F}055NSRgEm-eN1F7YGsx;&z5|)~awH<>S+wpE&TmuoX9hQ(=Fe(ar{*&7__D{S zDMF@7S!lBp^0HR!Ukw$`JR?DR|Gi2pA7)%wlW3jfTi!OWt!y;{^U8Uhk)AkEu?Hjo zw=YEcq^Uw&T6b4lmfIOkFEYbD-@Gq-+c3H@sz8AEyCZG#+x>fZ{Rp59;wdW~1768K zKJ#gDZ_gLib&36Zkd}sK7=^V3lhS$ffbf^WnAg>@ZK{!KR(lU%z3KEf{W40?tM+is zIxxXE*D_C(rm)S4&J%cSU*Miz`93ttI+L^;24%m&=OlHpQno~9if$VQsJ@ris~R^G z_>N^NPR5mgr7YD!+Or9~M~(-<7KLr}pVZ|32}QU`#qL$jS%G#1M&xhQ}i zz^Y;k9iv>ejC6wjYjho}7$;N=>;<@2aXeF~D~0m`VSk(neye zOlr*xM#)?fQ;_0cS)JR0F5bAimbS;gM{h;}Mx?6W%klja1%dGte;K@tz*n#6QNlsW zD<)jj5WVPka2$}EneTc|5O6-8;m44RQ zd#0!3rD8D7Kj+)OAZ5V^ zZF<|ok@r4$l6u<~e*raL;^H+SLFSV_lg`#L+ipurR~r!pn(|?8v9U?W2Q$QIj|ZEi z!sfLdDv)5{-~sXskaD0iwZ| zu%2JiX6zk{T5sN&pKGL^f5ureg>tc-L-N(u<&`+c4lR_8)JMET58kaMLXT0AncFSv zqBaqvLFBL&O4QFd=!JBWva!!*ppKBiZOTNX2(=b_SgvvOvrS11Y!s6w{YH3i3Lm(R zMxLUlP2Kn*?p}O|W}=7Jh;L%?*=a;amOfN#^cPQQ8mlv^Xu`5;iVfj@m^N{kaMfi3|W|>+~;;j`ubPMxP!VY~4&JTLHR-n#O zD$k+o6kVGBOE{tNy#C75(Y6`xP;GLlDivlKP0#v#=bTiseXU|P4%AZ%BUrs61?M@n z*dy$nkmb-h=qNvCX0HnrWzTwEkrJYF4o+T+W4rE2A`=5=dSo@z!5U!|uU_2L>Y$4t=r1bBifP2@NOGo?H#MAc97F30~V=dpZ@`jdsl>_FV`rNb&Q-1q+O+! zR8qgw0GW;KVJpPlCE-?d1T@L^-R04fE=gQj)>?hc67|dw7{+3=mk$tw)jFTElhwCn zIWvPje)bT4a*@*A%SJ%azRiW@{d}Fe0%y{iE5iAUds>lyfKs;K^ce}G;BXBz`p?8| z)y8SF6W3=Zymszu z#eGinZpjVa-O0c`g1oV+HB{;S$s6?Yio<7J5Q+7(QWXp)A3&oK-kBUgZiGt%NShTW zIn0EFbf>^C8+-z-umn{~+4}g-WCE~^=uW^&^&_cxCb_%#zLVIX_!G2lj?O=?FPgCM#ttc(U#hRy6sDZ+nc`dj zDYRz5OiFPu(&IyGk$_TaMKDZHBy_*SNTLUQw2}nFeu7`WpFWLF1Hk&_L=jGICF~V~r&%#xwzy_qRk|{$syFy;!tY(osEr?Ym4qT`h^U zpb|~uRedcWtIdK#o1NPOb8MgN(Jy9T@+LIy_?YF%C#(zpaJ1lj_x-Q$_MsvuZ}=1_ zAz~=EquGj8(nCVDFN&dw`UF_v#8w-`!~ufn$)QuX3zPPaU^1>{daMS=v$|u0mts)H z1IFCkiREt8qV?NKNoROD$O(^!R@E>FOtB9C;!)T>W!&*#1*M6(hMm^48&Ekg-ryp32J{c4Wc z8mb|N`{Yn2Xjuox1saRuoXo)b{%+-H3mCodMVOs+WaDbv$D0wmD?8csMAp*LVP6~N93m1RmO*s zVRx2c{i~r>L%=~OF|+ZC5v7Jy+nOg%>wX|t7KMSiTBivOHS$_B$6(f0Tu156&leCn zM%mXxeJW{{rxZf6PXrhy!&)avYe9Rh?7uiwPeEfdAOr-dmc2U$J!V)X(wWO7kh7d3 zzd+FE-Azh#4gOr$WZkR&q5g@hjV=`N(8-nqzOd1As!$XWBnigRoL2a+MwJU}9r@Xw zHS9I_M+9wEFF_=foaI`=T9=uPB4+08sz-_<{J{<=1aP8dyQ@-eXb0cBg>Zx7JS}^D zZ3hH$UDN?N1CH^9n3!lHPxNj2B)rpN8?-p*(gI0wv>>rL*<{HiG5nv0!yK1(RCpJR zoCX;<1O8)xoD!Cz@=O1Ko zE@y%1f3;SiSZHKYoHCDY;_Yv!6tYZSg>Mn1uwpqzo_%e7{-HDk^e@_ zRPtMmw9D*C8{rO&NNUP4LNC3zJl%Kr>Ez4BRN*$cAG8mv+>{3EpVm=id&bBlSU`Aa% zFDe`-np-Ew!-SRWS?<{^EO2yYhNBGR6E_yWcCTf1Ymxgfx68Fe(G!XwZ+N>H!+W$#u)u-#=h41& zd@wWmbU}xW={1<5Y8@GD%-8b}l%(ep8F?7oRqtuteDB}d+)g4Kwol!`WNV?frlL|2 zl|j#yKD~mB+A3tXcsAl_S4uk;_oVKj8UW*OIJ(d|xp$|fRfL>JQkkxVv}yK`oR{ML zPvE0H+62?mwUK<{F6S7^ysAbr{6am)E!Cvj;+rnK^%d~Uvp?-id^(Ka*)A?O16b`E z;p>oFdH=nLFBRRjW!%Ba^@XQoiKL1BUXLqsQK^n-utpjox@US|uz#iKs_Jp&{ReiV z=q?cov{2}_p@f%Ft7WarNfDDeGav+~z;Kmb82-C#kZwpOgY#Fc6n~N@3t?a;NzG-9 zcuwL66H_7~zibN*Ok^zs05qMdsV3B9KU|+y6t5grItu$7;E-{HqCNJ&>%qZ3X&gr( z4BATtjoT9st`xJJBtWB)p#YBx62bo@L^0Hf)8}j|)nfy9hXg)RRf1bRlJF|^>B|vH z{gVYYGAknY-s)8Q-bnjWgAvFZBC@BjMx7Ic0gVflS8+;w^*qwYDq%+wgdvronmgTu z2RVk+w(UL>MkQ$~lxLy+y%U@KiMeo}_bQ@lHw+T!wjqmOPDdj-PiGSIrsOxrh^O6l zvfvR2O75)i%Tz?Rjl@5I!d5SsF`?7Ugypk52Hxgd(sG;06LUR|=Qq3$JPC}YwSJgU z4`{^nDo?nvfaVchhj<1X2CXWSV;3hh0n=79_T3dXTF*FfTXlrnzQV9PC6OYFTJdWAkZz+toGe z1AI4^XQ?VZvLTQIANf?R0J1M`Z~vy*h-k<(yqnNgXCv^Iv?3S1G_KVWHgM>r1(}u()}f^L zb7l68CuKN6^1O$&x&Q7nHSNVBs+nV-@-c+SnK)46p|&Hk9GRNJ3xRnhF^Y&^%Bcd; z55IA;4H?H*`B2UJn!_!geRMuFx{#^Es*|gH>=Z%VOrfm>N%z}V%&yL(fv+cyF-^fB zrrQUk5MSypDOhRHPLb*<h*(DH9BS7<)4tyjVb{)WnI=J@yUn*xnGIA`EwsWJ0bwP99NwBTIgYFpIgvZB?pn9T>ta7gy&WE$NHp2^rI#Yui*Gd(}DOMQ$jKgN9m;;pS5QMFxYo;q%Q;Wo&eNsExe@@`~&RFgW; z(i-pqWINEuDRqDnl!vpg%t0+cp>x`|hm+~5Oq>$gRD#*izPNP$bq8aQ&l`}A;fQK> zJ6*^hxpJ#1(2`a%&dFtCrRYpKgrP#^0GLwhPp)U=D~|_q?Us^vu^I;u1&Ooh-`zvf zDd9zVd$47RhoJ3VU;xK(eQe2!7*ISNPC9{KP?t8ZSZySCD5^KT7qkn1=V~uVYH@{af4+mTu+$T z_?OwHHlL_|j-yncEw6O{^Lfss7QdN&2j$H^8q;p0H;r5JE1J|3REL~kNp(|Zygg~e z|Hd(5rFHJNZtih`kq!vY(`DF`UQ76*ux*T08*}J4FIDTW{+&VX$ikd=kd~fl9!`tmI7QsS ziR{Yi(e41?CNhvV*(lwGnB@ISZ4rTt$xsVkuPE7yd_ZEX1ILRDZQtxw$w>@@Xe3DI zE~Z7U&YuwP%JiVW5~~|*#$dFH59w~|2>*qU1bJN;>Cd1KOtL-?P7eL*hoPA?0cZ_B+?z`m`Iu;r}eRMf)Ia_IxWBeUiZe7DyTBo%g z?G?Xc$k8S^>5pZJJOqU8G!uC_;2T<-YbS&9z7*$Ki*9UwCH1^zoz%`PVu_wb!?_Wz z8M>_Gx#oJBY?R++!l9Rm*;Q$@vB7%i%TTqil-0MX4XAOhF%_!S=XcQV6{30Mw|<6i<5_9){2)a#v zx!wL>fUVBkeVbSY*jGs@^dTFP5vEo4Voa7=o0`N`-|}FG{g~Xm9SiJWmyk}yyRTqZi+d7VDy3`a49{CS?ns07sY_xtsON&vMZlM=oWxYqYlO#}(C4`fuJY(Y7}H+4CyrmG9Z zsI^|$MpX4$!6g;8-r{%Xd-4H(VpLwbo#qU2fbk^?OOnI< z^ijAYZ^Q3f&XWqp`p+~nPs-L=t7fz0jT+B7Kj%Fw{Xadtlu{-Xa|XkFL!0#yv@$ln za~qZl;DvuTrIFOZk7nZj8~$gfzgygh^Ya#c@pjO?LlvYGl)7eBG1#iGM9RMQ|E|2e zL%EJDG^4}Q5;7Tmb+#kC)1xL#HR9t(^wH<8X6oz%FQ0HI=vM6mfT4tJ_!aIu6?6E}_@S3K>uEqMW?~7>HsQ@(C4d;#8)L7>Ann(!~hgv4xvM=oEOxBp|)59Mf;Z zNub)I+$MSXM=>l3Z=m`F`4;rBpDBXb=j#qjEc?N9N)vX8p6Tn?Q7&tBiTs11OIRWG zp7PDVPA)ekgLhhyYfu1<0Uoy^K&AbfkJOGJMrEFuyruER_5of(B{GhGBF2S(Lq{X$ z6hiU;N^(Rs+=n%xY?bvohM!ey7drtd8F20JcQlO==Gj>4t2ZK$dpQU;Q*|`D`wvj1 zf6{ExKB3i5b9to=dL<X(!!5W>&nGrW?2e9UfCj?XP{JMex&UnHnO$NK); zpC<`4h!$ds7slMebc`Cd@embP%@Nj*Q@FTDJ=T>e@~FH&G+_%d6E#Z<_IL4`_XKsp}~nRNW)29zq}58uRuJV zZ$41ise*6zdr+xB70R^aNNq)bLk|v6dqn1HcrLAg4mU6^hHR`NX6Q(8@jA{j$ymzK zjt3OY0M-b&uM|DOt4t4GgP=H)5j}1(Yab-hy-HnszUM-8;D1b0`V%(nA+{;th@oGc z{&vNp%(0u1V2A7xeFKO0?kQTpfJn#NZ@@j33~G8i`q+nt=#qNzwZKsO6bxH}zMDmQ zUPTe;D*3Qw=oCwVur}4){1pxtZ5)JaxomRKjc9VyU2~gCQdAJ+(w2P98j?tzhc!Co zf@3}@i}PX3$SsVUUw>Emd$2y6ctk|jRkLt4@=Wa zvnud?l^^u2`x`7p0>7cO4Hn^OE5gyCAyttYW%P$;4f&&Zj#vFidmtq#o{(VLI^mUZaVM=>MbBRQLjwCcMt6g`R;SOVl| zk?782TurJp{@0itOya2SZ~hsS>st96*L)iP;o`6^c&sL>@Z>&xhqp=5DhVC|_jYQ= zzv<(;0d$8RhYN%KlqBV}u?SpZ7lqZwL21T2a7lmA5&p35zSu@rVVFe2t4}h?Ivs=q z!HKl4faj7dL7S|!K{TQbDO%wDb;uPa&q|>(NV3d>;Nl2+cHci$*npN=tKgBS%AB2v zW5{JZPVl~V_ABs4n#n#)cy*D>F8H{P3EbX0aS+O|H9&aX1iNEFQMnnz^?Qgyo(4)9 zpV5Se zCJegyX(s~l?t~*W*OX0HsALCYd6SJit-SIeB45&@@CJf6)Dzsqo6pUG%=smJIR@jD zLDxzgHt)02Xn##@6pbjpFjgO#{*uo=I*qAW{D z1w51G0bdwb5tnlaK#|L3TSROv^NJa{9bTMnV)c{dvbX6!dSeGXk~miwhBn?#n$y)7 z2b%A)!XB_Pz5B-GBq4f)p8&9(!sLLpGp`D9lFkiTzt%jab4Z6wjR#(v9zMDQ(AqAC zq2Sy=eQkE=@^?B|x=keT9tFq^-y%JZ62%^S-LmSRsm?1+l@X?lBvn{A zg2EEbY;~1XmxxIoLkco29*`9Z9(waer>w^1mi~ZvU=(-zuOm>Gj%H)Bnr20FIm)M%wSwh z)mw^8z)@?=Br#-^z=y?ZUo7FVDK7RhBPKV29{RQss8^8(X~8E_Ty}fp#73m8F%hEC zc@-?}B2=#Utg=2pLp5@=ye!gQyXBC(FX6XXcW2HhM0enRd7-jixg1#e`Fv%L6k(6~ zy1h2O$rdaUeOw7m!x)gB`qL201Ur8qRIUt!10Z4Bb5MPkLxijhMCVHB8;G=DZQ2$j8HwGu z@VB=gqJX?5lBqKN1UTutFZiCCwDmo_smHZf66P7tY zAqSt$#lH(?RY-8TJ}60r-V^Wt0@b}P@%%5u;Qy>h{znY5vvT}@M39+~i-qlf2L>7c zBL@GkiMv*C)nsc-_Lz`lX{d;!c$5LS?d@$cu09}K(} z-yq~3GTJdR3V0w;7h(LEe}qFZrQn|{h-PpL2T;|0MyRL&F@%42qQcksbFG(Or^tO~ zg9v-b$jDwF5}bk~;6Wi90Y*UZj2plQPMwADYuNdat%1UGxxXnva$CT$;t?Q$H#aw1 zhL~s^c$N&~KWKXhVmv@DM3hhq@W!xj+suNfS0L|IY<3_R0X?8-&t)QrcHwT2Bt!u^ z!7NJZYFkZVFYL_l<6u69k3A5=hajo)%$JVkr0_l6vdOV~EPGH*pLjDkwykU%}x zcYq&7c1cQ**aLB)9RF9SubdONEOf&bCkISSD7aYSH@!SwH0b*FZFhw|gYZkR;LgFW z-{7l!MxD-G+cka(Ab3N?)l($&_g>Cc@*sbk7bI3eAX3^P3R<9mHW0!;>U2uY3{^{rWTi<{bZ4KK<56-nTbC68Nrd5tbt!#y<;A#cg)VWn&bob;zO+cD#sG~&(uN;VSH>I`*%}Y++A~y^U<~6)8+TD5YWfw3;u;YP$`wnl32MYckcIGhSmTg*txmHaJ z=ov0uj}`oKj_qPO@u>dlg@a5%*nN6`cz}Ze8<)7fP)hK26X}DZ};xm5}*CIRX+;csfP-#{dc52u%~pG6x*_bw);uX?2_AiK|Jc#n>s{%Gsv=f#Eb0OeikU*cN_h$P1m+dh=dpc-+yY^7OPoj z;_5J|RRY({v-(laIpepH!Njm?(F6XcL&IpmiA?C$^(1?PXLy#6Hwxq5b!J1YxjlwC zLieiGnKj?LLfaWS$Mt#5VX3|RjVzg0-U6dMDx2{UR>{~xBnFW;QpGjTzdOjI-QU45usFPhg;{W!&fy!-??B;n!KJ!2__1pBwaa_p)r7HadI!{|v9 z{yQh}FZXL*ja;hhOfxYGh8)guvu@+wBelS(aUSGb!3uddwe-y7w(0Ru z*?`HgZuc&@{+`as@&WOkuV)x3ISf5azW<|JCm%6qW@0B-cD;>X^XV~@9+g=(op`;O z+xV~&(6A&y7kF@7UkxYWh4JX6733qjU=onhW$2@PmhO~8;kJIAKx-P3%ERMgR$k(C zh4xS77d>YAUOEX{kVLIVijN609 zZrYO;5iVlzkfmt~(moBy$(=%f)A>pT_(a%M8O)%EIWTZ9lfRdUC%E^Q5dj6{yo~#b zP`xEr+soJCoW-zdzD1b4pV^1bq)F}(Zm}1Yo{-3QvhR~qi4N85h~q+?*vFZ$DqhaM zp-J+i8Xcg>eu6VH1I=tvwtZEs2MjX<*7_r`&=D6!)iJ9RaA9Szz%9>k&p*a3U+tbB z;G%i|ty=xI1g7=!VJBMIXh*NughLz&wRo>>cM#r*)eK#y+Z3?Q7cJP@N6{)>*4Rqq z#xO}Cen0NmG>>-MRaJ(cL8WVrDbhxjqQ`OK=;H*~MlQ#WF=`D3#g`8fin@-$W3JCrk?I+v{ot!vxx-yeLPQ#`u9#^KMV5|I7*_tpu^{R79* zi`^Y$QWXK=&eqKz>;DBy`Se~jl4uISj9jqeOMOB1fc-ok$?4=M$U;w#Uq>K&`qz!l zVz~~t^3BAFenB-{?i#j3?IF)cJW#w%%Nbj8Z;BloPDzySWmV|_CJm`#lhTSTOfsY0 zn!&5nM3Xy-D)W6;3sJ33^miq$bCfa__6Wv53D+FwcN@&y&4%& zJa!~YCCnmI4!)#N4o(~zN8N}8-cQ#|ibzPV1MoSl1KWN0s00su zp@pZR65o~BpFsqT2IKh(8xVq&Z-8d_tj&2P-A2WTZ5{5V&JxvlG4gIpXyJc)Hc&Y- zo-v%NBR4UudUQ%$oo^P8UVai-bDFZh^1K#pD}8?p>9u*F|MmQsSDqe-ErOE>OZgT} zpXvPX?{3S0y|D;z3im7gS@1E^N*2k2vH7+W7I8eCx|m9fWYCrY(W&EUsB%&Ayktzo zttH)bs>Cr-8!4)rwug8$0h2~_V^m&Va8LG#1P?Ikgcc3hzgypQN`Am6Yczr4aC5Pp z@!M6-Gkxzp?xNA$qmcxRR47%M)vp!A;SR!cTgyjd_K!#K(nL~>T7Y=^V`vZaG?2}~ z21^m7@!YEWBP=>`aCba5Fyej@!821Cq-uH@z*fF_IQx!Y?EjH)`sibI|5lnwU{%79JtQ5Hb;W;jkZ@ZuUHwD3H3`vsGtM$9>{-v-CCxm0McW2fc zew>VMF$E_j{o&KN=)nnkCL?T2(^dP4aw$(y1a(R)5^geL--P=)*8No11E3=!5H-oA zALd^e=MKPg0MRon_^B!pei=Xx#v8lj)AdDxprPXbHnm*j_=s<6+bRr4Hqp)hIPH3- zQ1#Jlldj&ntml8w*x@wUBiGE-HFU4F28ZXRLV^+?5Mg+5PH#W96 zR(SjNXA1@Y={X3uJwhW=%)Q+3BNevlsnY26t=~-1F+jt5!i%;6FWkc0GpJqg1;2os zoRRn@%c6*On90z~F>Ki&@?(04a@JWWo@;_SfN-C3{Z!4FSO*>4e?=L2a|Lnzf`%TY zEcI2+{zEw%M*ScCZqI|oe$!N%X9LsXeYIypFxo9uBR$xzsq_w76>SFz&OXOe z(U%10zTRP|XanUSNn3VrO@_|@kQGb@ z{Xv~7+_sZMS9oDZ*kR}|oCxmZ7+f3G8H@N$0GR8|` znn~Nk8^qkj5>V(PjTPWq$ouYs_}pdhbIp+El;G$Hs|@rVGD>QRPQy9|KJBT~K`JqZ^I8#>>JnZOPp2&YEq^Ra4vgE5`T5~Jg+ibgIJ@(U-xQzCT)<)xGnSQzIVW;3TPHa zTTC*y9Pod{;7-?dfgQuk*ia71Xs}W^-acy6l32rtHm+HukjW5bId2RaSd|V@%bS0i zI|cdb#W1(F`K?%1kHvTuR4cCZINBHT8@LwXl#J7&D$xl}Epb#uF>D4$Hld((NGs>O z5@X^|C0AG9W(S;yJQ}buHq!lp)5N;tt9I~J<8kfk^`ZSPC~X(1xf>l~S*=j1aE*gKxKcP{WWHVahk z`|+^8pF0`~r74ry>v&z*uDSp3Pol-k;NDsSfA#VdMMlW*P4^gAc{i7+(W04_jfV8vK3l2KL3I8w9d7aTh()%;`kQksJMh)%IQXR z1Eg!O)%ci&57x1q(f!g20k?F7Z z^?s=SgpL*x>KZl)W;Z`*_Yd3bWjV)xHcjK?(ILSjfAR~{z)zr0Bm?|}!*9P&_)_{N zZ?U@!{-m*NGe8Z>_wL-V4FhD!-jWR;za|>T1v&aGv1x8zVvFqYz?1uzfwIz%zyUcr7!kffSTrZCF|*&>TLq3((0ZDe?U? zzJK@oIP^9*=+RKw?oXVbFs4Bi^R25gHqvPmjhUFGVR>jcD0UU`IPo8n9BP~k zYtrI_`s=aC$Yl<-7Z^4j8gDgC{!`KT`I8lT-HD}*P%6?G^NVNkwWoWzZ_6CP1jkSx zP1Fw(bR$CY%x5hJxR`Q zNpr+(mpi|xtf7Bt`L`i@Lf4bgNdxa8SbxR9tYA+K-S8Ho($RC*oynli7^C;B2G`y# z|HLU@U1_+)|@tad4w*N)I}7z=sYy9~K(e zAq}|mjtWsz1n{qZE_CmzY-Xr3FTwwzLM+h=_ehLVK(KMb_xd)?66z00VqmQ7Y|<7w zcBAf+Xx_aT4J9#h(T)8c4yxv;!h`qncevpU{X^De>V7=BshKMXoW}OoCtDV!0`yf) z82c3%N<_Dw@&gQqXSrudk2)eebIaHp=KXl}+DT!dE{I?B;Z6cS%(|DVsCF&&yne^_ ze73S%$BE9w;e`vR8|X8?hjhYf(&C{qec6|DEl$bcqZ~SuL)LUl&*9HU!rvr<>QwLj zLa8wyry}bRS?|=TSBr(9O#h@Vj?Q0&i5_>K5!D~PhfjRSVtw@1B)*qKXR-qWmaYY} z9hG?w&HJb!H&U5?_@%t(a%*$5iG(_&qKm=)p>XkCUk<7(776g_?JjCt@0_gkW#>=> z*2o7^^6a#sZy4+1cXax$pzz?QIEa-w%M<(3!)C;D)vk_#CW*R`-^rRJabualWrWZ% zDr%n*qr8Bb7OJpw7OHnCd*r}?Zg*h&uO$3|<^Rkdss!N$jfakA4Wi%(J%3IZrI>LY zh$r#bQqcaE5PWm9KFZ~SDA`0SqEk*VstUHqi9zK5RhQp}y!Yuqg%=7Zu90a?UF%I6 z8S|o+&3NguUMP*B8fjb0Pvh5xDNS9ITGlVF!de&a>2`|7Nd{0uY;Js@xcH<>`?cPm z)TCN4$~Rm#e~Ox6j-QktXywzlp@}*fN_8MtpCsn60i8=4Haj?_gs7S4!X_LXx_!{k zwSdu5O26!tdG$;vx<#QuDu`}p= z{PMigQyUvsg&rGt*;4m*xrRLz~J;NyhUC-V>&p#kI0c%r<=1(wscxqtPwy}Ss>u1EntX>(r zgS5Y8uf4Zc_F`i~XDA}Y5!AeIvb-XRt*$_rKwc#_8adVchnSXHJ_|DcTYEE48ZQ!0 zPyAODC$p_rmM)hueN~BwX*+m@Aw*gTzB?)w=r;ylK*Y-~tK~jVpPXu?g~cyxb?o)e zHSGkeOmEXPp#lPDt9M?`7?q_l()?lq9=t}gZ>oN&Ej1=8UPyUJri1=R!foPuPEJXg zy&T>!vgcLx04Wb}x#&wXrLI-V{UoQGN}%sXiE+^0_i~O8{|k#(HAp~0>-WeF5V62W zJ}Q3c(;v1mBU6Io0!ztEB*Q~TBHdqyQ*5lb5yq@>K*pNh;RUBUpHOM`OxXrMqbDHW z0ykGb^}S-@$rGQ(Sg6*%M>%TT>#oIf0hh{LJLSL5AD69bKKnTj4a(PvbaD7*SMFTFo3*1cGb(Pwp;+5{ zNtKvbc;V{6-%%+S<>*Q*x-CUG=mmz0dERd09dZ=rxrbGH*PahBW`Rv4L77%?KekLRk6Jel??yydNm+cpr-BFHJr2yhqa9gC zQ?}c8DDMGJoS$=~T~@PxkJneScZ2Tu8frwHB=S;nq}!W3I+ITL;H?tw{+42nHY|&Y zfpgC-CH6PmQteQlZXOjzV#4Etw`DB1lLq{sTrn`5za0~IfIr>wf7o*wsmI==911co zul#tiGuH=>`lXWLS|_ zZPcqUbme@w0P^3v&}oi4a1zWHv&TJ`+-b3;_lTGSFrcOEVxpfgXHCor{#qo$FSw|X z9^E7F4}03?%cKpI_3z7X1Vkba3ef{7Bmt}`im{cjuC{v|>ixdPRvW}(;;wUFN%vPf zoF8$TXP$BW--zP@mdwcSHS-C+-=Qm zlOc{bRE3P}H-WDVREi_nrVS>kGKy{69a7|e1png(EdRwRstM!Y9L(Z*kpN zyQ?_*{YB?hp`Ejvi1Xej3b0U|G{zkBN`Mxg&sSHrw$5Y8B>**()4|N;Op47qwQ%k- z(G`Ec*EBIJDkGEUG;v$C=UwWr=U4Ps)MP#<#so=tp;kWV^pJ@*UU$)4ALybRN~Y&H zn_%}P6N*vK5uMDWCm*PHwaDsv#5*W!?)oNsd0d+5rUN^BQL|U5+JC5s$x@E_^pYx~ zLKZttsqe}$_OH^IVu?5=hQ*+;sROda-vj(D0rN!GSd{3mJW><-dHS^g&RYBWm_wA~ z9Snmn%C4nTa_q;f&$ml5uak9jPKg1g3ER#`x^zNb`1)w}aAsL3HG@YDwYx1aAmQDlkqk48RwfSbE5q>S!+gGG9qp zd$Idvw*c$e@cGuvzDj_kTKY~?tp_U}7a)|rB%9xgX(~FJX!m*cv{yWCy&W+^Sk^&O z<%6q^wI$LW9I!6TW+d(`#OO{#USWCAP${4GIF9WKt>n^Y4+uSXEIod(S$mq2~P1Y_BXqv|)trd62nHO4`bJV&uYtsU&u3Ywzp{PYcU4p$~eSc}T9sXuO>>{3e*~N%jXwV+s zXS?60MI79JLszQUP!@)h{E@o0kb8#k*rmC!w2~c8sYMgMjWG{LpSH;(%lPKXynF@i z=m03nS736jO`6Ivjfo6b+Xd9opg2+2tlnrjxQ>X~ct6 zA%-8?!=F^9d?;xPt2*kMJ^cCBK%F>~(yNp3Em)G`g4?En@_<|$3mNw$?IjxivZVF< z!2Pmic8g559c^Bx}MOvY&GiD z6&PL7R)`z(63F~qVFR^M6fP&e(ochTOuAVgq57g*5{LQX27U-LulBFU@_I$+&1s~^ zy{_0;Ll@s!mg=ru!&9V7e~SWp2`7@dO!;qiE^~*y*+IF|>w7T{$WzT|_^|Zq%W}PA zQ=t=mHxtg>j9s&4OK_6UyAvHKUfJ(vC=?0x^knP)4Y=~<^SX7unWMb23t5`N$F~S7 zl@&B(xQ~*{#!|-6z*GByxCn4|hotcLm7M1TEL9s0wuGbKY{sY(%1Di5h)`OlU&dA` zqmI!B09Nh|a82Ma=G|3#)n}?UZUvGx`v%#{^g(^W^uEU47!FysA)<2gZ>}wNcovOI z@LvW`{y`8d7IGY-gT%V)7uMFViY(Aok>Ydj1}xj2J$>I-mK_8nqJr1Dr{hWpl%7A0 z2Lyw+T~~xSAoC8Ol!sBAwwq`Y@IkIQ_ej%vW~2u;?k&&5dKC|E<$P99kaN1-1lj)# zucMJ8&aT`oN*q>y2=NSB^e=5@b4|6LrXUGQTvvU2kNj9U(=H#-@Lp+pEfL@qIu3EG4rUR0~&h?ewV+qsSUVy(VmsxZM&%iR05&M|l@ zf)tSp^%7grvdSRS31s96k?rIXlW`u1t4Y}83x;h&p!Hz19mFk-Hk zgLC@)=G?{YsGVu3P(J<3+Fl0k&Rn(sLkaVQ7ajyhTdP5$$TFb`YIlIOW~lZN{N-m6 zn4)!=#D-3kh(F8IntF)Adtws;@0R8vH4JN&G${F|d(tG!fymhGoY2l7D7L&^zLy~M zz(n{^u}m4QAk4{vimnGUH-2UAVVTnxmF&k&CgK;n1OFmxlKH3-L{@OuFSzxp^sjWc zU65emBz6b#U8J(y=9?*8C?-B39nkB~pd6$((yE&YaeF=ye{YqRc>u?Leau9~P5rFq zGkaLWb*cyKHn`ObNtPHFjmW`uTt;UH47C zo9}#|FVdugIy)53SUrN2z>urN#Y&ReZn;i}6*C=G88W#GMy<PwyP)KSjO@%@4Z zADn-ULwc|v=oIxi5M$9G;Hw{$?u#_ViFr{>l&M}EvKZ=msHYy1?Lx;E|8fOCfW6+l z!0k4Sy0cq7q6LXB!T;&d}!oSyFjZog{_Hf5`WicEl_h$q!QOGq@K1?4TEkK`E~vQk_$p}-KTjzh z9+np3x7SSI{$M^5*?j3MA@~zfb)vqD0Vlyx`KN;?8|FB?iT*{n9I^KSlJ)J_Rs7R; z;o-e?Ksh;sn)v|wH+e!~rVMGNF`mo`WQul-xev3#DZRWu-uaq$E3n^-_c zHFqG9agV^F6h98t>?y}JwHXe7E12B^Defm%xtNX(Oo?|1R;Mls9*^7ZiGytSaxc&2 z;5_7DmH@eD-RklB2qiycBa_f%g;5&igt12jHa}-w&ljZDC|}-pmPaG z1dV-0Y@yzqn}E`0;02c&#RO>wSpqN7r_0b}EG8w1p9MrQM=nu({4V*TK-(-qBBIR( z8gMiB6EiZ5=UXFKIwzCw9|MVVd13$XC2xjKw?MLh`B2PR4)qOh^Se0R!9IT%^Hu8g)tkLrJ z)7vsz*8LW1*N&`~TAq9cwi`#}+nZab2JD`a+ylw#3v?AcH;l{D%8gb(h75a$Vy{0# zLXh8lx*7tRdnYQC`r4_R?41-tZbP{*8E2loa{0j_rRFe!Y7bKY{b3BSb}pOo+`ZFq zJdJQ|p9Yr^<=e7(gl7WuKC+v3a&6;49$Z4n=3WIqS*@Hq&x1vca7rH-YYYwETz$hs?fZvfDCG8AGvR_ zXp<^^Y#;{e-K8<~in+x0wVUyvK{N~jvK_{ku2zuvn^K>m3SynSHlV?9vEQw(cc9+o zuH}O5If`eOJ)Ttw(QHnbGPG?CTAs&fP8Sg+WEFG?E`qoYls~(oI38QP__p2>F1@`< zVuykoEWCTx?Wet7x8>Bkr|d!^dqZN`zrajL%$)xVFv5yd=T@hhf3(uS(MG3L9k@(1OGmg77Ge?gGJfIRwn$KVlL=I5LO@N`if1 zJ31(d1!5r&0!b->XqtP3^YlCWR{QdErHb|Os=K!Pw)@swcNQPmcxmM@zFA0XASn(4 z1wIX(1TJoMP5}|nPXMTk0D&J6p$uM}v+t(^(l3MoU7Z7o@TV8xfsO$J>RQ<^Z;k_& z1Ss#~1ONaUpl{&70MP*fq7NP@{2MyV84;X9U~69u09MbB3JK7O6kvilyGv(}t%c%= z@z(>SPM8zGfRPdLX7?OGQ#=hC2TBltg@8gkjrc=^VhAuVG-$w(qSiObAhk&}KWpgy zjfaQFjWDLBO9CC663*5S9LEHDF1UR_XUkB{PahbVg)pX$Kk*(30Pv&5ewE*cw}^ED z_y7nv4;Rj!0%kvA#$H&XUkBi9@IPTma*P9bjc<5A?7LT600X_d-pTLjA61B$w`>@H zq4*d%gdlVrL*Tj)?mhr5sf#WOc@%blfVvORAdWVo`F8|Yh%LZB;b31kI6w*s%YXuN zz(2UNs24!4LhTP71GqlXW3QDkA1SDaY7Y|P;ut{3Qg@a7pl#4F5j`&SJ^Y!?;sm@1 ze7>+&90L;{s|aega$aB%ZH?G6qWkn9*FfAR_O83}ygR$d;3@m0dll z$XBiiUz5=}eXFC8=OA@r@PLoO+JkfaAbd3lt{4Ev2VjrS@4NoKS|A1teNb?sfHa0| z_8|Sf6@}Xjm;7uV?{xO^eaHwIo(2GCtEap2^7Bs(LPR)SKfu4;`h3fy86Fp6I=*B- zt}=3P=a6^%fWU5V!2$pb8XzzTg8XkkjS*}hKdsPnzDlYHD-r-0Po>&VtlyPJue~4! zztnJWef*IYMDta_fNQ_Pj>>Te5D`B>zrM=ft`on}`@I!ky%ImWu$1kb9A9vazcIh~ zhGE28{g?CrvRdpYS^!uQO)v<*u&e>!h}B?IP&X%UyNakNAhaNwL9iK9JO+Y#aeMgu zTdI&Zkc|r=g?TN$6py2JchZ({_8>CY=TN`Twt{B=C`nY|OK8hjAK$hD_jhs-2hm8_ zXV2(fYYZ*9-z#B6KvAvl1>D{^27rSDpnD>LT09#_K(9V?f31EVUuNvS(MW-UIZA-1 zsU85UBIy2F)<8ia0KPYR{C@rmp=}+VIq=^S;Ey@q_15T`|nGLbl4S%piB zWSVO5*^M%i8@-2eM*dmz98A6nb%y~jPBnUBZ@p>}iyH7MW7E}q%2Th5clVPqv*wii z8R@&AP{H#|*g%u1r)kI&n6o$ZvChVx}$Bz~jH z^PK2M15$b=Bt=-;Wout`)ub9ZNpjP+#)3%8maA2LWUdm^NiBycpZn)x3%3MQs>BTA zPfWoo@#AiK@4)X!65glmc)*Gqf2&U#LJB0&a33yE!7i!6VVr`=DxueF6(#&habw2` z9CH;ZTjwx+dSAL*J}3+n zpVRhDkJS)#i-qMW5&H~+Z}N9IfoOcPJUm1CH~sh{>a9)d z5)5qG(tF^UeM3du9Af{jrp;6RNRB^_*=DxMt0J4dBTBMu#@0Spmla)lah4Ar(_QnU zJp&hijUI>Q^$+qGHgIBLHPX5lv`*>Avp-wheX-TICbV89h=oc?gsI9+~+YFAJHI_fWdpOXn$2NY6J;tv&&~)8^N!`1s^G?yIl&m6w^xkkBGLh_^*hFMbySTt zlo0S&HXtn~p+8IWLCMza08DM+49w1DZMyoJYqeUO;IuTHf}X&I@7EgXJ8EFLGq>yU z@gY@Sp@$oOmj|v22o6U4?dCg?bM+WE!yAn~b`m6KxYh6Ceky0=2?|QB-Xub!#NrZq z`_p<#&hR^Mg%YOMjrt&0RZAe+JpnB1$^p$qYCKDM1>`>v54SZk5|JNMh4D0L6j$ zb-%-3v?Q|u>knM#(G_I&%Cvgwa3bDw`Fd2{$(=;FR+lEJjicc)7HpS#Oe`MuZrFL7 zktV0UUDy~uCEAtzEQ`lPk`X3&j6|rVo>-aAJ)nD!*#fPhjs)T|TWLL9HcL}W5kF>l zXP+89&u|ShCZ^lynqbw;rd&}Q4D)RK?3JrOUOB@wGc+e>P#r>ZjY|jE z?33CNhGW8fQRY35T8lT9lM8CeybbG!*0EuM5-0w3{( zO}r%CI{E^ZP|0g>h23uGwr!NU?CQ~RY>YINX=~gq;K9oX!3 zOnG#b)mPq?rx;9=%~yu5D_SNFr5yktHNDK6Zc9jZ($kKr7W&TcM>_MkoQj4fi7_Px zP5PR2AEN>v!3Q*c4vt3vWT$Sc;1k z6T~EfShKE_4Q9OzI@M#6J&6d0+U;2b6AroYWuKO$z-iZ&OU~GefbP1zaWg`p2eBp` zPWnWkN8lOwK{3-H zb4I1jHk~@k^eDU{2x_UN1blZ1C{|5Pe-6l18br!3icv<*H%@5u)sT8xGcKivrMS-7 zQ%>PdjsB(c8mzUJ+IDi2m5{J(02d|edcKn0Ihlv%N*GS|rH+qSk{7V1UmY(fEKTFq zjF%0R-7TErii_w^gFx;&DwD=CfijX4V_a_f9KoM+S2j&H+N(t(h3m9uF~P7dvM50* zgJYkJv%FjCa0QUGp0_puSk|$&2)VV}9pOb&b^Eob6{wYD0VEI|ey7A2KfK{(?<^mbQ zoAx)n5a^T|H?g{c6i0z|eTV|t?$OD68SD=bA508r$eShE2cn8qh8e3Xl`D3|qt#Mu zH=1qiEo{tkhJ3E&tY!8TMI&_C0D)dw+lMgf`9ac^+i2!;ZyQ#f&iV&BuChY3;tsnV7 zG(i^bn2P%}y)C#|%u?Evn7!9QQl~JPk^W*s+Wc%kqVen)yQp+E3$XO+`RaHgv zukS&4D;m5#N}XN`=7Hceg4j-OA3DM(?{w6Wl+#btb0%m+Xu2OzJ)5%BJQkgCCeb~ddtXf<+L@HKKZ<;b)uG?R#?3ddUfUM!&h%APnnu23vGO>7vyA6Ld0z>` z!*9XX6)lkocdIECno-a;xA;wa!*117*gPc*T0Y$X`yh2p8BP|H-f!yaVyyR&fI8J7 z*E)11Ij_acSDcxxNb1gfulTc5SV_fxkupt*J5dHn|9-XtMZC&6Q5&?aN?oda>P|W4xyaiY{Bvz-_1boVVPH{L^3RQ>wdo&@FtMo`YyAX$k1dTh(2je{2pO$^)5x zI&kx_mkOfJV14%#4&WMH!MS9)QlLcCp+WjqJWF+9z8lVA;iu?OiGCN9Uiv(@+4q9x zHOrs%7t~#2Sk<)4qOheWzMNh=5@G(c+S9Mc{hj7E$~^4|&-0Ny!nMu0=7rOJHxAtG z@1H2a(#D0O9Kl0L>WJt2=hul`X9JhoA=4a|a;bVBL#R|}o;KNPaM|o|j-FqGxm9@y zLW60=euDaC7f0o3_^N)xUmstzT;Wd;{IS7Pfd`o8=*=WASewqghe+*}UMt&A+wm5x z$GzllLnU+Z%LA*AkU7Bj4@>aAdvpk#(B&N1rIu8k+$JY>kJ^cC5*Q2m5iSmDdnIW- z!XbXEE%FOT&V$x>6*u6ia*5#NuxxBgYkcR|XQA9>T4+4=!rH&Jv}_JC8tRb~tg_m(pszG&4NeA2Y9$QkT^~SAIH~zJe@`M<7j02ezUwYV6c!FY zLCGbwzYw|MYPKWYP2^PdArgaczKYz{cq7dJ*(MN27b^ISVjim{Vc~?6DDt+g1065P4Wr8gwVYR|s~!ZBARZT& zud|Sp};0u0ttqFQTq85n`lPHyZ3)Rg+POeQtPj;1T0tpiB}F^KF}Jqm2K0}T~)J&=~~ zjz0;O;Mz09KjQJPj$Ul2?mH}ECBS6eLBjbOXFm?a+LrBwtL)$ITK@5w(Dri8EG6lB zKys}07%^nok-8Yy>w7zlPQCCnV?)h&#I$=Xr$cC4Lg4_lv0Ngb(!MS>8(loXJuo&D ziJhw8v{!$UkP!XU2FGVcUmf3YRI!s>P)U8P=YR^sVZM!*;C*Y;qsKp5Nl z$Ug&N0Q^LxqsHMZ1~cpAqtO5z`y4DeD>yBF?KlIOL)U~Ux6XGo4r$!Wa?4EZK2Bh} z&rGCiPrPbq@6R4Mnz0?=Ze?@-X8iE+l9lEd+X(o(k2y;Q#sR6dw`+WdFescqkEv~nxi(3IRN4)!`>pibF}&8NRS5u% z@dYG8C`d{*JI#5?(FM+eWEKU;bcR%V>tbX1#NzelmVvix2nF@{05z|}WAhK2^gt)= z+dg@+=*Rc7oBQqB>ES+gt2q&w{3IGkN1e9@*cgmfjy_6p-)e~)Xu7!2%ZC`Y2L1xa z$QIsW?R$G)bZ7mq+E>g1wB$a=(Cfm+qh6M?7 zmL`n~p8SM}?@7SF{kjE?-sq;5SD|wCD~%2;b!4-^fa%91O1O{q0=yxGU0F&?k{e*9 zf7ri|%TM2WKQTY`kyyaPTy!Wl#{(gB>VkiYB=|UDpRVgeOnnv2uP2?@$AC>jr}{*> zqVTjh*FigQ`qPnXuYXA|JCzq$ZB<$L>wyDrmoa}1>?Rb`k9%z0zYOBNOPW|pov`uz zyb5rp#9ySDlj`|ovhGM<(_Jel$7KR_0Zwk4kA25UXR`*G`MTI>pm%#8t zz(#B*r=X7EKZR(f`PSh}j51k%J|ZhWVonNimaX|3PC<^j9m9AP$6g-^ltcZ^%9qf1{Ad-dZ(ec zvWTu{1ZH0G$#Q)^u>7F~?Cj93oZD$-tRXhDL5c0^^w8#mINdWa)}d8pm$gd z=fqZ%&*p-btl&zb?gK0#AtRcR8`{i(R!KJmyIg+$Uh?t3@K2y zy#%1egnJN$rz^u&5!GI;gk+tHWJjU5?oog-lbcnxK>l7QBu6Dh`25Zz*P>=>dY3O8 zDyJ-xABPu>IPgL3$)XJRG-(BYqUL#wopPC#m<-%Fc}zT$iBc^35zLAEY=U2om9+jt z;4t}U1uJr^`;FL3tammuWyFqScS>N$pz)sGhNw|ag#R+VngfdTfw3+ec^xeF?iC;0v?IpxqIWx>V z7NK-=h5IZ|v%3+cxbff3M)*OV7+=8f)@*p#`dXRqZ|sC`ut(TgxCnRSQX+K4?}hLz zEv;`~0DSlHAlr~$oixtReVb0hl{$O!Iu@>Gq(!#Kgg=?mM*cIfBo zqYZ?7{HXd(z6mk>N$Z35u~{Q3e}O$FcGAcv{F3$`4HYSJ6urVe^TWwjj>=;+q3}#gw|1D!3 zuoMe;c#4DF0QrxwzQ=HFrq_DKBzb^1`&fP}SxzEzt@55j`O%;Q?(v4zN$P#uybk?t z)OPRU63Xg2C)u_GN+;j2$ERP}5H5o?zSeCPk^*LPPHr;%0Yc6LLk|(V)9jh0JHgnO zVQ4y|CB}?P%W477!kkkcI#~sT6=o{~R$4Qi9Aa*siSu~4)-eF`<90>m-OkYm77A6r zw)X;rRQe?+44Yy9tByID^hQBLP6gmv8j498|G#z`!SE~JF5OJFcUSXG`P`19+pYIT zQ|SbFB34Xnp~=J}Dv|$HPo*kKy(5s_cC}Wf2+Y9_Ei?3q^>L5(K)LO1@eHgr>4;6Xdp6MuCFz}VwYpR0v-sM8Q~!$WTF zvRmav?Px4XDwDszAK0ce>#j|)i`#7Cr0)?ypZ#MnHMs#GIRX* zgpi4ViIJU+^S_V(b708C%*4d>|Cz87)dH%Z1KC6y(b-w*;F_A(zrAfi)7B{raf7tA zP3UG1dvgN^7{DDnHI;3A^Q(G`sw!JcYxT(~D_4~#LvQ@Y3Iydpoa|<%1_yv)V^oaH zfN5zOnE#%=v2j(JtSZ0Xu>G-RKe!mQ7B(JVj4%!W*z6r+e3UZJ$@H=vB;Dp{x*vLrR zidz`l6&jn_uRItPfqqlj)uMNeBQVp{U=! zw*PO^sri+G;px%Xp1I+3rO1dri=8f7Gb3Vsa|_r82j{@|#BE?O@Z4MV^-Ywo{7YeU zb!GG^f8Wx;$k3BIBH4^fR0SK_%Z$J{{BK%U_&*{0l%E`c3mF-ioUIzb93Fr(Gn?6$ zXzhV5_?Ptfm-LsK|9|<|t0D4QgDLN>@v}+`^Pv&;j`m=lUcQv?^+86bU>NEdT!1hD zr)jMBd>VVh{Y!igTlcv&+5nr?>7z=EcU!AE07ax@K@_#`x={|LeEw!nghF*XE5r<##jT_cmxKtGen(N%_0@ z_qPnTnzm}|m(fjI%dE5&IIh{78#wdVrULHk)7-?L3~grRSDX6W_{{}Eh|N^(w`G1n zacTh8yue`J*!t(S<%?GR`>%-_8k+#9ws@p|EGoeFruk3m&2>{0e-AGg&aT=6J?h=H z;}5pd(#YD%(Q0^oof7~IE)LB0{!YkO$QoeIlwGSikn^WiIA9bETZ^0>onPxi7hp*X zoP96ZL_eGX$_MEOwgUi0urIM3K;f9(5U9b|9kv57hUl+omJEPc{cad$AH@%LJpcx& z53w3R;gQ`Fn*0g7Ma^BCs>$x{{ zhu(9TUr}qjtdJPH#8&&Sx6PyJ{xfzD>Z!5*xi{jwYgNOGC+(S!+OONczv}mDf%m;( z-_cWRD;G9Pzaz$uuS5>`vleb}0y&%2g>%QrmT-;xX*VBDh@NXk_Kb<|T*G#Uh%-|be zhWBKj#C(g|k}1A@t?6E0z&*`ZvkN;P7T@9)cHJM-Q$Ht`k1i~}XSb{UR zxBz9Ns(z3|lCN72dgIf4Wv^m=n0uRN?_HIJoC-XD5Tt8{EzRd2C{KadE>AUev!WY!%=C-Rt$y1@N~OFlrm-)Hd27 znB2%~>9i#DQvcYle_cH4yr5iq%87)#o`IK`3tv(_2fT!17YY~Nrl8&|P+1L-zRlr{ z&AiO#Zyus<;q%}PGCiHhKAP>qHen$r#Pv;(t7rgIBT0J2|xm8kMI$~mckNqg;LPQXT)Qj&;-cwS9D7@=0 zg4bA~%8#>M9`Z~acej^WerLHEt(97C!qkuSs^VhsB_lJ$7 z{n)n5!L4&ryIUep-mh;eIbCc?huhjDojjTWvth{srAir>BHUl7^(bNN8N>o(>J;-% z`3*4EojNyMG7`E0+&O43iFfnTEXh@LuzjmF8gt2=TAgLPZ&d)UUA-{o=<(4@$4N~w z@Cl(Ji)FrMmeXoJDWa>nFC@KBY2+~)iY5e}^yb$1pk)o+2QCh^PBP;4YDOI{_#C87 zd&lXNF{?tgtYxI`loIJSD`+tmkL3*>3LNa!aW@UedOIl@^3o7*qhdQ(y)6U^Ueu<- z9_-lbr{pMg`J5t`iVg)%&8?Gn6WB`RLs)bzc&&pGOH=pwd+^2FY(J4&xBLj)aUwu; zo$p+@M_w1pP;C)N-VzgmNqc)q7|OC;@hhqc|={U zeUkKf4d6UI7i*jBhp%1s#6mS+d1z%5WX~j40<<-vm>_5O<bRS=EKARL?{EbJu?y1&+kG6I7Xi@qn}8bH|&-jIoq`LFoxjehQ9sOv!Gb& z0(+Q2-*(k4S4u{){sHcy@@`7W2xe87=tGrHT^DhJ06zb?l&4f++a&`* zC`qW!C_wkJ5+M=oFTt4{pz!48C^T%p)EECzDf=Yjj5j+YIdw3qAHtjhLmWPx*`5$q zPcG8=qXI|zSmE*9s(OUIi7y=zn#*$cK9MRoG^KI?n)orX>S6A!w(Hg#*TZJ))02YR zq~~x3zBs3#n@z?LWJO>c%Ci?=aK``iOZE2fFYFTGoPNMs_oXU zADKy|gryi$t;iuJq^$F-ZaB1<7gkubDQK8^b3Y7XJGDG+pomh~L*ppDWI2JFlLU2a z?B8}Q{zT^4VLf{jw?mAXU!m~6E3g|w+XC?;3eAxzq?jsRu5GcHz4CdMjkocnriTO1 zO4gxLBmcDhoR>v0rO4H#7)_?v@eKyG9{SmIqFf(S$;dmOPiMK4ZOXBVAfZA7F6)lx zvpI0FpQ!aqCZa6gy>6rq^fW1=5wTFFR6h78C>2qLW~5?|`|i#@N$L1leG zU7`{@mJFjvWPk_KkIr>--e2BFm8|k&s$CyJ70__JA1ZWusMeLcJT1@mM+ND56?a>k z>_5++mLx7KuIfYl*+krSHHO#Y{F-R6dfKpq&1Tx|hnQf-KV>lW3;Xs;y-Qxs4rBSd ziJ__H;v>{0f9bA@z18v6JZ!`xG=&a@HeK=56IG-g(TfC8pGSsMO((P0T`PtQTwlP` zX6-MX>U7ep=3EjKvK*v3w?l=-381%86W4D)M+eM!e(D0Q7*<%zTau3!5y5NkUYw>I zTvl-BagCJb4G)e}64~gfIRNc^#~SNv9^pFjfr*S_C}4FQ4(CQ=!ZQjE*c@Cd#CtV4_I|6HqJJj|t_e5gBS zfeo82CL~gsWEMBORhMUVctDj&48?N}3CT9;QTym494BIZD5!NMM>=}ONcxhQ;hTh- zoUCc0K9Vr6B6>vSuqb$Ly>R84J$>pa%qD7jb%BU4fccuzttF^DF9Ap}qj-B5t0SIR z#)3@}yGDm`7SZ+XmBR^?E(5Q#O|kT-1pZbRu(cq7-VVPzU^2|vK2BmnqepQNj5c-0 zZd1jvCCD$?FBUn@u5%|jc!NhBbuuXq3Aqo`88q}+Bdd9=bj7}9aWk{3Oc&!{MlX8> zrsRCW^ezpoXV2Knpw*{EBgZ+2WpeO0vd;nb$pbsy z$&_FXGMd@E@tBgn4x^oH4huL->Oub4&yC{*1YgWjeg9KJDLmZEWx~yZ^V<1AciVoR zrFCfkNo`$}T3j9OfN>t8;YmFsaR}R%eHQ+^EG!723TvKRJ{?xAEen$_+d{q-T@sJ( z-F^1li#Ozge0<+pyK<#*yAM2F2?to=6wG0MDSdcrMBWT8VHMDnex*Jh*4FZ76;`?| z5tF2&2#=3rT-1dQT{jFfh_Jq#9ol;s25w+0cbws0IEpBhNE*IJwv;T0q+MjY02$we zcLro?4cK(f$@C>pMtJK3x@TTMfPPq9Ck!>n@%9=GgFEG|&lez;y8lCy+#=e@s(xBx z+jb~kkRH^{n&#N_DgjMi;9Mky3 zhD&81@2qzL>iO6=WYU5`X8^?gkfG#vjyPTZ{{cThz`x*R&~f^DAffS{Ae3n!Lb@KI z`f4x*3!5uiiIoTZ9@z|w`Wbqy>uPZSi9EN_Yu+x2d|?*)@ThtZjToBlDr2F6dufDX z4Q%L8f{tQhH@+B6>57F4*3ZZTJvqRQiGH4}L12D}GPz2fT#GbkbQKJ(QtI4^wnIVM z)1c;cANmhXd!Tn)%>n^JLHO;0<|l=RE4VQ+P*u^~lgpQg^J(e8&RJxM2+G<9eo!q% z!7*gX#SJI&yq(vi^iJ(!YR+DYZ%^6gV>THGHMobGlrzhQ-CtFDeo|^U_|B}SGTP|d zB!WxHxY3%Rh}-)vSGez z4rp_q=Tj(}%hs99`bx`QE?fK+a|)R+x`VaQ>#1WRMtA?^g^kuaI8AEn`;yyX$Ln+3 zGz=p_&sg_4cob_cEPtJ(;n6Pc&H;n9p%^Vd{Ovvabb#AK0X3{8R z`0P3$(3+5~&=I_vebVZ=4jveWdXv7=nvM;4xEH$wzT4EV751nc{*)DR#UkJ`(*^?t zc68ZxJ^!gk1Jp2&mmo5U9Lyc(t{AMQpu4iJ&(Gj2u+)lsD_h~Y z!}568cS#v8#7y@GjbUO50SK$>52q!f>xSB)0j75fZft%M!P%HzN6_j|^}NgCL~|G@ zn&>2~!dL8zmrr|ln-V%C(`DLFcg#s+sXvU_g!B4}!no(Vq zxM3>NAvy7DS8j2Q#)~`lHTmNs|*)6bsQ%;2eImo2J-Sl>Hc#yAUuMvrQ(KyJYIEq-LQ%n#n^Tg)N$UNcBI zJ^nzUPT)6Kx-+M!(M$#88T0a5kDk78-zPiyBKz}~N2 zEAOgeo8b5p4y-y9?P5dl%5r_DsXIfyX52RvTrfuRLM!7^BIq?=^Xxc5NYz*h9$~nZ z)dh-DF^LcJj&qU$PCd8(PiNRcy|Ys@@%az56{^#ZVZkfJx%-Nt%f# zM;PE>P4SZ130@*@h)4omh>}TcO%SZ`U_o}jxYhMZDm=Km^jLoQ zjGn;8p$`(4pK?*Q9Wfm+1Kd`U;Px20`Ijcp zLtXXR`{|~ku}QPHAyNTa&}h^<{rj)sya%6Z$1Z$hx1^d} za*%5MbyrB?$QGeXk(Vh&%mw_}Q~83Fah?fVe|)d*`Y9M+fs+CI#jw2Ij~*jc$k#Y5 zLMD-0i>~rblG5j!ba26a@l~@%L>eeu+pG~Qqn5>*>|Icc(?v3=XzS9 zd-%jNAs0%tD&_3`n4RH)9=!j8`LX;*aD$A-)3j~7y9a~{E@$@@GKY(#)yqU@I8$$9 z`yN{ME_WZ|=T+U=j0gO?&J!e6x(d*5PTACZ7CaIc+27=YdzYyy^?~yKhlFBk-(Kt| zps@JMoews8>BV_MH-Gke1ZD=ONoeViN2~sDS?B~ILY(l}*2CHOE*$Aj?kA_R)%2D1 zJx-;@@rFQ~HHK8&9TxpGYtSvB#rC{};7W|Y>3HDt$0j9)8o z!)>sAu3@gQ3Dtl6!0&AbMZ0HOYQ}9&M)*+N2dXQ0CVOwNpf}YlE`7txUIvx#I&j;}UTB!hh6%a4v zgolYBm)ARX$LA z3(PGX-+mx4&mBUND(SV&5`|r+s8q7kxWU`YoT!s5*5kt#y6Sj$jBBfAByIb1xfajZ z*?#YMeqTCs$3=sc?;@}he*o0L`A!fF&kLgbAWcWpj7Mx`*>&>(ptRapsWm3Ul+Ck~^9^Ed5t{di|bFEdFonD+>NCT+kE zFsLsk?>0!vJzeb>ax4{Sarxfbuc!0$nI;Z%?pbkovsli^G?;d|?b}*VrY#9<>$v96+8~E+Z0BOf3o>NFmUc?S*zUx5A(;p}oIOlFQj8<8Y}}##7Nm{Y<)y zQz?`D$~IPXx-XChGERAOa@%w7D~4^NCN48aN4t;Zh*>WFlE0zH*i>R)-vcpp18N@8 zhg^PtuSHbu5%i(NNf3ec7KrvGE$cvbL6F~)nor%_U`Mtsl>c=;cj(n;6S(n1?Ss^; zS8_{>2D0~Lk%&XsAa=jXpwQp}yeZBzSV~@8f`T_MWEjbGoAk{z=~%2vb|aG5?Ssxf z-t(>AOguOt9ymO2Dr~3MkrLp8PHzCBg!2r?t76~tL<(hwBI}?LuN!Go)H~M8cgiC? zrItphKbFaxoTOr*8Tp5El;`UK2i2 z2@=@g(LHl>&e}Gm1NU{o>Bq~9<|eyAG`5(JewtfXWFWX|rdK$nMqIwX4JVR>wk6=UmvxVF=l1$!M(+xT#o(q^TXRNAA9{oRuoOi_1O~FSN z^MkJy){BR!MPov_kOQ7n3(_B4sVmRT(8IoC+RyN8m{^h)G*_))hMGg$55O0sw>jD( z(l-mn!AXOQb4G8IRCp;)d;;4meb@zPU3fTp1qXQN^~%iFE2D=M@c5aQ&RVw>bqlec zMbDip!?X0h$BmuSt}|&|h<}nw*IB80t-t;=N1C_(J)g3*f67@b9sAZ~J8ZtnHD^&U2 z0X1e=MErKJ9)=vTLq(6KM*&|!2nDu7GOv({qzJwNW2nD39K9s~l*2>kyVV8q$a7e_ zG#ehxsJ}El?)<8Hf%2|G_-Lh2sW@d|FIMl$19siS)QIRA%ff_&0%sR?710mP9rYpl zTCpKCQQ6pe-7kZ}pSQBe&_Hy5vXJvBHt%iu?17u>Z4zxCj+|8c<_(Z84S1Rq+PO{! z5rSAeSRB2xh2eIHA650V@%Zk|p{#rPUO|8R2bTZm1{FY?qKchjft-?dQP{1#ZT_>m zJVz;mN&jXAo*?o5eDZ;i9$qE(zBGL0ibx|bxzozXTyQHR#dZ3cJ1dGs8j)s{(=#)ZOb4?QjOQ{-vp&| zZP@8LGO{UFJZ1pWBQ05ow>S5ZC8Im5!oqgvj*I;G{+>FVpW?L}1Fskes+YThIz@wK8o^saj?KcDA8&@WbiUN9{f0a2v%6estao z##Sw>TG}h-oF-WKwu|TJh~8?Ltv_yG0%c&0LO|NQc_1B^R^dEONJa#gKM&EY7+j zswyB*<6(YFof6-tj#GehMOwZUkPUDR9IfIA-E}r`v?_E}##*HH7fxs!mKb+7nw?8; z&A-4h*eKBoBFqnu9^UkfNTCf(thxIkqP^jx^Ca1%oIpwrNNh$FJt8qWPlw)5sc#P0 ztKl@D0Yfj9Y0o0#HC^Ga=8L_>-QVEh+7tGoNKGUX#6E(J3FYC5OOqLUt90@sFIhhfdB-yGIIqXCGu0=FcB^m~a8UViSjI`MLHZioXEvVBuQMEAVberb z-1~i>&(y8s_ateqzUVVL39dLX3f9qT_YNF7UdS7Ed92OZc@mL!e-w7_@scdD&7g!o zys9UJR86sqO!G5~M_oZH(FxkZ#aA!qO?>4mt84mdPBM5X#Y`Xt1)hdvFXN(4fHo;< z@2n!;8@kxsK()Za?+t>6T$AHNQ{lqrWP^jTbTN&QQhvY@U!41W_$NG^_eK`c^3_YX zkDHHooGBMwj)s4VdEv{C5Y*Ga0NqA}%Ny@a3u(a+@a&cx1qJ59J3#7jzhmXr)7W7K z->qi$u`;$Bd!IUgAa4R3u99(^ zx_%qNw)yVdEVTqzz$Js z-EhAXEmz88PQ&+p)5xSOa?f<=Nh8@XRH3z5{U7D~oH!HBp_Lv}dvW1~lXEzyqJEzD z<8-9S$wnwrwgnw9eKD~io}dL=wuWI*GCxHMvk6dp7O(v18vwG3>~v3o8wys2j_u!1 zON5MFtad^7Iz(8!4M4(bLEp)ZpciSDdhTk>J!^BK6uHB;)({ z?CV0eRF+C8LyD1bb|a>`DX*Dn5R|u&S?z(ufv_|7wGzQiIU`!6>9#Bq-HEfVG*}c6 ztqg-ur=JI3O!!2Sh^F}ugl1*NxbQy3VE)W=b*~!iWY$Bd6f0U!JsXM3tly0!Zv=nx zU;08-%L5(m!IhT#o5b8SCSeLM#iS{Xr$W3J-24 z)+*sslC%to#m`d}kuKzqU=)cT$RDIO(kaX?kxBQ;mQh%3Me5L>!v*Z7kI1y)2$jOF zfnbIwNhko+ox@PfstuRu_uqsCuV9J^olhyR_xp@Im@?P3gb*IX`iC+?@Z((CGj?&k z7|p}ND2^0~C1S&lm!gDe5*2b!ma-jpl~A387r@q)#`fr0`9l15G$v&d?Nb2UP9#kE zsKp{b^D>bvz+85~yF_R#%Yz+Mz6;Xb2Yc;eiCERdM3;$0s%~FpHwffDQg)cp7xi6+ zH@cHb3wXF?*6dwod%`+i_kMC8S&@E$IkMNgvg&R^fmm0H$^ROVpA|-b7rS-hYOBZ( zcON2QpMc_J+(Dv-YCPMfG8dari0Lo?$(*E?HhnOAlSBm@O;o`)&E|?j=psKe%GFxo z*(YNcC+NpzQH*b3AM(%)RG z3|{dtFH=c>HYIQmQ{AyogtYEqSVsW!lKu<&zFkAfGDCF1+_kSF|F_Sy=->C3I% zZf<+V`cqr>zA#^a94?~QK7&$JcP5(YHsM$(FEs~yO1I1lGn>ZAk<;q zn(?6|4Tw$96wxYg!otKJ=21gb%E@Xs@m|zgH88v=sDjl1-_i?8&}3YHfl>SMIe3xq zk%(=HAXMDwwC?N&rKEpqYQiPf00MZ+lLo{WM;Nww#OofiwFXmn5aHJ_`lJ`EB}OH$ z*f_VJ?UiG)s|IdYM6wZEh%d%w2u-NW3u%V+T!``It(k{>koCb&B*L3`n3HpIY#nM4;`M}Y zJc4RHWdj*DURBRKc%t{@z5Kq2lTa38OOILIIL<=ynWY zS)DkGsmD=azRsgTM^eA9wt>^=(2<4=Y5xFWje4%#^0`ltX8N<3hLJsd%vIn#(<-Zj zTcQ6mr~UWoj~b7Of|So=FqAtcM^03i)0v0{Y~gaf>;{g;!K)%yx7aM+#VHZx`a9)? z`SCbNFq~8{FlC8-q%lub%Ne zGDbQ}xZDmai^QKmRO$>p$d(U#Zv8;eDS9E#RLp5leP%PH8RM2h@Hf7JaGRRS2h^Mt z8-!>)GAdQbQ>~#lyYGyP;p}3}+X?+-*?2^j&7n`#8uXjGo7l1*u&Omy&f9s?oV?|X zZqZbCAW|`Y#}$rF`BmSiUG<~uLOJa@_2kV_&zf zgLRJyP{yQ+s=0?zsf-Y|WVv_~XHX=C9YchfGTzB|5MRb=u*zf1*LNVVjy(rIjel-~cB^@sNN*WWRA^py(b<5StUTr?3F zxlwksyqH;v$B+(*QG}5)OfVn9b^qNhSt+D5;PXih)w70bT^4s`p@bwQQ)S%AVeaJD!Xx#pT)E!IY}t0@lcCS8QQ z;@&=y$nY^cEj8nqI-0Dwdg5YnY?4+>ICZl$NB7EnUy1$68DOEa-%g=&AK(t~qCXM}u3*rNBdcdQ!M+UQMwsd&}jqjwM7(c$M^*&bC z2=g(s>dIazkX*AQNX6s5G_Ggo09|(fMs~3D$q&IOUF=4YU)T_F5$`sm>HPmp$Q>K@6@H6tDBd2SkO^P`C^`r~#c1nrUONz9CpZ=7_ zxkMB!jH)&9HFSIzXqN{V-rx>-h?Yv!BdYQcPasa>T1nWI+6RO@vD2t8N4Ab$Y|qZu z+uBQMkGSVL;^rT_hAHQAhPSb%7{I0onYULsPSFeGAB&I7Rzn)H+>eE^LdHdV)a#qa zRo*Y5cvp8V2Vo%{0BcBOc1YnbtkG|}#F!$pp~ICER~4z+y{;v-H%fMJ$;vEs8Z7rw znk00s^F|pIKCmeF2|6XmVAEFadEzP%c`nav$H!0BURhHe<{LA0h)ox%yAe4B(pQ`a z0V~_He?T?7T0`{q=Aly#M59HX6@qB#Q-3wlN}-3y>8#@sU64J2SlgYp+B1zB8*@t; zr|z&IzwwDPuv^&;zqq5@K)m{RueX?+K=S~-*gLZ;!r}LgqjfuXQV!?25)j#(pi+5W z0YXk1-ycQ4a`%I>#w)~3vxhV20>YjNQXjoXhq%mDnTjk1*4Be&UTUWPxy_1- z_pWD1TClc0+&A*9pFz`S!qVs?+{mV$vg*o$%b(}5lvvD8(KMMV`}2{Wv-reVcIjU| z*B((QPeb6=U|g?PXt8^uCb1ZjxGyjeB6?O=Pd?cUBoZ5u;$UU*%c#*TN^dS(kkI!Ney z=2cS7Wf$?;gyhRhajzPAvp$gX*zn^}{huh=slwx++l$4I$xTn&I-JXjVsAylnak+ic1_PJaqr zUPC#n=porbi=!w}tkl9{ElC8Xz4YL_6-5otArUiz2ygIbqIlTsMlwwJ@=+yC>1?p& zVTLa#kG{bLFgJAap3|RW+>of#j(zhbJmqQTVlH{Q#XPp}GOAu^Tf-MWvZw}V&n1E_ z&=rRusY#2d1+=)_p?wbv3y%(H>`MVUsaHsGg73Ey#k8GnL*CiI=B!Xf?#2BZ~P1@B6Q_ymB+i3vmO0Cx9#(@H5A^nMU76~SjDglHg|Vy7 znAx8zR|ZNa!oEY_FV0tymIlO~I{AnQNYA2Xb$=Ww6`{2j5F4oLsn^K=&a~QFWIzv% zftpl3^svp1qJ<$X>3$fr+}m{2eW+)-=rgN>m+liFF6-q&2J$mJ_4+!@2TTwiPuYwv zNJ#>GpQ7HlysY9liDQH@z(*(cm~@q_yC^@5(nn3@nkLs{24WlO^9GtA;H$B?Dpd&5 zZZlHs&+n0m!7{O}pqt!CZNoYQ^NJnxHC%Yhs3HUk^c1f`LTR;OGy&h7IA~-oE#t3Z zCoKE4#mlBb3zoEgO!G7w9pI;BgRqa5(Kd?M@I-l*TsMf}-L%x^eUvK;wsl(`Liz?O zXuE;Lg(i%&EP*FBZmT*=5lW9(|#n}D$SMEbie zw5z{6MLU2J?{r3uQDQw?F@d>w1K)WCtcsvi2vUPx*yg0mK7h56)ANp&#hJw3u4cQK4>_W)$A`A1W^Y7sjN9R*p!L}a#Vjq_;Jd-UXm4|X?M z=aZ#asgGXPdpjIBZ9|&cv}uP6Y{+=%9E{O0F{8(_7(bkg#CRLv21yg1+va?2JOxId z9JtW}pVI_oP=*PI`5GpQ_(nboK?OD7TH!y(ND3E!alYl{mQIcFWkvy9VAe(YTzf_FvGBS8;3St}m4a(XnG$82KUY!mO-~C1yf`3yHbs zh^k=43R7P0iG=15`~D=y&UyNq$BSvVxx*ZCEfn>`PH|%1dtmrnidI z_G*XbS!i2YT7P~(lrVJO)~;Jd*ej&>%xsM$n1*u#I&N$*loKYI)}}v9#2i~eq+kfM zp7Y(7ia?_-mgGdy0Db)=?)#&mFQHDjEk( zkxbRW2pp&Kh&kgw0=@Zo((qvLS-#Fx@EUj(zF072JWTV`z-rIROpc``E=VsxH z28!w%*jI=0km@HL%1uBoRrozV^S30D5> zbPVcjRuVjkIuxZ4HrOgMM;Jox5~za+n+pds)$sJXj-hF+f>%REriwPsgzUIn_7bDOnPiqek&--w?n+5z6*y* z$#zU)2kwo!{fJox!8;#*xce|_EarN0-&9VpvxY=or-X$$IOXdhe4Kfc)T&2mtnbn> z7Vc_NSy&g>zsinbNX4duSu-dsyA2>yAVPpFZA?NTWvwQdqK+pa_E~o~tL~XXyQPk` zo#}9XiD*HM-uteC_;dq2@=9LUMq!Ks21tJ5*1#I_b~NEkXlB{@G_uh=hsdvefiA@>Fg!F!kOgDub@GjmC+83R z*@Xxxqck$dkh}-WK(p+A@oiC}P2Xi!7g{0R4abPqgZmQtfaH0!LwGNC00ps|GZ%WQ zK^PHMmfi+W_3Ery%JN%k+Sq&Zb07Kh*;iS+2bIb3PhRd{R))hAE-He5Je2o3VIg}f zgJcD^Wi-V{eL;qb65j4H@dOozz5lU+{0(Jujjp0{-v;x=ufKo23@yVp2In?g9=y9@ zJtWpD9=DY3$B^7N;N~&`51E>GbH0^D0AanyS1=n&N7iGcJJwsE=qWa$!iZUrD&L4R zNR=Z8^{8v$1M^-=;MHr*IzwHy5YCV5>orgE4!wzUM%l=Qi;`iLA3u!pmb*w?&{aLB zdSz{gP3h}0oRfT$d4k~;5Tn_?Mu1=aoLM}XAJK`7-Xk+%qq)VacQTayB8)M>o_%(z z(!g~j?-mH~3uz$rjos zKC!gQq*!Ouc1n@&J0#rjymH?rDrdi~$7Gw=Uehe!<9galb*X;0agY&DOD21YLqcC) z6+b42CG((qB%Sy)D8$vsUIVZ5lzf}WBE`oS%X2aYP*hk;!~sgj=I=g86HB!noFAB} z1UqUL29mETRu-K$9Ocy!azgYnYDdx~)j7zJB`c;vsA5dcJiesG@9eL#M-~uP9VVqf zqTLt;P{|q`lPN4Td_Lf7-S(Ac5XNt+LUII}^OPmN52tvouZg`8nB+Kd7R@S0Gzc*; z?aD1gZ9;e&Kf66q;%eRFTXb*G?avC6-i7@oag-V8j~8=0Nn|V z*w8hBSdM`{YM3!wCxK-g;w`1c&Y&S=Y{s=ma>AB{JxGv=vSGMGZ<|W4<5-X!4WU^0 z;v(InYNs4vfw*01t&V3DZnG&{sQQX?q^aog*-hlkq)PLImF+_$z5L>*Gw*THpIkLd zkmex(4G49@@9jWcXTFDwB}Gon?$# zWA4$IGaA?)h4brTaazz2acpc~yH#r&sET=81Bqj)1&>KY8=(b;K5)fWimh}~Be8npgqrcf&?pSMj36O=)5KGSB^B=X_LwCz&donpeU6!I?VqOa?&5)krY(GrD;XXY+q{rNgRZO%!3vy1d}?3NWnu&X=q zRb@)GXG&T4vnPWGvxF$95Yx0CPm{qQ5v2WVY{PON#3*g|7z+dPfgF;Jqr>$B7<1bl zd63H0RL~Jh&eK191>-;%XlddcZ)-p|O6W61D2^d6Fvn?)D`k44DrUjXH5xgC%q4)uoUD1&fz$KU$m zR4yT+R6bS84NqH-ujWPLeWV=UXCp7p)0E%2D%cW6@<%I~WmTH6LH3SlmGsF|2^geW z+ZIyfkZI);y+m8Az{O$?3{DQX&Gvd79EHuCr&L%KTv@A_x^l!%R|<>`x{o@mO6Zs~dNYl2#>-{!{6yFH4jk$0j2flFU3TL-2PLQS>9bYR-0H zmS-mFa_RSewvf4f)uHT`EfE1%>PKL&L{=jO`&cG|@nIPv9i6)GX`F&jV06yE)(?IJ z%OTM%Hs~Om;-$SHt$gS3+=(d1uNCppt~KIr*v`?-_A)0;x5m+BvE1t0qAVlzRac!D zT(_+#KNW5GDZNHd0%d!(xBvG>zR!kTSA95|pCg8GZWAIdW~Pof8L9P4x@OS4x~_$l zF~|!UOKW>(7#PUO8#nYARHa8sTWa?BJK}du7_fv>FUE^73F#zN3kJ>fHpIXM@d<{A{+tw!XvO zIepKh2Eng!It^hph1ity^jsTz(Pr>2uG8xdLT=OsE&YQ`luk-kWK+*RHu7;4emx2w z+LRmf{W!r-Dubp2%!*iq^yGF7hMP!bnd3WGuKi^0(h==5X+3#cy<&o|!B6i_m4NZY zk|TnbZM21&`kPpEf!F)z>b14P1PEI9XsEX%JYHR`>tM~&+Yzu4iry$v%EOFHkS;N! zEAML!?cI7Iu!BhiP(OiqN&8V0)q7PG_m1g`q#Eh;>2BJMUTwQapDXcHU9@D_M0y0< zeP%7nQjl^H#hPEKv4?qltZ;{LF_JP{z$?21QQ@45I%LZGt8u-p&Bi zTNZEZwY$3OyfzF|*r5^go_{85mI0T_>gMWsbR z$*vtP61~WHlG-Lv&4iUu=pSquBp?7wbeVl(j@Hj`JI=#ljXnl}%N}&&_O;j6-{U^J z9u{DPTlEO40|vJyy|3`8u7Z*&bchL(6YNs0TN?QY3#(@-0IR8yfXpH!quJ5__N`U( zFFy4~+oG*4ISFQ)f)x5PyPrASCs6fqzX@k7!o2B}wp**3d|+43uCEMmOZ*VmeO~RH zwZsWIZ3IEL_w7LKE0#p^jK-Z~|5SB$FfRh*g$&@^+V7aXrOd>o5;J?BTe636SaKc} zo&dT#*~|!VUXXcuVjq((G{Inx{CPI#+9O;A&jslE(09}tfqm0VY{E1>y3Ya%*8Z-py)Qm$iv_q*@6AA0| z3I{|ufTZ9NeyQ(l$Qq~)fDlv_f5r6@r&&mZyD6; zC<_qEU@DRkKij!1(gP%vWy{7~`B9H_J%pUeQ&%D`TLRz5Wc}_!j+x>cWjP8AbsvV$ zV40gWV|J#@M{?)AP|U5!BmvOaiexTe9zh=~vFoosu90wb%CqLPkDJRS~Q`CiFv zdv7`rGja;3;WZh^VP^8(;)3=mZ6e52+gf*;m*X+HqV!@^NLKwJXzwI1#F^F5}OUg z*GN=>eDklVd%LfV_L!9Gbfg!1t`6qmMYc(pN$(74KTk(}0Yd{yHztro<3Oj`5F8%Z zv=5{7weTMtp|E)Ae}F_8Ub#6@af8AhNm|X_?5ZkAxh^f%*fwXNzWe@;q-OrIzxPDU z-yHM6ti8epkNCkqQ@M%%qI+(H3c(i@_DBG2E4BmQk-G(X-s75^U<4lM_3SzD#n3s% z$1f1vp~3!`5z2LaKQH;bgR*$OQ9!NiM@(}?YrHa%!Y0RiLG+Lad_0?v6nMY)!#xAi0wSrF#x>YnW&fw7Vw|A#$RuitSVA_9x31 z```VCK<(S<{EQ(T;R`>=6WMm=<*?f}DT!Jk!=fRP0YMWYH@9O1YE5pe)*jA~OH93c z5Z4(H{)gO5*LN7zl~4A`i{mPYPgWN<<1A8E`+>;7=mE8ms_f6)!ytTzSLaWF?i1#` z4&l@GVo<5?PyJ6=uD>rOyxfxcjQ^j5%|vZpVoD@g%wuCK#_v!ByhOT=T(q8)^q0W5 z^7e2R-a5Dyagu((W84${w)NtCb0ME>5YB3n70J*Gnc7aw8lZM z2v7rJnN9_m+J@K|?}s`keh$aAI?=tZoW+RR#f5y@QtG6yZwnW3XH4z*0>I3Tndlxw zaR7UgqFaqrnOp`hS7>6)e+Z(5G% z%J($Oqs^n=BlJ!4Ux(OGCm|G9KS8-s*n$gF(^biAL;CYG^lCcr5tC$|cu?>J_>nO^H|;;C+|^PXL+-mcW2&hcKEi@4KO7+@6~> z6nvvD<27W?GCG(Cz#o5B_|OHF5kDAib`>VLj5kh)hb)GaZby$?14gz8e_E@Lge1$) zt7v}kYt?=mGq0&ATkkoI$lw&UBXYn1}vqq zgjNc&pnU1b)`FnGIi}0LW;NL-qiYpc(b9YVD%O`QP)&UB2L_=jXzy0oq0?n;mV#~D zXWz}r%LDNMw@!9GmiMwjkD7HhF7nb}Ve~uw=TF=wRvg1l>sB85=TzyaF}-maQ$LM_ z;tUddOEB9{CFx3c`jCif_sas+!aTIDnkMnSXd#p43oBniD>WWn^)(X+48OsB7(s}wZ5Zf>OaKt zD*?RU+J2Y=iI6^IiFaK4&T=jL(^&Bg=S6*3Hs^Wjw=~1Bf#Jlo5>vq%mpd?MyaM5y z0%}|w1lDkZsSa@Z=}d$MzU6=?sP3W@lQg1V8LgGn2o|#twDi#uV(!~bo4bsS_eI$r zo>{&$J@8;V8jL{4XnB)Ki62sbS$`2tuqiK5VW<{lyBh@0E2X(c1x-+?`D@{eA?M%G zr2E}QWF^hssRDLM3~37S-T~|^^ImKoO3zc5KQc?Ljl>yrlCDiB4ocHtI<1&!JLCKx z&o=0mi4&WPTsbIuGC7Ee>U#{0`>I1$ori&TfnK?xn}}oV8JUZu`ZqeP>W*NKWx-pI z$Tb?)=>zWYAsaM$WS_50um9-cs6R|H7AhMG=q>$L8OP*qD>Nf(dt#=bku1Z_1S}y< z0qx*hG{`)!ZI^?2NUw<6?@N6S!2_`b?|ajw!+jc)N;gZOOQmZw9r{~uyPawY!x_-U zAqQJoI%-BlCrFMYitOrd@(>|B6tD7fyHx zYkcR;F5W=4$oMyu8tufaO4d?%nd5WufY}GSE}nE}u`NFLKdc;$Nkn4N_>yA#qQSE^ zQ(#-O;7My5p~Br%dwG%T>xc-c&`bQh!V|(ZdwuMwyW80~RcgB~*rcoq^TD7rL%^oQV&`z*(t@yjhv`X+VzMkrJ@A8JG-LS@i*{>wt1XT>%( zZI#?q;h#j_7PJ<~UYXxfnMKa(SutvoI@@XQu5Pfk1ZEmjh4C`IX&p*el<4*cno6r@ z0y0+`L^MFUV%bc~%- zk0?N!ZriqP+ctOGwr$(CZQHhOo4akhXXhl}$s{uub5lvB{ysc=#J4fhmmd1Mq z?JX{!8jDVK6(+ExUB>I`&0E_C~_EXNY4l zhI)XOSHb8N+|3J60j5wexggLjV#GX?c(nshTlk%M;xx*5$0!fg z2(p7OiYCk5CFL*(H5<=9pY6QyXo?}nQ@WHpadV$`4Hf78Iik$>I`CGjSP-hp9^R%} z8bAUtGjrnLg6KhhX7C>t?Ycu8)XkTh7buplO}(lh_SEx+vn^x_MF;Lv>tM(%7|<(_ z zm}i3T$`?i6PoJrvD|80lMC9?G3d z$g8B(EAL;EjSJ@AL+W_Npz$vivcHHU|3WL9;1?ph6F6KzIL>bpB;hnlRl#Pl9ymK; zWCf<%H7=w|d)6srV@@614z-sq7V9$Z(#^X$TrmgJ$nJ+8(!7fOaCrl5=4CbcsqkYL(3JtXDvOpduQTY(G0b2>9E1s_ zN9e{9Dc!iblO>APmzH`ae{C>rnmLanjP%WD9E4f9$)3TZuMGpMJVu_JA8eqaA)gh-y6ed|pFrx6-u4|Wt&I)8u7@lT2I`c$AlI{#PV0J!I^p=M2>-8d`Z4w_X zDJZc7qFyc|LoH^q&hn1=?KX|-5|~iB(?EhiH&EQnnXkzFysXb%XsNa@-0kK`U0U`} zgg~P)Tf~!QwVU?E?N+5kwgL!$&BwLysdxku_8kTyWCDeM&_Ol;oPuLB&T$^5Gk^xC}r!OPbiArkkzNP5)V7(@C4^yF~} zhNI?362z$M8sG9O3$LhU2)zVrPl!LV2EnqiCJ-w?UHZ$nHH;7e38bF4xC83B=P-{)d<7^xY)0{z**!8jLe;*c#V zV^GUE)k4{)w&WyFO2+2tn0k&r;l442gO~dzmn39;7kQ^SP@=a~SJmSqNq>lWFT(Y{uF{If9!w_J& ziVfASVW&&j^K3JPlNE4C$b>+9_FL|n**!jxrZ~VGFH>r@Tzy|t>&=eayZvaCxFn}2 zEBs=R3Cg@cXqTgyz)bvOJq3~;9LHsmRhu+*2hA0Rc{BANINpfV-J3qkg>Cu#V+U?(_ zmcsDt!i;hkrFdin9fm+xmwi^j=6&d5k{b{zP`MYQo1(tUvS>ZY{F@{Otpu+>=duYT zW-WVh$(pU5wbp`m3AvP1V+X{lpCItzQ--daSkQDx+3X25QA{+beouiaEE_p(>CU5U&Y)XRf?8@*sKtaNN)l)Zj>=fXoFE&pIzqjk-0La32s-PQ|7+#@4kT>5)=uuQc_ z>7WZUY`Ra#fF5CMn}X4%sLb;X^C!;~Gpt4#i084kpTR$j`mDh+Bndu)gEgqx-~&N) zd_K!h36qGPmi*&l$x7ClJ1)zU-6cnKSYoQKPs??Zv7zGf$DOBZ;ITk3Ednzj()W3? zDl|B^ka6d?G~>0k(r)<6elLVRS_~7MbSn37H8ODyh5C5&oq2odpNMfq@XR{(c%silX1{sUspMzn158I!P#Gs!D4 z8l!P`PtnVHcv~V5kI-GtoQaGA;%3Mh4=}V)5bh1J3y?CLMc#9#Zo8c(tj)WPbRK7U zO=Ai!fWZ2_n4&Buz=NL_s2l=@--_~`>xonlZbmiFe)z4U$=Fi!pVaM-{qspmWk1*J zR=nb*Gn&s-u=!l`b7!KYcxrN zrE;|B%-f2nLphl<=Um1eBnViq&hC+)cAhK~jtctc!A?4WRGhq}g8;Euw2R)EnSUC% z1AAy-v@*6B(G#TX(fIZz(Op6d5z%{9NR2ft_hr1@TWhci{w`Zxix@yJkFxBTW^fj4Pki>+&E;L@7b+yL+n%<{(-+pM~xZ&2f7Gu>BD_6CA{I;oK4rJVEY42(kge^ywM4!LI<`Ru}}vR$;%onEABX{1cdm zFWa`~cMuP(puvG}K;^@EF-}}=4`7`Dh5%nD07EY{0d(LQuG$(_?SjPp`%HlW?gM_{ zUejLd1Q6EqW?NrgZfx;d8TcWlA@?By0s%XzG`%564iWp&PVT1W(Jub_-r8LnK?iJZ z?qGjubkGWj>f-Br?d|Jbdu$95;z7{!(L+3`MSb-RZp&$4p5&k1oPdQAcH8@{lz{{U zUEhw~jQx5w)iSv0srT#kBLX?uf2{-uwSo6B!W^E%s;YfV9qR^v#!W*;13&-=2q-uZ z0<0qgh;4E|{zBOup920UL4J_--V#vs5A6W&yYGQ;KpaB!{tm$2H9i9ZBiP&7%lG%8 z{>In~68HlT;{nzKa|`OX|BCdX2jTi1ef}LH{NoRLm+M6UaJP1P>zDfa(uvkBI!B$uhZJc{i9WuzaI+%at8$k=nfhz2;jiT=wHr&fbg`Z@MKNsrvmsjrhA4qf|eq_j&qt$<_|=iz_wuo!hJraLSM42ZRE)x#t(~lb7*RHuZ}?;3xXt z=kVnRt#}_Q^sDUjQ}IugZL>ol-`59o!+9Cge%jai`HkBDv$l-#^=aBN0Eb}L_PbI^ zY<+txfOi7&?G=qcj|zcwl@Bhs&izX^W!G_EM;s)iug~j7KVGK>+7Ar`^egV>r}0wz zN*}hyOZ=-Ga0`Fhr$jY$wS()clkQ&+(T@h#_B;f-i!33aj)4Hs$uA1d@E`{V{PwPY z6YhoH@8cy1AnwL-Qx_8%2=G10(!Ig6%%^x{QT!#76+|#e z;fek1`2zoaUkn)dQ~%EzQr*>KTr8zz{3;s6Q$v5d%6)FpO1p$Zx9jiW9`}k0s7j{h zBlrgOCC&FZ1F&!kYci|U0Xn+nUx!Pp&X{xlp|cjizFGl>-`Z)<-&2N>;r*i0>yeHZ z7Q6Pxmium%d7fnYSrFW^4ooYetPLYT7xO&iHlC`{qutVh$J15HuS-`1`L@(Dl6`^W zKw>=#vsJNcFiv?o9YWXB+BWg_&tS$GTwInx5z*wz@th)@l@Q86ss7J zuFrDy@`>^jysX41e?2(Gm8pgNEU2<-b^llszv9zBWrT@;epmL778e-$U5^p9YpVpL ztR>YCxbcM?vMSfg;Xk-LoDl`{%8p zLn1rxNi3s1*_^d$Ff7#Ad=VOZ6Y_AX9cRogi6R|8W{aL@m&ocSoveP5^xgt;=Z*6G zF?MU4@$l0Lv!k@n$)6!Vs#P<)AZ*E(?=YX<&p)>>!D&I*EvS}cT2@x=PqxBlrVU7V z@YhO_CqkaL%=d7bFqtB$(}CTIa09Bm-3nGyr8RZ#+V9U@Izzqf=nX@9Y~z*DRX4|% zR#L-I;duw;2BhRVtpy|1GVV&{y?ROVnq(0gOW`sf6PP-#hML^=O!pth^Nrc)6eDVX zjmrhX>wsqnSm_sK7PzwMWROZ*knAu?J}K{onv$@I@3Nq5-H&zp^>OqG$(k)y-xr`< z7Fx{Mu}Y-lpy#Qu-&w09{NBjNjs|*y{vnR-wh*j8*bRDn|AvzMq=YV%RK&C)0qH4^dqW zONx$_ey9q<%l+kC%101ZV_5jVUT9(l{kVQJ>*nt)I$z+$YR^O~*li&9yltOLbA&aD z1ukehSG9Dd<~l=1m1lFhvBB8kD6Uj>&^!?S_4?h;ElT$4@X@-?Rh$SpYuOSvKt+J8 zd2q~fAde{K$nC=GkqFP)WW}F0SCZs9o$D=SA!0GGOk^IY$|w?)-s1-Lt}J*7=JqTP zUr&*4Orm`8;#cMj%Er-!u$k~P4<>)!qr=E%W&FZ}l(mholR7C(Giuh+!W02F!A(cU z`X7qgu07It^vG~iX;5Dp$4l`hV@o-E>Yu$_D1N)ogH}wnQeaIVDmX-Q8TRl@$?G&ygwh03pC;fW{a23Qr+#pKY54omfs?`^C~72iNWZ+Xs52n+Z_?pAMUS! z%`zU~SAG(7Iiu;k4b!cB>woFq^a*|2wO^%8?LCBxC<-)s)2q&OWL=_15a3MJU^Vc1 z9JceHXhZi5h*It-JH$s{U4smd9$$^+)QJqEm6FbBaj zjLzL$kzc4zxJ3-yjpILp#$%V)7{=MO2CRY++D z7nfN9i)UOqH++uv~i$Xm#8IG7Nyj_!5tjS!#A*&5W#LWxDO6P zI-xon{9fxQ9=duYp%on|Pfb02pC6*uoqOn*gRk1}HpSr>qr;zPl+p}3`e`{fv~)c& ztoAg{`7d799_g&VAZ4x+5np**n%W9(ghg8}?+n&klMOSRwZ&{poa0q2fX?3k!AU@P z_irZKO?8+ej`gP!8bkQ)0Y&zr1+#$KS!J;Lvp?p<&c=dSlq<0o%6i4y?xq}+khwThNQ~4X>vnNd7UOm$>5&hnjw!S75i}KxWPbVtc<7vnDIs^C`0GgkqN0 zxB!!dnd6A@^#`NGAw!7LH4k*bN^Kyp*_Z4w-&-zi{(EDR-`0r^y@6SWC#P97R_I5p zoVTJx6F7}P5%Bl?4a2G><9ZB?)e+}?8G)Q2q|+DdIbyky#Pp>_E`K=yVm12Ws}zT5 z;nBf4aC$S#7~W-4vlUD>bd2AdY0owaEI@NuptdsMyu8TzK60HXf0^TTZ#P&{ei{f^x>oPi z)aiqRH_T(6iqWJlEf+r0w&vBI8t(l)t?uOh7|gINKKl6C>u9~(ylD*4WovJ&+uM*M zgr`xF4k|S^4zG;IDYG512+z@WL%S1?``c``cK!*eJ(wAY%>%cFAY=g4@Yg~&K6i~I zT~gh02Kf=;fS_<1RNf1VAi&BL>jaMn!PO*PjqIvf__FjVZk*W5xESwwJ%ktJrSFeR zBuXy+1Uef0;NwInI74PQJ{_#LSXPERMH!=V*VW1}qoEe_$WP2rNaan#q0bTXv}$ro zS^=2I+@A!-fD>ueq2M~76q{2V?6Te-i=g%$R1zr2g@>(`^X+S=`Qu#Pd2Jko?F&La zu3ambs#TZV<#_y=8LOMr22Vkv8zr8c!!entk%F60^Ss(5`*{P-X*l}1`OMOtR#t&j z7$(sj4u)rp{Q}eDu;G&yNBk81&}Z97yEJ*MRak1y_)cG}Vu>arn|3BnteDzHA!A5T zPUs+|v=wK=17XXS3)DF0t$Gm-RqFCJvWNncndpW0_5`;Du1>vjH1+sa3JyD$n8}_OVy0r@y3}y?25*lO%SIor$VZ^{n2yHdb}3 zOO#)ty!^o4r=lDSwM!yBcv>GyB>AHUQg*8NjmBa>t3Q|avs<$hi;dXKVWhKvY$FPx zUq!&P)*G2TuBmyu#)Hju*PE8pdptorGfAbaM7JT9Bfe)?+L^ji?b)Yf*8`q_+iIC& z?I(xCjEGOEFG$Pf>fF(5SkW*3!aQ?Sg&F$pj;nbR5&6d%TMmF)da*=y{CsnNqiq{B&c?CDmVTd{Gwlsd`=i&ZouGM1}bf zwaBEFy27Qm;Tt#5lG+vVG_b`gVnqo0{f~TOg_!5%JqECYDsOk_m)mkr<|B2po_IW0 zv6SmRBr5P5qm1SN@PRk4x6@v$@<1jLfv6WZX(M`?23v1y@;|m~AHj4HNu5|Z>J%YHlml}mMBwJ{#Rn7jmQah@_on*>2!cs+>+B+4@Sbi z6&#;hh(2nN$x@b1>YXNbH8E*EWY|!95m5$dLN|VkjM^ybC@hreW-EHEK6`H2Ui^jP0{77e0y*v@EM|+cJ3lu3$BAk#GDo;+=Yi zmo}R(h^6Q?Qe@)(1L* zVX}xI*9gDqN>cK!m}&9f;b+xT6^0k4kP`VGL9I~;lU5iZpAw-}?(HM)vN_A#he&17?Qi)Ts?cIp+V?~_8R3ta|{jR`)BjEq)lNDMmxBm zCi88uAe~+_lwyObxA}}{0E{D+KEFfaLC--0Radsery(Am-gK4(J~~%6`z(=c+^T%D zbo~uPI?47ID&;=d@n-nsgWOQ*NXhj-26bu1AG*}O#9w}gzP zWCp64re05zQbtGH*gI{B1A_)J_by`zHyAy|9upUT^# z=#L2O%$H5?Qt%C`SVj4sQY{Hq;TYwnc|A7oJa|V(t=${a6Rw_|>nhtkqNWm`4-TfShD7uUHfo6+hkM$93X>2jDa(k{lI~JyPPZF;&7IDfg!DTO zHUNy#bg4c7i8Etrqfsz_4TQ>tp3Vc-@om5p3St#l3i-c;hxOG}wzR?ghHwx&=tG?4j%=wqA z2LQN$8d1|=5BV-~$iKEHmJOxnwt)T!dh(IcmBgZ@I&L)*TQlcs{FuAM_?>j2YAdRz zihW&|-3Bv#fO0uio*-0*XQn&`DwkcE!=L+~Sy&A=XzxdF2E&}<)9#k?E}{Meyo(*t zVv}8LVn4@jQ~ymM0zOthdf|3~R#n^p1sg=>>+W^g*4hltOEjXFYZN#jGnu<5WNgeb zIlzL7RUlms(L0CDEiw=UVp~zy49>piD3X^l&j}6cav0HloF$v_iMYrhNb1^$*_-F;nt*jN(Ydlurpzt{ZC9}rR!xt~(f%X7fbXR*$3iqsyJl|v=xmD(#3CHyvwVCdnKVFN zqIv)+9V24i?;g`3{~{FBMfXJx@c_?`5DndfuGC)t6Okf z3G;1`%T=Jlv&v7l4{4}->aZAVSSYkhj(#=#%PW|6d+o>XOLI}6uB2G|99S$QTmbCu zDdwGNhv2Po<4R71nV=kXRMa*rTB+&R)KDTmBDQ{PK9O1-1pzH_v%Z-h$mKfKWmuDz zINqH>8>?w$0^>=FZpFK?+UyW^|1g{!?NgQr9rX8MN84Ojckqf;j*|2;3njoN+~r0p zM92^SNf?_;YNSU&$}4wgz8)SjCxI4Y8_|wl>$0`kA^>-1;k3j_j%?J|urrQK5eH z98VhFwXxRcfFCk@k*(eGs6`@Qr)JELlCrVJ2bDvc=M2Rg$I}+m#(`>3g=Y!WK)DBZL5rT z#ach+)nKU_`VQZVSSUi9$_h$m1?r0+8f_bcY18xP-+w4#$#UA&_xtA zs5&#%wF35w{|`6P*tLm+4oAm0eTfr+(G|)QPVoghRds11o(wZ0T`QQQdV<&uMBt-0kMdk=0zQK8yg%fU$ zJ*nnLOaQK!8P!AZgMe7#Z6-IIZ;Z*A*kK{loBwqO*=#^Fm;2}p+}1yZhC2Z6WhIi zQp{ZF?bRD$AwBL|=!H2ANvrv5H7O?8rXv`_;1@qlAS{%cu!eq`ZIE#J&+=D>Xzq zhh=*qxo*~`I=Nsvo!*GVPN`NtUGq)JPk$jAf5H`+g*T-v<1D^I@@ugIQJwC0NmR&& zsXw|>`5VAKgrf~MqLhwKcgJOR$v0VAYLW#o)jaPODIUfT>9kZmJ5B8=WioZh=_gp6 zY7Td=dA1-hzbIbHgewyUSn{Nc9+H3XvmCehyyI`tddDWj7SJNqI`)tU`}K0nX`Z`t zGXC;b#Ek29i^PRf=07}#VPUC>rUyp`FEFu(mt2p~u(?zZj5 zu=8fQ0P7e}fXDoB!lUmg8)l;3{FtnwYDig+pQ;eoks+5^BDX0BSZ=H}C$xR=lw%cV zMV-}O4?a$eBG+R20DpEIh*@WSz7M%KyQIFrf7Km@{79GGUKm~Av8aTn1cvHTrhz>p z(PrnP)K7dR^EDQC`bhCU5eEHs;wB?;=+t3RK%h5jQcOtD{rI|Yv$?-~DJjDwC$VCi zW|l~fJ~Oj|1KyQ-`k|Xuu&@IvtS1{oha;0GfZV`y#BUU;j9g(nEsA^i<5XCf`!MX1o>uJ9s7;csw0cdJ1{3gvfMT$tr2Y4L$$b!g@3vX zF{Yu)G-ZxF!k<`+7D9C0+^LOavw6`Sbb2+@E2fwG!kW@xAoa$Ku1 zbsT)sRYJ-u<}vmDl5mQuM3h9zZd8K}=(|0Xm=D zz|=KD8tSIh8SzzVxN#>IpNAw8e<)Ccyo{x%ieSL(_?QsL z5n6i$8L?`Im_3+WFQ%A z?7HkJRSEL4K()W0b~`+Y66wM@rMa!85^Ggjx3*k!8pdPySjG+i^7r`gc3;#9$UmRL zEPZs=hf#Yjt*5Tg&Dlh2+u=d12ulUh!>1hDV(t-h(nh^4PY-7#j+^|%bV>nkCU@uW zW6W1|?|=;^hbqffKIunc!*P5IU1w%F!@i8DdD*4q#)6P@1Egnse15SPHR{JkfF!Zn zh0M!z@P?%7sT+Pvv?ArMkdvCWiv)rR87AH{ue_1JLfY=fW78yIx#P+8lKw1g_aD*JqKu(|W6etY#~ z{m^!}yW-i@Q8|VGm^&v{(}nv=(v_*y0)0)E{!e1DOD z9!bM<#md$Wu@ezDPBd1eEky*%IbVqa+jbE5vW+J)&|=tcZDoM}_5FIZ2b zk8gQY9GZCq$1m-$$S&$b;%=#sILb6W9(!+e1)25>Q*y3tO8If^Rx8W2?{>e$;#eJ; zo^#<5Icj>$L|t+Nv%y z%1VJm9G}$yz)*E}Wv1zfdM6whLP~UZeuT#e=}atReH&FlaLz($!i0FzX;=Bx*lwXr zr`1)$rH&3^x0YXlP4?)|m#v?NnOx?dOQjov^@c1ZElugboZK|NCR=24Rr%R1KWDEu zcV6Y3zf<$Cg3~FGc+oQ>Ku!g*Hlia>vn+#Ex0Vgt^GZK<^rE#+egw1Gx`Hmi@16fl z?#_$HWog~ju6X7E&Nf`Hs|}^(jjWPSaA&zGkivMMm5w;3FuYVmW)z%zFslb^xZAiC zhv)(WEEdEhL(FOByvHt`0$z|-hWxa1;s!S|VO;P;WCCG@?o?#!i}0FKMw9WT-q(eM z!`^IroVX5N@GinHo3G(tqnaS9hnR+KbA7{StGIm3QAv9m(lF^3qB5O0@WL*W%pr9C zgnzv8Ff+#~GRM$D(;JbT1$GbbFQtWODBZF&YdChap*pbOBD4b+r|jlc&G;3L<|SE3 z90sp#v~5*GVzwQ#?I~i~m7tlkrZn}CSorXO)BgE=R38#>LQaOJntd9l8Oh~BI3oKa zvZ+ja=VGp$g&v>{C#=8T3iLk1--<-7kqaB_K)PiVMBD_PLID@AG+B|^Q@M1qy|<<` zV5z7|F5_>iy2d!Eh0GnC2lxwyN`z+8l_c;bGIW3j5Ox1Vec2@fX85cM*OoEd_n`0E zM1NSa7(2(^JLUY~sK*pt}<~T{arOI4^F5yR=UmWps zvh!QLFzT0b(}_z;d04?P@htyZw!89{1Dc_ApO)tOZW*Pi)BBceyW8p*RedYX&Ap zZDlXsOuD0v#=_eJt>bj`ns5le?`v8Q;`0v zvC@%C);G0|1@qPJ#Gqy!S8oX9=`pTnhz|6$`+96P=-o~>fhWO^yo;3t7R{1jtJw6r z9;-;^WfUJvq#=-JcLmwUT~}99aT|R`kQ2#XZfKQKF04hugA!GcOLBO3ip5JjfDMu;WP3Snw7b+>9Hr%LZ?tXqP)0t!I?*T zfp>sV<_*5>$)$^48T>8-9N5U1zN|O8u6)#2WYf};Udc5NvZvf&XCE;}k<(~X6OJOm z`eU;w|0X=4Ln<}F&~A2|wBrIj`X&`y1!?j{OB0JubKAjZ7yGIvX2?O(3LKvOj@Da2MAMe=o&IdSe(_$L#&eAgeEPHQqe8-b(g3{=f5k^}c8lhLWx{c|oP)4D8vCAn0=)(m{ zUPQ4$#^T?~IezU#-Rc4+`yFwqI*jvW{=g{}kKm*?*_Ry^r2U#Zq}zS)8q7dIij4&Qm+CfkBb&{7vD&H zExPFkToWPwgirzxE+3pU!b!zbR{XOvG1+Ian)znq=;LFV*<8*j7u^;Fncp`Uh%lPLEA0P`#6)UgWR4!jTQ`&0hRi!dVXJ;=K0y=ZO#JP_|=q&e6+s3esF zk8vqoE+iG1voq2}Yq7Pr#E)V1bf344Pt?LFoHaCIi|Amj7$aLG1v_CB50 zBD9L;HCJ{%rhc+#f@{ygjNml6_iNOO+E-E|RT-et8$F`*)#ht%kcS|q&Uc5Yw84X8z4^|*O9N3 z68od^j@hj;oZDZ3gyyuc{{=Pt2M-e18CpW|@caiSWF%l@<@o<_Ark=y8#}{)&i*@U z$ocQK@&8Ce0w{Vh3u|W+M*?~=YXfH!5fdXjV-qMoJ}4(=M-u}ZDEG~nHcsG-fkpeFvA z$OsQ<4G(%?H2!^F!28BWUvBMvJ$~RofKcN$IWz>j1mU#(U?5;X%f=}i+uhsh z0B8u8d!cChYG+M-Az`2p)&}p^cjQjc{?)-?{f8a>eN#>?j)0sU9gQ7<{e4o#zqltI zQ%nd}l;uUl2!|(;FWmeV@zC=Z9oM^8eln|oK+nN%U$E8!2v%8pqUv4T4VMA}vo`{u z=Y2A{qUOH|8$de%-8eWn-ay>|`OE-kCMIJ)+}*8h$aisxk8N)qK>YaR<;eXf9T55W z<6v)JK_^F+2Y?{$9qqv1-ai#@cEO_)ko9019e^|etppI8euex|0c?H;rw3jB-2h@Z zbK6HC_Fq3=pA*L!x~uXK>!185ekW74Bo+A;#j{^(BfqN>l0rQIeAV0A0IGDlaQ*=B z^!{<;0Q;|d3d^(ter5yr_-dfxuqXs~YK?O`A8Lbmesg&Tw>$bEUv4xiXUrA>0HMG3 z+v!1RLl^H+kG~n`e%e335I@|LzcEL@S@G4}7+>NucjCXl3R)b2{kwkHJWi`S*BQT5 z^QW}_Uv(9DcXc@`fSN(uxW8&u`= zg9rp%%Bjy@Yk>6s9`C>5?>w4naPsWo)XqhJ6#?K+T?D>(71n_QTru^D`XTU>`|BL> zhhz8GKHHJ>gX_1w!F#?meXxJzaCSZO?>ph_|62&Q`~>g-x_0;p=>2h@;NQGshy3;* zYwLx70XqP$WPknV3bcO!^?=uRegN}?JAMOxSD2~Y(9=$}j^L~Eus`U(P9uSUdi+(* zADQK;3*v%b&vY24d z522Ic`TF?Qh{c<`m&|(}d)TFxarSIQvp!|#`Bk5!3TxwVQleF~zQS&Un(A!hfxpbw zWkoxA%-nowo`Jfp=I9-DU3^TUh7Opwu=p!=sSEbfWa@iYB3R+5ato*0rgO;(#T<=D z#SI2|Uj}nK+p~vfaJ>qZrT=H$vN?@KBm$UW(>VP%1E_+kpQyKgClz6G~p`*9!GK0Ef21e6>M8 z2n%rf5^Rzx#UtJe&`k+WS7;Xx%LTz?em(+cpy0;t8kb%@H@^iOx;cUXj4{JGrxzL? zIJs_0q^S6?g7Rw(WHkcuqq@>owH4gP8f*fj^^&FN{ep@Ipn&57jJL&%}CRPqvV2 zAr7paX=eS9U4sT_;%@Kv-FmcCu=ltPAUAtW z9Jd&-FSJe~F9_7`zwbgmY9-poviwdr0JhN`)QXSxyZ;RW0^Rai=Y9HgES9Z_h_tpN zp8CGn6^POmw;qR#a@}Dm`3n&F4zrCm2fMtRGa$yNrKh z>>H)%wu2bx)?8CzId#FWeV4cpDJREw`#_!FB7@NOUJaEoG`U^>_6Ou`+HgK;1hfV& zu)vD>8m~lU{jLggda1&AjNad>>&Ku=c%ioU7wUowZRrZ%8H@IzbUC;Y$kzkQJJozU z?&t16r%#fE*Evq)J5C;rf}VoX6aQ z+$lHzNCV1a`Y;NH4rt{DA_^MQDyt|w{R~L0@XF#G6@@38Q5D~A2_**Y>sUsd$$C;? z4uq2?!=Dvq;AO{}MGt9!ZmA>^D$#}=Qmq`1 z`VwcsL5U@MUl+CS9nC;v%7clu@Elg zSp#n3R1QxNxgC8n&gF?LSpin%-&aR!n*3(}@n(ot)U`1Fl|b9-ZRv_l>s&3M5ugTn zO^PYwrKjt(KSBy&fgCwpdI^t(-sKu!{f(bl?BdGfPS?Zg*qnhKfY$><(tR;h&uoVT6g&@jh7YVVr>0KHPS@a)7Ga&iK0PCOGl6cNWc<|^2`&hO?TaL* zIU4cwd#o=q9R5Vx1bWvBuW%r?%&1RcXC@95uo7WbWqv|+S`aCpe9o=Kytt0Zoqz3P zhS|5cM>2o!8=!w01ZT*U5*xsD&9o=QLi1|ilmz33%uI{~Y%h)s)F0^nMH9v|Do=mX zNpi^=kYjW%nHHg|duCxtn^wZ3WK$leJoIqS&r+V`mKddp!KHm3$99k}bYpQjSLjf@ z=+}(i#@3(vERg$-t=3>tjNQh@?z&e`p*kPdK1;EcfXyKpdm59#u5(u1+<=-WT0$hF zU7cVl73?U-3^18Lk;f;)D($IB@#V`p+V-M|8 zRJAkMo3pE+ONhE@KYjIESqQ)X~31Wxj`@Y zvvu`FIj*p^w<%F*L+9JWFgNJlAl44=4~&gez4#CeCnPTM3x1BYG6f>B@A!3d)k%>JodlU(2A=>jUMXxeVZ_N0cX{8Dx2_mTr+f8Pj z1CB$C2Oj|KIG9omeP-oRQ14>434fPdrChz^2r`K-QLvyZs-yYzsJ+`E{x;TBXV@!%*510a zd4&ip#~RsU3I}%~cP18xVpUw~nI?z&mE3h$)Ev!4WqX~>r0TYpa>qd7N67zQjGaSp zs8NG$W81dv+}O5l+qP}nPHt@5wr$(VyIrrkx(ENDhu`Fzo>OP9y_fV(Rk+0PqzN@$ z8QIa{7--qXWvobx^b!#2jru=!qUr(kiSDA*<9kTgR#p}w3lhs&Lv{FXeHbT!xG-A_ zORfy*NZzJe_LyqUba>D)&=O>t$b(pr#zEh0~Z5Xrs4c(Wx#~j;>)6P?|A@qH#o* zS1BO`b)-5idek}b!D)}4LBB$RrSwFM=zB&^LaW#6O!VZ~H^<(&`?lZE?Ke$rsVK^x z4lyJQVA)?h9DDwrn+bSZ5NokFQjW<)e7mCofcPORdi&N~5K%IzhzM>p7ow#Q`ylvK z2qinb`R?_W&VBn*YjJ1jGKu)i)jv`5dqIKFC+91aj?YLrL=HZGvgfMHEQXoO4?!|M zmJT?4sesTWcUVDRovTc(;yJ5*HlSB$MIb?1wXxizOlnhLrrpYuw-1rM>TK!KRVe}Z zr0Wui2EkcNA|sYB4ZA@75}6BU@Dh*;uc5~11*n{aw#>}u(%<}}Qd#;pF?tHW&#Na* zuS(y!2QAe(1^Ek51&~Y{_9nu0sO~55)MTPlsgNUA<(EVDt_C04vVrM@U;h%u|J)$1 z56FpZZm8%FvLZHqJNC~lXoW`tk7yb2+d*nIzSFw?qR`7usf4c|KS_^*sYRaM360$Y z-CTBDP1QspwW0G4_Tw0!*Q}G(UWD(GUxt39#mPEjs?#G@O^~yL7JBNJdW17YtDNmE z9v?C#k-FKvVm!OR-H(cs*Vzg=|2f8TN|~1{90ijyNyAefegW%Q(27XN>SxE2@zUQ> z_ppSH>8i({kFy3@XBtP8#|!PU-Uu0LA`l7G+=yMop>n<$hRq73Km@ZF82>}7O)CNJ zpdwo%BO?ndb$qULk`aOOh}tWRFp|Qynnmg`n@B|<4n(C#=4XuKTPK?H{;=V^o2ZZ7 zR;8zNKx;3Q1j^NOi4h{KsYO==!cs*$lSBpnbkd;8*atEvMOQP_?Qe?R<8v#^Jb3DP zTe_q*2E&)`xj0MV)khI7?(oVh=FN*WTE)o{LU(PIS2hUoE=&6|xuCLjbP#S#9Xt^! zTI}SG65%;dzgS_ONe?Z^^aT#OaX47gq^Z(jsY&MwB8Xn+iin7Me6Ms5J{lr%wB+o5 zRYSdTQT^U4nPh`qRU6ci#p_@PQCi7f3RijZSfbnSuJ{;Z*gAw*6J~?qD~$_zfEiRFz(AJtpz6$MSWXw`Co-+B@S}+5u8`ML zv10}8%;s`DnGd^F*}Hfxx?P@z@S6E3*1b{tm|~1p=Ky4Wh%UC3?F`*v1J!){8$uV= zBLjF25QqvEf;5@Ym%{98_wR^ci23M37@;;=tKZw8lED947HE-H7Zju@J*x@;-SFOtaZ(xPW#45b#N5A zc&Ls@=?OA;W&@s8lugadP4DRj7Rzud$7ScQW#(;m`f}nlZxWR#sV>?}@e{7F@b^k< z1+y#>$D5$nv?r|-RXk!?kyXv1EWF#zeO*Nf1bmjbdLw94Xlz)CFCe8EaN6&f1l#sN z6~=3ecLn3wJcxwJn=2(hk=KkYa>7sOKgkhn*B>!xLTN}Z=pi5vuROT%hvFFB8EIyw z_wasiZ50VPX%m*VsW(UoH+9L~I?sI!r?x+f0-i+Z9QjmLgiL0Q5II%9qQKWa@^;IT zWCe=j`ew=Y<`^ShE*PwEU-@JJm*=YpyxYpI4xe;ktuX_^ckqH5#& zhU2xRtpez$?As6uc`{!pf=pK8RjrHYv)idl2oR~PxjTT{Qx&_&=*Y2V~Bxepg(zW}MG@M)PpT3>XI74|PuZJQM-$Qw>RQme8n1<7g#J zwfij4e-^3EMm#cq>HSqH$%6t95bd$`lE_-+vU1-@{?l!jMyqArLs?`X?@cWWfBV`k zb|jw|IPvupe4k%8ctR;2gM0BdPkaHh$y?cjM)ZdJ#(X+hd^lhrLY$51c4n*`uWY(Z zk^1TyjbYM@2D{>pY?+@Lpl@Bkcczxm^__mR$s6e%y0N$kRA&uB>J;}kXzv?>T2Iu; z(JeP#;2($Ic~sIaZ)0q_*xY{T84(6i5u)_5a?D>3JG64C$q^7751zO{QjzxhF}Xx`H_Mg$uPtyp&lenkLT*AgQ<9TVQ;W&%qq zj4`w;`MZW*Q)l1CpU96GTA=gmqez9HidOE#1oD}nk|~QFxDd9XAZY1+@E;D98D%W` zxUKB>pk=MjEx9>*l(cTKm&!yiK$`PU66$U)VKC zUptqfn}khdYt1rRVdu_N-`4>*mau%O9Lk>P;&>pOx``#p;PEbRpldVx-bUwVQzlQp zSQI8+2B+@p=JU&hfz}0K_Jw2_SxJ%LiWKR-a?c#Ja#7Z7YsiN>tcU)2H)7s4EiSFK zn5NG|OkCrJ~B1vwV$qJmEfG%s3E4OQjgx*Ul2Q5=&-=L+4g z2#|FP6j`%Z392P<_&d!=_Zi`TJqOQa3ylMoL#K$iPy@TAd(sJcgaN14PZ_LBKp>vN zX#!d^Mm3r@o(uB44ZW~x&wmYsX{I%CwOG+c6g!#uQZXX(vzx&XR+&hf@}psRZPZat zvEm+WS4CHXJ8yMw@6%jAV&-Gt0tQ(|_QtzJManP4Yl<&@mUCoJcj|t5b2-Ftbmnty zk2M>IK%JO9uWmrPDWws3x?3b%ykrxAUV~C6{Ib2g)d>`;U`wFMeEb#uDPa)oQewXxKAS)Q86CiWdSEZ&RHzJ1ytK}YkWYDi|i(v0icaDLuPe5XwLv0>UwcCRQPDhc{#de3pMixa51KBdYzBQcvkk*kcODsEhc2$2ow zvF?E2B=EVn;h6XSQEO|C45@EhmVR4Ur-Uxa1%0Ug7WCm1CDnRPBJ*kF-RvJiHtdBt z?X0wLdLy!-cDJxG)Mmt3BAG_z{SUAqdA) zHZ9Br9j$&V+FJ8+DO(-)DJzNI!L!Xr3vrS>WHJqc+KaldL5HCr^6^v2OEbnkJ!ZQK zrC)k%D3haqJuRpPn1s2rhw}J_;X~he#W9RTy*Gsb-Cs03PcmAguvGiJSs%`{kXN<> zEjsJD^b3gJa+lgV%7tgC_En73=3>(~?N4szK2@>xL$%jN6}2LxI8l}1c5a(I*Pa4~ z=9Sc{JSuY=f;&z;6&SLkC;XV%QjEIXxpb$;IVum*6ZGW|Yp#}W znGF}BJKz;my;aD970VKtJ3i$e!%;tI?wDQ;ap{RQPZR-9naJt9@?m1Z;2_2|x>8{F zdI_)%gTX4@MfbU&=L@ zaOYJslI~iJ_!E0v6Fx34$`zC9G*VwG^eK+`J%-lkEt+HeydWUu%Ow#jkZbCqd@1X3 za^$!eyJKohfR)8fx-2eg?f7lGFnSqUaiTn-wW=YdYG=c)Ao_D&!3P_Y2q`nz1BQ@b zXXS?DF>6wwCV%U^H0@~5RirXB{`~5r=j9k;LPv~U7$*!qxC)38j0qz+G7YvQV#?>? z=WI#M$CXvG6ws>iDZRBwG3_C&ozdMGm0xpZ@sw~7OJD9seE8#noGxwCBrfx+@~o1+ zPLp(Z-60yQ_ch4Dq{T)6%cVP3cr${`cl%V;TA~h`U0DVPHh>U)$|3!rM+^OzQ_=I2 z2R{I4cB9Gj>5nHi{*%hKPD{mZIdcb1?mmpi`isb>FC`ljIBf)Vv}gQ>eUujUx!c99 zQPC=4T10F!F+DOu6qsX-xXi_f_s9+XYM`ghWmk5nH4P@2l0CKFqhKT{uc0ZlE)fy# z%l%c^Cei*C8D~N6`yFj;V{8syH9YVDB6Y_H5y|A0l9b@5gd5=Y z{(Pn5D7X00V&%yo*h%fuv*RkI7da|;XvuI!j;{#0_RJCO7&u0V)sH0wz3%v@tD%zc zd3D{_aRw3a>60yY*F|Mdk9!ICZUd&0nJq)!#+Bo$K77UFzxk{pXvf>2u6*Logm?dN zqmX|phU`*6$Wf9E`!%|3u%&#E77;j|8&gkg2UBaxkt*<(gILA1(I;dD=hz@Fx@h}j+bGo0vC33!G@>Ge;eH{OW0=$xG@ zw1w)CaY5sM;GG1#F9tO4yES5OaRW=^h5SD|0 zan-H8l;K^f{c!6N9?-wzXh{gtQ`SAZmuYAWOivsB`lvvl!EeiI1|I29t})MEuChC@ z&H;B>_9Z4BXYoT2>lu{=WR%79aHxW2e1LzHCOEOg?X*MT`zom?4(nxBy5X--_wZLyge1;&OVBKfN3gYc>KI&)W}KKm)`ovxB2#3v@E!!zG_3AiMJ> z$R8i(C5!9iGFY=P53D|~CaOLjCtUpoGB@R^C^K8ez$CKCFkA>2cDFIo52(NFo6UKA z3F_SD&B4pki}Nqo9cfvOL<{B{D}@B9vofJHbae3#Ax%ume|2b~Ltw`Yn+Sv?Ojy1N z=vj+mk&EtTK8l4ZdB(Dlusf-0i!)Pln`_fFh*Ph)r#`lgnT&l z{Du3CaE_5bPw@Nmxxk=Fz=^4(> z*m)5SE&*z}N3qOb#wBpRUqs%R@lhRuBdQ)gP29F2{WW8o_;la1* zEiL|HuBNJTtT5_3k_Q@3hkL{%*Lv_BI^Opn8p6uGsxQ;tIj)(;vG_N##ErLyp=V}_ ztzeJRTs(vV7*0TnJmP^AZz;rU$>Lv#n7Vzm2PKpkMU|XK03GS9fS*qbWsLn)i!Euu3_jgtw9nvKXze%S zhAjNMflB}%bM}>hc6tj6;mqW^$t>AZVx~z7R~y1{D!sP(&?ax0)X610?)ChZr>mlo+BkvH});j)z?J6N*XsbV66sr9~Z?3+*SEaS*<38_4 ziO}A9IOry9cFMlb`U?*q*OdG7!G#5&I1fHxx0^Qf1cz2Ks27I3>dDeUmH-hoO-usX zP%<(ZOnx(cHd|in<7}0SoAWiV5`qGnIwCx>84oh5z2@)A@8iU>4^qxe?iQ_(_pGXW zwbP+Sv?9}>R%!;!`lb&*@Ed%qd;bA1WBpHf84JUo{|3sK2-sNuGhW8d!p!i0#>-kj zm6N`)*<~f7(c)7jD7s_7&TSiaP`_(3EjBtRuBgi#;`ut17QNs396Q2-@8 z%4Q#p?)YLNfZqH~>BMh)^_5tFF2RTU0^Iv>A%lv#?%{YT$p3(a z&%&}S&x7yW2N(S?t^7{%W4ygC0}vL*`-OdOe!3BmT*NV>fC+iI3n~DLCo>}iIEMk> znqNd2e%BB1Q%sz<5-x3H$GnDp2qxUfi*@zq4HWRppc)aN?C$Pvdkiv&%T>3QvoCzR zh2`%W+@)0qI4b`8S)YQsUEl4;QUb;w7{5!vd_E%=p@MJuw%!>Ck_pKBPEc}uxp)q! z^JCyuh2Kpec)*_^j=_3<2?h)rT4=C=Zhw2fbm%iT`$hn{H+<3~_UKwZjMIo05TZNU zzMuq%KR=*-9zs6*{4^urc+sDB!+fLwAVAK719kjjZOllZZ*tDuFk)Y%hvabrAHcW& zo(O{g`g`;I@~rQ-90iNEfPajB%-RU3b)bojlnVG@f3->~BVWJ|gola)hzt|;2|$R* zz>-Js1Aj4xAtJvzq3-;=UF0EHtH?^~a01ATsTd4G4K2m!v#XoOgD>+K1C{UB_C zQ$Ysr_~L)fGJhT3e~n&mDSpudf9-fOd2ep~n!b9MfAMLTfY0&nTJdJp@M&^C!OXwF z^8c;a0sX9YVD;t1^WyzhE%yuFbL9s*y8gbB5_PjC{MeHdlc1eEpsV~0O#9KNb0LAU z3wjaz`N{heAuzo8Ilt8ew(s*{?YQ&)DD>Y;J)fq4Sw%4^gWSaxqcR0UWVPqR;jFg3#*2q zjJ&DRGJy))FQ%L3DPc9R1f;DSK&KO@H1)uB%u-{0g-tMPqqj}B+Km-rDMe?^1kPM1 z$%v|D0Vol#?!fcyDp#DJ6z?H0D(OOZ+(C7G_Qkx>8dTBg<)+2K#3%p`*6XFE`pLMx zU-2IuRo-t%QSwYYKEx5-pE$6=OOCuh;O5EH*(Vu_{22$Wy?I}Z#m9@$na1roT982l z0cYXf;NpFyZMGP8t!LH zT(=CBpWQ^@vx<@B>$%?WuiIEgXM6t&NLMFHY+}dm!`At)b*rdw!`bUn`-#kM#j~UUJ)ily%PmTZ zlA?nG$fz@vfb8U_2r+FK8*8ELp<$GJ+njT&dJDMC`xW{NB`yK*h*Gr*%0*D{lm$zP z+rhxGp5nin&Rj)WiEfGXWNW<2-LBSR6K#Fnaaxrz771nWpID?IERRWY7~a^tI6Sbd zg&m!Znw~aP71PM)satz{9bEOV!v(ZeEjmR5+5j>=k2NcXaSJNT2>0baEj5H&<+C)l zkxlh)#7ntuuhiSn7rgi`U$t9* z#!x;-kG&^JTUjhl7;~yyBfYOqvHOi)0hL-!)uwZ`p^`%w?l10Obv$W#*%tOI5E+z^RM%w;%$lifz#w&QuJqB&%?-R~Fk9jt*JLFYk?dE1cd~yy zj9&GW%I7f1x}eIump&llM@vFPp@jBx_4Hy}QIV(tWeinYn^2IJue$elZ!B`1c9@s!`r z&+{Cffe=`O7cRAR^C%cBdl(uZKxMyG1dhB%TP>3%4DGiy?}IY}^iK+PBM9_@$4K@< z!2jjhUE7!NOG1|*(wcGo1h@+oK91~DDgwZgJU`o;b#2Duy~^ZTSK=`&tADRZS^go! zQ^YNPaJzomif9i7x+Meqs`i|zQ6Lej5^>A!UHLAl>ZuZ8-Du7*{noKAvnUlxjKQVd zJYHljAlk&yHE%tpC1zb+!lY$FZA0K+iA-C*ukN~8oD|2an62eMmW^@ZBn!&uo0Aze-8=`EH`aIM)E;A>f+i zg4_R@gUU9rzbMUbZJovpDcgsdTDU4QLlnZXei8B-A68`Fq!C$jWu#`T4PA&u?Ny$0 zl-MF!y-*!MSqG6YNm<}NUq<);bU|q(@w=H)MjeQ*BI{oH$wQJx5J z;I01fzsvz8rdl00)d_OYJwS7<1TksNoxay&s8dHpeCo*WOG48j!;UDGk_6#ZlY=nr zD5nc=VXE$Iue@9+L{1nlXQxKSM=8z1Hhu790%cROZ{DFtW#hIUzzZ&E{+R3Bv}nh8 zag<4*%Cn(+a55(GQ2I<_$&q9%k^YzZIB>Iud)i-C?y)~~Xbl|?Z!1Z!6T)KGcY zIjnOm%e4h(8!7JwRLL-8bw!mDhCR*voxOgqVN8 zxhjY8CW#nTdxX{HF^#+ka2I|$f8VrLMkN31h@E%JdztHP#tGRX;>^CRu{~-+c8&!p zk@Y2PafTh{M6Y}8f}XiG>2(oftJRZa&aYWZUU$&ETij$*->P1!2(m^L3ifPOBbbecDyc; zvhJ+zt^`r2BwBju#A7!)W$W%@xowJ?sx6Qkn?2{^q{XLdmT&c2$q?EKarTX2Y<^Eu zTuQ^Qz@Sz)oZHW>%-jDRt&SITdEcf3vr&xVE=mx&|ITMFn3BBu|vE!q`T zlwDcyMmfWhGEQvXn=bBaJ&+J-2`Dp6KXJtz*6aBI_V)y4F5A}X*rjC=J zb(E`}PLj}`(7*WhZ+d=U*-S9q;2IsaZuG^v8_hj(oAu2G1=It}xm?raQu%8ZWMwr^ zYbERE;*nAn=!&mn7i%0_gz}|2v66_o*Xnj17@I3epXU0{CfN@H+h%E`^p(CgnMNX{ z+&GcDs7T7A$NYAdP#j|EkBg{dpB-}Wmae{+!&1wdn3(vfySyLbaJ9wJ7p{kq(-Yq_ ztKCH!xnpJgxEU5wtk$=zI#EI%(_NBSW`gbf{3qumn36~&G{B$w(x7&p*wXH#WuRSo z2xUWAF4+}ox7jI6cu@^_Bj@@vSm}CLVpE)SQhgLK;;ubN|4PnX zc9Y%^t?)i$((~IueC%Wz#fSW|e-F4`JPKdqsW1zP6mq|iOUBhZDDYp@%)0uqTo&Y7 zlVaI|FZqvl^1njt$ww+yO=H&#cD?N=?>l|iCVeSZ9XA<(C~O&u)k8p_?nv63^2|#&`^S|V^YbPAP&oQKX&r{jSj@ST z2b^a}aM*P;rpH)!+v`GYt=5DKc7rh9e9$;0?01oLOK@?Vn1cVgfq| z^D}7Yk?EEqI8^n7sA6$3J_B}9Z@FamMMsIxj
  • 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 literal 0 HcmV?d00001 diff --git a/doc/quickstart.tex b/doc/quickstart.tex new file mode 100644 index 0000000..caff287 --- /dev/null +++ b/doc/quickstart.tex @@ -0,0 +1,407 @@ +\documentclass[a4paper]{article} + +%\usepackage{a4wide} +\usepackage{verbatim} +\usepackage{subfigure} +\usepackage{graphicx} + +\title{Epoch QuickStart guide} +\author{Guillaume Infantes} +\date{January 21, 2013} + +\begin{document} + +\maketitle + +This guide describes usage of EPOCH temporal probabilistic assessment +tool as of version 20130121. + +\section{Preliminaries} + +Epoch aims at ensuring the \emph{validity} of \emph{temporal + properties} from an \emph{initial state} of a given +\emph{dynamic model}. + +\begin{itemize} +\item The \emph{validity} is simply a true/false value output as a 1 + or 0. +\item The \emph{temporal property} is for now only a small subset of + PTCL* (more on this below). +\item The \emph{dynamic model} of the system is given as an AltaRica + file, that can be directly exported from modelling/assessment tools + like OCAS or others. +\item The \emph{initial state} may be specified directly in the + dynamic model itself (``init'' keyword of AltaRica + files, can be given from the tool used to build the model itself); + or it can be specified as a separate file (see section \ref{init}). +\end{itemize} + +For version 20130121, time can have two very different semantics: +\begin{itemize} +\item First is an ``abstract'' notion meaning a timestep, that is +any change in the system. It is denoted \emph{discrete} time. +\item Second is the natural time, meaning a real time in + seconds/hours. It is denoted \emph{continuous} time. +\end{itemize} + +\subsection*{Temporal properties} + +A temporal property is generally a property on possible execution +paths of the dynamic model (see technical report DCSD-T/R-120/11 for a +general presentation). Epoch currently handles only simples +constructs that should be sufficient for DIANA needs. We call a \emph{query} the +asking for a check of a temporal property. + +An example of query is: ``is the probability that variable FC\_x takes the +value true whithin 3 time units greater than 10e-9 ?''. + +\begin{itemize} +\item For discrete version the time unit is a timestep, +i.e. a (non-immediate) change in the system. This means +that if the model is a failure propagation model, then 3 timesteps +means 3 failure events. Immediate events are denoted +``dirac(0)'' and are not taken into account for the horizon, as they +are used for ease of modelling in order to make the tool compute the +state of the system for non-trivial updates. For instance, in the +Bleed model, many dirac(0) updates are necessary to compute the +resulting pressures after any event, while these intermediate states do +not have any physical reality. +\item For continuous time, the semantic of time is the intuitive one. The +unit is not specified, it just has to be consistent over the model and +the queries. +\end{itemize} + + + +Formally, the previous queries can be written as: +\begin{displaymath} + ? P_{\le{3}}(true~Until~FC\_x=true) \ge 10^{-9} +\end{displaymath} + +We will see in next section how to specify such query within EPOCH. + + +\section{Use} + + +\verb?--help? gives description of command-line options.\\ +\verb?--verbosity? changes text output information level. + +\subsection{Model file} + +\verb?--file? gives the name of the dynamic model +(including initial state) to check. As files are not searched in any +particular directory (except current directory), we strongly encourage +to give full qualified names.\\ Example: \verb?--file $HOME/model.alt? + +\subsection{Init file} +\verb?--init? allows to give path to a xml file specifying initial +values. If initial values are specified both in model and init file, +init file values are used. +An example is show below: +{\footnotesize +\begin{verbatim} + + + + Rudder_BPS_RB + class + + + + + + + + + main.BCM + + + + + + + + +\end{verbatim} +} +The user has to specify the nodes where init values has to be set, +using the \verb?? tag. +Inside a node, several fields have to be specified: +\begin{itemize} +\item \verb?node_name?: specifies the name of the + node. It can be: + \begin{itemize} + \item an instance, and so the full + name has to be given, as for \verb?main.BCM? (in this case + \verb?instance? is assumed as default) + \item a node definition (will affect all its instances). In + this case, the \verb?class? has to be + added (\verb?Rudder_BPS_RB? example). + \end{itemize} +\item \verb?? allows to change event law, specified by a list of + tags with the syntax \verb??; where +\verb?ename? is the event name inside the node, \verb?law? can be \verb?dirac? or \verb?exp?, +and \verb?val? can be \verb?0? (for diracs) or any double (for +exponential law rates). Doubles can be stated as \verb?1.5E-5? for example. +\item \verb?? start a list of initial values stated with the + following general syntax: + \verb??, where \verb?varName? + is the name of the variable (a string) and \verb?varValue? its + initial value (also a string). +\end{itemize} +\label{init} + +The complete XSD definition is given at the end of the document. + +\subsection{Query specification} + +As the query is quite complicated, several switches are mandatory for +query specification. In the following , we will use $? +P_{\le{3}}(true~Until~FC\_x=true) \ge 10^{-9}$ as an example. + + +\subsubsection*{Variable} +\verb?--var? gives the name of the variable to check. The variable name has to be the full qualified +\emph{case-senstive} AltaRica name of the variable instance. \\Example: +\verb? --var main.LGERS.SAFETY.fc_safety^FC15? (from A380 LGERS model) + +\subsubsection*{Value} +\verb?--value? value of the variable. For string/enum values, the +argument is \emph{case-sensitive}.\\ Examples: ``\verb?--value true?'' ``\verb?--value OK?'' + +\subsubsection*{Time horizon} +\verb?--dhor? specify time horizon for discrete time property checking. \\Example: +\verb?--dhor 3?\\ +\verb?--chor? specify time horizon for continuous time property checking. \\Example: +\verb?--chor 3? + + +\subsubsection*{Probability threshold} +\verb?--thres? threshold for probability. \\Example: +\verb?--thres 10e-9? + +\subsubsection*{Negation of the property} +\verb?--neg? specifies $\neq$ instead of $=$ for the inner property. For example, if +FC\_x can be ``false'', ``true'' or ``dont\_know'', and both ``true'' and ``dont\_know'' +are problematic, then the property to check is FC\_x $\neq$ false and +one has to call EPOCH with:\\ \verb?--var FC_x --value false --neg? + +\subsection{Algorithm selection} + +Several algorithms can be used by EPOCH. They are selected with the + +\verb?--algo? switch. + +\verb?-1? runs all algorithms one after the other (usefull + only for testing purposes). +\subsubsection{Discrete time} +\begin{itemize} +\item \verb?0? runs exact computation over infinite time (do not + honor \verb?--dhor? switch). Not usefull for DIANA. +\item \verb?1? runs iterative computation over infinite time (do not + honor \verb?--dhor? switch). Not usefull for DIANA. +\item \verb?2? runs exact computation over infinite time using + bound mechanism (do not honor \verb?--dhor? switch). Not usefull + for DIANA. +\item \verb?3? runs iterative computation over infinite time using + bound mechanism (do not honor \verb?--dhor? switch). Not usefull + for DIANA. +\item \verb?4? runs exact computation over finite time specified + by \verb?--dhor? switch. +\item \verb?5? (default) runs exact computation over finite time specified + by \verb?--dhor? switch, using the bound mechanism. +\end{itemize} + +Algorithm 5 is designed to be the most efficient and should be used +for DIANA for discrete time computations. + +\subsubsection{Continuous time} +\begin{itemize} +\item \verb?6? runs exact computation without bounding mechanism. +\item \verb?7? runs exact computation with bounding mechanism. +\end{itemize} + +These algorithms comes with different implementations for internal +Hessenberg matrices, that can be changed using the \verb?--hess? +switch. + +\begin{itemize} +\item \verb?0? triangular Hessenberg matrices +\item \verb?1? banded Hessenberg matrices +\item \verb?2? dense Hessenberg matrices +\end{itemize} + +Default value is \verb?0?, this aims to be the most efficient version. + +\section{Output} + +\subsection{Textual output} + +Currently, default output gives the following informations: + +\begin{itemize} +\item +\begin{verbatim} +f1: true +\end{verbatim} +Generally, we check $f1~Until~f2$ formulas, but for now f1 is always true; +\item +\begin{verbatim} +f2: P +\end{verbatim} + where P is the property to check (defined with \verb?--var?, \verb?--value?, \verb?--neg?); +\item then some data about the model are given: +\begin{verbatim} +MODEL STATS: +number of state vars: s +number of _different_ flow vars: f +number of atomic events: e +\end{verbatim} +s is the total number of states variables in the fully instanciated model; f +is the number of different flow variables (for assertions of type +$v1=v2$, only one instance is considered); e is the number of events +(generally failures), including dirac(0) but not taking into account +synchronizations. +\item +\begin{verbatim} +Check [recall of user selected algorithm] (Pr[f1Uf2](0,h) >= t): +\end{verbatim} +where h is the horizon given by \verb?--hor? and t is the probability +threshold given by \verb?--thres?. \\ +For continuous time algorithms, the probability at specified time is +given once here: \verb?PROB: xx.xxx? +\\The following 0 or 1 is the +result for the query; 0 for false, 1 for true. \emph{For + scripting purposes, this value is also given to the shell as an + exit value} \verb!$?!. +\item +\begin{verbatim} +time taken: n seconds +\end{verbatim} +n is the time taken by the execution (if alone); +\item +\begin{verbatim} +probability: [either a value for unbounded versions or something +like:] [ {([0,10]->0)} ; {([0,10]->0)} ] +\end{verbatim} + gives the probabilities as intervals. The format for bounded + version is + [l,u], where l is the lower bound, u the upper, and l,u are given as + interval/value sequences, $\{(i_1) (i_2) \ldots\}$, whith $i_i$ of the form + \verb![a,b] -> p!, meaning that from timestep $a$ to timestep $b$, the + probability of the property is $p$. +\item +\begin{verbatim} +explored states: n +\end{verbatim} + here n is the total number of states + that EPOCH had to instanciate in order to answer the query. +\end{itemize} + + +\subsection{Graphical output for continuous time algorithms} +For continuous time algorithms, a graphical view of the analytical +solution is displayed, as shown on figure \ref{output}. + +In these figures, x-axis is time, y-axis is probability, vertical bold +yellow line shows time horizon specified by the query. + +In unbounded version (figure \ref{nobounds}), the red line show the +evolution of the probability of the specified property with time. +In bounded version, as in example of figure \ref{bounds}, the red and +blue curves show the enveloppe of the +true probability which is sufficient to answer the query. + +\begin{figure}[ht] +\begin{center} + \subfigure[no bounds]{ + \includegraphics[width=.5\textwidth]{cont} + \label{nobounds} + } + \subfigure[bounds]{ + \includegraphics[width=.45\textwidth]{boundedcont} + \label{bounds} + } + \end{center} +\caption{Output examples for continuous time algorithms} +\label{output} +\end{figure} + + +\section{Note on queries} +Due to the bound mechanism used by the ``bounded'' algorithms, it can +be interesting to ask for the complementary query, depending on the +model. For instance, $?P_{\le{3}}(true~Until~FC\_x\neq true) \le +1-10^{-9}$ gives the same information as $?P_{\le{3}}(true~Until~ +FC\_x=true) \le 10^{-9}$. Depending on the model, these +two queries may need very different computation times. + +\newpage +\section*{XSD definition of init files} +\footnotesize{ +\begin{verbatim} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +\end{verbatim} +} + +\end{document} diff --git a/icons/document-build-model-16.xpm b/icons/document-build-model-16.xpm new file mode 100644 index 0000000..3c722d4 --- /dev/null +++ b/icons/document-build-model-16.xpm @@ -0,0 +1,162 @@ +/* XPM */ +static const char * document_build_model_16_xpm[] = { +"16 16 143 2", +" c None", +". c #5EBF25", +"+ c #88D159", +"@ c #B4E493", +"# c #7BC65C", +"$ c #53BA1A", +"% c #92E23E", +"& c #A3F239", +"* c #A1F039", +"= c #88DB3B", +"- c #61BD36", +"; c #128809", +"> c #41B100", +", c #92E23F", +"' c #A1F724", +") c #BBFF4D", +"! c #B6FF40", +"~ c #99EF26", +"{ c #64C61F", +"] c #168E01", +"^ c #36A700", +"/ c #7DD72B", +"( c #B8FA59", +"_ c #E2FFB3", +": c #C8FD77", +"< c #9AE840", +"[ c #4CB80D", +"} c #0E8700", +"| c #1D9100", +"1 c #41B400", +"2 c #7ED72D", +"3 c #AAE869", +"4 c #9ADF60", +"5 c #61C224", +"6 c #269D00", +"7 c #017D00", +"8 c #48820A", +"9 c #3FA429", +"0 c #73C549", +"a c #9EDB76", +"b c #8CD361", +"c c #5CB838", +"d c #239118", +"e c #007B00", +"f c #6DA8F7", +"g c #5691E1", +"h c #FEC33B", +"i c #FFC45B", +"j c #FFCD77", +"k c #7AA63A", +"l c #79C26E", +"m c #A7D796", +"n c #98D185", +"o c #66B54D", +"p c #3DA970", +"q c #74D2EF", +"r c #7DD8FE", +"s c #7CD4FF", +"t c #59ACF2", +"u c #F9CB30", +"v c #FEE64B", +"w c #FFE23B", +"x c #FEDD3C", +"y c #FFD93C", +"z c #C0BF29", +"A c #85C383", +"B c #80B757", +"C c #31CAC9", +"D c #45D9FF", +"E c #44E6FE", +"F c #46E7FF", +"G c #3EDAFF", +"H c #43C8FF", +"I c #34B1F8", +"J c #F7C424", +"K c #FFE769", +"L c #FFF96F", +"M c #FFFE5C", +"N c #FFFC6A", +"O c #FFF36A", +"P c #EDDD30", +"Q c #C7BF34", +"R c #45DEC3", +"S c #75F6FF", +"T c #7AFCFF", +"U c #7DFDFF", +"V c #6BF4FF", +"W c #56E3FF", +"X c #27BEFF", +"Y c #F7BA22", +"Z c #FFD534", +"` c #FFED71", +" . c #FFF292", +".. c #FFE876", +"+. c #FFE45A", +"@. c #E4CD21", +"#. c #C1B232", +"$. c #1DBFC4", +"%. c #5EE0FF", +"&. c #84EFFE", +"*. c #88E7FB", +"=. c #76DCFA", +"-. c #31C8FF", +";. c #1FA6FB", +">. c #F7A81B", +",. c #FEC32D", +"'. c #FFD553", +"). c #FFE082", +"!. c #FFDD78", +"~. c #FFC944", +"{. c #E2B51F", +"]. c #BD9A2B", +"^. c #1398BE", +"/. c #3DBFFF", +"(. c #73D3FE", +"_. c #81D8FE", +":. c #58C4FD", +"<. c #299EF4", +"[. c #136ADB", +"}. c #FEC04E", +"|. c #FED979", +"1. c #FFE293", +"2. c #FFDB80", +"3. c #FFD067", +"4. c #E0AE2D", +"5. c #946611", +"6. c #1E6199", +"7. c #6DB8F7", +"8. c #84CAF9", +"9. c #8ACEF9", +"0. c #69B6F2", +"a. c #468BE3", +"b. c #0B2DA6", +"c. c #EDAF57", +"d. c #FFEAB7", +"e. c #FFD78E", +"f. c #C88D38", +"g. c #2946A2", +"h. c #9AB6E7", +"i. c #ABC7ED", +"j. c #506CBE", +"k. c #BA6F2B", +"l. c #1C1F6B", +" ", +" . + @ # ", +" $ % & * = - ; ", +" > , ' ) ! ~ { ] ", +" ^ / ( _ : < [ } ", +" | 1 2 3 4 5 6 7 ", +" 8 9 0 a b c d e f g ", +" h i j k l m n o p q r s t ", +"u v w x y z A B C D E F G H I ", +"J K L M N O P Q R S T U V W X ", +"Y Z ` ...+.@.#.$.%.&.*.=.-.;. ", +">.,.'.).!.~.{.].^./.(._.:.<.[. ", +" }.|.1.2.3.4.5.6.7.8.9.0.a.b. ", +" c.d.e.f. g.h.i.j. ", +" k. l. ", +" "}; diff --git a/icons/document-build-model-24.xpm b/icons/document-build-model-24.xpm new file mode 100644 index 0000000..014cefb --- /dev/null +++ b/icons/document-build-model-24.xpm @@ -0,0 +1,343 @@ +/* XPM */ +static const char * document_build_model_24_xpm[] = { +"24 24 316 2", +" c None", +". c #76C454", +"+ c #80C66B", +"@ c #55B03B", +"# c #74CA3D", +"$ c #9EDD70", +"% c #A6E178", +"& c #A8E07E", +"* c #98D675", +"= c #64B945", +"- c #178E00", +"; c #41AE12", +"> c #7DD040", +", c #97E24B", +"' c #A0EB48", +") c #A4EE48", +"! c #9EE848", +"~ c #8FDD48", +"{ c #7FCE4C", +"] c #57B439", +"^ c #128907", +"/ c #44B309", +"( c #68C820", +"_ c #7BDA1B", +": c #91F10E", +"< c #A7FC23", +"[ c #ADFE2E", +"} c #A2FA1B", +"| c #88E90F", +"1 c #72D31C", +"2 c #58BB23", +"3 c #27990E", +"4 c #047200", +"5 c #45B700", +"6 c #96E14C", +"7 c #A1F038", +"8 c #B4FD41", +"9 c #BDFF54", +"0 c #C8FF72", +"a c #BAFF4B", +"b c #AFF941", +"c c #85DD2E", +"d c #55BD15", +"e c #209701", +"f c #046C00", +"g c #3DB000", +"h c #79D42A", +"i c #AAF052", +"j c #BBFD54", +"k c #DFFFAB", +"l c #E9FFC7", +"m c #CCFD80", +"n c #9EEF36", +"o c #7FD730", +"p c #43B308", +"q c #199200", +"r c #016A00", +"s c #2FA400", +"t c #50BE05", +"u c #80DB28", +"v c #ADF158", +"w c #B6F758", +"x c #BFF47A", +"y c #ABEC61", +"z c #92DD4D", +"A c #5AC311", +"B c #30A400", +"C c #0D8800", +"D c #006800", +"E c #1A9200", +"F c #35A900", +"G c #51BE04", +"H c #80D538", +"I c #9ADF5A", +"J c #A6E36D", +"K c #9ADD66", +"L c #6AC431", +"M c #38A909", +"N c #017E00", +"O c #078100", +"P c #2A9A13", +"Q c #5AB733", +"R c #76C946", +"S c #92D863", +"T c #A1DD75", +"U c #8CD35F", +"V c #62BD37", +"W c #3EA523", +"X c #12880B", +"Y c #007D00", +"Z c #0D753E", +"` c #3F82DF", +" . c #3573D6", +".. c #FFB458", +"+. c #8CA545", +"@. c #329829", +"#. c #65B853", +"$. c #81C864", +"%. c #96D476", +"&. c #A0D883", +"*. c #87CC67", +"=. c #6EBE53", +"-. c #4EAA3A", +";. c #1D8D12", +">. c #2B994F", +",. c #6BC0D0", +"'. c #9CD9FE", +"). c #96D0FA", +"!. c #5AA2EC", +"~. c #2377DB", +"{. c #FEC729", +"]. c #FECB50", +"^. c #FFCD63", +"/. c #FFCD68", +"(. c #FECB67", +"_. c #D5BC55", +":. c #54A237", +"<. c #91CD81", +"[. c #A6D698", +"}. c #A9D79E", +"|. c #9BD28B", +"1. c #78BF60", +"2. c #35A04D", +"3. c #59C3CD", +"4. c #6DD4F6", +"5. c #73DAFF", +"6. c #71D7FF", +"7. c #70D4FF", +"8. c #6CCCFE", +"9. c #5FB4F6", +"0. c #2B7BDD", +"a. c #FFDB3F", +"b. c #FEDF3F", +"c. c #FFDD44", +"d. c #FFDA45", +"e. c #FED644", +"f. c #FFD443", +"g. c #F2CA3B", +"h. c #68A52A", +"i. c #A6D49E", +"j. c #B4D9AC", +"k. c #67B35C", +"l. c #25B190", +"m. c #3ECBFF", +"n. c #49D8FF", +"o. c #4DE0FE", +"p. c #4FE4FF", +"q. c #4FE1FF", +"r. c #4ADAFF", +"s. c #47CEFE", +"t. c #43C2FF", +"u. c #37A8F6", +"v. c #208CE3", +"w. c #FFD946", +"x. c #FFEE61", +"y. c #FFF554", +"z. c #FFF43C", +"A. c #FFF030", +"B. c #FEED30", +"C. c #FFEA4A", +"D. c #FFE74F", +"E. c #9FC22F", +"F. c #A2B727", +"G. c #9CBC4B", +"H. c #3DE2CD", +"I. c #5DE9E5", +"J. c #57ECFF", +"K. c #45F3FF", +"L. c #40F6FF", +"M. c #3BF4FF", +"N. c #49ECFF", +"O. c #51E1FF", +"P. c #4AD8FE", +"Q. c #39CDFF", +"R. c #21ACEF", +"S. c #FFD43D", +"T. c #FFE96D", +"U. c #FFF472", +"V. c #FFFC76", +"W. c #FFFE72", +"X. c #FFFE8C", +"Y. c #FEF668", +"Z. c #FFEF64", +"`. c #EBDF3B", +" + c #E5C91A", +".+ c #A7BA4B", +"++ c #31D3C7", +"@+ c #6DEAE0", +"#+ c #71F6FF", +"$+ c #8CFCFF", +"%+ c #9BFDFE", +"&+ c #A4FDFF", +"*+ c #71F7FF", +"=+ c #61EBFE", +"-+ c #4BDAFF", +";+ c #28C0FF", +">+ c #1D9FEB", +",+ c #FFCA29", +"'+ c #FFDD45", +")+ c #FFED71", +"!+ c #FFF37B", +"~+ c #FFF9BC", +"{+ c #FFF065", +"]+ c #FFEE81", +"^+ c #FFE857", +"/+ c #E9D426", +"(+ c #E3C119", +"_+ c #A5B14A", +":+ c #1EC0C7", +"<+ c #43D6E0", +"[+ c #75EAFF", +"}+ c #83F2FF", +"|+ c #ABF5FE", +"1+ c #76EEFD", +"2+ c #82E8FD", +"3+ c #5EDEFE", +"4+ c #2FC6FF", +"5+ c #24B2FE", +"6+ c #1989E1", +"7+ c #FFBF23", +"8+ c #FFCE28", +"9+ c #FFDC47", +"0+ c #FFE469", +"a+ c #FFE586", +"b+ c #FFDD7A", +"c+ c #FFD86B", +"d+ c #FFCE38", +"e+ c #E7C620", +"f+ c #E2B716", +"g+ c #A3A347", +"h+ c #16ACC7", +"i+ c #26BDE0", +"j+ c #45CFFF", +"k+ c #73DDFE", +"l+ c #6FD9FC", +"m+ c #8CDAFA", +"n+ c #6ECCF8", +"o+ c #39B9F8", +"p+ c #23B1FD", +"q+ c #1C98F5", +"r+ c #1266CD", +"s+ c #FFB322", +"t+ c #FEC73D", +"u+ c #FFD255", +"v+ c #FFD96B", +"w+ c #FFE38D", +"x+ c #FFD463", +"y+ c #FFC843", +"z+ c #E6B526", +"A+ c #E0A713", +"B+ c #9E8C3F", +"C+ c #1086B9", +"D+ c #31ABDE", +"E+ c #4EC1FF", +"F+ c #69CFFE", +"G+ c #80D7FE", +"H+ c #84D8FE", +"I+ c #63CAFE", +"J+ c #3FB1FB", +"K+ c #2890EC", +"L+ c #1369D8", +"M+ c #0A3EB6", +"N+ c #F9AE33", +"O+ c #FFCB5B", +"P+ c #FED56F", +"Q+ c #FFDB7C", +"R+ c #FFE396", +"S+ c #FFDD82", +"T+ c #FED56E", +"U+ c #E5B736", +"V+ c #D99E17", +"W+ c #936E2A", +"X+ c #1A65A3", +"Y+ c #4C9ED1", +"Z+ c #69BDF8", +"`+ c #77C9FB", +" @ c #8CD4FD", +".@ c #85D0FC", +"+@ c #69BEF7", +"@@ c #54A8EF", +"#@ c #3983E1", +"$@ c #174AC3", +"%@ c #031894", +"&@ c #E4A13A", +"*@ c #FFD275", +"=@ c #FFE29A", +"-@ c #FEE4A3", +";@ c #FFDF94", +">@ c #FFDB86", +",@ c #FFC056", +"'@ c #BC8C24", +")@ c #76520A", +"!@ c #2D5CAA", +"~@ c #71A4E6", +"{@ c #92C5F0", +"]@ c #9CCAF1", +"^@ c #90C3EF", +"/@ c #82B8EC", +"(@ c #5586D9", +"_@ c #254AAB", +":@ c #06166C", +"<@ c #B77523", +"[@ c #FFCA80", +"}@ c #FFEABD", +"|@ c #FFDB9C", +"1@ c #DE993D", +"2@ c #112489", +"3@ c #758AD5", +"4@ c #C0D4F0", +"5@ c #A4BAE8", +"6@ c #3D51B4", +"7@ c #0A1658", +"8@ c #EC9B50", +"9@ c #8E4500", +"0@ c #454CAF", +"a@ c #070A69", +" ", +" . + @ ", +" # $ % & * = - ", +" ; > , ' ) ! ~ { ] ^ ", +" / ( _ : < [ } | 1 2 3 4 ", +" 5 6 7 8 9 0 a b c d e f ", +" g h i j k l m n o p q r ", +" s t u v w x y z A B C D ", +" E F G H I J K L M q N D ", +" O P Q R S T U V W X Y Z ` . ", +" ..+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~. ", +" {.].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0. ", +" a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v. ", +" w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R. ", +" S.T.U.V.W.X.Y.Z.`. +.+++@+#+$+%+&+*+=+-+;+>+ ", +" ,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+6+ ", +" 7+8+9+0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+ ", +" s+t+u+v+w+b+x+y+z+A+B+C+D+E+F+G+H+I+J+K+L+M+ ", +" N+O+P+Q+R+S+T+O+U+V+W+X+Y+Z+`+ @.@+@@@#@$@%@ ", +" &@*@=@-@;@>@,@'@)@ !@~@{@]@^@/@(@_@:@ ", +" <@[@}@|@1@ 2@3@4@5@6@7@ ", +" 8@9@ 0@a@ ", +" ", +" "}; diff --git a/icons/document-switch-mode-16.xpm b/icons/document-switch-mode-16.xpm new file mode 100644 index 0000000..924a29a --- /dev/null +++ b/icons/document-switch-mode-16.xpm @@ -0,0 +1,60 @@ +/* XPM */ +static const char * document_switch_mode_16_xpm[] = { +"16 16 41 1", +" c None", +". c #909090", +"+ c #8D8D8D", +"@ c #9B9B9B", +"# c #9A9A9A", +"$ c #999999", +"% c #989898", +"& c #979797", +"* c #969696", +"= c #A2A2A2", +"- c #9F9F9F", +"; c #8F8F8F", +"> c #A3A3A3", +", c #A9A9A9", +"' c #A8A8A8", +") c #A6A6A6", +"! c #9C9C9C", +"~ c #929292", +"{ c #7B7B7B", +"] c #A4A4A4", +"^ c #AAAAAA", +"/ c #9D9D9D", +"( c #8A8A8A", +"_ c #888888", +": c #898989", +"< c #8C8C8C", +"[ c #848484", +"} c #828282", +"| c #A0A0A0", +"1 c #808080", +"2 c #727272", +"3 c #747474", +"4 c #757575", +"5 c #7C7C7C", +"6 c #7A7A7A", +"7 c #939393", +"8 c #838383", +"9 c #858585", +"0 c #878787", +"a c #818181", +"b c #737373", +" ", +" ", +" ", +" .+ ", +" @#$%&*=-; ", +" >,,'')-!@~{", +" ]^,/~(_:<: ", +" @ [_ ", +" })|1 2234 5 ", +"6>=7_:(+;.+ ", +"}$;}}890::0 ", +" 35ab ", +" b ", +" ", +" ", +" "}; diff --git a/icons/document-switch-mode-24.xpm b/icons/document-switch-mode-24.xpm new file mode 100644 index 0000000..cb68653 --- /dev/null +++ b/icons/document-switch-mode-24.xpm @@ -0,0 +1,80 @@ +/* XPM */ +static const char * document_switch_mode_24_xpm[] = { +"24 24 53 1", +" c None", +". c #9A9A9A", +"+ c #A2A2A2", +"@ c #A1A1A1", +"# c #767676", +"$ c #A6A6A6", +"% c #797979", +"& c #A9A9A9", +"* c #A8A8A8", +"= c #A7A7A7", +"- c #A5A5A5", +"; c #A4A4A4", +"> c #A3A3A3", +", c #7D7D7D", +"' c #AFAFAF", +") c #AEAEAE", +"! c #ADADAD", +"~ c #ACACAC", +"{ c #ABABAB", +"] c #AAAAAA", +"^ c #A0A0A0", +"/ c #9C9C9C", +"( c #999999", +"_ c #969696", +": c #919191", +"< c #6E6E6E", +"[ c #9D9D9D", +"} c #929292", +"| c #898989", +"1 c #858585", +"2 c #878787", +"3 c #888888", +"4 c #8A8A8A", +"5 c #8B8B8B", +"6 c #5C5C5C", +"7 c #909090", +"8 c #8D8D8D", +"9 c #7E7E7E", +"0 c #747474", +"a c #757575", +"b c #8E8E8E", +"c c #828282", +"d c #7A7A7A", +"e c #868686", +"f c #8C8C8C", +"g c #787878", +"h c #7B7B7B", +"i c #8F8F8F", +"j c #686868", +"k c #9E9E9E", +"l c #848484", +"m c #777777", +"n c #7C7C7C", +" ", +" ", +" ", +" ", +" . ", +" +@# ", +" +$@% ", +" +&*=$--;>>=$-@, ", +" =')!~{{]&;^/(_:<", +" =')!~*[}|12345|6", +" + 47789000a#3582 ", +" #=* |b1 ", +" %$]; 5c ", +" d;$$+41e23|4f84 g ", +"h+>>(2e3|458bi7b ", +"jk>}le23|5f8b7:b ", +" fl11#mg%dhnn9h ", +" ,el ", +" nl ", +" # ", +" ", +" ", +" ", +" "}; diff --git a/sdk/CMakeLists.txt b/sdk/CMakeLists.txt new file mode 100644 index 0000000..4c238e8 --- /dev/null +++ b/sdk/CMakeLists.txt @@ -0,0 +1,27 @@ +# This file is part of EPOCH. +# File: CMakeLists.txt +# Author: Florent Teichteil-Königsbuch +# Contact: florent.teichteil@onera.fr +# +# EPOCH is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# EPOCH is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with EPOCH. If not, see . + +MESSAGE (STATUS "COMPILES the Software Development Kit (additional provided dependencies)") +IF (BUILD_GUI) + INCLUDE (${wxWidgets_USE_FILE}) + ADD_SUBDIRECTORY (wxscintilla) + ADD_SUBDIRECTORY (wxshapeframework) +ENDIF (BUILD_GUI) + +ADD_SUBDIRECTORY(buddy-2.4) + diff --git a/sdk/boost/numeric/bindings/addressing_index.hpp b/sdk/boost/numeric/bindings/addressing_index.hpp new file mode 100644 index 0000000..5c4256b --- /dev/null +++ b/sdk/boost/numeric/bindings/addressing_index.hpp @@ -0,0 +1,74 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_INDEX_HPP +#define BOOST_NUMERIC_BINDINGS_INDEX_HPP + +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +struct addressing_index_minor { + typedef typename mpl::if_< + is_column_major< T >, + tag::addressing_index<1>, + tag::addressing_index< + mpl::max< tag::matrix, rank< T > >::type::value + > + >::type type; +}; + +template< typename T > +struct addressing_index_major { + typedef typename mpl::if_< + is_column_major< T >, + tag::addressing_index< + mpl::max< tag::matrix, rank< T > >::type::value + >, + tag::addressing_index<1> + >::type type; +}; + + +template< typename AddressingIndex, typename TransTag > +struct addressing_index_trans { + typedef AddressingIndex type; +}; + +template<> +struct addressing_index_trans< tag::addressing_index<1>, tag::transpose > { + typedef tag::addressing_index<2> type; +}; + +template<> +struct addressing_index_trans< tag::addressing_index<1>, tag::conjugate > { + typedef tag::addressing_index<2> type; +}; + +template<> +struct addressing_index_trans< tag::addressing_index<2>, tag::transpose > { + typedef tag::addressing_index<1> type; +}; + +template<> +struct addressing_index_trans< tag::addressing_index<2>, tag::conjugate > { + typedef tag::addressing_index<1> type; +}; + + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/at.hpp b/sdk/boost/numeric/bindings/at.hpp new file mode 100644 index 0000000..7b1eda5 --- /dev/null +++ b/sdk/boost/numeric/bindings/at.hpp @@ -0,0 +1,71 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_AT_HPP +#define BOOST_NUMERIC_BINDINGS_AT_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Enable = void > +struct at_impl { + + typedef typename bindings::value_type::type& result_type; + + // TODO implement other array structures such as triangular, band, etc. + static result_type invoke( T& t, const std::ptrdiff_t i1, std::ptrdiff_t i2 ) { + return t( i1, i2 ); + } + +}; + +template< typename T > +struct at_impl< T, typename boost::enable_if< bindings::has_linear_array >::type > { + + typedef typename bindings::value_type::type& result_type; + + static result_type invoke( T& t, const std::ptrdiff_t i1 ) { + return *( bindings::begin_value(t) + offset(t,i1) ); + } + + static result_type invoke( T& t, const std::ptrdiff_t i1, std::ptrdiff_t i2 ) { + return *( bindings::begin_value(t) + offset(t,i1,i2) ); + } + +}; + +} + +namespace result_of { + +template< typename T > +struct at { + typedef typename detail::at_impl::result_type type; +}; + +} + +template< typename T > +typename result_of::at::type at( T& t, const std::ptrdiff_t i1 ) { + return detail::at_impl::invoke( t, i1 ); +} + +template< typename T > +typename result_of::at::type at( T& t, const std::ptrdiff_t i1, const std::ptrdiff_t i2 ) { + return detail::at_impl::invoke( t, i1, i2 ); +} + +} // bindings +} // numeric +} // boost + +#endif diff --git a/sdk/boost/numeric/bindings/bandwidth.hpp b/sdk/boost/numeric/bindings/bandwidth.hpp new file mode 100644 index 0000000..c489c66 --- /dev/null +++ b/sdk/boost/numeric/bindings/bandwidth.hpp @@ -0,0 +1,167 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BANDWIDTH_HPP +#define BOOST_NUMERIC_BINDINGS_BANDWIDTH_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename AddressingIndex, typename Enable = void > +struct bandwidth_impl { + + typedef typename tag::bandwidth_type< AddressingIndex::value > key_type; + typedef typename result_of_get< T, key_type >::type result_type; + + static result_type invoke( const T& t ) { + return get< key_type >( t ); + } + +}; + +template< typename T > +struct bandwidth_impl< T, tag::lower >: + bandwidth_impl< T, tag::addressing_index<1> > {}; + + +template< typename T > +struct bandwidth_impl< T, tag::upper >: + bandwidth_impl< T, tag::addressing_index<2> > {}; + + +template< typename T, int N > +struct bandwidth_impl< T, tag::addressing_index, + typename boost::enable_if< typename mpl::and_< + mpl::greater< tag::addressing_index, rank >, + is_same_at< T, tag::bandwidth_type<1>, std::ptrdiff_t > + >::type >::type > { + + typedef std::ptrdiff_t result_type; + + static result_type invoke( const T& t ) { + return std::min< std::ptrdiff_t >( bandwidth_impl >::invoke(t), 1 ); + } + +}; + +template< typename T, int N > +struct bandwidth_impl< T, tag::addressing_index, + typename boost::enable_if< typename mpl::and_< + mpl::greater< tag::addressing_index, rank >, + mpl::not_< is_same_at< T, tag::bandwidth_type<1>, std::ptrdiff_t > > + >::type >::type > { + + typedef typename mpl::min< + typename detail::property_at< T, tag::bandwidth_type<1> >::type, + mpl::int_<1> + >::type result_type; + + static result_type invoke( const T& t ) { + return result_type(); + } + +}; + +} // namespace detail + + +namespace result_of { + +template< typename T, typename Tag = tag::addressing_index<1> > +struct bandwidth { + BOOST_STATIC_ASSERT( (is_tag::value) ); + typedef typename detail::bandwidth_impl< T, Tag >::result_type type; +}; + +} // namespace result_of + +// +// Overloads for free template functions bandwidth( x, tag ), +// +template< typename T, typename Tag > +inline typename result_of::bandwidth< const T, Tag >::type +bandwidth( const T& t, Tag ) { + return detail::bandwidth_impl< const T, Tag >::invoke( t ); +} + +// Overloads for free template function bandwidth( x ) +// Valid for types with rank <= 1 (scalars, vectors) +// In theory, we could provide overloads for matrices here, too, +// if their minimal_rank is at most 1. + +// template< typename T > +// typename boost::enable_if< mpl::less< rank, mpl::int_<2> >, +// typename result_of::bandwidth< const T >::type >::type +// bandwidth( const T& t ) { +// return detail::bandwidth_impl< const T, tag::addressing_index<1> >::invoke( t ); +// } + +#define GENERATE_BANDWIDTH_INDEX( z, which, unused ) \ +GENERATE_FUNCTIONS( bandwidth, which, tag::addressing_index ) + +BOOST_PP_REPEAT_FROM_TO(1,3,GENERATE_BANDWIDTH_INDEX,~) + +GENERATE_FUNCTIONS( bandwidth, _left, tag::addressing_index<1> ) +GENERATE_FUNCTIONS( bandwidth, _right, tag::addressing_index<2> ) +GENERATE_FUNCTIONS( bandwidth, _lower, tag::addressing_index<1> ) +GENERATE_FUNCTIONS( bandwidth, _upper, tag::addressing_index<2> ) +GENERATE_FUNCTIONS( bandwidth, _major, typename addressing_index_major::type ) +GENERATE_FUNCTIONS( bandwidth, _minor, typename addressing_index_minor::type ) + +// +// Overloads for free template functions bandwidth_row( x, tag ), +// Here, tag is assumed to be either one of +// tag::transpose, tag::no_transpose, or tag::conjugate +// +namespace result_of { + +template< typename T, typename TransTag > +struct bandwidth_lower_op { + typedef typename bandwidth< + T, + typename addressing_index_trans< tag::addressing_index<1>, TransTag >::type + >::type type; +}; + +template< typename T, typename TransTag > +struct bandwidth_upper_op { + typedef typename bandwidth< T, + typename addressing_index_trans< tag::addressing_index<2>, TransTag >::type >::type type; +}; + +} // namespace result_of + +template< typename T, typename Tag > +inline typename result_of::bandwidth_lower_op< const T, Tag >::type +bandwidth_lower_op( const T& t, Tag ) { + return bindings::bandwidth( t, typename addressing_index_trans< tag::addressing_index<1>, Tag >::type() ); +} + +template< typename T, typename Tag > +inline typename result_of::bandwidth_upper_op< const T, Tag >::type +bandwidth_upper_op( const T& t, Tag ) { + return bindings::bandwidth( t, typename addressing_index_trans< tag::addressing_index<2>, Tag >::type() ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/begin.hpp b/sdk/boost/numeric/bindings/begin.hpp new file mode 100644 index 0000000..8beda8d --- /dev/null +++ b/sdk/boost/numeric/bindings/begin.hpp @@ -0,0 +1,145 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BEGIN_HPP +#define BOOST_NUMERIC_BINDINGS_BEGIN_HPP + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +namespace detail { + +template< typename T, typename Tag > +struct begin_impl {}; + +template< typename T > +struct begin_impl< T, tag::value > { + typedef typename bindings::value_type< T>::type* result_type; + + static result_type invoke( T& t ) { + return adaptor_access::begin_value( t ); + } +}; + +template< typename T, int Dimension > +struct begin_impl > { + + typedef tag::addressing_index tag_type; + + typedef linear_iterator< + typename bindings::value_type< T>::type, + typename result_of::stride< T, tag_type >::type + > result_type; + + static result_type invoke( T& t ) { + return result_type( adaptor_access::begin_value( t ), bindings::stride(t, tag_type() ) ); + } +}; + +template< typename T > +struct begin_impl< T, tag::index_major > { + typedef typename detail::property_at< T, tag::index_type >::type* result_type; + + static result_type invoke( T& t ) { + return adaptor_access::begin_index_major( t ); + } +}; + +template< typename T > +struct begin_impl< T, tag::compressed_index_major > { + typedef typename detail::property_at< T, tag::index_type >::type* result_type; + + static result_type invoke( T& t ) { + return adaptor_access::begin_compressed_index_major( t ); + } +}; + +template< typename T > +struct begin_impl< T, tag::index_minor > { + typedef typename detail::property_at< T, tag::index_type >::type* result_type; + + static result_type invoke( T& t ) { + return adaptor_access::begin_index_minor( t ); + } +}; + +} // namespace detail + +namespace result_of { + +template< typename T, typename Tag = tag::addressing_index<1> > +struct begin { + BOOST_STATIC_ASSERT( (is_tag::value) ); + typedef typename detail::begin_impl::result_type type; +}; + +} // namespace result_of + +// +// Free Functions +// + +// +// Overloads like begin( t, tag ) +// +template< typename T, typename Tag > +inline typename result_of::begin::type +begin( T& t, Tag ) { + return detail::begin_impl::invoke( t ); +} + +template< typename T, typename Tag > +inline typename result_of::begin::type +begin( const T& t, Tag ) { + return detail::begin_impl::invoke( t ); +} + +// Overloads for types with rank <= 1 (scalars, vectors) +// In theory, we could provide overloads for matrices here, too, +// if their minimal_rank is at most 1. + +template< typename T > +typename boost::enable_if< mpl::less< rank, mpl::int_<2> >, + typename result_of::begin< T >::type >::type +begin( T& t ) { + return detail::begin_impl< T, tag::addressing_index<1> >::invoke( t ); +} + +template< typename T > +typename boost::enable_if< mpl::less< rank, mpl::int_<2> >, + typename result_of::begin< const T >::type >::type +begin( const T& t ) { + return detail::begin_impl< const T, tag::addressing_index<1> >::invoke( t ); +} + +#define GENERATE_BEGIN_INDEX( z, which, unused ) \ +GENERATE_FUNCTIONS( begin, which, tag::addressing_index ) + +BOOST_PP_REPEAT_FROM_TO(1,3,GENERATE_BEGIN_INDEX,~) +GENERATE_FUNCTIONS( begin, _value, tag::value ) +GENERATE_FUNCTIONS( begin, _row, tag::addressing_index<1> ) +GENERATE_FUNCTIONS( begin, _column, tag::addressing_index<2> ) + +GENERATE_FUNCTIONS( begin, _index_major, tag::index_major ) +GENERATE_FUNCTIONS( begin, _compressed_index_major, tag::compressed_index_major ) +GENERATE_FUNCTIONS( begin, _index_minor, tag::index_minor ) + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas.hpp b/sdk/boost/numeric/bindings/blas.hpp new file mode 100644 index 0000000..71f7eb7 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas.hpp @@ -0,0 +1,17 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_HPP + +#include +#include +#include + +#endif + diff --git a/sdk/boost/numeric/bindings/blas/detail/blas.h b/sdk/boost/numeric/bindings/blas/detail/blas.h new file mode 100644 index 0000000..54bd711 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/detail/blas.h @@ -0,0 +1,574 @@ +// +// Copyright (c) 2003--2009 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_BLAS_H +#define BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_BLAS_H + +#include + +extern "C" { + +// +// BLAS level1 routines +// + +// Value-type variants of asum +float BLAS_SASUM( const fortran_int_t* n, const float* x, + const fortran_int_t* incx ); +double BLAS_DASUM( const fortran_int_t* n, const double* x, + const fortran_int_t* incx ); +float BLAS_SCASUM( const fortran_int_t* n, const void* x, + const fortran_int_t* incx ); +double BLAS_DZASUM( const fortran_int_t* n, const void* x, + const fortran_int_t* incx ); + +// Value-type variants of axpy +void BLAS_SAXPY( const fortran_int_t* n, const float* a, const float* x, + const fortran_int_t* incx, float* y, const fortran_int_t* incy ); +void BLAS_DAXPY( const fortran_int_t* n, const double* a, const double* x, + const fortran_int_t* incx, double* y, const fortran_int_t* incy ); +void BLAS_CAXPY( const fortran_int_t* n, const void* a, const void* x, + const fortran_int_t* incx, void* y, const fortran_int_t* incy ); +void BLAS_ZAXPY( const fortran_int_t* n, const void* a, const void* x, + const fortran_int_t* incx, void* y, const fortran_int_t* incy ); + +// Value-type variants of copy +void BLAS_SCOPY( const fortran_int_t* n, const float* x, + const fortran_int_t* incx, float* y, const fortran_int_t* incy ); +void BLAS_DCOPY( const fortran_int_t* n, const double* x, + const fortran_int_t* incx, double* y, const fortran_int_t* incy ); +void BLAS_CCOPY( const fortran_int_t* n, const void* x, + const fortran_int_t* incx, void* y, const fortran_int_t* incy ); +void BLAS_ZCOPY( const fortran_int_t* n, const void* x, + const fortran_int_t* incx, void* y, const fortran_int_t* incy ); + +// Value-type variants of dot +float BLAS_SDOT( const fortran_int_t* n, const float* x, + const fortran_int_t* incx, const float* y, const fortran_int_t* incy ); +double BLAS_DDOT( const fortran_int_t* n, const double* x, + const fortran_int_t* incx, const double* y, + const fortran_int_t* incy ); +std::complex BLAS_CDOTU( const fortran_int_t* n, const void* x, + const fortran_int_t* incx, const void* y, const fortran_int_t* incy ); +std::complex BLAS_ZDOTU( const fortran_int_t* n, const void* x, + const fortran_int_t* incx, const void* y, const fortran_int_t* incy ); + +// Value-type variants of dotc +std::complex BLAS_CDOTC( const fortran_int_t* n, const void* x, + const fortran_int_t* incx, const void* y, const fortran_int_t* incy ); +std::complex BLAS_ZDOTC( const fortran_int_t* n, const void* x, + const fortran_int_t* incx, const void* y, const fortran_int_t* incy ); + +// Value-type variants of iamax +fortran_int_t BLAS_ISAMAX( const fortran_int_t* n, const float* x, + const fortran_int_t* incx ); +fortran_int_t BLAS_IDAMAX( const fortran_int_t* n, const double* x, + const fortran_int_t* incx ); +fortran_int_t BLAS_ICAMAX( const fortran_int_t* n, const void* x, + const fortran_int_t* incx ); +fortran_int_t BLAS_IZAMAX( const fortran_int_t* n, const void* x, + const fortran_int_t* incx ); + +// Value-type variants of nrm2 +float BLAS_SNRM2( const fortran_int_t* n, const float* x, + const fortran_int_t* incx ); +double BLAS_DNRM2( const fortran_int_t* n, const double* x, + const fortran_int_t* incx ); +float BLAS_SCNRM2( const fortran_int_t* n, const void* x, + const fortran_int_t* incx ); +double BLAS_DZNRM2( const fortran_int_t* n, const void* x, + const fortran_int_t* incx ); + +// Value-type variants of prec_dot +double BLAS_DSDOT( const fortran_int_t* n, const float* x, + const fortran_int_t* incx, const float* y, const fortran_int_t* incy ); + +// Value-type variants of rot +void BLAS_SROT( const fortran_int_t* n, float* x, const fortran_int_t* incx, + float* y, const fortran_int_t* incy, const float* c, const float* s ); +void BLAS_DROT( const fortran_int_t* n, double* x, const fortran_int_t* incx, + double* y, const fortran_int_t* incy, const double* c, + const double* s ); +void BLAS_CSROT( const fortran_int_t* n, void* x, const fortran_int_t* incx, + void* y, const fortran_int_t* incy, const float* c, const float* s ); +void BLAS_ZDROT( const fortran_int_t* n, void* x, const fortran_int_t* incx, + void* y, const fortran_int_t* incy, const double* c, const double* s ); + +// Value-type variants of rotg +void BLAS_SROTG( float* a, float* b, float* c, float* s ); +void BLAS_DROTG( double* a, double* b, double* c, double* s ); +void BLAS_CROTG( void* a, void* b, float* c, void* s ); +void BLAS_ZROTG( void* a, void* b, double* c, void* s ); + +// Value-type variants of rotm +void BLAS_SROTM( const fortran_int_t* n, float* x, const fortran_int_t* incx, + float* y, const fortran_int_t* incy, float* param ); +void BLAS_DROTM( const fortran_int_t* n, double* x, const fortran_int_t* incx, + double* y, const fortran_int_t* incy, double* param ); + +// Value-type variants of rotmg +void BLAS_SROTMG( float* d1, float* d2, float* x1, const float* y1, + float* sparam ); +void BLAS_DROTMG( double* d1, double* d2, double* x1, const double* y1, + double* dparam ); + +// Value-type variants of scal +void BLAS_SSCAL( const fortran_int_t* n, const float* a, float* x, + const fortran_int_t* incx ); +void BLAS_DSCAL( const fortran_int_t* n, const double* a, double* x, + const fortran_int_t* incx ); +void BLAS_CSSCAL( const fortran_int_t* n, const float* a, void* x, + const fortran_int_t* incx ); +void BLAS_ZDSCAL( const fortran_int_t* n, const double* a, void* x, + const fortran_int_t* incx ); +void BLAS_CSCAL( const fortran_int_t* n, const void* a, void* x, + const fortran_int_t* incx ); +void BLAS_ZSCAL( const fortran_int_t* n, const void* a, void* x, + const fortran_int_t* incx ); + +// Value-type variants of swap +void BLAS_SSWAP( const fortran_int_t* n, float* x, const fortran_int_t* incx, + float* y, const fortran_int_t* incy ); +void BLAS_DSWAP( const fortran_int_t* n, double* x, const fortran_int_t* incx, + double* y, const fortran_int_t* incy ); +void BLAS_CSWAP( const fortran_int_t* n, void* x, const fortran_int_t* incx, + void* y, const fortran_int_t* incy ); +void BLAS_ZSWAP( const fortran_int_t* n, void* x, const fortran_int_t* incx, + void* y, const fortran_int_t* incy ); + +// +// BLAS level2 routines +// + +// Value-type variants of gbmv +void BLAS_SGBMV( const char* trans, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* kl, + const fortran_int_t* ku, const float* alpha, const float* a, + const fortran_int_t* lda, const float* x, const fortran_int_t* incx, + const float* beta, float* y, const fortran_int_t* incy ); +void BLAS_DGBMV( const char* trans, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* kl, + const fortran_int_t* ku, const double* alpha, const double* a, + const fortran_int_t* lda, const double* x, const fortran_int_t* incx, + const double* beta, double* y, const fortran_int_t* incy ); +void BLAS_CGBMV( const char* trans, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* kl, + const fortran_int_t* ku, const void* alpha, const void* a, + const fortran_int_t* lda, const void* x, const fortran_int_t* incx, + const void* beta, void* y, const fortran_int_t* incy ); +void BLAS_ZGBMV( const char* trans, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* kl, + const fortran_int_t* ku, const void* alpha, const void* a, + const fortran_int_t* lda, const void* x, const fortran_int_t* incx, + const void* beta, void* y, const fortran_int_t* incy ); + +// Value-type variants of gemv +void BLAS_SGEMV( const char* trans, const fortran_int_t* m, + const fortran_int_t* n, const float* alpha, const float* a, + const fortran_int_t* lda, const float* x, const fortran_int_t* incx, + const float* beta, float* y, const fortran_int_t* incy ); +void BLAS_DGEMV( const char* trans, const fortran_int_t* m, + const fortran_int_t* n, const double* alpha, const double* a, + const fortran_int_t* lda, const double* x, const fortran_int_t* incx, + const double* beta, double* y, const fortran_int_t* incy ); +void BLAS_CGEMV( const char* trans, const fortran_int_t* m, + const fortran_int_t* n, const void* alpha, const void* a, + const fortran_int_t* lda, const void* x, const fortran_int_t* incx, + const void* beta, void* y, const fortran_int_t* incy ); +void BLAS_ZGEMV( const char* trans, const fortran_int_t* m, + const fortran_int_t* n, const void* alpha, const void* a, + const fortran_int_t* lda, const void* x, const fortran_int_t* incx, + const void* beta, void* y, const fortran_int_t* incy ); + +// Value-type variants of ger +void BLAS_SGER( const fortran_int_t* m, const fortran_int_t* n, + const float* alpha, const float* x, const fortran_int_t* incx, + const float* y, const fortran_int_t* incy, float* a, + const fortran_int_t* lda ); +void BLAS_DGER( const fortran_int_t* m, const fortran_int_t* n, + const double* alpha, const double* x, const fortran_int_t* incx, + const double* y, const fortran_int_t* incy, double* a, + const fortran_int_t* lda ); + +// Value-type variants of gerc +void BLAS_CGERC( const fortran_int_t* m, const fortran_int_t* n, + const void* alpha, const void* x, const fortran_int_t* incx, + const void* y, const fortran_int_t* incy, void* a, + const fortran_int_t* lda ); +void BLAS_ZGERC( const fortran_int_t* m, const fortran_int_t* n, + const void* alpha, const void* x, const fortran_int_t* incx, + const void* y, const fortran_int_t* incy, void* a, + const fortran_int_t* lda ); + +// Value-type variants of geru +void BLAS_CGERU( const fortran_int_t* m, const fortran_int_t* n, + const void* alpha, const void* x, const fortran_int_t* incx, + const void* y, const fortran_int_t* incy, void* a, + const fortran_int_t* lda ); +void BLAS_ZGERU( const fortran_int_t* m, const fortran_int_t* n, + const void* alpha, const void* x, const fortran_int_t* incx, + const void* y, const fortran_int_t* incy, void* a, + const fortran_int_t* lda ); + +// Value-type variants of hbmv +void BLAS_CHBMV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* k, const void* alpha, const void* a, + const fortran_int_t* lda, const void* x, const fortran_int_t* incx, + const void* beta, void* y, const fortran_int_t* incy ); +void BLAS_ZHBMV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* k, const void* alpha, const void* a, + const fortran_int_t* lda, const void* x, const fortran_int_t* incx, + const void* beta, void* y, const fortran_int_t* incy ); + +// Value-type variants of hemv +void BLAS_CHEMV( const char* uplo, const fortran_int_t* n, const void* alpha, + const void* a, const fortran_int_t* lda, const void* x, + const fortran_int_t* incx, const void* beta, void* y, + const fortran_int_t* incy ); +void BLAS_ZHEMV( const char* uplo, const fortran_int_t* n, const void* alpha, + const void* a, const fortran_int_t* lda, const void* x, + const fortran_int_t* incx, const void* beta, void* y, + const fortran_int_t* incy ); + +// Value-type variants of her +void BLAS_CHER( const char* uplo, const fortran_int_t* n, const float* alpha, + const void* x, const fortran_int_t* incx, void* a, + const fortran_int_t* lda ); +void BLAS_ZHER( const char* uplo, const fortran_int_t* n, const double* alpha, + const void* x, const fortran_int_t* incx, void* a, + const fortran_int_t* lda ); + +// Value-type variants of her2 +void BLAS_CHER2( const char* uplo, const fortran_int_t* n, const void* alpha, + const void* x, const fortran_int_t* incx, const void* y, + const fortran_int_t* incy, void* a, const fortran_int_t* lda ); +void BLAS_ZHER2( const char* uplo, const fortran_int_t* n, const void* alpha, + const void* x, const fortran_int_t* incx, const void* y, + const fortran_int_t* incy, void* a, const fortran_int_t* lda ); + +// Value-type variants of hpmv +void BLAS_CHPMV( const char* uplo, const fortran_int_t* n, const void* alpha, + const void* ap, const void* x, const fortran_int_t* incx, + const void* beta, void* y, const fortran_int_t* incy ); +void BLAS_ZHPMV( const char* uplo, const fortran_int_t* n, const void* alpha, + const void* ap, const void* x, const fortran_int_t* incx, + const void* beta, void* y, const fortran_int_t* incy ); + +// Value-type variants of hpr +void BLAS_CHPR( const char* uplo, const fortran_int_t* n, const float* alpha, + const void* x, const fortran_int_t* incx, void* ap ); +void BLAS_ZHPR( const char* uplo, const fortran_int_t* n, const double* alpha, + const void* x, const fortran_int_t* incx, void* ap ); + +// Value-type variants of hpr2 +void BLAS_CHPR2( const char* uplo, const fortran_int_t* n, const void* alpha, + const void* x, const fortran_int_t* incx, const void* y, + const fortran_int_t* incy, void* ap ); +void BLAS_ZHPR2( const char* uplo, const fortran_int_t* n, const void* alpha, + const void* x, const fortran_int_t* incx, const void* y, + const fortran_int_t* incy, void* ap ); + +// Value-type variants of sbmv +void BLAS_SSBMV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* k, const float* alpha, const float* a, + const fortran_int_t* lda, const float* x, const fortran_int_t* incx, + const float* beta, float* y, const fortran_int_t* incy ); +void BLAS_DSBMV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* k, const double* alpha, const double* a, + const fortran_int_t* lda, const double* x, const fortran_int_t* incx, + const double* beta, double* y, const fortran_int_t* incy ); + +// Value-type variants of spmv +void BLAS_SSPMV( const char* uplo, const fortran_int_t* n, const float* alpha, + const float* ap, const float* x, const fortran_int_t* incx, + const float* beta, float* y, const fortran_int_t* incy ); +void BLAS_DSPMV( const char* uplo, const fortran_int_t* n, + const double* alpha, const double* ap, const double* x, + const fortran_int_t* incx, const double* beta, double* y, + const fortran_int_t* incy ); + +// Value-type variants of spr +void BLAS_SSPR( const char* uplo, const fortran_int_t* n, const float* alpha, + const float* x, const fortran_int_t* incx, float* ap ); +void BLAS_DSPR( const char* uplo, const fortran_int_t* n, const double* alpha, + const double* x, const fortran_int_t* incx, double* ap ); + +// Value-type variants of spr2 +void BLAS_SSPR2( const char* uplo, const fortran_int_t* n, const float* alpha, + const float* x, const fortran_int_t* incx, const float* y, + const fortran_int_t* incy, float* ap ); +void BLAS_DSPR2( const char* uplo, const fortran_int_t* n, + const double* alpha, const double* x, const fortran_int_t* incx, + const double* y, const fortran_int_t* incy, double* ap ); + +// Value-type variants of symv +void BLAS_SSYMV( const char* uplo, const fortran_int_t* n, const float* alpha, + const float* a, const fortran_int_t* lda, const float* x, + const fortran_int_t* incx, const float* beta, float* y, + const fortran_int_t* incy ); +void BLAS_DSYMV( const char* uplo, const fortran_int_t* n, + const double* alpha, const double* a, const fortran_int_t* lda, + const double* x, const fortran_int_t* incx, const double* beta, + double* y, const fortran_int_t* incy ); + +// Value-type variants of syr +void BLAS_SSYR( const char* uplo, const fortran_int_t* n, const float* alpha, + const float* x, const fortran_int_t* incx, float* a, + const fortran_int_t* lda ); +void BLAS_DSYR( const char* uplo, const fortran_int_t* n, const double* alpha, + const double* x, const fortran_int_t* incx, double* a, + const fortran_int_t* lda ); + +// Value-type variants of syr2 +void BLAS_SSYR2( const char* uplo, const fortran_int_t* n, const float* alpha, + const float* x, const fortran_int_t* incx, const float* y, + const fortran_int_t* incy, float* a, const fortran_int_t* lda ); +void BLAS_DSYR2( const char* uplo, const fortran_int_t* n, + const double* alpha, const double* x, const fortran_int_t* incx, + const double* y, const fortran_int_t* incy, double* a, + const fortran_int_t* lda ); + +// Value-type variants of tbmv +void BLAS_STBMV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* k, const float* a, + const fortran_int_t* lda, float* x, const fortran_int_t* incx ); +void BLAS_DTBMV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* k, const double* a, + const fortran_int_t* lda, double* x, const fortran_int_t* incx ); +void BLAS_CTBMV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* k, const void* a, + const fortran_int_t* lda, void* x, const fortran_int_t* incx ); +void BLAS_ZTBMV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* k, const void* a, + const fortran_int_t* lda, void* x, const fortran_int_t* incx ); + +// Value-type variants of tbsv +void BLAS_STBSV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* k, const float* a, + const fortran_int_t* lda, float* x, const fortran_int_t* incx ); +void BLAS_DTBSV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* k, const double* a, + const fortran_int_t* lda, double* x, const fortran_int_t* incx ); +void BLAS_CTBSV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* k, const void* a, + const fortran_int_t* lda, void* x, const fortran_int_t* incx ); +void BLAS_ZTBSV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* k, const void* a, + const fortran_int_t* lda, void* x, const fortran_int_t* incx ); + +// Value-type variants of tpmv +void BLAS_STPMV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const float* ap, float* x, + const fortran_int_t* incx ); +void BLAS_DTPMV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const double* ap, double* x, + const fortran_int_t* incx ); +void BLAS_CTPMV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const void* ap, void* x, + const fortran_int_t* incx ); +void BLAS_ZTPMV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const void* ap, void* x, + const fortran_int_t* incx ); + +// Value-type variants of tpsv +void BLAS_STPSV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const float* ap, float* x, + const fortran_int_t* incx ); +void BLAS_DTPSV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const double* ap, double* x, + const fortran_int_t* incx ); +void BLAS_CTPSV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const void* ap, void* x, + const fortran_int_t* incx ); +void BLAS_ZTPSV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const void* ap, void* x, + const fortran_int_t* incx ); + +// Value-type variants of trmv +void BLAS_STRMV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const float* a, const fortran_int_t* lda, + float* x, const fortran_int_t* incx ); +void BLAS_DTRMV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const double* a, const fortran_int_t* lda, + double* x, const fortran_int_t* incx ); +void BLAS_CTRMV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + void* x, const fortran_int_t* incx ); +void BLAS_ZTRMV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + void* x, const fortran_int_t* incx ); + +// Value-type variants of trsv +void BLAS_STRSV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const float* a, const fortran_int_t* lda, + float* x, const fortran_int_t* incx ); +void BLAS_DTRSV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const double* a, const fortran_int_t* lda, + double* x, const fortran_int_t* incx ); +void BLAS_CTRSV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + void* x, const fortran_int_t* incx ); +void BLAS_ZTRSV( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + void* x, const fortran_int_t* incx ); + +// +// BLAS level3 routines +// + +// Value-type variants of gemm +void BLAS_SGEMM( const char* transa, const char* transb, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const float* alpha, const float* a, + const fortran_int_t* lda, const float* b, const fortran_int_t* ldb, + const float* beta, float* c, const fortran_int_t* ldc ); +void BLAS_DGEMM( const char* transa, const char* transb, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const double* alpha, const double* a, + const fortran_int_t* lda, const double* b, const fortran_int_t* ldb, + const double* beta, double* c, const fortran_int_t* ldc ); +void BLAS_CGEMM( const char* transa, const char* transb, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* alpha, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const void* beta, void* c, const fortran_int_t* ldc ); +void BLAS_ZGEMM( const char* transa, const char* transb, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* alpha, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const void* beta, void* c, const fortran_int_t* ldc ); + +// Value-type variants of hemm +void BLAS_CHEMM( const char* side, const char* uplo, const fortran_int_t* m, + const fortran_int_t* n, const void* alpha, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const void* beta, void* c, const fortran_int_t* ldc ); +void BLAS_ZHEMM( const char* side, const char* uplo, const fortran_int_t* m, + const fortran_int_t* n, const void* alpha, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const void* beta, void* c, const fortran_int_t* ldc ); + +// Value-type variants of her2k +void BLAS_CHER2K( const char* uplo, const char* trans, const fortran_int_t* n, + const fortran_int_t* k, const void* alpha, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const float* beta, void* c, const fortran_int_t* ldc ); +void BLAS_ZHER2K( const char* uplo, const char* trans, const fortran_int_t* n, + const fortran_int_t* k, const void* alpha, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const double* beta, void* c, const fortran_int_t* ldc ); + +// Value-type variants of herk +void BLAS_CHERK( const char* uplo, const char* trans, const fortran_int_t* n, + const fortran_int_t* k, const float* alpha, const void* a, + const fortran_int_t* lda, const float* beta, void* c, + const fortran_int_t* ldc ); +void BLAS_ZHERK( const char* uplo, const char* trans, const fortran_int_t* n, + const fortran_int_t* k, const double* alpha, const void* a, + const fortran_int_t* lda, const double* beta, void* c, + const fortran_int_t* ldc ); + +// Value-type variants of symm +void BLAS_SSYMM( const char* side, const char* uplo, const fortran_int_t* m, + const fortran_int_t* n, const float* alpha, const float* a, + const fortran_int_t* lda, const float* b, const fortran_int_t* ldb, + const float* beta, float* c, const fortran_int_t* ldc ); +void BLAS_DSYMM( const char* side, const char* uplo, const fortran_int_t* m, + const fortran_int_t* n, const double* alpha, const double* a, + const fortran_int_t* lda, const double* b, const fortran_int_t* ldb, + const double* beta, double* c, const fortran_int_t* ldc ); +void BLAS_CSYMM( const char* side, const char* uplo, const fortran_int_t* m, + const fortran_int_t* n, const void* alpha, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const void* beta, void* c, const fortran_int_t* ldc ); +void BLAS_ZSYMM( const char* side, const char* uplo, const fortran_int_t* m, + const fortran_int_t* n, const void* alpha, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const void* beta, void* c, const fortran_int_t* ldc ); + +// Value-type variants of syr2k +void BLAS_SSYR2K( const char* uplo, const char* trans, const fortran_int_t* n, + const fortran_int_t* k, const float* alpha, const float* a, + const fortran_int_t* lda, const float* b, const fortran_int_t* ldb, + const float* beta, float* c, const fortran_int_t* ldc ); +void BLAS_DSYR2K( const char* uplo, const char* trans, const fortran_int_t* n, + const fortran_int_t* k, const double* alpha, const double* a, + const fortran_int_t* lda, const double* b, const fortran_int_t* ldb, + const double* beta, double* c, const fortran_int_t* ldc ); +void BLAS_CSYR2K( const char* uplo, const char* trans, const fortran_int_t* n, + const fortran_int_t* k, const void* alpha, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const void* beta, void* c, const fortran_int_t* ldc ); +void BLAS_ZSYR2K( const char* uplo, const char* trans, const fortran_int_t* n, + const fortran_int_t* k, const void* alpha, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const void* beta, void* c, const fortran_int_t* ldc ); + +// Value-type variants of syrk +void BLAS_SSYRK( const char* uplo, const char* trans, const fortran_int_t* n, + const fortran_int_t* k, const float* alpha, const float* a, + const fortran_int_t* lda, const float* beta, float* c, + const fortran_int_t* ldc ); +void BLAS_DSYRK( const char* uplo, const char* trans, const fortran_int_t* n, + const fortran_int_t* k, const double* alpha, const double* a, + const fortran_int_t* lda, const double* beta, double* c, + const fortran_int_t* ldc ); +void BLAS_CSYRK( const char* uplo, const char* trans, const fortran_int_t* n, + const fortran_int_t* k, const void* alpha, const void* a, + const fortran_int_t* lda, const void* beta, void* c, + const fortran_int_t* ldc ); +void BLAS_ZSYRK( const char* uplo, const char* trans, const fortran_int_t* n, + const fortran_int_t* k, const void* alpha, const void* a, + const fortran_int_t* lda, const void* beta, void* c, + const fortran_int_t* ldc ); + +// Value-type variants of trmm +void BLAS_STRMM( const char* side, const char* uplo, const char* transa, + const char* diag, const fortran_int_t* m, const fortran_int_t* n, + const float* alpha, const float* a, const fortran_int_t* lda, + float* b, const fortran_int_t* ldb ); +void BLAS_DTRMM( const char* side, const char* uplo, const char* transa, + const char* diag, const fortran_int_t* m, const fortran_int_t* n, + const double* alpha, const double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb ); +void BLAS_CTRMM( const char* side, const char* uplo, const char* transa, + const char* diag, const fortran_int_t* m, const fortran_int_t* n, + const void* alpha, const void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb ); +void BLAS_ZTRMM( const char* side, const char* uplo, const char* transa, + const char* diag, const fortran_int_t* m, const fortran_int_t* n, + const void* alpha, const void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb ); + +// Value-type variants of trsm +void BLAS_STRSM( const char* side, const char* uplo, const char* transa, + const char* diag, const fortran_int_t* m, const fortran_int_t* n, + const float* alpha, const float* a, const fortran_int_t* lda, + float* b, const fortran_int_t* ldb ); +void BLAS_DTRSM( const char* side, const char* uplo, const char* transa, + const char* diag, const fortran_int_t* m, const fortran_int_t* n, + const double* alpha, const double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb ); +void BLAS_CTRSM( const char* side, const char* uplo, const char* transa, + const char* diag, const fortran_int_t* m, const fortran_int_t* n, + const void* alpha, const void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb ); +void BLAS_ZTRSM( const char* side, const char* uplo, const char* transa, + const char* diag, const fortran_int_t* m, const fortran_int_t* n, + const void* alpha, const void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb ); + +} + +#endif + diff --git a/sdk/boost/numeric/bindings/blas/detail/blas_names.h b/sdk/boost/numeric/bindings/blas/detail/blas_names.h new file mode 100644 index 0000000..98de1a5 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/detail/blas_names.h @@ -0,0 +1,275 @@ +// +// Copyright (c) 2003--2009 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_BLAS_NAMES_H +#define BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_BLAS_NAMES_H + +#include + +// +// BLAS level1 routines +// + +// Value-type variants of asum +#define BLAS_SASUM FORTRAN_ID2( sasum, SASUM ) +#define BLAS_DASUM FORTRAN_ID2( dasum, DASUM ) +#define BLAS_SCASUM FORTRAN_ID2( scasum, SCASUM ) +#define BLAS_DZASUM FORTRAN_ID2( dzasum, DZASUM ) + +// Value-type variants of axpy +#define BLAS_SAXPY FORTRAN_ID2( saxpy, SAXPY ) +#define BLAS_DAXPY FORTRAN_ID2( daxpy, DAXPY ) +#define BLAS_CAXPY FORTRAN_ID2( caxpy, CAXPY ) +#define BLAS_ZAXPY FORTRAN_ID2( zaxpy, ZAXPY ) + +// Value-type variants of copy +#define BLAS_SCOPY FORTRAN_ID2( scopy, SCOPY ) +#define BLAS_DCOPY FORTRAN_ID2( dcopy, DCOPY ) +#define BLAS_CCOPY FORTRAN_ID2( ccopy, CCOPY ) +#define BLAS_ZCOPY FORTRAN_ID2( zcopy, ZCOPY ) + +// Value-type variants of dot +#define BLAS_SDOT FORTRAN_ID2( sdot, SDOT ) +#define BLAS_DDOT FORTRAN_ID2( ddot, DDOT ) +#define BLAS_CDOTU FORTRAN_ID2( cdotu, CDOTU ) +#define BLAS_ZDOTU FORTRAN_ID2( zdotu, ZDOTU ) + +// Value-type variants of dotc +#define BLAS_CDOTC FORTRAN_ID2( cdotc, CDOTC ) +#define BLAS_ZDOTC FORTRAN_ID2( zdotc, ZDOTC ) + +// Value-type variants of iamax +#define BLAS_ISAMAX FORTRAN_ID2( isamax, ISAMAX ) +#define BLAS_IDAMAX FORTRAN_ID2( idamax, IDAMAX ) +#define BLAS_ICAMAX FORTRAN_ID2( icamax, ICAMAX ) +#define BLAS_IZAMAX FORTRAN_ID2( izamax, IZAMAX ) + +// Value-type variants of nrm2 +#define BLAS_SNRM2 FORTRAN_ID2( snrm2, SNRM2 ) +#define BLAS_DNRM2 FORTRAN_ID2( dnrm2, DNRM2 ) +#define BLAS_SCNRM2 FORTRAN_ID2( scnrm2, SCNRM2 ) +#define BLAS_DZNRM2 FORTRAN_ID2( dznrm2, DZNRM2 ) + +// Value-type variants of prec_dot +#define BLAS_DSDOT FORTRAN_ID2( dsdot, DSDOT ) + +// Value-type variants of rot +#define BLAS_SROT FORTRAN_ID2( srot, SROT ) +#define BLAS_DROT FORTRAN_ID2( drot, DROT ) +#define BLAS_CSROT FORTRAN_ID2( csrot, CSROT ) +#define BLAS_ZDROT FORTRAN_ID2( zdrot, ZDROT ) + +// Value-type variants of rotg +#define BLAS_SROTG FORTRAN_ID2( srotg, SROTG ) +#define BLAS_DROTG FORTRAN_ID2( drotg, DROTG ) +#define BLAS_CROTG FORTRAN_ID2( crotg, CROTG ) +#define BLAS_ZROTG FORTRAN_ID2( zrotg, ZROTG ) + +// Value-type variants of rotm +#define BLAS_SROTM FORTRAN_ID2( srotm, SROTM ) +#define BLAS_DROTM FORTRAN_ID2( drotm, DROTM ) + +// Value-type variants of rotmg +#define BLAS_SROTMG FORTRAN_ID2( srotmg, SROTMG ) +#define BLAS_DROTMG FORTRAN_ID2( drotmg, DROTMG ) + +// Value-type variants of scal +#define BLAS_SSCAL FORTRAN_ID2( sscal, SSCAL ) +#define BLAS_DSCAL FORTRAN_ID2( dscal, DSCAL ) +#define BLAS_CSSCAL FORTRAN_ID2( csscal, CSSCAL ) +#define BLAS_ZDSCAL FORTRAN_ID2( zdscal, ZDSCAL ) +#define BLAS_CSCAL FORTRAN_ID2( cscal, CSCAL ) +#define BLAS_ZSCAL FORTRAN_ID2( zscal, ZSCAL ) + +// Value-type variants of swap +#define BLAS_SSWAP FORTRAN_ID2( sswap, SSWAP ) +#define BLAS_DSWAP FORTRAN_ID2( dswap, DSWAP ) +#define BLAS_CSWAP FORTRAN_ID2( cswap, CSWAP ) +#define BLAS_ZSWAP FORTRAN_ID2( zswap, ZSWAP ) + +// +// BLAS level2 routines +// + +// Value-type variants of gbmv +#define BLAS_SGBMV FORTRAN_ID2( sgbmv, SGBMV ) +#define BLAS_DGBMV FORTRAN_ID2( dgbmv, DGBMV ) +#define BLAS_CGBMV FORTRAN_ID2( cgbmv, CGBMV ) +#define BLAS_ZGBMV FORTRAN_ID2( zgbmv, ZGBMV ) + +// Value-type variants of gemv +#define BLAS_SGEMV FORTRAN_ID2( sgemv, SGEMV ) +#define BLAS_DGEMV FORTRAN_ID2( dgemv, DGEMV ) +#define BLAS_CGEMV FORTRAN_ID2( cgemv, CGEMV ) +#define BLAS_ZGEMV FORTRAN_ID2( zgemv, ZGEMV ) + +// Value-type variants of ger +#define BLAS_SGER FORTRAN_ID2( sger, SGER ) +#define BLAS_DGER FORTRAN_ID2( dger, DGER ) + +// Value-type variants of gerc +#define BLAS_CGERC FORTRAN_ID2( cgerc, CGERC ) +#define BLAS_ZGERC FORTRAN_ID2( zgerc, ZGERC ) + +// Value-type variants of geru +#define BLAS_CGERU FORTRAN_ID2( cgeru, CGERU ) +#define BLAS_ZGERU FORTRAN_ID2( zgeru, ZGERU ) + +// Value-type variants of hbmv +#define BLAS_CHBMV FORTRAN_ID2( chbmv, CHBMV ) +#define BLAS_ZHBMV FORTRAN_ID2( zhbmv, ZHBMV ) + +// Value-type variants of hemv +#define BLAS_CHEMV FORTRAN_ID2( chemv, CHEMV ) +#define BLAS_ZHEMV FORTRAN_ID2( zhemv, ZHEMV ) + +// Value-type variants of her +#define BLAS_CHER FORTRAN_ID2( cher, CHER ) +#define BLAS_ZHER FORTRAN_ID2( zher, ZHER ) + +// Value-type variants of her2 +#define BLAS_CHER2 FORTRAN_ID2( cher2, CHER2 ) +#define BLAS_ZHER2 FORTRAN_ID2( zher2, ZHER2 ) + +// Value-type variants of hpmv +#define BLAS_CHPMV FORTRAN_ID2( chpmv, CHPMV ) +#define BLAS_ZHPMV FORTRAN_ID2( zhpmv, ZHPMV ) + +// Value-type variants of hpr +#define BLAS_CHPR FORTRAN_ID2( chpr, CHPR ) +#define BLAS_ZHPR FORTRAN_ID2( zhpr, ZHPR ) + +// Value-type variants of hpr2 +#define BLAS_CHPR2 FORTRAN_ID2( chpr2, CHPR2 ) +#define BLAS_ZHPR2 FORTRAN_ID2( zhpr2, ZHPR2 ) + +// Value-type variants of sbmv +#define BLAS_SSBMV FORTRAN_ID2( ssbmv, SSBMV ) +#define BLAS_DSBMV FORTRAN_ID2( dsbmv, DSBMV ) + +// Value-type variants of spmv +#define BLAS_SSPMV FORTRAN_ID2( sspmv, SSPMV ) +#define BLAS_DSPMV FORTRAN_ID2( dspmv, DSPMV ) + +// Value-type variants of spr +#define BLAS_SSPR FORTRAN_ID2( sspr, SSPR ) +#define BLAS_DSPR FORTRAN_ID2( dspr, DSPR ) + +// Value-type variants of spr2 +#define BLAS_SSPR2 FORTRAN_ID2( sspr2, SSPR2 ) +#define BLAS_DSPR2 FORTRAN_ID2( dspr2, DSPR2 ) + +// Value-type variants of symv +#define BLAS_SSYMV FORTRAN_ID2( ssymv, SSYMV ) +#define BLAS_DSYMV FORTRAN_ID2( dsymv, DSYMV ) + +// Value-type variants of syr +#define BLAS_SSYR FORTRAN_ID2( ssyr, SSYR ) +#define BLAS_DSYR FORTRAN_ID2( dsyr, DSYR ) + +// Value-type variants of syr2 +#define BLAS_SSYR2 FORTRAN_ID2( ssyr2, SSYR2 ) +#define BLAS_DSYR2 FORTRAN_ID2( dsyr2, DSYR2 ) + +// Value-type variants of tbmv +#define BLAS_STBMV FORTRAN_ID2( stbmv, STBMV ) +#define BLAS_DTBMV FORTRAN_ID2( dtbmv, DTBMV ) +#define BLAS_CTBMV FORTRAN_ID2( ctbmv, CTBMV ) +#define BLAS_ZTBMV FORTRAN_ID2( ztbmv, ZTBMV ) + +// Value-type variants of tbsv +#define BLAS_STBSV FORTRAN_ID2( stbsv, STBSV ) +#define BLAS_DTBSV FORTRAN_ID2( dtbsv, DTBSV ) +#define BLAS_CTBSV FORTRAN_ID2( ctbsv, CTBSV ) +#define BLAS_ZTBSV FORTRAN_ID2( ztbsv, ZTBSV ) + +// Value-type variants of tpmv +#define BLAS_STPMV FORTRAN_ID2( stpmv, STPMV ) +#define BLAS_DTPMV FORTRAN_ID2( dtpmv, DTPMV ) +#define BLAS_CTPMV FORTRAN_ID2( ctpmv, CTPMV ) +#define BLAS_ZTPMV FORTRAN_ID2( ztpmv, ZTPMV ) + +// Value-type variants of tpsv +#define BLAS_STPSV FORTRAN_ID2( stpsv, STPSV ) +#define BLAS_DTPSV FORTRAN_ID2( dtpsv, DTPSV ) +#define BLAS_CTPSV FORTRAN_ID2( ctpsv, CTPSV ) +#define BLAS_ZTPSV FORTRAN_ID2( ztpsv, ZTPSV ) + +// Value-type variants of trmv +#define BLAS_STRMV FORTRAN_ID2( strmv, STRMV ) +#define BLAS_DTRMV FORTRAN_ID2( dtrmv, DTRMV ) +#define BLAS_CTRMV FORTRAN_ID2( ctrmv, CTRMV ) +#define BLAS_ZTRMV FORTRAN_ID2( ztrmv, ZTRMV ) + +// Value-type variants of trsv +#define BLAS_STRSV FORTRAN_ID2( strsv, STRSV ) +#define BLAS_DTRSV FORTRAN_ID2( dtrsv, DTRSV ) +#define BLAS_CTRSV FORTRAN_ID2( ctrsv, CTRSV ) +#define BLAS_ZTRSV FORTRAN_ID2( ztrsv, ZTRSV ) + +// +// BLAS level3 routines +// + +// Value-type variants of gemm +#define BLAS_SGEMM FORTRAN_ID2( sgemm, SGEMM ) +#define BLAS_DGEMM FORTRAN_ID2( dgemm, DGEMM ) +#define BLAS_CGEMM FORTRAN_ID2( cgemm, CGEMM ) +#define BLAS_ZGEMM FORTRAN_ID2( zgemm, ZGEMM ) + +// Value-type variants of hemm +#define BLAS_CHEMM FORTRAN_ID2( chemm, CHEMM ) +#define BLAS_ZHEMM FORTRAN_ID2( zhemm, ZHEMM ) + +// Value-type variants of her2k +#define BLAS_CHER2K FORTRAN_ID2( cher2k, CHER2K ) +#define BLAS_ZHER2K FORTRAN_ID2( zher2k, ZHER2K ) + +// Value-type variants of herk +#define BLAS_CHERK FORTRAN_ID2( cherk, CHERK ) +#define BLAS_ZHERK FORTRAN_ID2( zherk, ZHERK ) + +// Value-type variants of symm +#define BLAS_SSYMM FORTRAN_ID2( ssymm, SSYMM ) +#define BLAS_DSYMM FORTRAN_ID2( dsymm, DSYMM ) +#define BLAS_CSYMM FORTRAN_ID2( csymm, CSYMM ) +#define BLAS_ZSYMM FORTRAN_ID2( zsymm, ZSYMM ) + +// Value-type variants of syr2k +#define BLAS_SSYR2K FORTRAN_ID2( ssyr2k, SSYR2K ) +#define BLAS_DSYR2K FORTRAN_ID2( dsyr2k, DSYR2K ) +#define BLAS_CSYR2K FORTRAN_ID2( csyr2k, CSYR2K ) +#define BLAS_ZSYR2K FORTRAN_ID2( zsyr2k, ZSYR2K ) + +// Value-type variants of syrk +#define BLAS_SSYRK FORTRAN_ID2( ssyrk, SSYRK ) +#define BLAS_DSYRK FORTRAN_ID2( dsyrk, DSYRK ) +#define BLAS_CSYRK FORTRAN_ID2( csyrk, CSYRK ) +#define BLAS_ZSYRK FORTRAN_ID2( zsyrk, ZSYRK ) + +// Value-type variants of trmm +#define BLAS_STRMM FORTRAN_ID2( strmm, STRMM ) +#define BLAS_DTRMM FORTRAN_ID2( dtrmm, DTRMM ) +#define BLAS_CTRMM FORTRAN_ID2( ctrmm, CTRMM ) +#define BLAS_ZTRMM FORTRAN_ID2( ztrmm, ZTRMM ) + +// Value-type variants of trsm +#define BLAS_STRSM FORTRAN_ID2( strsm, STRSM ) +#define BLAS_DTRSM FORTRAN_ID2( dtrsm, DTRSM ) +#define BLAS_CTRSM FORTRAN_ID2( ctrsm, CTRSM ) +#define BLAS_ZTRSM FORTRAN_ID2( ztrsm, ZTRSM ) + + + +#endif + diff --git a/sdk/boost/numeric/bindings/blas/detail/blas_option.hpp b/sdk/boost/numeric/bindings/blas/detail/blas_option.hpp new file mode 100644 index 0000000..b27440a --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/detail/blas_option.hpp @@ -0,0 +1,57 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_BLAS_OPTION_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_BLAS_OPTION_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { +namespace detail { + +template< typename Tag > +struct blas_option {}; + +template<> +struct blas_option< tag::transpose >: mpl::char_< 'T' > {}; + +template<> +struct blas_option< tag::no_transpose >: mpl::char_< 'N' > {}; + +template<> +struct blas_option< tag::conjugate >: mpl::char_< 'C' > {}; + +template<> +struct blas_option< tag::upper >: mpl::char_< 'U' > {}; + +template<> +struct blas_option< tag::lower >: mpl::char_< 'L' > {}; + +template<> +struct blas_option< tag::unit >: mpl::char_< 'U' > {}; + +template<> +struct blas_option< tag::non_unit >: mpl::char_< 'N' > {}; + +template<> +struct blas_option< tag::left >: mpl::char_< 'L' > {}; + +template<> +struct blas_option< tag::right >: mpl::char_< 'R' > {}; + +} // namespace detail +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/detail/cblas.h b/sdk/boost/numeric/bindings/blas/detail/cblas.h new file mode 100644 index 0000000..e4194dc --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/detail/cblas.h @@ -0,0 +1,41 @@ +/* + * + * Copyright (c) Kresimir Fresl 2002 + * + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + * + * Author acknowledges the support of the Faculty of Civil Engineering, + * University of Zagreb, Croatia. + * + */ + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_CBLAS_H +#define BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_CBLAS_H + +// +// MKL-specific CBLAS include +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_MKL + +extern "C" { +#include +#include +// +// mkl_types.h defines P4 macro which breaks MPL, undefine it here. +// +#undef P4 +} + +// +// Default CBLAS include +// +#else + +extern "C" { +#include +} + +#endif +#endif diff --git a/sdk/boost/numeric/bindings/blas/detail/cblas_option.hpp b/sdk/boost/numeric/bindings/blas/detail/cblas_option.hpp new file mode 100644 index 0000000..19420d1 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/detail/cblas_option.hpp @@ -0,0 +1,85 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_CBLAS_OPTION_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_CBLAS_OPTION_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { +namespace detail { + +template< typename Tag > +struct cblas_option {}; + +template<> +struct cblas_option< tag::row_major > { + static const CBLAS_ORDER value = CblasRowMajor; +}; + +template<> +struct cblas_option< tag::column_major > { + static const CBLAS_ORDER value = CblasColMajor; +}; + +template<> +struct cblas_option< tag::transpose > { + static const CBLAS_TRANSPOSE value = CblasTrans; +}; + +template<> +struct cblas_option< tag::no_transpose > { + static const CBLAS_TRANSPOSE value = CblasNoTrans; +}; + +template<> +struct cblas_option< tag::conjugate > { + static const CBLAS_TRANSPOSE value = CblasConjTrans; +}; + +template<> +struct cblas_option< tag::upper > { + static const CBLAS_UPLO value = CblasUpper; +}; + +template<> +struct cblas_option< tag::lower > { + static const CBLAS_UPLO value = CblasLower; +}; + +template<> +struct cblas_option< tag::unit > { + static const CBLAS_DIAG value = CblasUnit; +}; + +template<> +struct cblas_option< tag::non_unit > { + static const CBLAS_DIAG value = CblasNonUnit; +}; + +template<> +struct cblas_option< tag::left > { + static const CBLAS_SIDE value = CblasLeft; +}; + +template<> +struct cblas_option< tag::right > { + static const CBLAS_SIDE value = CblasRight; +}; + +} // namespace detail +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/detail/cublas.h b/sdk/boost/numeric/bindings/blas/detail/cublas.h new file mode 100644 index 0000000..0f46bcb --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/detail/cublas.h @@ -0,0 +1,16 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_CUBLAS_H +#define BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_CUBLAS_H + +extern "C" { +#include +} + +#endif diff --git a/sdk/boost/numeric/bindings/blas/detail/default_order.hpp b/sdk/boost/numeric/bindings/blas/detail/default_order.hpp new file mode 100644 index 0000000..7d3f176 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/detail/default_order.hpp @@ -0,0 +1,38 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_DEFAULT_ORDER_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_DEFAULT_ORDER_HPP + +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { +namespace detail { + +template< typename T > +struct default_order { + typedef typename mpl::if_< + bindings::detail::is_same_at< T, tag::value_transform, tag::conjugate >, + typename mpl::if_< is_row_major< T >, tag::column_major, tag::row_major >::type, + tag::column_major + >::type type; +}; + +} // namespace detail +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1.hpp b/sdk/boost/numeric/bindings/blas/level1.hpp new file mode 100644 index 0000000..54e8bc5 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1.hpp @@ -0,0 +1,29 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/asum.hpp b/sdk/boost/numeric/bindings/blas/level1/asum.hpp new file mode 100644 index 0000000..a7e3ea4 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/asum.hpp @@ -0,0 +1,230 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_ASUM_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_ASUM_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +inline float asum( const int n, const float* x, const int incx ) { + return cblas_sasum( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +inline double asum( const int n, const double* x, const int incx ) { + return cblas_dasum( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline float asum( const int n, const std::complex* x, + const int incx ) { + return cblas_scasum( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline double asum( const int n, const std::complex* x, + const int incx ) { + return cblas_dzasum( n, x, incx ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +inline float asum( const int n, const float* x, const int incx ) { + return cublasSasum( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +inline double asum( const int n, const double* x, const int incx ) { + return cublasDasum( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline float asum( const int n, const std::complex* x, + const int incx ) { + return cublasScasum( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline double asum( const int n, const std::complex* x, + const int incx ) { + return cublasDzasum( n, x, incx ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +inline float asum( const fortran_int_t n, const float* x, + const fortran_int_t incx ) { + return BLAS_SASUM( &n, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +inline double asum( const fortran_int_t n, const double* x, + const fortran_int_t incx ) { + return BLAS_DASUM( &n, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline float asum( const fortran_int_t n, const std::complex* x, + const fortran_int_t incx ) { + return BLAS_SCASUM( &n, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline double asum( const fortran_int_t n, const std::complex* x, + const fortran_int_t incx ) { + return BLAS_DZASUM( &n, x, &incx ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to asum. +// +template< typename Value > +struct asum_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef real_type result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX > + static result_type invoke( const VectorX& x ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + return detail::asum( bindings::size(x), + bindings::begin_value(x), bindings::stride(x) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the asum_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for asum. Its overload differs for +// +template< typename VectorX > +inline typename asum_impl< typename bindings::value_type< + VectorX >::type >::result_type +asum( const VectorX& x ) { + return asum_impl< typename bindings::value_type< + VectorX >::type >::invoke( x ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/axpy.hpp b/sdk/boost/numeric/bindings/blas/level1/axpy.hpp new file mode 100644 index 0000000..f5c605c --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/axpy.hpp @@ -0,0 +1,249 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_AXPY_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_AXPY_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +inline void axpy( const int n, const float a, const float* x, const int incx, + float* y, const int incy ) { + cblas_saxpy( n, a, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +inline void axpy( const int n, const double a, const double* x, + const int incx, double* y, const int incy ) { + cblas_daxpy( n, a, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline void axpy( const int n, const std::complex a, + const std::complex* x, const int incx, std::complex* y, + const int incy ) { + cblas_caxpy( n, &a, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline void axpy( const int n, const std::complex a, + const std::complex* x, const int incx, + std::complex* y, const int incy ) { + cblas_zaxpy( n, &a, x, incx, y, incy ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +inline void axpy( const int n, const float a, const float* x, const int incx, + float* y, const int incy ) { + cublasSaxpy( n, a, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +inline void axpy( const int n, const double a, const double* x, + const int incx, double* y, const int incy ) { + cublasDaxpy( n, a, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline void axpy( const int n, const std::complex a, + const std::complex* x, const int incx, std::complex* y, + const int incy ) { + cublasCaxpy( n, a, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline void axpy( const int n, const std::complex a, + const std::complex* x, const int incx, + std::complex* y, const int incy ) { + cublasZaxpy( n, a, x, incx, y, incy ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +inline void axpy( const fortran_int_t n, const float a, const float* x, + const fortran_int_t incx, float* y, const fortran_int_t incy ) { + BLAS_SAXPY( &n, &a, x, &incx, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +inline void axpy( const fortran_int_t n, const double a, const double* x, + const fortran_int_t incx, double* y, const fortran_int_t incy ) { + BLAS_DAXPY( &n, &a, x, &incx, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline void axpy( const fortran_int_t n, const std::complex a, + const std::complex* x, const fortran_int_t incx, + std::complex* y, const fortran_int_t incy ) { + BLAS_CAXPY( &n, &a, x, &incx, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline void axpy( const fortran_int_t n, const std::complex a, + const std::complex* x, const fortran_int_t incx, + std::complex* y, const fortran_int_t incy ) { + BLAS_ZAXPY( &n, &a, x, &incx, y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to axpy. +// +template< typename Value > +struct axpy_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY > + static result_type invoke( const value_type a, const VectorX& x, + VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + detail::axpy( bindings::size(x), a, bindings::begin_value(x), + bindings::stride(x), bindings::begin_value(y), + bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the axpy_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for axpy. Its overload differs for +// +template< typename VectorX, typename VectorY > +inline typename axpy_impl< typename bindings::value_type< + VectorX >::type >::result_type +axpy( const typename bindings::value_type< VectorX >::type a, + const VectorX& x, VectorY& y ) { + axpy_impl< typename bindings::value_type< + VectorX >::type >::invoke( a, x, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/copy.hpp b/sdk/boost/numeric/bindings/blas/level1/copy.hpp new file mode 100644 index 0000000..4d9ae20 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/copy.hpp @@ -0,0 +1,243 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_COPY_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_COPY_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +inline void copy( const int n, const float* x, const int incx, float* y, + const int incy ) { + cblas_scopy( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +inline void copy( const int n, const double* x, const int incx, double* y, + const int incy ) { + cblas_dcopy( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline void copy( const int n, const std::complex* x, const int incx, + std::complex* y, const int incy ) { + cblas_ccopy( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline void copy( const int n, const std::complex* x, const int incx, + std::complex* y, const int incy ) { + cblas_zcopy( n, x, incx, y, incy ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +inline void copy( const int n, const float* x, const int incx, float* y, + const int incy ) { + cublasScopy( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +inline void copy( const int n, const double* x, const int incx, double* y, + const int incy ) { + cublasDcopy( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline void copy( const int n, const std::complex* x, const int incx, + std::complex* y, const int incy ) { + cublasCcopy( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline void copy( const int n, const std::complex* x, const int incx, + std::complex* y, const int incy ) { + cublasZcopy( n, x, incx, y, incy ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +inline void copy( const fortran_int_t n, const float* x, + const fortran_int_t incx, float* y, const fortran_int_t incy ) { + BLAS_SCOPY( &n, x, &incx, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +inline void copy( const fortran_int_t n, const double* x, + const fortran_int_t incx, double* y, const fortran_int_t incy ) { + BLAS_DCOPY( &n, x, &incx, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline void copy( const fortran_int_t n, const std::complex* x, + const fortran_int_t incx, std::complex* y, + const fortran_int_t incy ) { + BLAS_CCOPY( &n, x, &incx, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline void copy( const fortran_int_t n, const std::complex* x, + const fortran_int_t incx, std::complex* y, + const fortran_int_t incy ) { + BLAS_ZCOPY( &n, x, &incx, y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to copy. +// +template< typename Value > +struct copy_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY > + static result_type invoke( const VectorX& x, VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + detail::copy( bindings::size(x), bindings::begin_value(x), + bindings::stride(x), bindings::begin_value(y), + bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the copy_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for copy. Its overload differs for +// +template< typename VectorX, typename VectorY > +inline typename copy_impl< typename bindings::value_type< + VectorX >::type >::result_type +copy( const VectorX& x, VectorY& y ) { + copy_impl< typename bindings::value_type< + VectorX >::type >::invoke( x, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/dot.hpp b/sdk/boost/numeric/bindings/blas/level1/dot.hpp new file mode 100644 index 0000000..5d84f48 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/dot.hpp @@ -0,0 +1,246 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_DOT_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_DOT_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +inline float dot( const int n, const float* x, const int incx, const float* y, + const int incy ) { + return cblas_sdot( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +inline double dot( const int n, const double* x, const int incx, + const double* y, const int incy ) { + return cblas_ddot( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline std::complex dot( const int n, const std::complex* x, + const int incx, const std::complex* y, const int incy ) { + std::complex result; + cblas_cdotu_sub( n, x, incx, y, incy, &result ); + return result; +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline std::complex dot( const int n, const std::complex* x, + const int incx, const std::complex* y, const int incy ) { + std::complex result; + cblas_zdotu_sub( n, x, incx, y, incy, &result ); + return result; +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +inline float dot( const int n, const float* x, const int incx, const float* y, + const int incy ) { + return cublasSdot( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +inline double dot( const int n, const double* x, const int incx, + const double* y, const int incy ) { + return cublasDdot( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline std::complex dot( const int n, const std::complex* x, + const int incx, const std::complex* y, const int incy ) { + return cublasCdotu( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline std::complex dot( const int n, const std::complex* x, + const int incx, const std::complex* y, const int incy ) { + return cublasZdotu( n, x, incx, y, incy ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +inline float dot( const fortran_int_t n, const float* x, + const fortran_int_t incx, const float* y, const fortran_int_t incy ) { + return BLAS_SDOT( &n, x, &incx, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +inline double dot( const fortran_int_t n, const double* x, + const fortran_int_t incx, const double* y, const fortran_int_t incy ) { + return BLAS_DDOT( &n, x, &incx, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline std::complex dot( const fortran_int_t n, + const std::complex* x, const fortran_int_t incx, + const std::complex* y, const fortran_int_t incy ) { + return BLAS_CDOTU( &n, x, &incx, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline std::complex dot( const fortran_int_t n, + const std::complex* x, const fortran_int_t incx, + const std::complex* y, const fortran_int_t incy ) { + return BLAS_ZDOTU( &n, x, &incx, y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to dot. +// +template< typename Value > +struct dot_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef value_type result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY > + static result_type invoke( const VectorX& x, const VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + return detail::dot( bindings::size(x), + bindings::begin_value(x), bindings::stride(x), + bindings::begin_value(y), bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the dot_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for dot. Its overload differs for +// +template< typename VectorX, typename VectorY > +inline typename dot_impl< typename bindings::value_type< + VectorX >::type >::result_type +dot( const VectorX& x, const VectorY& y ) { + return dot_impl< typename bindings::value_type< + VectorX >::type >::invoke( x, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/dotc.hpp b/sdk/boost/numeric/bindings/blas/level1/dotc.hpp new file mode 100644 index 0000000..229045f --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/dotc.hpp @@ -0,0 +1,186 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_DOTC_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_DOTC_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline std::complex dotc( const int n, const std::complex* x, + const int incx, const std::complex* y, const int incy ) { + std::complex result; + cblas_cdotc_sub( n, x, incx, y, incy, &result ); + return result; +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline std::complex dotc( const int n, const std::complex* x, + const int incx, const std::complex* y, const int incy ) { + std::complex result; + cblas_zdotc_sub( n, x, incx, y, incy, &result ); + return result; +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline std::complex dotc( const int n, const std::complex* x, + const int incx, const std::complex* y, const int incy ) { + return cublasCdotc( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline std::complex dotc( const int n, const std::complex* x, + const int incx, const std::complex* y, const int incy ) { + return cublasZdotc( n, x, incx, y, incy ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline std::complex dotc( const fortran_int_t n, + const std::complex* x, const fortran_int_t incx, + const std::complex* y, const fortran_int_t incy ) { + return BLAS_CDOTC( &n, x, &incx, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline std::complex dotc( const fortran_int_t n, + const std::complex* x, const fortran_int_t incx, + const std::complex* y, const fortran_int_t incy ) { + return BLAS_ZDOTC( &n, x, &incx, y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to dotc. +// +template< typename Value > +struct dotc_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef value_type result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY > + static result_type invoke( const VectorX& x, const VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + return detail::dotc( bindings::size(x), + bindings::begin_value(x), bindings::stride(x), + bindings::begin_value(y), bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the dotc_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for dotc. Its overload differs for +// +template< typename VectorX, typename VectorY > +inline typename dotc_impl< typename bindings::value_type< + VectorX >::type >::result_type +dotc( const VectorX& x, const VectorY& y ) { + return dotc_impl< typename bindings::value_type< + VectorX >::type >::invoke( x, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/dotu.hpp b/sdk/boost/numeric/bindings/blas/level1/dotu.hpp new file mode 100644 index 0000000..5956860 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/dotu.hpp @@ -0,0 +1,42 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_DOTU_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_DOTU_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// dotu is a synonym for dot +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. +// + +// +// Overloaded function for dotu. +// +template< typename VectorX, typename VectorY > +inline typename dot_impl< typename bindings::value_type< VectorX >::type >::result_type +dotu( const VectorX& x, const VectorY& y ) { + return dot_impl< typename bindings::value_type< VectorX >::type >::invoke( x, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/iamax.hpp b/sdk/boost/numeric/bindings/blas/level1/iamax.hpp new file mode 100644 index 0000000..5eaec0c --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/iamax.hpp @@ -0,0 +1,232 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_IAMAX_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_IAMAX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +inline std::ptrdiff_t iamax( const int n, const float* x, const int incx ) { + return cblas_isamax( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +inline std::ptrdiff_t iamax( const int n, const double* x, + const int incx ) { + return cblas_idamax( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline std::ptrdiff_t iamax( const int n, const std::complex* x, + const int incx ) { + return cblas_icamax( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline std::ptrdiff_t iamax( const int n, const std::complex* x, + const int incx ) { + return cblas_izamax( n, x, incx ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +inline std::ptrdiff_t iamax( const int n, const float* x, const int incx ) { + return cublasIsamax( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +inline std::ptrdiff_t iamax( const int n, const double* x, + const int incx ) { + return cublasIdamax( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline std::ptrdiff_t iamax( const int n, const std::complex* x, + const int incx ) { + return cublasIcamax( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline std::ptrdiff_t iamax( const int n, const std::complex* x, + const int incx ) { + return cublasIzamax( n, x, incx ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t iamax( const fortran_int_t n, const float* x, + const fortran_int_t incx ) { + return BLAS_ISAMAX( &n, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t iamax( const fortran_int_t n, const double* x, + const fortran_int_t incx ) { + return BLAS_IDAMAX( &n, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t iamax( const fortran_int_t n, + const std::complex* x, const fortran_int_t incx ) { + return BLAS_ICAMAX( &n, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t iamax( const fortran_int_t n, + const std::complex* x, const fortran_int_t incx ) { + return BLAS_IZAMAX( &n, x, &incx ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to iamax. +// +template< typename Value > +struct iamax_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef std::ptrdiff_t result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX > + static result_type invoke( const VectorX& x ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + return detail::iamax( bindings::size(x), + bindings::begin_value(x), bindings::stride(x) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the iamax_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for iamax. Its overload differs for +// +template< typename VectorX > +inline typename iamax_impl< typename bindings::value_type< + VectorX >::type >::result_type +iamax( const VectorX& x ) { + return iamax_impl< typename bindings::value_type< + VectorX >::type >::invoke( x ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/nrm2.hpp b/sdk/boost/numeric/bindings/blas/level1/nrm2.hpp new file mode 100644 index 0000000..fb02dd3 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/nrm2.hpp @@ -0,0 +1,230 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_NRM2_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_NRM2_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +inline float nrm2( const int n, const float* x, const int incx ) { + return cblas_snrm2( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +inline double nrm2( const int n, const double* x, const int incx ) { + return cblas_dnrm2( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline float nrm2( const int n, const std::complex* x, + const int incx ) { + return cblas_scnrm2( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline double nrm2( const int n, const std::complex* x, + const int incx ) { + return cblas_dznrm2( n, x, incx ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +inline float nrm2( const int n, const float* x, const int incx ) { + return cublasSnrm2( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +inline double nrm2( const int n, const double* x, const int incx ) { + return cublasDnrm2( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline float nrm2( const int n, const std::complex* x, + const int incx ) { + return cublasScnrm2( n, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline double nrm2( const int n, const std::complex* x, + const int incx ) { + return cublasDznrm2( n, x, incx ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +inline float nrm2( const fortran_int_t n, const float* x, + const fortran_int_t incx ) { + return BLAS_SNRM2( &n, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +inline double nrm2( const fortran_int_t n, const double* x, + const fortran_int_t incx ) { + return BLAS_DNRM2( &n, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline float nrm2( const fortran_int_t n, const std::complex* x, + const fortran_int_t incx ) { + return BLAS_SCNRM2( &n, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline double nrm2( const fortran_int_t n, const std::complex* x, + const fortran_int_t incx ) { + return BLAS_DZNRM2( &n, x, &incx ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to nrm2. +// +template< typename Value > +struct nrm2_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef real_type result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX > + static result_type invoke( const VectorX& x ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + return detail::nrm2( bindings::size(x), + bindings::begin_value(x), bindings::stride(x) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the nrm2_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for nrm2. Its overload differs for +// +template< typename VectorX > +inline typename nrm2_impl< typename bindings::value_type< + VectorX >::type >::result_type +nrm2( const VectorX& x ) { + return nrm2_impl< typename bindings::value_type< + VectorX >::type >::invoke( x ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/prec_dot.hpp b/sdk/boost/numeric/bindings/blas/level1/prec_dot.hpp new file mode 100644 index 0000000..d57eb58 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/prec_dot.hpp @@ -0,0 +1,150 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_PREC_DOT_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_PREC_DOT_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +inline double prec_dot( const int n, const float* x, const int incx, + const float* y, const int incy ) { + return cblas_dsdot( n, x, incx, y, incy ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +inline double prec_dot( const int n, const float* x, const int incx, + const float* y, const int incy ) { + return // NOT FOUND(); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +inline double prec_dot( const fortran_int_t n, const float* x, + const fortran_int_t incx, const float* y, const fortran_int_t incy ) { + return BLAS_DSDOT( &n, x, &incx, y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to prec_dot. +// +template< typename Value > +struct prec_dot_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef double result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY > + static result_type invoke( const VectorX& x, const VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + return detail::prec_dot( bindings::size(x), + bindings::begin_value(x), bindings::stride(x), + bindings::begin_value(y), bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the prec_dot_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for prec_dot. Its overload differs for +// +template< typename VectorX, typename VectorY > +inline typename prec_dot_impl< typename bindings::value_type< + VectorX >::type >::result_type +prec_dot( const VectorX& x, const VectorY& y ) { + return prec_dot_impl< typename bindings::value_type< + VectorX >::type >::invoke( x, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/rot.hpp b/sdk/boost/numeric/bindings/blas/level1/rot.hpp new file mode 100644 index 0000000..db0349a --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/rot.hpp @@ -0,0 +1,250 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_ROT_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_ROT_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +inline void rot( const int n, float* x, const int incx, float* y, + const int incy, const float c, const float s ) { + cblas_srot( n, x, incx, y, incy, c, s ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +inline void rot( const int n, double* x, const int incx, double* y, + const int incy, const double c, const double s ) { + cblas_drot( n, x, incx, y, incy, c, s ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline void rot( const int n, std::complex* x, const int incx, + std::complex* y, const int incy, const float c, + const float s ) { + // NOT FOUND(); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline void rot( const int n, std::complex* x, const int incx, + std::complex* y, const int incy, const double c, + const double s ) { + // NOT FOUND(); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +inline void rot( const int n, float* x, const int incx, float* y, + const int incy, const float c, const float s ) { + cublasSrot( n, x, incx, y, incy, c, s ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +inline void rot( const int n, double* x, const int incx, double* y, + const int incy, const double c, const double s ) { + cublasDrot( n, x, incx, y, incy, c, s ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline void rot( const int n, std::complex* x, const int incx, + std::complex* y, const int incy, const float c, + const float s ) { + cublasCsrot( n, x, incx, y, incy, c, s ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline void rot( const int n, std::complex* x, const int incx, + std::complex* y, const int incy, const double c, + const double s ) { + cublasZdrot( n, x, incx, y, incy, c, s ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +inline void rot( const fortran_int_t n, float* x, const fortran_int_t incx, + float* y, const fortran_int_t incy, const float c, const float s ) { + BLAS_SROT( &n, x, &incx, y, &incy, &c, &s ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +inline void rot( const fortran_int_t n, double* x, const fortran_int_t incx, + double* y, const fortran_int_t incy, const double c, const double s ) { + BLAS_DROT( &n, x, &incx, y, &incy, &c, &s ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline void rot( const fortran_int_t n, std::complex* x, + const fortran_int_t incx, std::complex* y, + const fortran_int_t incy, const float c, const float s ) { + BLAS_CSROT( &n, x, &incx, y, &incy, &c, &s ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline void rot( const fortran_int_t n, std::complex* x, + const fortran_int_t incx, std::complex* y, + const fortran_int_t incy, const double c, const double s ) { + BLAS_ZDROT( &n, x, &incx, y, &incy, &c, &s ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to rot. +// +template< typename Value > +struct rot_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY > + static result_type invoke( VectorX& x, VectorY& y, const real_type c, + const real_type s ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + detail::rot( bindings::size(x), bindings::begin_value(x), + bindings::stride(x), bindings::begin_value(y), + bindings::stride(y), c, s ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the rot_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for rot. Its overload differs for +// +template< typename VectorX, typename VectorY > +inline typename rot_impl< typename bindings::value_type< + VectorX >::type >::result_type +rot( VectorX& x, VectorY& y, const typename remove_imaginary< + typename bindings::value_type< VectorX >::type >::type c, + const typename remove_imaginary< typename bindings::value_type< + VectorX >::type >::type s ) { + rot_impl< typename bindings::value_type< + VectorX >::type >::invoke( x, y, c, s ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/rotg.hpp b/sdk/boost/numeric/bindings/blas/level1/rotg.hpp new file mode 100644 index 0000000..229d78c --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/rotg.hpp @@ -0,0 +1,223 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_ROTG_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_ROTG_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +inline void rotg( float& a, float& b, float& c, float& s ) { + cblas_srotg( &a, &b, &c, &s ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +inline void rotg( double& a, double& b, double& c, double& s ) { + cblas_drotg( &a, &b, &c, &s ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline void rotg( std::complex& a, std::complex& b, float& c, + std::complex& s ) { + // NOT FOUND(); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline void rotg( std::complex& a, std::complex& b, double& c, + std::complex& s ) { + // NOT FOUND(); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +inline void rotg( float& a, float& b, float& c, float& s ) { + cublasSrotg( &a, &b, &c, &s ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +inline void rotg( double& a, double& b, double& c, double& s ) { + cublasDrotg( &a, &b, &c, &s ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline void rotg( std::complex& a, std::complex& b, float& c, + std::complex& s ) { + cublasCrotg( &a, b, &c, &s ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline void rotg( std::complex& a, std::complex& b, double& c, + std::complex& s ) { + cublasZrotg( &a, b, &c, &s ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +inline void rotg( float& a, float& b, float& c, float& s ) { + BLAS_SROTG( &a, &b, &c, &s ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +inline void rotg( double& a, double& b, double& c, double& s ) { + BLAS_DROTG( &a, &b, &c, &s ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline void rotg( std::complex& a, std::complex& b, float& c, + std::complex& s ) { + BLAS_CROTG( &a, &b, &c, &s ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline void rotg( std::complex& a, std::complex& b, double& c, + std::complex& s ) { + BLAS_ZROTG( &a, &b, &c, &s ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to rotg. +// +template< typename Value > +struct rotg_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + static result_type invoke( value_type& a, value_type& b, real_type& c, + value_type& s ) { + namespace bindings = ::boost::numeric::bindings; + detail::rotg( a, b, c, s ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the rotg_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for rotg. Its overload differs for +// +template< typename Value > +inline typename rotg_impl< Value >::result_type +rotg( Value& a, Value& b, Value& c, Value& s ) { + rotg_impl< Value >::invoke( a, b, c, s ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/rotm.hpp b/sdk/boost/numeric/bindings/blas/level1/rotm.hpp new file mode 100644 index 0000000..05fc3be --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/rotm.hpp @@ -0,0 +1,187 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_ROTM_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_ROTM_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +inline void rotm( const int n, float* x, const int incx, float* y, + const int incy, float* param ) { + cblas_srotm( n, x, incx, y, incy, param ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +inline void rotm( const int n, double* x, const int incx, double* y, + const int incy, double* param ) { + cblas_drotm( n, x, incx, y, incy, param ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +inline void rotm( const int n, float* x, const int incx, float* y, + const int incy, float* param ) { + cublasSrotm( n, x, incx, y, incy, param ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +inline void rotm( const int n, double* x, const int incx, double* y, + const int incy, double* param ) { + cublasDrotm( n, x, incx, y, incy, param ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +inline void rotm( const fortran_int_t n, float* x, const fortran_int_t incx, + float* y, const fortran_int_t incy, float* param ) { + BLAS_SROTM( &n, x, &incx, y, &incy, param ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +inline void rotm( const fortran_int_t n, double* x, const fortran_int_t incx, + double* y, const fortran_int_t incy, double* param ) { + BLAS_DROTM( &n, x, &incx, y, &incy, param ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to rotm. +// +template< typename Value > +struct rotm_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY, typename VectorPARAM > + static result_type invoke( VectorX& x, VectorY& y, VectorPARAM& param ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorPARAM >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorPARAM >::value) ); + detail::rotm( bindings::size(x), bindings::begin_value(x), + bindings::stride(x), bindings::begin_value(y), + bindings::stride(y), bindings::begin_value(param) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the rotm_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for rotm. Its overload differs for +// +template< typename VectorX, typename VectorY, typename VectorPARAM > +inline typename rotm_impl< typename bindings::value_type< + VectorX >::type >::result_type +rotm( VectorX& x, VectorY& y, VectorPARAM& param ) { + rotm_impl< typename bindings::value_type< + VectorX >::type >::invoke( x, y, param ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/rotmg.hpp b/sdk/boost/numeric/bindings/blas/level1/rotmg.hpp new file mode 100644 index 0000000..0fdecc5 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/rotmg.hpp @@ -0,0 +1,179 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_ROTMG_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_ROTMG_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +inline void rotmg( float& d1, float& d2, float& x1, const float y1, + float* sparam ) { + cblas_srotmg( &d1, &d2, &x1, y1, sparam ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +inline void rotmg( double& d1, double& d2, double& x1, const double y1, + double* dparam ) { + cblas_drotmg( &d1, &d2, &x1, y1, dparam ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +inline void rotmg( float& d1, float& d2, float& x1, const float y1, + float* sparam ) { + cublasSrotmg( &d1, &d2, &x1, &y1, sparam ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +inline void rotmg( double& d1, double& d2, double& x1, const double y1, + double* dparam ) { + cublasDrotmg( &d1, &d2, &x1, &y1, dparam ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +inline void rotmg( float& d1, float& d2, float& x1, const float y1, + float* sparam ) { + BLAS_SROTMG( &d1, &d2, &x1, &y1, sparam ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +inline void rotmg( double& d1, double& d2, double& x1, const double y1, + double* dparam ) { + BLAS_DROTMG( &d1, &d2, &x1, &y1, dparam ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to rotmg. +// +template< typename Value > +struct rotmg_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorDPARAM > + static result_type invoke( real_type& d1, real_type& d2, real_type& x1, + const real_type y1, VectorDPARAM& dparam ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDPARAM >::value) ); + detail::rotmg( d1, d2, x1, y1, bindings::begin_value(dparam) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the rotmg_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for rotmg. Its overload differs for +// +template< typename VectorDPARAM > +inline typename rotmg_impl< typename bindings::value_type< + VectorDPARAM >::type >::result_type +rotmg( typename remove_imaginary< typename bindings::value_type< + VectorDPARAM >::type >::type& d1, typename remove_imaginary< + typename bindings::value_type< VectorDPARAM >::type >::type& d2, + typename remove_imaginary< typename bindings::value_type< + VectorDPARAM >::type >::type& x1, const typename remove_imaginary< + typename bindings::value_type< VectorDPARAM >::type >::type y1, + VectorDPARAM& dparam ) { + rotmg_impl< typename bindings::value_type< + VectorDPARAM >::type >::invoke( d1, d2, x1, y1, dparam ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/scal.hpp b/sdk/boost/numeric/bindings/blas/level1/scal.hpp new file mode 100644 index 0000000..5684836 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/scal.hpp @@ -0,0 +1,291 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_SCAL_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_SCAL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +inline void scal( const int n, const float a, float* x, const int incx ) { + cblas_sscal( n, a, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +inline void scal( const int n, const double a, double* x, const int incx ) { + cblas_dscal( n, a, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * combined float and complex value-type. +// +inline void scal( const int n, const float a, std::complex* x, + const int incx ) { + cblas_csscal( n, a, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * combined double and complex value-type. +// +inline void scal( const int n, const double a, std::complex* x, + const int incx ) { + cblas_zdscal( n, a, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline void scal( const int n, const std::complex a, + std::complex* x, const int incx ) { + cblas_cscal( n, &a, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline void scal( const int n, const std::complex a, + std::complex* x, const int incx ) { + cblas_zscal( n, &a, x, incx ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +inline void scal( const int n, const float a, float* x, const int incx ) { + cublasSscal( n, a, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +inline void scal( const int n, const double a, double* x, const int incx ) { + cublasDscal( n, a, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * combined float and complex value-type. +// +inline void scal( const int n, const float a, std::complex* x, + const int incx ) { + cublasCsscal( n, a, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * combined double and complex value-type. +// +inline void scal( const int n, const double a, std::complex* x, + const int incx ) { + cublasZdscal( n, a, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline void scal( const int n, const std::complex a, + std::complex* x, const int incx ) { + cublasCscal( n, a, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline void scal( const int n, const std::complex a, + std::complex* x, const int incx ) { + cublasZscal( n, a, x, incx ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +inline void scal( const fortran_int_t n, const float a, float* x, + const fortran_int_t incx ) { + BLAS_SSCAL( &n, &a, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +inline void scal( const fortran_int_t n, const double a, double* x, + const fortran_int_t incx ) { + BLAS_DSCAL( &n, &a, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * combined float and complex value-type. +// +inline void scal( const fortran_int_t n, const float a, + std::complex* x, const fortran_int_t incx ) { + BLAS_CSSCAL( &n, &a, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * combined double and complex value-type. +// +inline void scal( const fortran_int_t n, const double a, + std::complex* x, const fortran_int_t incx ) { + BLAS_ZDSCAL( &n, &a, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline void scal( const fortran_int_t n, const std::complex a, + std::complex* x, const fortran_int_t incx ) { + BLAS_CSCAL( &n, &a, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline void scal( const fortran_int_t n, const std::complex a, + std::complex* x, const fortran_int_t incx ) { + BLAS_ZSCAL( &n, &a, x, &incx ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to scal. +// +template< typename Value > +struct scal_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename ScalarA, typename VectorX > + static result_type invoke( const ScalarA a, VectorX& x ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + detail::scal( bindings::size(x), a, bindings::begin_value(x), + bindings::stride(x) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the scal_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for scal. Its overload differs for +// +template< typename ScalarA, typename VectorX > +inline typename scal_impl< typename bindings::value_type< + VectorX >::type >::result_type +scal( const ScalarA a, VectorX& x ) { + scal_impl< typename bindings::value_type< + VectorX >::type >::invoke( a, x ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/set.hpp b/sdk/boost/numeric/bindings/blas/level1/set.hpp new file mode 100644 index 0000000..05fccb8 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/set.hpp @@ -0,0 +1,62 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_SET_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_SET_HPP + +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// set is an extension, not part of the BLAS API. +// +// TODO implement ATLAS backend call(s) +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. +// + +// +// Overloaded function for set. Its overload differs for +// * VectorX& +// +template< typename VectorX > +inline void +set( const typename bindings::value_type< VectorX >::type a, VectorX& x ) { + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + std::fill( bindings::begin(x), bindings::end(x), a ); +} + +// +// Overloaded function for set. Its overload differs for +// * const VectorX& +// +template< typename VectorX > +inline void +set( const typename bindings::value_type< const VectorX >::type a, const VectorX& x ) { + BOOST_STATIC_ASSERT( (bindings::is_mutable< const VectorX >::value) ); + std::fill( bindings::begin(x), bindings::end(x), a ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level1/swap.hpp b/sdk/boost/numeric/bindings/blas/level1/swap.hpp new file mode 100644 index 0000000..ba5f8d3 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level1/swap.hpp @@ -0,0 +1,244 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_SWAP_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL1_SWAP_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +inline void swap( const int n, float* x, const int incx, float* y, + const int incy ) { + cblas_sswap( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +inline void swap( const int n, double* x, const int incx, double* y, + const int incy ) { + cblas_dswap( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline void swap( const int n, std::complex* x, const int incx, + std::complex* y, const int incy ) { + cblas_cswap( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +inline void swap( const int n, std::complex* x, const int incx, + std::complex* y, const int incy ) { + cblas_zswap( n, x, incx, y, incy ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +inline void swap( const int n, float* x, const int incx, float* y, + const int incy ) { + cublasSswap( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +inline void swap( const int n, double* x, const int incx, double* y, + const int incy ) { + cublasDswap( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline void swap( const int n, std::complex* x, const int incx, + std::complex* y, const int incy ) { + cublasCswap( n, x, incx, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +inline void swap( const int n, std::complex* x, const int incx, + std::complex* y, const int incy ) { + cublasZswap( n, x, incx, y, incy ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +inline void swap( const fortran_int_t n, float* x, const fortran_int_t incx, + float* y, const fortran_int_t incy ) { + BLAS_SSWAP( &n, x, &incx, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +inline void swap( const fortran_int_t n, double* x, const fortran_int_t incx, + double* y, const fortran_int_t incy ) { + BLAS_DSWAP( &n, x, &incx, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline void swap( const fortran_int_t n, std::complex* x, + const fortran_int_t incx, std::complex* y, + const fortran_int_t incy ) { + BLAS_CSWAP( &n, x, &incx, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +inline void swap( const fortran_int_t n, std::complex* x, + const fortran_int_t incx, std::complex* y, + const fortran_int_t incy ) { + BLAS_ZSWAP( &n, x, &incx, y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to swap. +// +template< typename Value > +struct swap_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY > + static result_type invoke( VectorX& x, VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + detail::swap( bindings::size(x), bindings::begin_value(x), + bindings::stride(x), bindings::begin_value(y), + bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the swap_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for swap. Its overload differs for +// +template< typename VectorX, typename VectorY > +inline typename swap_impl< typename bindings::value_type< + VectorX >::type >::result_type +swap( VectorX& x, VectorY& y ) { + swap_impl< typename bindings::value_type< + VectorX >::type >::invoke( x, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2.hpp b/sdk/boost/numeric/bindings/blas/level2.hpp new file mode 100644 index 0000000..e734e08 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2.hpp @@ -0,0 +1,38 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/gbmv.hpp b/sdk/boost/numeric/bindings/blas/level2/gbmv.hpp new file mode 100644 index 0000000..a7a951c --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/gbmv.hpp @@ -0,0 +1,332 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_GBMV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_GBMV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename Trans > +inline void gbmv( const Order, const Trans, const int m, const int n, + const int kl, const int ku, const float alpha, const float* a, + const int lda, const float* x, const int incx, const float beta, + float* y, const int incy ) { + cblas_sgbmv( cblas_option< Order >::value, cblas_option< Trans >::value, + m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename Trans > +inline void gbmv( const Order, const Trans, const int m, const int n, + const int kl, const int ku, const double alpha, const double* a, + const int lda, const double* x, const int incx, const double beta, + double* y, const int incy ) { + cblas_dgbmv( cblas_option< Order >::value, cblas_option< Trans >::value, + m, n, kl, ku, alpha, a, lda, x, incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Trans > +inline void gbmv( const Order, const Trans, const int m, const int n, + const int kl, const int ku, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + cblas_cgbmv( cblas_option< Order >::value, cblas_option< Trans >::value, + m, n, kl, ku, &alpha, a, lda, x, incx, &beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Trans > +inline void gbmv( const Order, const Trans, const int m, const int n, + const int kl, const int ku, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + cblas_zgbmv( cblas_option< Order >::value, cblas_option< Trans >::value, + m, n, kl, ku, &alpha, a, lda, x, incx, &beta, y, incy ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename Trans > +inline void gbmv( const Order, const Trans, const int m, const int n, + const int kl, const int ku, const float alpha, const float* a, + const int lda, const float* x, const int incx, const float beta, + float* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSgbmv( blas_option< Trans >::value, m, n, kl, ku, alpha, a, lda, x, + incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename Trans > +inline void gbmv( const Order, const Trans, const int m, const int n, + const int kl, const int ku, const double alpha, const double* a, + const int lda, const double* x, const int incx, const double beta, + double* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDgbmv( blas_option< Trans >::value, m, n, kl, ku, alpha, a, lda, x, + incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Trans > +inline void gbmv( const Order, const Trans, const int m, const int n, + const int kl, const int ku, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCgbmv( blas_option< Trans >::value, m, n, kl, ku, alpha, a, lda, x, + incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Trans > +inline void gbmv( const Order, const Trans, const int m, const int n, + const int kl, const int ku, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZgbmv( blas_option< Trans >::value, m, n, kl, ku, alpha, a, lda, x, + incx, beta, y, incy ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename Trans > +inline void gbmv( const Order, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t kl, const fortran_int_t ku, + const float alpha, const float* a, const fortran_int_t lda, + const float* x, const fortran_int_t incx, const float beta, float* y, + const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SGBMV( &blas_option< Trans >::value, &m, &n, &kl, &ku, &alpha, a, + &lda, x, &incx, &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename Trans > +inline void gbmv( const Order, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t kl, const fortran_int_t ku, + const double alpha, const double* a, const fortran_int_t lda, + const double* x, const fortran_int_t incx, const double beta, + double* y, const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DGBMV( &blas_option< Trans >::value, &m, &n, &kl, &ku, &alpha, a, + &lda, x, &incx, &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename Trans > +inline void gbmv( const Order, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t kl, const fortran_int_t ku, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, const std::complex* x, + const fortran_int_t incx, const std::complex beta, + std::complex* y, const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CGBMV( &blas_option< Trans >::value, &m, &n, &kl, &ku, &alpha, a, + &lda, x, &incx, &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename Trans > +inline void gbmv( const Order, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t kl, const fortran_int_t ku, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, const std::complex* x, + const fortran_int_t incx, const std::complex beta, + std::complex* y, const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZGBMV( &blas_option< Trans >::value, &m, &n, &kl, &ku, &alpha, a, + &lda, x, &incx, &beta, y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gbmv. +// +template< typename Value > +struct gbmv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorX, typename VectorY > + static result_type invoke( const value_type alpha, const MatrixA& a, + const VectorX& x, const value_type beta, VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename detail::default_order< MatrixA >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_band_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::gbmv( order(), trans(), bindings::size_row_op(a, + trans()), bindings::size_column_op(a, trans()), + bindings::bandwidth_lower_op(a, trans()), + bindings::bandwidth_upper_op(a, trans()), alpha, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(x), bindings::stride(x), beta, + bindings::begin_value(y), bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the gbmv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gbmv. Its overload differs for +// +template< typename MatrixA, typename VectorX, typename VectorY > +inline typename gbmv_impl< typename bindings::value_type< + MatrixA >::type >::result_type +gbmv( const typename bindings::value_type< MatrixA >::type alpha, + const MatrixA& a, const VectorX& x, + const typename bindings::value_type< MatrixA >::type beta, + VectorY& y ) { + gbmv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( alpha, a, x, beta, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/gemv.hpp b/sdk/boost/numeric/bindings/blas/level2/gemv.hpp new file mode 100644 index 0000000..c36dff0 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/gemv.hpp @@ -0,0 +1,325 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_GEMV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_GEMV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename Trans > +inline void gemv( const Order, const Trans, const int m, const int n, + const float alpha, const float* a, const int lda, const float* x, + const int incx, const float beta, float* y, const int incy ) { + cblas_sgemv( cblas_option< Order >::value, cblas_option< Trans >::value, + m, n, alpha, a, lda, x, incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename Trans > +inline void gemv( const Order, const Trans, const int m, const int n, + const double alpha, const double* a, const int lda, const double* x, + const int incx, const double beta, double* y, const int incy ) { + cblas_dgemv( cblas_option< Order >::value, cblas_option< Trans >::value, + m, n, alpha, a, lda, x, incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Trans > +inline void gemv( const Order, const Trans, const int m, const int n, + const std::complex alpha, const std::complex* a, + const int lda, const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + cblas_cgemv( cblas_option< Order >::value, cblas_option< Trans >::value, + m, n, &alpha, a, lda, x, incx, &beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Trans > +inline void gemv( const Order, const Trans, const int m, const int n, + const std::complex alpha, const std::complex* a, + const int lda, const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + cblas_zgemv( cblas_option< Order >::value, cblas_option< Trans >::value, + m, n, &alpha, a, lda, x, incx, &beta, y, incy ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename Trans > +inline void gemv( const Order, const Trans, const int m, const int n, + const float alpha, const float* a, const int lda, const float* x, + const int incx, const float beta, float* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSgemv( blas_option< Trans >::value, m, n, alpha, a, lda, x, incx, + beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename Trans > +inline void gemv( const Order, const Trans, const int m, const int n, + const double alpha, const double* a, const int lda, const double* x, + const int incx, const double beta, double* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDgemv( blas_option< Trans >::value, m, n, alpha, a, lda, x, incx, + beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Trans > +inline void gemv( const Order, const Trans, const int m, const int n, + const std::complex alpha, const std::complex* a, + const int lda, const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCgemv( blas_option< Trans >::value, m, n, alpha, a, lda, x, incx, + beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Trans > +inline void gemv( const Order, const Trans, const int m, const int n, + const std::complex alpha, const std::complex* a, + const int lda, const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZgemv( blas_option< Trans >::value, m, n, alpha, a, lda, x, incx, + beta, y, incy ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename Trans > +inline void gemv( const Order, const Trans, const fortran_int_t m, + const fortran_int_t n, const float alpha, const float* a, + const fortran_int_t lda, const float* x, const fortran_int_t incx, + const float beta, float* y, const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SGEMV( &blas_option< Trans >::value, &m, &n, &alpha, a, &lda, x, + &incx, &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename Trans > +inline void gemv( const Order, const Trans, const fortran_int_t m, + const fortran_int_t n, const double alpha, const double* a, + const fortran_int_t lda, const double* x, const fortran_int_t incx, + const double beta, double* y, const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DGEMV( &blas_option< Trans >::value, &m, &n, &alpha, a, &lda, x, + &incx, &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename Trans > +inline void gemv( const Order, const Trans, const fortran_int_t m, + const fortran_int_t n, const std::complex alpha, + const std::complex* a, const fortran_int_t lda, + const std::complex* x, const fortran_int_t incx, + const std::complex beta, std::complex* y, + const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CGEMV( &blas_option< Trans >::value, &m, &n, &alpha, a, &lda, x, + &incx, &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename Trans > +inline void gemv( const Order, const Trans, const fortran_int_t m, + const fortran_int_t n, const std::complex alpha, + const std::complex* a, const fortran_int_t lda, + const std::complex* x, const fortran_int_t incx, + const std::complex beta, std::complex* y, + const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZGEMV( &blas_option< Trans >::value, &m, &n, &alpha, a, &lda, x, + &incx, &beta, y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gemv. +// +template< typename Value > +struct gemv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // high-level transform typedefs and functions + template< typename MatrixA, typename VectorX, typename VectorY > + static result_type transform( MatrixA& A, VectorX& x, VectorY& y, + const value_type alpha, const value_type beta ) { + invoke(); + } + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorX, typename VectorY > + static result_type invoke( const value_type alpha, const MatrixA& a, + const VectorX& x, const value_type beta, VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename detail::default_order< MatrixA >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::gemv( order(), trans(), bindings::size_row_op(a, + trans()), bindings::size_column_op(a, trans()), alpha, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(x), bindings::stride(x), beta, + bindings::begin_value(y), bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the gemv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gemv. Its overload differs for +// +template< typename MatrixA, typename VectorX, typename VectorY > +inline typename gemv_impl< typename bindings::value_type< + MatrixA >::type >::result_type +gemv( const typename bindings::value_type< MatrixA >::type alpha, + const MatrixA& a, const VectorX& x, + const typename bindings::value_type< MatrixA >::type beta, + VectorY& y ) { + gemv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( alpha, a, x, beta, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/ger.hpp b/sdk/boost/numeric/bindings/blas/level2/ger.hpp new file mode 100644 index 0000000..04b52e0 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/ger.hpp @@ -0,0 +1,215 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_GER_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_GER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order > +inline void ger( const Order, const int m, const int n, const float alpha, + const float* x, const int incx, const float* y, const int incy, + float* a, const int lda ) { + cblas_sger( cblas_option< Order >::value, m, n, alpha, x, incx, y, incy, + a, lda ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order > +inline void ger( const Order, const int m, const int n, const double alpha, + const double* x, const int incx, const double* y, const int incy, + double* a, const int lda ) { + cblas_dger( cblas_option< Order >::value, m, n, alpha, x, incx, y, incy, + a, lda ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order > +inline void ger( const Order, const int m, const int n, const float alpha, + const float* x, const int incx, const float* y, const int incy, + float* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSger( m, n, alpha, x, incx, y, incy, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order > +inline void ger( const Order, const int m, const int n, const double alpha, + const double* x, const int incx, const double* y, const int incy, + double* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDger( m, n, alpha, x, incx, y, incy, a, lda ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order > +inline void ger( const Order, const fortran_int_t m, const fortran_int_t n, + const float alpha, const float* x, const fortran_int_t incx, + const float* y, const fortran_int_t incy, float* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SGER( &m, &n, &alpha, x, &incx, y, &incy, a, &lda ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order > +inline void ger( const Order, const fortran_int_t m, const fortran_int_t n, + const double alpha, const double* x, const fortran_int_t incx, + const double* y, const fortran_int_t incy, double* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DGER( &m, &n, &alpha, x, &incx, y, &incy, a, &lda ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ger. +// +template< typename Value > +struct ger_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY, typename MatrixA > + static result_type invoke( const real_type alpha, const VectorX& x, + const VectorY& y, MatrixA& a ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::ger( order(), bindings::size_row(a), + bindings::size_column(a), alpha, bindings::begin_value(x), + bindings::stride(x), bindings::begin_value(y), + bindings::stride(y), bindings::begin_value(a), + bindings::stride_major(a) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the ger_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ger. Its overload differs for +// +template< typename VectorX, typename VectorY, typename MatrixA > +inline typename ger_impl< typename bindings::value_type< + VectorX >::type >::result_type +ger( const typename remove_imaginary< typename bindings::value_type< + VectorX >::type >::type alpha, const VectorX& x, const VectorY& y, + MatrixA& a ) { + ger_impl< typename bindings::value_type< + VectorX >::type >::invoke( alpha, x, y, a ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/gerc.hpp b/sdk/boost/numeric/bindings/blas/level2/gerc.hpp new file mode 100644 index 0000000..c32f1cd --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/gerc.hpp @@ -0,0 +1,220 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_GERC_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_GERC_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order > +inline void gerc( const Order, const int m, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* a, const int lda ) { + cblas_cgerc( cblas_option< Order >::value, m, n, &alpha, x, incx, y, incy, + a, lda ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order > +inline void gerc( const Order, const int m, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* a, const int lda ) { + cblas_zgerc( cblas_option< Order >::value, m, n, &alpha, x, incx, y, incy, + a, lda ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order > +inline void gerc( const Order, const int m, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCgerc( m, n, alpha, x, incx, y, incy, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order > +inline void gerc( const Order, const int m, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZgerc( m, n, alpha, x, incx, y, incy, a, lda ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order > +inline void gerc( const Order, const fortran_int_t m, const fortran_int_t n, + const std::complex alpha, const std::complex* x, + const fortran_int_t incx, const std::complex* y, + const fortran_int_t incy, std::complex* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CGERC( &m, &n, &alpha, x, &incx, y, &incy, a, &lda ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order > +inline void gerc( const Order, const fortran_int_t m, const fortran_int_t n, + const std::complex alpha, const std::complex* x, + const fortran_int_t incx, const std::complex* y, + const fortran_int_t incy, std::complex* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZGERC( &m, &n, &alpha, x, &incx, y, &incy, a, &lda ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gerc. +// +template< typename Value > +struct gerc_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY, typename MatrixA > + static result_type invoke( const value_type alpha, const VectorX& x, + const VectorY& y, MatrixA& a ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::gerc( order(), bindings::size_row(a), + bindings::size_column(a), alpha, bindings::begin_value(x), + bindings::stride(x), bindings::begin_value(y), + bindings::stride(y), bindings::begin_value(a), + bindings::stride_major(a) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the gerc_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gerc. Its overload differs for +// +template< typename VectorX, typename VectorY, typename MatrixA > +inline typename gerc_impl< typename bindings::value_type< + VectorX >::type >::result_type +gerc( const typename bindings::value_type< VectorX >::type alpha, + const VectorX& x, const VectorY& y, MatrixA& a ) { + gerc_impl< typename bindings::value_type< + VectorX >::type >::invoke( alpha, x, y, a ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/geru.hpp b/sdk/boost/numeric/bindings/blas/level2/geru.hpp new file mode 100644 index 0000000..1880744 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/geru.hpp @@ -0,0 +1,220 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_GERU_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_GERU_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order > +inline void geru( const Order, const int m, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* a, const int lda ) { + cblas_cgeru( cblas_option< Order >::value, m, n, &alpha, x, incx, y, incy, + a, lda ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order > +inline void geru( const Order, const int m, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* a, const int lda ) { + cblas_zgeru( cblas_option< Order >::value, m, n, &alpha, x, incx, y, incy, + a, lda ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order > +inline void geru( const Order, const int m, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCgeru( m, n, alpha, x, incx, y, incy, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order > +inline void geru( const Order, const int m, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZgeru( m, n, alpha, x, incx, y, incy, a, lda ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order > +inline void geru( const Order, const fortran_int_t m, const fortran_int_t n, + const std::complex alpha, const std::complex* x, + const fortran_int_t incx, const std::complex* y, + const fortran_int_t incy, std::complex* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CGERU( &m, &n, &alpha, x, &incx, y, &incy, a, &lda ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order > +inline void geru( const Order, const fortran_int_t m, const fortran_int_t n, + const std::complex alpha, const std::complex* x, + const fortran_int_t incx, const std::complex* y, + const fortran_int_t incy, std::complex* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZGERU( &m, &n, &alpha, x, &incx, y, &incy, a, &lda ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to geru. +// +template< typename Value > +struct geru_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY, typename MatrixA > + static result_type invoke( const value_type alpha, const VectorX& x, + const VectorY& y, MatrixA& a ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::geru( order(), bindings::size_row(a), + bindings::size_column(a), alpha, bindings::begin_value(x), + bindings::stride(x), bindings::begin_value(y), + bindings::stride(y), bindings::begin_value(a), + bindings::stride_major(a) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the geru_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for geru. Its overload differs for +// +template< typename VectorX, typename VectorY, typename MatrixA > +inline typename geru_impl< typename bindings::value_type< + VectorX >::type >::result_type +geru( const typename bindings::value_type< VectorX >::type alpha, + const VectorX& x, const VectorY& y, MatrixA& a ) { + geru_impl< typename bindings::value_type< + VectorX >::type >::invoke( alpha, x, y, a ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/hbmv.hpp b/sdk/boost/numeric/bindings/blas/level2/hbmv.hpp new file mode 100644 index 0000000..96adca4 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/hbmv.hpp @@ -0,0 +1,320 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HBMV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HBMV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hbmv( const Order, const UpLo, const int n, const int k, + const float alpha, const float* a, const int lda, const float* x, + const int incx, const float beta, float* y, const int incy ) { + cblas_ssbmv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + k, alpha, a, lda, x, incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hbmv( const Order, const UpLo, const int n, const int k, + const double alpha, const double* a, const int lda, const double* x, + const int incx, const double beta, double* y, const int incy ) { + cblas_dsbmv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + k, alpha, a, lda, x, incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hbmv( const Order, const UpLo, const int n, const int k, + const std::complex alpha, const std::complex* a, + const int lda, const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + cblas_chbmv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + k, &alpha, a, lda, x, incx, &beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hbmv( const Order, const UpLo, const int n, const int k, + const std::complex alpha, const std::complex* a, + const int lda, const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + cblas_zhbmv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + k, &alpha, a, lda, x, incx, &beta, y, incy ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hbmv( const Order, const UpLo, const int n, const int k, + const float alpha, const float* a, const int lda, const float* x, + const int incx, const float beta, float* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsbmv( blas_option< UpLo >::value, n, k, alpha, a, lda, x, incx, + beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hbmv( const Order, const UpLo, const int n, const int k, + const double alpha, const double* a, const int lda, const double* x, + const int incx, const double beta, double* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsbmv( blas_option< UpLo >::value, n, k, alpha, a, lda, x, incx, + beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hbmv( const Order, const UpLo, const int n, const int k, + const std::complex alpha, const std::complex* a, + const int lda, const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasChbmv( blas_option< UpLo >::value, n, k, alpha, a, lda, x, incx, + beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hbmv( const Order, const UpLo, const int n, const int k, + const std::complex alpha, const std::complex* a, + const int lda, const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZhbmv( blas_option< UpLo >::value, n, k, alpha, a, lda, x, incx, + beta, y, incy ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hbmv( const Order, const UpLo, const fortran_int_t n, + const fortran_int_t k, const float alpha, const float* a, + const fortran_int_t lda, const float* x, const fortran_int_t incx, + const float beta, float* y, const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSBMV( &blas_option< UpLo >::value, &n, &k, &alpha, a, &lda, x, + &incx, &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hbmv( const Order, const UpLo, const fortran_int_t n, + const fortran_int_t k, const double alpha, const double* a, + const fortran_int_t lda, const double* x, const fortran_int_t incx, + const double beta, double* y, const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSBMV( &blas_option< UpLo >::value, &n, &k, &alpha, a, &lda, x, + &incx, &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hbmv( const Order, const UpLo, const fortran_int_t n, + const fortran_int_t k, const std::complex alpha, + const std::complex* a, const fortran_int_t lda, + const std::complex* x, const fortran_int_t incx, + const std::complex beta, std::complex* y, + const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CHBMV( &blas_option< UpLo >::value, &n, &k, &alpha, a, &lda, x, + &incx, &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hbmv( const Order, const UpLo, const fortran_int_t n, + const fortran_int_t k, const std::complex alpha, + const std::complex* a, const fortran_int_t lda, + const std::complex* x, const fortran_int_t incx, + const std::complex beta, std::complex* y, + const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZHBMV( &blas_option< UpLo >::value, &n, &k, &alpha, a, &lda, x, + &incx, &beta, y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hbmv. +// +template< typename Value > +struct hbmv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorX, typename VectorY > + static result_type invoke( const value_type alpha, const MatrixA& a, + const VectorX& x, const value_type beta, VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_band_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::hbmv( order(), uplo(), bindings::size_column(a), + bindings::bandwidth_upper(a), alpha, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(x), + bindings::stride(x), beta, bindings::begin_value(y), + bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the hbmv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hbmv. Its overload differs for +// +template< typename MatrixA, typename VectorX, typename VectorY > +inline typename hbmv_impl< typename bindings::value_type< + MatrixA >::type >::result_type +hbmv( const typename bindings::value_type< MatrixA >::type alpha, + const MatrixA& a, const VectorX& x, + const typename bindings::value_type< MatrixA >::type beta, + VectorY& y ) { + hbmv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( alpha, a, x, beta, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/hemv.hpp b/sdk/boost/numeric/bindings/blas/level2/hemv.hpp new file mode 100644 index 0000000..fab7788 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/hemv.hpp @@ -0,0 +1,315 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HEMV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HEMV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hemv( const Order, const UpLo, const int n, const float alpha, + const float* a, const int lda, const float* x, const int incx, + const float beta, float* y, const int incy ) { + cblas_ssymv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, a, lda, x, incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hemv( const Order, const UpLo, const int n, const double alpha, + const double* a, const int lda, const double* x, const int incx, + const double beta, double* y, const int incy ) { + cblas_dsymv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, a, lda, x, incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hemv( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* a, + const int lda, const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + cblas_chemv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + &alpha, a, lda, x, incx, &beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hemv( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* a, + const int lda, const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + cblas_zhemv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + &alpha, a, lda, x, incx, &beta, y, incy ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hemv( const Order, const UpLo, const int n, const float alpha, + const float* a, const int lda, const float* x, const int incx, + const float beta, float* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsymv( blas_option< UpLo >::value, n, alpha, a, lda, x, incx, beta, + y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hemv( const Order, const UpLo, const int n, const double alpha, + const double* a, const int lda, const double* x, const int incx, + const double beta, double* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsymv( blas_option< UpLo >::value, n, alpha, a, lda, x, incx, beta, + y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hemv( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* a, + const int lda, const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasChemv( blas_option< UpLo >::value, n, alpha, a, lda, x, incx, beta, + y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hemv( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* a, + const int lda, const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZhemv( blas_option< UpLo >::value, n, alpha, a, lda, x, incx, beta, + y, incy ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hemv( const Order, const UpLo, const fortran_int_t n, + const float alpha, const float* a, const fortran_int_t lda, + const float* x, const fortran_int_t incx, const float beta, float* y, + const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSYMV( &blas_option< UpLo >::value, &n, &alpha, a, &lda, x, &incx, + &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hemv( const Order, const UpLo, const fortran_int_t n, + const double alpha, const double* a, const fortran_int_t lda, + const double* x, const fortran_int_t incx, const double beta, + double* y, const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSYMV( &blas_option< UpLo >::value, &n, &alpha, a, &lda, x, &incx, + &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hemv( const Order, const UpLo, const fortran_int_t n, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, const std::complex* x, + const fortran_int_t incx, const std::complex beta, + std::complex* y, const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CHEMV( &blas_option< UpLo >::value, &n, &alpha, a, &lda, x, &incx, + &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hemv( const Order, const UpLo, const fortran_int_t n, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, const std::complex* x, + const fortran_int_t incx, const std::complex beta, + std::complex* y, const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZHEMV( &blas_option< UpLo >::value, &n, &alpha, a, &lda, x, &incx, + &beta, y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hemv. +// +template< typename Value > +struct hemv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorX, typename VectorY > + static result_type invoke( const value_type alpha, const MatrixA& a, + const VectorX& x, const value_type beta, VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::hemv( order(), uplo(), bindings::size_column(a), alpha, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(x), bindings::stride(x), beta, + bindings::begin_value(y), bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the hemv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hemv. Its overload differs for +// +template< typename MatrixA, typename VectorX, typename VectorY > +inline typename hemv_impl< typename bindings::value_type< + MatrixA >::type >::result_type +hemv( const typename bindings::value_type< MatrixA >::type alpha, + const MatrixA& a, const VectorX& x, + const typename bindings::value_type< MatrixA >::type beta, + VectorY& y ) { + hemv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( alpha, a, x, beta, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/her.hpp b/sdk/boost/numeric/bindings/blas/level2/her.hpp new file mode 100644 index 0000000..bbfdac0 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/her.hpp @@ -0,0 +1,283 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HER_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void her( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, float* a, const int lda ) { + cblas_ssyr( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void her( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, double* a, const int lda ) { + cblas_dsyr( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void her( const Order, const UpLo, const int n, const float alpha, + const std::complex* x, const int incx, std::complex* a, + const int lda ) { + cblas_cher( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void her( const Order, const UpLo, const int n, const double alpha, + const std::complex* x, const int incx, + std::complex* a, const int lda ) { + cblas_zher( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, a, lda ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void her( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, float* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsyr( blas_option< UpLo >::value, n, alpha, x, incx, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void her( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, double* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsyr( blas_option< UpLo >::value, n, alpha, x, incx, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void her( const Order, const UpLo, const int n, const float alpha, + const std::complex* x, const int incx, std::complex* a, + const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCher( blas_option< UpLo >::value, n, alpha, x, incx, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void her( const Order, const UpLo, const int n, const double alpha, + const std::complex* x, const int incx, + std::complex* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZher( blas_option< UpLo >::value, n, alpha, x, incx, a, lda ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void her( const Order, const UpLo, const fortran_int_t n, + const float alpha, const float* x, const fortran_int_t incx, float* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSYR( &blas_option< UpLo >::value, &n, &alpha, x, &incx, a, &lda ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void her( const Order, const UpLo, const fortran_int_t n, + const double alpha, const double* x, const fortran_int_t incx, + double* a, const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSYR( &blas_option< UpLo >::value, &n, &alpha, x, &incx, a, &lda ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void her( const Order, const UpLo, const fortran_int_t n, + const float alpha, const std::complex* x, + const fortran_int_t incx, std::complex* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CHER( &blas_option< UpLo >::value, &n, &alpha, x, &incx, a, &lda ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void her( const Order, const UpLo, const fortran_int_t n, + const double alpha, const std::complex* x, + const fortran_int_t incx, std::complex* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZHER( &blas_option< UpLo >::value, &n, &alpha, x, &incx, a, &lda ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to her. +// +template< typename Value > +struct her_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename MatrixA > + static result_type invoke( const real_type alpha, const VectorX& x, + MatrixA& a ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::her( order(), uplo(), bindings::size_column(a), alpha, + bindings::begin_value(x), bindings::stride(x), + bindings::begin_value(a), bindings::stride_major(a) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the her_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for her. Its overload differs for +// +template< typename VectorX, typename MatrixA > +inline typename her_impl< typename bindings::value_type< + VectorX >::type >::result_type +her( const typename remove_imaginary< typename bindings::value_type< + VectorX >::type >::type alpha, const VectorX& x, MatrixA& a ) { + her_impl< typename bindings::value_type< + VectorX >::type >::invoke( alpha, x, a ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/her2.hpp b/sdk/boost/numeric/bindings/blas/level2/her2.hpp new file mode 100644 index 0000000..8cf68c3 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/her2.hpp @@ -0,0 +1,309 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HER2_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HER2_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void her2( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, const float* y, const int incy, + float* a, const int lda ) { + cblas_ssyr2( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, y, incy, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void her2( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, const double* y, const int incy, + double* a, const int lda ) { + cblas_dsyr2( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, y, incy, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void her2( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* a, const int lda ) { + cblas_cher2( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + &alpha, x, incx, y, incy, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void her2( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* a, const int lda ) { + cblas_zher2( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + &alpha, x, incx, y, incy, a, lda ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void her2( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, const float* y, const int incy, + float* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsyr2( blas_option< UpLo >::value, n, alpha, x, incx, y, incy, a, + lda ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void her2( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, const double* y, const int incy, + double* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsyr2( blas_option< UpLo >::value, n, alpha, x, incx, y, incy, a, + lda ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void her2( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCher2( blas_option< UpLo >::value, n, alpha, x, incx, y, incy, a, + lda ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void her2( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZher2( blas_option< UpLo >::value, n, alpha, x, incx, y, incy, a, + lda ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void her2( const Order, const UpLo, const fortran_int_t n, + const float alpha, const float* x, const fortran_int_t incx, + const float* y, const fortran_int_t incy, float* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSYR2( &blas_option< UpLo >::value, &n, &alpha, x, &incx, y, &incy, + a, &lda ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void her2( const Order, const UpLo, const fortran_int_t n, + const double alpha, const double* x, const fortran_int_t incx, + const double* y, const fortran_int_t incy, double* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSYR2( &blas_option< UpLo >::value, &n, &alpha, x, &incx, y, &incy, + a, &lda ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void her2( const Order, const UpLo, const fortran_int_t n, + const std::complex alpha, const std::complex* x, + const fortran_int_t incx, const std::complex* y, + const fortran_int_t incy, std::complex* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CHER2( &blas_option< UpLo >::value, &n, &alpha, x, &incx, y, &incy, + a, &lda ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void her2( const Order, const UpLo, const fortran_int_t n, + const std::complex alpha, const std::complex* x, + const fortran_int_t incx, const std::complex* y, + const fortran_int_t incy, std::complex* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZHER2( &blas_option< UpLo >::value, &n, &alpha, x, &incx, y, &incy, + a, &lda ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to her2. +// +template< typename Value > +struct her2_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY, typename MatrixA > + static result_type invoke( const value_type alpha, const VectorX& x, + const VectorY& y, MatrixA& a ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::her2( order(), uplo(), bindings::size_column(a), alpha, + bindings::begin_value(x), bindings::stride(x), + bindings::begin_value(y), bindings::stride(y), + bindings::begin_value(a), bindings::stride_major(a) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the her2_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for her2. Its overload differs for +// +template< typename VectorX, typename VectorY, typename MatrixA > +inline typename her2_impl< typename bindings::value_type< + VectorX >::type >::result_type +her2( const typename bindings::value_type< VectorX >::type alpha, + const VectorX& x, const VectorY& y, MatrixA& a ) { + her2_impl< typename bindings::value_type< + VectorX >::type >::invoke( alpha, x, y, a ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/hpmv.hpp b/sdk/boost/numeric/bindings/blas/level2/hpmv.hpp new file mode 100644 index 0000000..9d7dc5a --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/hpmv.hpp @@ -0,0 +1,315 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HPMV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HPMV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hpmv( const Order, const UpLo, const int n, const float alpha, + const float* ap, const float* x, const int incx, const float beta, + float* y, const int incy ) { + cblas_sspmv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, ap, x, incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hpmv( const Order, const UpLo, const int n, const double alpha, + const double* ap, const double* x, const int incx, const double beta, + double* y, const int incy ) { + cblas_dspmv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, ap, x, incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpmv( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* ap, + const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + cblas_chpmv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + &alpha, ap, x, incx, &beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpmv( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* ap, + const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + cblas_zhpmv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + &alpha, ap, x, incx, &beta, y, incy ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hpmv( const Order, const UpLo, const int n, const float alpha, + const float* ap, const float* x, const int incx, const float beta, + float* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSspmv( blas_option< UpLo >::value, n, alpha, ap, x, incx, beta, y, + incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hpmv( const Order, const UpLo, const int n, const double alpha, + const double* ap, const double* x, const int incx, const double beta, + double* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDspmv( blas_option< UpLo >::value, n, alpha, ap, x, incx, beta, y, + incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpmv( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* ap, + const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasChpmv( blas_option< UpLo >::value, n, alpha, ap, x, incx, beta, y, + incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpmv( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* ap, + const std::complex* x, const int incx, + const std::complex beta, std::complex* y, + const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZhpmv( blas_option< UpLo >::value, n, alpha, ap, x, incx, beta, y, + incy ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hpmv( const Order, const UpLo, const fortran_int_t n, + const float alpha, const float* ap, const float* x, + const fortran_int_t incx, const float beta, float* y, + const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSPMV( &blas_option< UpLo >::value, &n, &alpha, ap, x, &incx, &beta, + y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hpmv( const Order, const UpLo, const fortran_int_t n, + const double alpha, const double* ap, const double* x, + const fortran_int_t incx, const double beta, double* y, + const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSPMV( &blas_option< UpLo >::value, &n, &alpha, ap, x, &incx, &beta, + y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpmv( const Order, const UpLo, const fortran_int_t n, + const std::complex alpha, const std::complex* ap, + const std::complex* x, const fortran_int_t incx, + const std::complex beta, std::complex* y, + const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CHPMV( &blas_option< UpLo >::value, &n, &alpha, ap, x, &incx, &beta, + y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpmv( const Order, const UpLo, const fortran_int_t n, + const std::complex alpha, const std::complex* ap, + const std::complex* x, const fortran_int_t incx, + const std::complex beta, std::complex* y, + const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZHPMV( &blas_option< UpLo >::value, &n, &alpha, ap, x, &incx, &beta, + y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hpmv. +// +template< typename Value > +struct hpmv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorX, typename VectorY > + static result_type invoke( const value_type alpha, const MatrixAP& ap, + const VectorX& x, const value_type beta, VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAP >::type order; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_triangular_array< + MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + detail::hpmv( order(), uplo(), bindings::size_column(ap), alpha, + bindings::begin_value(ap), bindings::begin_value(x), + bindings::stride(x), beta, bindings::begin_value(y), + bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the hpmv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hpmv. Its overload differs for +// +template< typename MatrixAP, typename VectorX, typename VectorY > +inline typename hpmv_impl< typename bindings::value_type< + MatrixAP >::type >::result_type +hpmv( const typename bindings::value_type< MatrixAP >::type alpha, + const MatrixAP& ap, const VectorX& x, + const typename bindings::value_type< MatrixAP >::type beta, + VectorY& y ) { + hpmv_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( alpha, ap, x, beta, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/hpr.hpp b/sdk/boost/numeric/bindings/blas/level2/hpr.hpp new file mode 100644 index 0000000..9e4ed3e --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/hpr.hpp @@ -0,0 +1,281 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HPR_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HPR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hpr( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, float* ap ) { + cblas_sspr( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, ap ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hpr( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, double* ap ) { + cblas_dspr( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, ap ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpr( const Order, const UpLo, const int n, const float alpha, + const std::complex* x, const int incx, + std::complex* ap ) { + cblas_chpr( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, ap ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpr( const Order, const UpLo, const int n, const double alpha, + const std::complex* x, const int incx, + std::complex* ap ) { + cblas_zhpr( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, ap ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hpr( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, float* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSspr( blas_option< UpLo >::value, n, alpha, x, incx, ap ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hpr( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, double* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDspr( blas_option< UpLo >::value, n, alpha, x, incx, ap ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpr( const Order, const UpLo, const int n, const float alpha, + const std::complex* x, const int incx, + std::complex* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasChpr( blas_option< UpLo >::value, n, alpha, x, incx, ap ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpr( const Order, const UpLo, const int n, const double alpha, + const std::complex* x, const int incx, + std::complex* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZhpr( blas_option< UpLo >::value, n, alpha, x, incx, ap ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hpr( const Order, const UpLo, const fortran_int_t n, + const float alpha, const float* x, const fortran_int_t incx, + float* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSPR( &blas_option< UpLo >::value, &n, &alpha, x, &incx, ap ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hpr( const Order, const UpLo, const fortran_int_t n, + const double alpha, const double* x, const fortran_int_t incx, + double* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSPR( &blas_option< UpLo >::value, &n, &alpha, x, &incx, ap ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpr( const Order, const UpLo, const fortran_int_t n, + const float alpha, const std::complex* x, + const fortran_int_t incx, std::complex* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CHPR( &blas_option< UpLo >::value, &n, &alpha, x, &incx, ap ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpr( const Order, const UpLo, const fortran_int_t n, + const double alpha, const std::complex* x, + const fortran_int_t incx, std::complex* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZHPR( &blas_option< UpLo >::value, &n, &alpha, x, &incx, ap ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hpr. +// +template< typename Value > +struct hpr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename MatrixAP > + static result_type invoke( const real_type alpha, const VectorX& x, + MatrixAP& ap ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAP >::type order; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_triangular_array< + MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + detail::hpr( order(), uplo(), bindings::size_column(ap), alpha, + bindings::begin_value(x), bindings::stride(x), + bindings::begin_value(ap) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the hpr_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hpr. Its overload differs for +// +template< typename VectorX, typename MatrixAP > +inline typename hpr_impl< typename bindings::value_type< + VectorX >::type >::result_type +hpr( const typename remove_imaginary< typename bindings::value_type< + VectorX >::type >::type alpha, const VectorX& x, MatrixAP& ap ) { + hpr_impl< typename bindings::value_type< + VectorX >::type >::invoke( alpha, x, ap ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/hpr2.hpp b/sdk/boost/numeric/bindings/blas/level2/hpr2.hpp new file mode 100644 index 0000000..58e6c0e --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/hpr2.hpp @@ -0,0 +1,301 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HPR2_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_HPR2_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hpr2( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, const float* y, const int incy, + float* ap ) { + cblas_sspr2( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, y, incy, ap ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hpr2( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, const double* y, const int incy, + double* ap ) { + cblas_dspr2( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, y, incy, ap ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpr2( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* ap ) { + cblas_chpr2( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + &alpha, x, incx, y, incy, ap ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpr2( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* ap ) { + cblas_zhpr2( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + &alpha, x, incx, y, incy, ap ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hpr2( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, const float* y, const int incy, + float* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSspr2( blas_option< UpLo >::value, n, alpha, x, incx, y, incy, ap ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hpr2( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, const double* y, const int incy, + double* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDspr2( blas_option< UpLo >::value, n, alpha, x, incx, y, incy, ap ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpr2( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasChpr2( blas_option< UpLo >::value, n, alpha, x, incx, y, incy, ap ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpr2( const Order, const UpLo, const int n, + const std::complex alpha, const std::complex* x, + const int incx, const std::complex* y, const int incy, + std::complex* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZhpr2( blas_option< UpLo >::value, n, alpha, x, incx, y, incy, ap ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void hpr2( const Order, const UpLo, const fortran_int_t n, + const float alpha, const float* x, const fortran_int_t incx, + const float* y, const fortran_int_t incy, float* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSPR2( &blas_option< UpLo >::value, &n, &alpha, x, &incx, y, &incy, + ap ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void hpr2( const Order, const UpLo, const fortran_int_t n, + const double alpha, const double* x, const fortran_int_t incx, + const double* y, const fortran_int_t incy, double* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSPR2( &blas_option< UpLo >::value, &n, &alpha, x, &incx, y, &incy, + ap ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpr2( const Order, const UpLo, const fortran_int_t n, + const std::complex alpha, const std::complex* x, + const fortran_int_t incx, const std::complex* y, + const fortran_int_t incy, std::complex* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CHPR2( &blas_option< UpLo >::value, &n, &alpha, x, &incx, y, &incy, + ap ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline void hpr2( const Order, const UpLo, const fortran_int_t n, + const std::complex alpha, const std::complex* x, + const fortran_int_t incx, const std::complex* y, + const fortran_int_t incy, std::complex* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZHPR2( &blas_option< UpLo >::value, &n, &alpha, x, &incx, y, &incy, + ap ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hpr2. +// +template< typename Value > +struct hpr2_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY, typename MatrixAP > + static result_type invoke( const value_type alpha, const VectorX& x, + const VectorY& y, MatrixAP& ap ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAP >::type order; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_triangular_array< + MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + detail::hpr2( order(), uplo(), bindings::size_column(ap), alpha, + bindings::begin_value(x), bindings::stride(x), + bindings::begin_value(y), bindings::stride(y), + bindings::begin_value(ap) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the hpr2_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hpr2. Its overload differs for +// +template< typename VectorX, typename VectorY, typename MatrixAP > +inline typename hpr2_impl< typename bindings::value_type< + VectorX >::type >::result_type +hpr2( const typename bindings::value_type< VectorX >::type alpha, + const VectorX& x, const VectorY& y, MatrixAP& ap ) { + hpr2_impl< typename bindings::value_type< + VectorX >::type >::invoke( alpha, x, y, ap ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/sbmv.hpp b/sdk/boost/numeric/bindings/blas/level2/sbmv.hpp new file mode 100644 index 0000000..6d320c3 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/sbmv.hpp @@ -0,0 +1,224 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SBMV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SBMV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void sbmv( const Order, const UpLo, const int n, const int k, + const float alpha, const float* a, const int lda, const float* x, + const int incx, const float beta, float* y, const int incy ) { + cblas_ssbmv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + k, alpha, a, lda, x, incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void sbmv( const Order, const UpLo, const int n, const int k, + const double alpha, const double* a, const int lda, const double* x, + const int incx, const double beta, double* y, const int incy ) { + cblas_dsbmv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + k, alpha, a, lda, x, incx, beta, y, incy ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void sbmv( const Order, const UpLo, const int n, const int k, + const float alpha, const float* a, const int lda, const float* x, + const int incx, const float beta, float* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsbmv( blas_option< UpLo >::value, n, k, alpha, a, lda, x, incx, + beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void sbmv( const Order, const UpLo, const int n, const int k, + const double alpha, const double* a, const int lda, const double* x, + const int incx, const double beta, double* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsbmv( blas_option< UpLo >::value, n, k, alpha, a, lda, x, incx, + beta, y, incy ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void sbmv( const Order, const UpLo, const fortran_int_t n, + const fortran_int_t k, const float alpha, const float* a, + const fortran_int_t lda, const float* x, const fortran_int_t incx, + const float beta, float* y, const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSBMV( &blas_option< UpLo >::value, &n, &k, &alpha, a, &lda, x, + &incx, &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void sbmv( const Order, const UpLo, const fortran_int_t n, + const fortran_int_t k, const double alpha, const double* a, + const fortran_int_t lda, const double* x, const fortran_int_t incx, + const double beta, double* y, const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSBMV( &blas_option< UpLo >::value, &n, &k, &alpha, a, &lda, x, + &incx, &beta, y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sbmv. +// +template< typename Value > +struct sbmv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorX, typename VectorY > + static result_type invoke( const real_type alpha, const MatrixA& a, + const VectorX& x, const real_type beta, VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_band_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::sbmv( order(), uplo(), bindings::size_column(a), + bindings::bandwidth_upper(a), alpha, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(x), + bindings::stride(x), beta, bindings::begin_value(y), + bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the sbmv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sbmv. Its overload differs for +// +template< typename MatrixA, typename VectorX, typename VectorY > +inline typename sbmv_impl< typename bindings::value_type< + MatrixA >::type >::result_type +sbmv( const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type alpha, const MatrixA& a, const VectorX& x, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type beta, VectorY& y ) { + sbmv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( alpha, a, x, beta, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/spmv.hpp b/sdk/boost/numeric/bindings/blas/level2/spmv.hpp new file mode 100644 index 0000000..cfe9ebc --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/spmv.hpp @@ -0,0 +1,221 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SPMV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SPMV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void spmv( const Order, const UpLo, const int n, const float alpha, + const float* ap, const float* x, const int incx, const float beta, + float* y, const int incy ) { + cblas_sspmv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, ap, x, incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void spmv( const Order, const UpLo, const int n, const double alpha, + const double* ap, const double* x, const int incx, const double beta, + double* y, const int incy ) { + cblas_dspmv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, ap, x, incx, beta, y, incy ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void spmv( const Order, const UpLo, const int n, const float alpha, + const float* ap, const float* x, const int incx, const float beta, + float* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSspmv( blas_option< UpLo >::value, n, alpha, ap, x, incx, beta, y, + incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void spmv( const Order, const UpLo, const int n, const double alpha, + const double* ap, const double* x, const int incx, const double beta, + double* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDspmv( blas_option< UpLo >::value, n, alpha, ap, x, incx, beta, y, + incy ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void spmv( const Order, const UpLo, const fortran_int_t n, + const float alpha, const float* ap, const float* x, + const fortran_int_t incx, const float beta, float* y, + const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSPMV( &blas_option< UpLo >::value, &n, &alpha, ap, x, &incx, &beta, + y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void spmv( const Order, const UpLo, const fortran_int_t n, + const double alpha, const double* ap, const double* x, + const fortran_int_t incx, const double beta, double* y, + const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSPMV( &blas_option< UpLo >::value, &n, &alpha, ap, x, &incx, &beta, + y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to spmv. +// +template< typename Value > +struct spmv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorX, typename VectorY > + static result_type invoke( const real_type alpha, const MatrixAP& ap, + const VectorX& x, const real_type beta, VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAP >::type order; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_triangular_array< + MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + detail::spmv( order(), uplo(), bindings::size_column(ap), alpha, + bindings::begin_value(ap), bindings::begin_value(x), + bindings::stride(x), beta, bindings::begin_value(y), + bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the spmv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for spmv. Its overload differs for +// +template< typename MatrixAP, typename VectorX, typename VectorY > +inline typename spmv_impl< typename bindings::value_type< + MatrixAP >::type >::result_type +spmv( const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type alpha, const MatrixAP& ap, const VectorX& x, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type beta, VectorY& y ) { + spmv_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( alpha, ap, x, beta, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/spr.hpp b/sdk/boost/numeric/bindings/blas/level2/spr.hpp new file mode 100644 index 0000000..4174c6e --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/spr.hpp @@ -0,0 +1,203 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SPR_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SPR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void spr( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, float* ap ) { + cblas_sspr( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, ap ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void spr( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, double* ap ) { + cblas_dspr( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, ap ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void spr( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, float* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSspr( blas_option< UpLo >::value, n, alpha, x, incx, ap ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void spr( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, double* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDspr( blas_option< UpLo >::value, n, alpha, x, incx, ap ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void spr( const Order, const UpLo, const fortran_int_t n, + const float alpha, const float* x, const fortran_int_t incx, + float* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSPR( &blas_option< UpLo >::value, &n, &alpha, x, &incx, ap ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void spr( const Order, const UpLo, const fortran_int_t n, + const double alpha, const double* x, const fortran_int_t incx, + double* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSPR( &blas_option< UpLo >::value, &n, &alpha, x, &incx, ap ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to spr. +// +template< typename Value > +struct spr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename MatrixAP > + static result_type invoke( const real_type alpha, const VectorX& x, + MatrixAP& ap ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAP >::type order; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_triangular_array< + MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + detail::spr( order(), uplo(), bindings::size_column(ap), alpha, + bindings::begin_value(x), bindings::stride(x), + bindings::begin_value(ap) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the spr_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for spr. Its overload differs for +// +template< typename VectorX, typename MatrixAP > +inline typename spr_impl< typename bindings::value_type< + VectorX >::type >::result_type +spr( const typename remove_imaginary< typename bindings::value_type< + VectorX >::type >::type alpha, const VectorX& x, MatrixAP& ap ) { + spr_impl< typename bindings::value_type< + VectorX >::type >::invoke( alpha, x, ap ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/spr2.hpp b/sdk/boost/numeric/bindings/blas/level2/spr2.hpp new file mode 100644 index 0000000..3dc85d3 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/spr2.hpp @@ -0,0 +1,216 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SPR2_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SPR2_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void spr2( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, const float* y, const int incy, + float* ap ) { + cblas_sspr2( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, y, incy, ap ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void spr2( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, const double* y, const int incy, + double* ap ) { + cblas_dspr2( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, y, incy, ap ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void spr2( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, const float* y, const int incy, + float* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSspr2( blas_option< UpLo >::value, n, alpha, x, incx, y, incy, ap ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void spr2( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, const double* y, const int incy, + double* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDspr2( blas_option< UpLo >::value, n, alpha, x, incx, y, incy, ap ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void spr2( const Order, const UpLo, const fortran_int_t n, + const float alpha, const float* x, const fortran_int_t incx, + const float* y, const fortran_int_t incy, float* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSPR2( &blas_option< UpLo >::value, &n, &alpha, x, &incx, y, &incy, + ap ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void spr2( const Order, const UpLo, const fortran_int_t n, + const double alpha, const double* x, const fortran_int_t incx, + const double* y, const fortran_int_t incy, double* ap ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSPR2( &blas_option< UpLo >::value, &n, &alpha, x, &incx, y, &incy, + ap ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to spr2. +// +template< typename Value > +struct spr2_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY, typename MatrixAP > + static result_type invoke( const real_type alpha, const VectorX& x, + const VectorY& y, MatrixAP& ap ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAP >::type order; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_triangular_array< + MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + detail::spr2( order(), uplo(), bindings::size_column(ap), alpha, + bindings::begin_value(x), bindings::stride(x), + bindings::begin_value(y), bindings::stride(y), + bindings::begin_value(ap) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the spr2_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for spr2. Its overload differs for +// +template< typename VectorX, typename VectorY, typename MatrixAP > +inline typename spr2_impl< typename bindings::value_type< + VectorX >::type >::result_type +spr2( const typename remove_imaginary< typename bindings::value_type< + VectorX >::type >::type alpha, const VectorX& x, const VectorY& y, + MatrixAP& ap ) { + spr2_impl< typename bindings::value_type< + VectorX >::type >::invoke( alpha, x, y, ap ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/symv.hpp b/sdk/boost/numeric/bindings/blas/level2/symv.hpp new file mode 100644 index 0000000..3f06b9c --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/symv.hpp @@ -0,0 +1,221 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SYMV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SYMV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void symv( const Order, const UpLo, const int n, const float alpha, + const float* a, const int lda, const float* x, const int incx, + const float beta, float* y, const int incy ) { + cblas_ssymv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, a, lda, x, incx, beta, y, incy ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void symv( const Order, const UpLo, const int n, const double alpha, + const double* a, const int lda, const double* x, const int incx, + const double beta, double* y, const int incy ) { + cblas_dsymv( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, a, lda, x, incx, beta, y, incy ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void symv( const Order, const UpLo, const int n, const float alpha, + const float* a, const int lda, const float* x, const int incx, + const float beta, float* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsymv( blas_option< UpLo >::value, n, alpha, a, lda, x, incx, beta, + y, incy ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void symv( const Order, const UpLo, const int n, const double alpha, + const double* a, const int lda, const double* x, const int incx, + const double beta, double* y, const int incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsymv( blas_option< UpLo >::value, n, alpha, a, lda, x, incx, beta, + y, incy ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void symv( const Order, const UpLo, const fortran_int_t n, + const float alpha, const float* a, const fortran_int_t lda, + const float* x, const fortran_int_t incx, const float beta, float* y, + const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSYMV( &blas_option< UpLo >::value, &n, &alpha, a, &lda, x, &incx, + &beta, y, &incy ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void symv( const Order, const UpLo, const fortran_int_t n, + const double alpha, const double* a, const fortran_int_t lda, + const double* x, const fortran_int_t incx, const double beta, + double* y, const fortran_int_t incy ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSYMV( &blas_option< UpLo >::value, &n, &alpha, a, &lda, x, &incx, + &beta, y, &incy ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to symv. +// +template< typename Value > +struct symv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorX, typename VectorY > + static result_type invoke( const real_type alpha, const MatrixA& a, + const VectorX& x, const real_type beta, VectorY& y ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::symv( order(), uplo(), bindings::size_column(a), alpha, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(x), bindings::stride(x), beta, + bindings::begin_value(y), bindings::stride(y) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the symv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for symv. Its overload differs for +// +template< typename MatrixA, typename VectorX, typename VectorY > +inline typename symv_impl< typename bindings::value_type< + MatrixA >::type >::result_type +symv( const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type alpha, const MatrixA& a, const VectorX& x, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type beta, VectorY& y ) { + symv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( alpha, a, x, beta, y ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/syr.hpp b/sdk/boost/numeric/bindings/blas/level2/syr.hpp new file mode 100644 index 0000000..60c2d26 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/syr.hpp @@ -0,0 +1,203 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SYR_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SYR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void syr( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, float* a, const int lda ) { + cblas_ssyr( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void syr( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, double* a, const int lda ) { + cblas_dsyr( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, a, lda ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void syr( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, float* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsyr( blas_option< UpLo >::value, n, alpha, x, incx, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void syr( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, double* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsyr( blas_option< UpLo >::value, n, alpha, x, incx, a, lda ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void syr( const Order, const UpLo, const fortran_int_t n, + const float alpha, const float* x, const fortran_int_t incx, float* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSYR( &blas_option< UpLo >::value, &n, &alpha, x, &incx, a, &lda ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void syr( const Order, const UpLo, const fortran_int_t n, + const double alpha, const double* x, const fortran_int_t incx, + double* a, const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSYR( &blas_option< UpLo >::value, &n, &alpha, x, &incx, a, &lda ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to syr. +// +template< typename Value > +struct syr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename MatrixA > + static result_type invoke( const real_type alpha, const VectorX& x, + MatrixA& a ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::syr( order(), uplo(), bindings::size_column(a), alpha, + bindings::begin_value(x), bindings::stride(x), + bindings::begin_value(a), bindings::stride_major(a) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the syr_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for syr. Its overload differs for +// +template< typename VectorX, typename MatrixA > +inline typename syr_impl< typename bindings::value_type< + VectorX >::type >::result_type +syr( const typename remove_imaginary< typename bindings::value_type< + VectorX >::type >::type alpha, const VectorX& x, MatrixA& a ) { + syr_impl< typename bindings::value_type< + VectorX >::type >::invoke( alpha, x, a ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/syr2.hpp b/sdk/boost/numeric/bindings/blas/level2/syr2.hpp new file mode 100644 index 0000000..dc2f0af --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/syr2.hpp @@ -0,0 +1,220 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SYR2_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_SYR2_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void syr2( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, const float* y, const int incy, + float* a, const int lda ) { + cblas_ssyr2( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, y, incy, a, lda ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void syr2( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, const double* y, const int incy, + double* a, const int lda ) { + cblas_dsyr2( cblas_option< Order >::value, cblas_option< UpLo >::value, n, + alpha, x, incx, y, incy, a, lda ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void syr2( const Order, const UpLo, const int n, const float alpha, + const float* x, const int incx, const float* y, const int incy, + float* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsyr2( blas_option< UpLo >::value, n, alpha, x, incx, y, incy, a, + lda ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void syr2( const Order, const UpLo, const int n, const double alpha, + const double* x, const int incx, const double* y, const int incy, + double* a, const int lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsyr2( blas_option< UpLo >::value, n, alpha, x, incx, y, incy, a, + lda ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline void syr2( const Order, const UpLo, const fortran_int_t n, + const float alpha, const float* x, const fortran_int_t incx, + const float* y, const fortran_int_t incy, float* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSYR2( &blas_option< UpLo >::value, &n, &alpha, x, &incx, y, &incy, + a, &lda ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline void syr2( const Order, const UpLo, const fortran_int_t n, + const double alpha, const double* x, const fortran_int_t incx, + const double* y, const fortran_int_t incy, double* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSYR2( &blas_option< UpLo >::value, &n, &alpha, x, &incx, y, &incy, + a, &lda ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to syr2. +// +template< typename Value > +struct syr2_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY, typename MatrixA > + static result_type invoke( const real_type alpha, const VectorX& x, + const VectorY& y, MatrixA& a ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::syr2( order(), uplo(), bindings::size_column(a), alpha, + bindings::begin_value(x), bindings::stride(x), + bindings::begin_value(y), bindings::stride(y), + bindings::begin_value(a), bindings::stride_major(a) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the syr2_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for syr2. Its overload differs for +// +template< typename VectorX, typename VectorY, typename MatrixA > +inline typename syr2_impl< typename bindings::value_type< + VectorX >::type >::result_type +syr2( const typename remove_imaginary< typename bindings::value_type< + VectorX >::type >::type alpha, const VectorX& x, const VectorY& y, + MatrixA& a ) { + syr2_impl< typename bindings::value_type< + VectorX >::type >::invoke( alpha, x, y, a ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/tbmv.hpp b/sdk/boost/numeric/bindings/blas/level2/tbmv.hpp new file mode 100644 index 0000000..4d2dbeb --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/tbmv.hpp @@ -0,0 +1,305 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_TBMV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_TBMV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbmv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const float* a, const int lda, float* x, + const int incx ) { + cblas_stbmv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, k, + a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbmv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const double* a, const int lda, double* x, + const int incx ) { + cblas_dtbmv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, k, + a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbmv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const std::complex* a, const int lda, + std::complex* x, const int incx ) { + cblas_ctbmv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, k, + a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbmv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const std::complex* a, + const int lda, std::complex* x, const int incx ) { + cblas_ztbmv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, k, + a, lda, x, incx ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbmv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const float* a, const int lda, float* x, + const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasStbmv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, k, a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbmv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const double* a, const int lda, double* x, + const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDtbmv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, k, a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbmv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const std::complex* a, const int lda, + std::complex* x, const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCtbmv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, k, a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbmv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const std::complex* a, + const int lda, std::complex* x, const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZtbmv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, k, a, lda, x, incx ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbmv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t k, const float* a, + const fortran_int_t lda, float* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_STBMV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, &k, a, &lda, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbmv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t k, const double* a, + const fortran_int_t lda, double* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DTBMV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, &k, a, &lda, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbmv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + std::complex* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CTBMV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, &k, a, &lda, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbmv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + std::complex* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZTBMV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, &k, a, &lda, x, &incx ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tbmv. +// +template< typename Value > +struct tbmv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorX > + static result_type invoke( const std::ptrdiff_t k, const MatrixA& a, + VectorX& x ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename detail::default_order< MatrixA >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_band_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::tbmv( order(), uplo(), trans(), diag(), + bindings::size_column_op(a, trans()), k, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(x), bindings::stride(x) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the tbmv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tbmv. Its overload differs for +// +template< typename MatrixA, typename VectorX > +inline typename tbmv_impl< typename bindings::value_type< + MatrixA >::type >::result_type +tbmv( const std::ptrdiff_t k, const MatrixA& a, VectorX& x ) { + tbmv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( k, a, x ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/tbsv.hpp b/sdk/boost/numeric/bindings/blas/level2/tbsv.hpp new file mode 100644 index 0000000..f97ac39 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/tbsv.hpp @@ -0,0 +1,305 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_TBSV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_TBSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbsv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const float* a, const int lda, float* x, + const int incx ) { + cblas_stbsv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, k, + a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbsv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const double* a, const int lda, double* x, + const int incx ) { + cblas_dtbsv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, k, + a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbsv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const std::complex* a, const int lda, + std::complex* x, const int incx ) { + cblas_ctbsv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, k, + a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbsv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const std::complex* a, + const int lda, std::complex* x, const int incx ) { + cblas_ztbsv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, k, + a, lda, x, incx ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbsv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const float* a, const int lda, float* x, + const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasStbsv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, k, a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbsv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const double* a, const int lda, double* x, + const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDtbsv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, k, a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbsv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const std::complex* a, const int lda, + std::complex* x, const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCtbsv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, k, a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbsv( const Order, const UpLo, const Trans, const Diag, + const int n, const int k, const std::complex* a, + const int lda, std::complex* x, const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZtbsv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, k, a, lda, x, incx ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbsv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t k, const float* a, + const fortran_int_t lda, float* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_STBSV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, &k, a, &lda, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbsv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t k, const double* a, + const fortran_int_t lda, double* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DTBSV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, &k, a, &lda, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbsv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + std::complex* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CTBSV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, &k, a, &lda, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tbsv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + std::complex* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZTBSV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, &k, a, &lda, x, &incx ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tbsv. +// +template< typename Value > +struct tbsv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorX > + static result_type invoke( const std::ptrdiff_t k, const MatrixA& a, + VectorX& x ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename detail::default_order< MatrixA >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_band_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::tbsv( order(), uplo(), trans(), diag(), + bindings::size_column_op(a, trans()), k, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(x), bindings::stride(x) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the tbsv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tbsv. Its overload differs for +// +template< typename MatrixA, typename VectorX > +inline typename tbsv_impl< typename bindings::value_type< + MatrixA >::type >::result_type +tbsv( const std::ptrdiff_t k, const MatrixA& a, VectorX& x ) { + tbsv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( k, a, x ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/tpmv.hpp b/sdk/boost/numeric/bindings/blas/level2/tpmv.hpp new file mode 100644 index 0000000..ca438df --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/tpmv.hpp @@ -0,0 +1,296 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_TPMV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_TPMV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpmv( const Order, const UpLo, const Trans, const Diag, + const int n, const float* ap, float* x, const int incx ) { + cblas_stpmv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, ap, + x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpmv( const Order, const UpLo, const Trans, const Diag, + const int n, const double* ap, double* x, const int incx ) { + cblas_dtpmv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, ap, + x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpmv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* ap, std::complex* x, + const int incx ) { + cblas_ctpmv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, ap, + x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpmv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* ap, std::complex* x, + const int incx ) { + cblas_ztpmv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, ap, + x, incx ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpmv( const Order, const UpLo, const Trans, const Diag, + const int n, const float* ap, float* x, const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasStpmv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, ap, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpmv( const Order, const UpLo, const Trans, const Diag, + const int n, const double* ap, double* x, const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDtpmv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, ap, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpmv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* ap, std::complex* x, + const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCtpmv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, ap, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpmv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* ap, std::complex* x, + const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZtpmv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, ap, x, incx ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpmv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const float* ap, float* x, + const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_STPMV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, ap, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpmv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const double* ap, double* x, + const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DTPMV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, ap, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpmv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const std::complex* ap, + std::complex* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CTPMV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, ap, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpmv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const std::complex* ap, + std::complex* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZTPMV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, ap, x, &incx ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tpmv. +// +template< typename Value > +struct tpmv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorX > + static result_type invoke( const MatrixAP& ap, VectorX& x ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename detail::default_order< MatrixAP >::type order; + typedef typename result_of::trans_tag< MatrixAP, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAP, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_triangular_array< + MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + detail::tpmv( order(), uplo(), trans(), diag(), + bindings::size_column_op(ap, trans()), + bindings::begin_value(ap), bindings::begin_value(x), + bindings::stride(x) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the tpmv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tpmv. Its overload differs for +// +template< typename MatrixAP, typename VectorX > +inline typename tpmv_impl< typename bindings::value_type< + MatrixAP >::type >::result_type +tpmv( const MatrixAP& ap, VectorX& x ) { + tpmv_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, x ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/tpsv.hpp b/sdk/boost/numeric/bindings/blas/level2/tpsv.hpp new file mode 100644 index 0000000..f1dbc86 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/tpsv.hpp @@ -0,0 +1,296 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_TPSV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_TPSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpsv( const Order, const UpLo, const Trans, const Diag, + const int n, const float* ap, float* x, const int incx ) { + cblas_stpsv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, ap, + x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpsv( const Order, const UpLo, const Trans, const Diag, + const int n, const double* ap, double* x, const int incx ) { + cblas_dtpsv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, ap, + x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpsv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* ap, std::complex* x, + const int incx ) { + cblas_ctpsv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, ap, + x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpsv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* ap, std::complex* x, + const int incx ) { + cblas_ztpsv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, ap, + x, incx ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpsv( const Order, const UpLo, const Trans, const Diag, + const int n, const float* ap, float* x, const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasStpsv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, ap, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpsv( const Order, const UpLo, const Trans, const Diag, + const int n, const double* ap, double* x, const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDtpsv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, ap, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpsv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* ap, std::complex* x, + const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCtpsv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, ap, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpsv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* ap, std::complex* x, + const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZtpsv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, ap, x, incx ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpsv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const float* ap, float* x, + const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_STPSV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, ap, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpsv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const double* ap, double* x, + const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DTPSV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, ap, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpsv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const std::complex* ap, + std::complex* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CTPSV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, ap, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void tpsv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const std::complex* ap, + std::complex* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZTPSV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, ap, x, &incx ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tpsv. +// +template< typename Value > +struct tpsv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorX > + static result_type invoke( const MatrixAP& ap, VectorX& x ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename detail::default_order< MatrixAP >::type order; + typedef typename result_of::trans_tag< MatrixAP, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAP, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_triangular_array< + MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + detail::tpsv( order(), uplo(), trans(), diag(), + bindings::size_column_op(ap, trans()), + bindings::begin_value(ap), bindings::begin_value(x), + bindings::stride(x) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the tpsv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tpsv. Its overload differs for +// +template< typename MatrixAP, typename VectorX > +inline typename tpsv_impl< typename bindings::value_type< + MatrixAP >::type >::result_type +tpsv( const MatrixAP& ap, VectorX& x ) { + tpsv_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, x ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/trmv.hpp b/sdk/boost/numeric/bindings/blas/level2/trmv.hpp new file mode 100644 index 0000000..2950aa7 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/trmv.hpp @@ -0,0 +1,302 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_TRMV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_TRMV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trmv( const Order, const UpLo, const Trans, const Diag, + const int n, const float* a, const int lda, float* x, + const int incx ) { + cblas_strmv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, a, + lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trmv( const Order, const UpLo, const Trans, const Diag, + const int n, const double* a, const int lda, double* x, + const int incx ) { + cblas_dtrmv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, a, + lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trmv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* a, const int lda, + std::complex* x, const int incx ) { + cblas_ctrmv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, a, + lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trmv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* a, const int lda, + std::complex* x, const int incx ) { + cblas_ztrmv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, a, + lda, x, incx ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trmv( const Order, const UpLo, const Trans, const Diag, + const int n, const float* a, const int lda, float* x, + const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasStrmv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trmv( const Order, const UpLo, const Trans, const Diag, + const int n, const double* a, const int lda, double* x, + const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDtrmv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trmv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* a, const int lda, + std::complex* x, const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCtrmv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trmv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* a, const int lda, + std::complex* x, const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZtrmv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, a, lda, x, incx ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trmv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const float* a, const fortran_int_t lda, + float* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_STRMV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, a, &lda, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trmv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const double* a, const fortran_int_t lda, + double* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DTRMV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, a, &lda, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trmv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, std::complex* x, + const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CTRMV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, a, &lda, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trmv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, std::complex* x, + const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZTRMV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, a, &lda, x, &incx ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to trmv. +// +template< typename Value > +struct trmv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorX > + static result_type invoke( const MatrixA& a, VectorX& x ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename detail::default_order< MatrixA >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::trmv( order(), uplo(), trans(), diag(), + bindings::size_column_op(a, trans()), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(x), bindings::stride(x) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the trmv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for trmv. Its overload differs for +// +template< typename MatrixA, typename VectorX > +inline typename trmv_impl< typename bindings::value_type< + MatrixA >::type >::result_type +trmv( const MatrixA& a, VectorX& x ) { + trmv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, x ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level2/trsv.hpp b/sdk/boost/numeric/bindings/blas/level2/trsv.hpp new file mode 100644 index 0000000..e673573 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level2/trsv.hpp @@ -0,0 +1,302 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_TRSV_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL2_TRSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trsv( const Order, const UpLo, const Trans, const Diag, + const int n, const float* a, const int lda, float* x, + const int incx ) { + cblas_strsv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, a, + lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trsv( const Order, const UpLo, const Trans, const Diag, + const int n, const double* a, const int lda, double* x, + const int incx ) { + cblas_dtrsv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, a, + lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trsv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* a, const int lda, + std::complex* x, const int incx ) { + cblas_ctrsv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, a, + lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trsv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* a, const int lda, + std::complex* x, const int incx ) { + cblas_ztrsv( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, cblas_option< Diag >::value, n, a, + lda, x, incx ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trsv( const Order, const UpLo, const Trans, const Diag, + const int n, const float* a, const int lda, float* x, + const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasStrsv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trsv( const Order, const UpLo, const Trans, const Diag, + const int n, const double* a, const int lda, double* x, + const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDtrsv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trsv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* a, const int lda, + std::complex* x, const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCtrsv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, a, lda, x, incx ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trsv( const Order, const UpLo, const Trans, const Diag, + const int n, const std::complex* a, const int lda, + std::complex* x, const int incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZtrsv( blas_option< UpLo >::value, blas_option< Trans >::value, + blas_option< Diag >::value, n, a, lda, x, incx ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trsv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const float* a, const fortran_int_t lda, + float* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_STRSV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, a, &lda, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trsv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const double* a, const fortran_int_t lda, + double* x, const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DTRSV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, a, &lda, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trsv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, std::complex* x, + const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CTRSV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, a, &lda, x, &incx ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans, typename Diag > +inline void trsv( const Order, const UpLo, const Trans, const Diag, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, std::complex* x, + const fortran_int_t incx ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZTRSV( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &blas_option< Diag >::value, &n, a, &lda, x, &incx ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to trsv. +// +template< typename Value > +struct trsv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorX > + static result_type invoke( const MatrixA& a, VectorX& x ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename detail::default_order< MatrixA >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + detail::trsv( order(), uplo(), trans(), diag(), + bindings::size_column_op(a, trans()), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(x), bindings::stride(x) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the trsv_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for trsv. Its overload differs for +// +template< typename MatrixA, typename VectorX > +inline typename trsv_impl< typename bindings::value_type< + MatrixA >::type >::result_type +trsv( const MatrixA& a, VectorX& x ) { + trsv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, x ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level3.hpp b/sdk/boost/numeric/bindings/blas/level3.hpp new file mode 100644 index 0000000..c7b5b75 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level3.hpp @@ -0,0 +1,22 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level3/gemm.hpp b/sdk/boost/numeric/bindings/blas/level3/gemm.hpp new file mode 100644 index 0000000..d119243 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level3/gemm.hpp @@ -0,0 +1,338 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_GEMM_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_GEMM_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename TransA, typename TransB > +inline void gemm( const Order, const TransA, const TransB, const int m, + const int n, const int k, const float alpha, const float* a, + const int lda, const float* b, const int ldb, const float beta, + float* c, const int ldc ) { + cblas_sgemm( cblas_option< Order >::value, cblas_option< TransA >::value, + cblas_option< TransB >::value, m, n, k, alpha, a, lda, b, ldb, + beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename TransA, typename TransB > +inline void gemm( const Order, const TransA, const TransB, const int m, + const int n, const int k, const double alpha, const double* a, + const int lda, const double* b, const int ldb, const double beta, + double* c, const int ldc ) { + cblas_dgemm( cblas_option< Order >::value, cblas_option< TransA >::value, + cblas_option< TransB >::value, m, n, k, alpha, a, lda, b, ldb, + beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename TransA, typename TransB > +inline void gemm( const Order, const TransA, const TransB, const int m, + const int n, const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + cblas_cgemm( cblas_option< Order >::value, cblas_option< TransA >::value, + cblas_option< TransB >::value, m, n, k, &alpha, a, lda, b, ldb, + &beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename TransA, typename TransB > +inline void gemm( const Order, const TransA, const TransB, const int m, + const int n, const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + cblas_zgemm( cblas_option< Order >::value, cblas_option< TransA >::value, + cblas_option< TransB >::value, m, n, k, &alpha, a, lda, b, ldb, + &beta, c, ldc ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename TransA, typename TransB > +inline void gemm( const Order, const TransA, const TransB, const int m, + const int n, const int k, const float alpha, const float* a, + const int lda, const float* b, const int ldb, const float beta, + float* c, const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSgemm( blas_option< TransA >::value, blas_option< TransB >::value, + m, n, k, alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename TransA, typename TransB > +inline void gemm( const Order, const TransA, const TransB, const int m, + const int n, const int k, const double alpha, const double* a, + const int lda, const double* b, const int ldb, const double beta, + double* c, const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDgemm( blas_option< TransA >::value, blas_option< TransB >::value, + m, n, k, alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename TransA, typename TransB > +inline void gemm( const Order, const TransA, const TransB, const int m, + const int n, const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCgemm( blas_option< TransA >::value, blas_option< TransB >::value, + m, n, k, alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename TransA, typename TransB > +inline void gemm( const Order, const TransA, const TransB, const int m, + const int n, const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZgemm( blas_option< TransA >::value, blas_option< TransB >::value, + m, n, k, alpha, a, lda, b, ldb, beta, c, ldc ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename TransA, typename TransB > +inline void gemm( const Order, const TransA, const TransB, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t k, + const float alpha, const float* a, const fortran_int_t lda, + const float* b, const fortran_int_t ldb, const float beta, float* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SGEMM( &blas_option< TransA >::value, &blas_option< TransB >::value, + &m, &n, &k, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename TransA, typename TransB > +inline void gemm( const Order, const TransA, const TransB, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t k, + const double alpha, const double* a, const fortran_int_t lda, + const double* b, const fortran_int_t ldb, const double beta, + double* c, const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DGEMM( &blas_option< TransA >::value, &blas_option< TransB >::value, + &m, &n, &k, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename TransA, typename TransB > +inline void gemm( const Order, const TransA, const TransB, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t k, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, const std::complex* b, + const fortran_int_t ldb, const std::complex beta, + std::complex* c, const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CGEMM( &blas_option< TransA >::value, &blas_option< TransB >::value, + &m, &n, &k, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename TransA, typename TransB > +inline void gemm( const Order, const TransA, const TransB, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t k, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, const std::complex* b, + const fortran_int_t ldb, const std::complex beta, + std::complex* c, const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZGEMM( &blas_option< TransA >::value, &blas_option< TransB >::value, + &m, &n, &k, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gemm. +// +template< typename Value > +struct gemm_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixC > + static result_type invoke( const value_type alpha, const MatrixA& a, + const MatrixB& b, const value_type beta, MatrixC& c ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixB, order >::type transb; + typedef typename result_of::trans_tag< MatrixA, order >::type transa; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + detail::gemm( order(), transa(), transb(), + bindings::size_row(c), bindings::size_column(c), + bindings::size_column(a), alpha, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), beta, bindings::begin_value(c), + bindings::stride_major(c) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the gemm_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gemm. Its overload differs for +// +template< typename MatrixA, typename MatrixB, typename MatrixC > +inline typename gemm_impl< typename bindings::value_type< + MatrixA >::type >::result_type +gemm( const typename bindings::value_type< MatrixA >::type alpha, + const MatrixA& a, const MatrixB& b, + const typename bindings::value_type< MatrixA >::type beta, + MatrixC& c ) { + gemm_impl< typename bindings::value_type< + MatrixA >::type >::invoke( alpha, a, b, beta, c ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level3/hemm.hpp b/sdk/boost/numeric/bindings/blas/level3/hemm.hpp new file mode 100644 index 0000000..8c74d2d --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level3/hemm.hpp @@ -0,0 +1,336 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_HEMM_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_HEMM_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void hemm( const Order, const Side, const UpLo, const int m, + const int n, const float alpha, const float* a, const int lda, + const float* b, const int ldb, const float beta, float* c, + const int ldc ) { + cblas_ssymm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, m, n, alpha, a, lda, b, ldb, beta, c, + ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void hemm( const Order, const Side, const UpLo, const int m, + const int n, const double alpha, const double* a, const int lda, + const double* b, const int ldb, const double beta, double* c, + const int ldc ) { + cblas_dsymm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, m, n, alpha, a, lda, b, ldb, beta, c, + ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void hemm( const Order, const Side, const UpLo, const int m, + const int n, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + cblas_chemm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, m, n, &alpha, a, lda, b, ldb, &beta, + c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void hemm( const Order, const Side, const UpLo, const int m, + const int n, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + cblas_zhemm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, m, n, &alpha, a, lda, b, ldb, &beta, + c, ldc ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void hemm( const Order, const Side, const UpLo, const int m, + const int n, const float alpha, const float* a, const int lda, + const float* b, const int ldb, const float beta, float* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsymm( blas_option< Side >::value, blas_option< UpLo >::value, m, n, + alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void hemm( const Order, const Side, const UpLo, const int m, + const int n, const double alpha, const double* a, const int lda, + const double* b, const int ldb, const double beta, double* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsymm( blas_option< Side >::value, blas_option< UpLo >::value, m, n, + alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void hemm( const Order, const Side, const UpLo, const int m, + const int n, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasChemm( blas_option< Side >::value, blas_option< UpLo >::value, m, n, + alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void hemm( const Order, const Side, const UpLo, const int m, + const int n, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZhemm( blas_option< Side >::value, blas_option< UpLo >::value, m, n, + alpha, a, lda, b, ldb, beta, c, ldc ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void hemm( const Order, const Side, const UpLo, const fortran_int_t m, + const fortran_int_t n, const float alpha, const float* a, + const fortran_int_t lda, const float* b, const fortran_int_t ldb, + const float beta, float* c, const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSYMM( &blas_option< Side >::value, &blas_option< UpLo >::value, &m, + &n, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void hemm( const Order, const Side, const UpLo, const fortran_int_t m, + const fortran_int_t n, const double alpha, const double* a, + const fortran_int_t lda, const double* b, const fortran_int_t ldb, + const double beta, double* c, const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSYMM( &blas_option< Side >::value, &blas_option< UpLo >::value, &m, + &n, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void hemm( const Order, const Side, const UpLo, const fortran_int_t m, + const fortran_int_t n, const std::complex alpha, + const std::complex* a, const fortran_int_t lda, + const std::complex* b, const fortran_int_t ldb, + const std::complex beta, std::complex* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CHEMM( &blas_option< Side >::value, &blas_option< UpLo >::value, &m, + &n, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void hemm( const Order, const Side, const UpLo, const fortran_int_t m, + const fortran_int_t n, const std::complex alpha, + const std::complex* a, const fortran_int_t lda, + const std::complex* b, const fortran_int_t ldb, + const std::complex beta, std::complex* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZHEMM( &blas_option< Side >::value, &blas_option< UpLo >::value, &m, + &n, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hemm. +// +template< typename Value > +struct hemm_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename MatrixB, + typename MatrixC > + static result_type invoke( const Side side, const value_type alpha, + const MatrixA& a, const MatrixB& b, const value_type beta, + MatrixC& c ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + detail::hemm( order(), side, uplo(), bindings::size_row(c), + bindings::size_column(c), alpha, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), beta, bindings::begin_value(c), + bindings::stride_major(c) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the hemm_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hemm. Its overload differs for +// +template< typename Side, typename MatrixA, typename MatrixB, typename MatrixC > +inline typename hemm_impl< typename bindings::value_type< + MatrixA >::type >::result_type +hemm( const Side side, const typename bindings::value_type< + MatrixA >::type alpha, const MatrixA& a, const MatrixB& b, + const typename bindings::value_type< MatrixA >::type beta, + MatrixC& c ) { + hemm_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, alpha, a, b, beta, c ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level3/her2k.hpp b/sdk/boost/numeric/bindings/blas/level3/her2k.hpp new file mode 100644 index 0000000..47596a5 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level3/her2k.hpp @@ -0,0 +1,334 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_HER2K_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_HER2K_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void her2k( const Order, const UpLo, const Trans, const int n, + const int k, const float alpha, const float* a, const int lda, + const float* b, const int ldb, const float beta, float* c, + const int ldc ) { + cblas_ssyr2k( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, alpha, a, lda, b, ldb, beta, + c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void her2k( const Order, const UpLo, const Trans, const int n, + const int k, const double alpha, const double* a, const int lda, + const double* b, const int ldb, const double beta, double* c, + const int ldc ) { + cblas_dsyr2k( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, alpha, a, lda, b, ldb, beta, + c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void her2k( const Order, const UpLo, const Trans, const int n, + const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, const float beta, + std::complex* c, const int ldc ) { + cblas_cher2k( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, &alpha, a, lda, b, ldb, beta, + c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void her2k( const Order, const UpLo, const Trans, const int n, + const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, const double beta, + std::complex* c, const int ldc ) { + cblas_zher2k( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, &alpha, a, lda, b, ldb, beta, + c, ldc ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void her2k( const Order, const UpLo, const Trans, const int n, + const int k, const float alpha, const float* a, const int lda, + const float* b, const int ldb, const float beta, float* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsyr2k( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void her2k( const Order, const UpLo, const Trans, const int n, + const int k, const double alpha, const double* a, const int lda, + const double* b, const int ldb, const double beta, double* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsyr2k( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void her2k( const Order, const UpLo, const Trans, const int n, + const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, const float beta, + std::complex* c, const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCher2k( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void her2k( const Order, const UpLo, const Trans, const int n, + const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, const double beta, + std::complex* c, const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZher2k( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, b, ldb, beta, c, ldc ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void her2k( const Order, const UpLo, const Trans, + const fortran_int_t n, const fortran_int_t k, const float alpha, + const float* a, const fortran_int_t lda, const float* b, + const fortran_int_t ldb, const float beta, float* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSYR2K( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &n, &k, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void her2k( const Order, const UpLo, const Trans, + const fortran_int_t n, const fortran_int_t k, const double alpha, + const double* a, const fortran_int_t lda, const double* b, + const fortran_int_t ldb, const double beta, double* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSYR2K( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &n, &k, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void her2k( const Order, const UpLo, const Trans, + const fortran_int_t n, const fortran_int_t k, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, const std::complex* b, + const fortran_int_t ldb, const float beta, std::complex* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CHER2K( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &n, &k, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void her2k( const Order, const UpLo, const Trans, + const fortran_int_t n, const fortran_int_t k, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, const std::complex* b, + const fortran_int_t ldb, const double beta, std::complex* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZHER2K( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &n, &k, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to her2k. +// +template< typename Value > +struct her2k_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixC > + static result_type invoke( const value_type alpha, const MatrixA& a, + const MatrixB& b, const real_type beta, MatrixC& c ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixC >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + detail::her2k( order(), uplo(), trans(), + bindings::size_column(c), bindings::size_column(a), alpha, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), beta, + bindings::begin_value(c), bindings::stride_major(c) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the her2k_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for her2k. Its overload differs for +// +template< typename MatrixA, typename MatrixB, typename MatrixC > +inline typename her2k_impl< typename bindings::value_type< + MatrixA >::type >::result_type +her2k( const typename bindings::value_type< MatrixA >::type alpha, + const MatrixA& a, const MatrixB& b, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type beta, + MatrixC& c ) { + her2k_impl< typename bindings::value_type< + MatrixA >::type >::invoke( alpha, a, b, beta, c ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level3/herk.hpp b/sdk/boost/numeric/bindings/blas/level3/herk.hpp new file mode 100644 index 0000000..51818f7 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level3/herk.hpp @@ -0,0 +1,308 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_HERK_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_HERK_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void herk( const Order, const UpLo, const Trans, const int n, + const int k, const float alpha, const float* a, const int lda, + const float beta, float* c, const int ldc ) { + cblas_ssyrk( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, alpha, a, lda, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void herk( const Order, const UpLo, const Trans, const int n, + const int k, const double alpha, const double* a, const int lda, + const double beta, double* c, const int ldc ) { + cblas_dsyrk( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, alpha, a, lda, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void herk( const Order, const UpLo, const Trans, const int n, + const int k, const float alpha, const std::complex* a, + const int lda, const float beta, std::complex* c, + const int ldc ) { + cblas_cherk( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, alpha, a, lda, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void herk( const Order, const UpLo, const Trans, const int n, + const int k, const double alpha, const std::complex* a, + const int lda, const double beta, std::complex* c, + const int ldc ) { + cblas_zherk( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, alpha, a, lda, beta, c, ldc ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void herk( const Order, const UpLo, const Trans, const int n, + const int k, const float alpha, const float* a, const int lda, + const float beta, float* c, const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsyrk( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void herk( const Order, const UpLo, const Trans, const int n, + const int k, const double alpha, const double* a, const int lda, + const double beta, double* c, const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsyrk( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void herk( const Order, const UpLo, const Trans, const int n, + const int k, const float alpha, const std::complex* a, + const int lda, const float beta, std::complex* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCherk( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void herk( const Order, const UpLo, const Trans, const int n, + const int k, const double alpha, const std::complex* a, + const int lda, const double beta, std::complex* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZherk( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, beta, c, ldc ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void herk( const Order, const UpLo, const Trans, const fortran_int_t n, + const fortran_int_t k, const float alpha, const float* a, + const fortran_int_t lda, const float beta, float* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSYRK( &blas_option< UpLo >::value, &blas_option< Trans >::value, &n, + &k, &alpha, a, &lda, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void herk( const Order, const UpLo, const Trans, const fortran_int_t n, + const fortran_int_t k, const double alpha, const double* a, + const fortran_int_t lda, const double beta, double* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSYRK( &blas_option< UpLo >::value, &blas_option< Trans >::value, &n, + &k, &alpha, a, &lda, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void herk( const Order, const UpLo, const Trans, const fortran_int_t n, + const fortran_int_t k, const float alpha, + const std::complex* a, const fortran_int_t lda, + const float beta, std::complex* c, const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CHERK( &blas_option< UpLo >::value, &blas_option< Trans >::value, &n, + &k, &alpha, a, &lda, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void herk( const Order, const UpLo, const Trans, const fortran_int_t n, + const fortran_int_t k, const double alpha, + const std::complex* a, const fortran_int_t lda, + const double beta, std::complex* c, const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZHERK( &blas_option< UpLo >::value, &blas_option< Trans >::value, &n, + &k, &alpha, a, &lda, &beta, c, &ldc ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to herk. +// +template< typename Value > +struct herk_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixC > + static result_type invoke( const real_type alpha, const MatrixA& a, + const real_type beta, MatrixC& c ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixC >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + detail::herk( order(), uplo(), trans(), + bindings::size_column(c), bindings::size_column(a), alpha, + bindings::begin_value(a), bindings::stride_major(a), beta, + bindings::begin_value(c), bindings::stride_major(c) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the herk_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for herk. Its overload differs for +// +template< typename MatrixA, typename MatrixC > +inline typename herk_impl< typename bindings::value_type< + MatrixA >::type >::result_type +herk( const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type alpha, const MatrixA& a, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type beta, MatrixC& c ) { + herk_impl< typename bindings::value_type< + MatrixA >::type >::invoke( alpha, a, beta, c ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level3/symm.hpp b/sdk/boost/numeric/bindings/blas/level3/symm.hpp new file mode 100644 index 0000000..62b54f7 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level3/symm.hpp @@ -0,0 +1,336 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_SYMM_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_SYMM_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void symm( const Order, const Side, const UpLo, const int m, + const int n, const float alpha, const float* a, const int lda, + const float* b, const int ldb, const float beta, float* c, + const int ldc ) { + cblas_ssymm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, m, n, alpha, a, lda, b, ldb, beta, c, + ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void symm( const Order, const Side, const UpLo, const int m, + const int n, const double alpha, const double* a, const int lda, + const double* b, const int ldb, const double beta, double* c, + const int ldc ) { + cblas_dsymm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, m, n, alpha, a, lda, b, ldb, beta, c, + ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void symm( const Order, const Side, const UpLo, const int m, + const int n, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + cblas_csymm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, m, n, &alpha, a, lda, b, ldb, &beta, + c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void symm( const Order, const Side, const UpLo, const int m, + const int n, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + cblas_zsymm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, m, n, &alpha, a, lda, b, ldb, &beta, + c, ldc ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void symm( const Order, const Side, const UpLo, const int m, + const int n, const float alpha, const float* a, const int lda, + const float* b, const int ldb, const float beta, float* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsymm( blas_option< Side >::value, blas_option< UpLo >::value, m, n, + alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void symm( const Order, const Side, const UpLo, const int m, + const int n, const double alpha, const double* a, const int lda, + const double* b, const int ldb, const double beta, double* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsymm( blas_option< Side >::value, blas_option< UpLo >::value, m, n, + alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void symm( const Order, const Side, const UpLo, const int m, + const int n, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCsymm( blas_option< Side >::value, blas_option< UpLo >::value, m, n, + alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void symm( const Order, const Side, const UpLo, const int m, + const int n, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZsymm( blas_option< Side >::value, blas_option< UpLo >::value, m, n, + alpha, a, lda, b, ldb, beta, c, ldc ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void symm( const Order, const Side, const UpLo, const fortran_int_t m, + const fortran_int_t n, const float alpha, const float* a, + const fortran_int_t lda, const float* b, const fortran_int_t ldb, + const float beta, float* c, const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSYMM( &blas_option< Side >::value, &blas_option< UpLo >::value, &m, + &n, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void symm( const Order, const Side, const UpLo, const fortran_int_t m, + const fortran_int_t n, const double alpha, const double* a, + const fortran_int_t lda, const double* b, const fortran_int_t ldb, + const double beta, double* c, const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSYMM( &blas_option< Side >::value, &blas_option< UpLo >::value, &m, + &n, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void symm( const Order, const Side, const UpLo, const fortran_int_t m, + const fortran_int_t n, const std::complex alpha, + const std::complex* a, const fortran_int_t lda, + const std::complex* b, const fortran_int_t ldb, + const std::complex beta, std::complex* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CSYMM( &blas_option< Side >::value, &blas_option< UpLo >::value, &m, + &n, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo > +inline void symm( const Order, const Side, const UpLo, const fortran_int_t m, + const fortran_int_t n, const std::complex alpha, + const std::complex* a, const fortran_int_t lda, + const std::complex* b, const fortran_int_t ldb, + const std::complex beta, std::complex* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZSYMM( &blas_option< Side >::value, &blas_option< UpLo >::value, &m, + &n, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to symm. +// +template< typename Value > +struct symm_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename MatrixB, + typename MatrixC > + static result_type invoke( const Side side, const value_type alpha, + const MatrixA& a, const MatrixB& b, const value_type beta, + MatrixC& c ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + detail::symm( order(), side, uplo(), bindings::size_row(c), + bindings::size_column(c), alpha, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), beta, bindings::begin_value(c), + bindings::stride_major(c) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the symm_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for symm. Its overload differs for +// +template< typename Side, typename MatrixA, typename MatrixB, typename MatrixC > +inline typename symm_impl< typename bindings::value_type< + MatrixA >::type >::result_type +symm( const Side side, const typename bindings::value_type< + MatrixA >::type alpha, const MatrixA& a, const MatrixB& b, + const typename bindings::value_type< MatrixA >::type beta, + MatrixC& c ) { + symm_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, alpha, a, b, beta, c ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level3/syr2k.hpp b/sdk/boost/numeric/bindings/blas/level3/syr2k.hpp new file mode 100644 index 0000000..89cf7d3 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level3/syr2k.hpp @@ -0,0 +1,338 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_SYR2K_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_SYR2K_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syr2k( const Order, const UpLo, const Trans, const int n, + const int k, const float alpha, const float* a, const int lda, + const float* b, const int ldb, const float beta, float* c, + const int ldc ) { + cblas_ssyr2k( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, alpha, a, lda, b, ldb, beta, + c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syr2k( const Order, const UpLo, const Trans, const int n, + const int k, const double alpha, const double* a, const int lda, + const double* b, const int ldb, const double beta, double* c, + const int ldc ) { + cblas_dsyr2k( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, alpha, a, lda, b, ldb, beta, + c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syr2k( const Order, const UpLo, const Trans, const int n, + const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + cblas_csyr2k( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, &alpha, a, lda, b, ldb, &beta, + c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syr2k( const Order, const UpLo, const Trans, const int n, + const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + cblas_zsyr2k( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, &alpha, a, lda, b, ldb, &beta, + c, ldc ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syr2k( const Order, const UpLo, const Trans, const int n, + const int k, const float alpha, const float* a, const int lda, + const float* b, const int ldb, const float beta, float* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsyr2k( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syr2k( const Order, const UpLo, const Trans, const int n, + const int k, const double alpha, const double* a, const int lda, + const double* b, const int ldb, const double beta, double* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsyr2k( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syr2k( const Order, const UpLo, const Trans, const int n, + const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCsyr2k( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, b, ldb, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syr2k( const Order, const UpLo, const Trans, const int n, + const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex* b, const int ldb, + const std::complex beta, std::complex* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZsyr2k( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, b, ldb, beta, c, ldc ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syr2k( const Order, const UpLo, const Trans, + const fortran_int_t n, const fortran_int_t k, const float alpha, + const float* a, const fortran_int_t lda, const float* b, + const fortran_int_t ldb, const float beta, float* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSYR2K( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &n, &k, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syr2k( const Order, const UpLo, const Trans, + const fortran_int_t n, const fortran_int_t k, const double alpha, + const double* a, const fortran_int_t lda, const double* b, + const fortran_int_t ldb, const double beta, double* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSYR2K( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &n, &k, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syr2k( const Order, const UpLo, const Trans, + const fortran_int_t n, const fortran_int_t k, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, const std::complex* b, + const fortran_int_t ldb, const std::complex beta, + std::complex* c, const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CSYR2K( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &n, &k, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syr2k( const Order, const UpLo, const Trans, + const fortran_int_t n, const fortran_int_t k, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, const std::complex* b, + const fortran_int_t ldb, const std::complex beta, + std::complex* c, const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZSYR2K( &blas_option< UpLo >::value, &blas_option< Trans >::value, + &n, &k, &alpha, a, &lda, b, &ldb, &beta, c, &ldc ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to syr2k. +// +template< typename Value > +struct syr2k_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixC > + static result_type invoke( const value_type alpha, const MatrixA& a, + const MatrixB& b, const value_type beta, MatrixC& c ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixC >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + detail::syr2k( order(), uplo(), trans(), + bindings::size_column(c), bindings::size_column(a), alpha, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), beta, + bindings::begin_value(c), bindings::stride_major(c) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the syr2k_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for syr2k. Its overload differs for +// +template< typename MatrixA, typename MatrixB, typename MatrixC > +inline typename syr2k_impl< typename bindings::value_type< + MatrixA >::type >::result_type +syr2k( const typename bindings::value_type< MatrixA >::type alpha, + const MatrixA& a, const MatrixB& b, + const typename bindings::value_type< MatrixA >::type beta, + MatrixC& c ) { + syr2k_impl< typename bindings::value_type< + MatrixA >::type >::invoke( alpha, a, b, beta, c ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level3/syrk.hpp b/sdk/boost/numeric/bindings/blas/level3/syrk.hpp new file mode 100644 index 0000000..d4806dd --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level3/syrk.hpp @@ -0,0 +1,315 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_SYRK_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_SYRK_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syrk( const Order, const UpLo, const Trans, const int n, + const int k, const float alpha, const float* a, const int lda, + const float beta, float* c, const int ldc ) { + cblas_ssyrk( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, alpha, a, lda, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syrk( const Order, const UpLo, const Trans, const int n, + const int k, const double alpha, const double* a, const int lda, + const double beta, double* c, const int ldc ) { + cblas_dsyrk( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, alpha, a, lda, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syrk( const Order, const UpLo, const Trans, const int n, + const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex beta, std::complex* c, + const int ldc ) { + cblas_csyrk( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, &alpha, a, lda, &beta, c, + ldc ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syrk( const Order, const UpLo, const Trans, const int n, + const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex beta, std::complex* c, + const int ldc ) { + cblas_zsyrk( cblas_option< Order >::value, cblas_option< UpLo >::value, + cblas_option< Trans >::value, n, k, &alpha, a, lda, &beta, c, + ldc ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syrk( const Order, const UpLo, const Trans, const int n, + const int k, const float alpha, const float* a, const int lda, + const float beta, float* c, const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasSsyrk( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syrk( const Order, const UpLo, const Trans, const int n, + const int k, const double alpha, const double* a, const int lda, + const double beta, double* c, const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDsyrk( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syrk( const Order, const UpLo, const Trans, const int n, + const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex beta, std::complex* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCsyrk( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, beta, c, ldc ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syrk( const Order, const UpLo, const Trans, const int n, + const int k, const std::complex alpha, + const std::complex* a, const int lda, + const std::complex beta, std::complex* c, + const int ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZsyrk( blas_option< UpLo >::value, blas_option< Trans >::value, n, + k, alpha, a, lda, beta, c, ldc ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syrk( const Order, const UpLo, const Trans, const fortran_int_t n, + const fortran_int_t k, const float alpha, const float* a, + const fortran_int_t lda, const float beta, float* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_SSYRK( &blas_option< UpLo >::value, &blas_option< Trans >::value, &n, + &k, &alpha, a, &lda, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syrk( const Order, const UpLo, const Trans, const fortran_int_t n, + const fortran_int_t k, const double alpha, const double* a, + const fortran_int_t lda, const double beta, double* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DSYRK( &blas_option< UpLo >::value, &blas_option< Trans >::value, &n, + &k, &alpha, a, &lda, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syrk( const Order, const UpLo, const Trans, const fortran_int_t n, + const fortran_int_t k, const std::complex alpha, + const std::complex* a, const fortran_int_t lda, + const std::complex beta, std::complex* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CSYRK( &blas_option< UpLo >::value, &blas_option< Trans >::value, &n, + &k, &alpha, a, &lda, &beta, c, &ldc ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Trans > +inline void syrk( const Order, const UpLo, const Trans, const fortran_int_t n, + const fortran_int_t k, const std::complex alpha, + const std::complex* a, const fortran_int_t lda, + const std::complex beta, std::complex* c, + const fortran_int_t ldc ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZSYRK( &blas_option< UpLo >::value, &blas_option< Trans >::value, &n, + &k, &alpha, a, &lda, &beta, c, &ldc ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to syrk. +// +template< typename Value > +struct syrk_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixC > + static result_type invoke( const value_type alpha, const MatrixA& a, + const value_type beta, MatrixC& c ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixC >::type uplo; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + detail::syrk( order(), uplo(), trans(), + bindings::size_column(c), bindings::size_column(a), alpha, + bindings::begin_value(a), bindings::stride_major(a), beta, + bindings::begin_value(c), bindings::stride_major(c) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the syrk_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for syrk. Its overload differs for +// +template< typename MatrixA, typename MatrixC > +inline typename syrk_impl< typename bindings::value_type< + MatrixA >::type >::result_type +syrk( const typename bindings::value_type< MatrixA >::type alpha, + const MatrixA& a, const typename bindings::value_type< + MatrixA >::type beta, MatrixC& c ) { + syrk_impl< typename bindings::value_type< + MatrixA >::type >::invoke( alpha, a, beta, c ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level3/trmm.hpp b/sdk/boost/numeric/bindings/blas/level3/trmm.hpp new file mode 100644 index 0000000..48bc2b3 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level3/trmm.hpp @@ -0,0 +1,334 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_TRMM_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_TRMM_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trmm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, const float alpha, + const float* a, const int lda, float* b, const int ldb ) { + cblas_strmm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, cblas_option< TransA >::value, + cblas_option< Diag >::value, m, n, alpha, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trmm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, const double alpha, + const double* a, const int lda, double* b, const int ldb ) { + cblas_dtrmm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, cblas_option< TransA >::value, + cblas_option< Diag >::value, m, n, alpha, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trmm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, const std::complex alpha, + const std::complex* a, const int lda, std::complex* b, + const int ldb ) { + cblas_ctrmm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, cblas_option< TransA >::value, + cblas_option< Diag >::value, m, n, &alpha, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trmm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, + const std::complex alpha, const std::complex* a, + const int lda, std::complex* b, const int ldb ) { + cblas_ztrmm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, cblas_option< TransA >::value, + cblas_option< Diag >::value, m, n, &alpha, a, lda, b, ldb ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trmm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, const float alpha, + const float* a, const int lda, float* b, const int ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasStrmm( blas_option< Side >::value, blas_option< UpLo >::value, + blas_option< TransA >::value, blas_option< Diag >::value, m, n, + alpha, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trmm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, const double alpha, + const double* a, const int lda, double* b, const int ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDtrmm( blas_option< Side >::value, blas_option< UpLo >::value, + blas_option< TransA >::value, blas_option< Diag >::value, m, n, + alpha, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trmm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, const std::complex alpha, + const std::complex* a, const int lda, std::complex* b, + const int ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCtrmm( blas_option< Side >::value, blas_option< UpLo >::value, + blas_option< TransA >::value, blas_option< Diag >::value, m, n, + alpha, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trmm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, + const std::complex alpha, const std::complex* a, + const int lda, std::complex* b, const int ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZtrmm( blas_option< Side >::value, blas_option< UpLo >::value, + blas_option< TransA >::value, blas_option< Diag >::value, m, n, + alpha, a, lda, b, ldb ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trmm( const Order, const Side, const UpLo, const TransA, + const Diag, const fortran_int_t m, const fortran_int_t n, + const float alpha, const float* a, const fortran_int_t lda, float* b, + const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_STRMM( &blas_option< Side >::value, &blas_option< UpLo >::value, + &blas_option< TransA >::value, &blas_option< Diag >::value, &m, + &n, &alpha, a, &lda, b, &ldb ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trmm( const Order, const Side, const UpLo, const TransA, + const Diag, const fortran_int_t m, const fortran_int_t n, + const double alpha, const double* a, const fortran_int_t lda, + double* b, const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DTRMM( &blas_option< Side >::value, &blas_option< UpLo >::value, + &blas_option< TransA >::value, &blas_option< Diag >::value, &m, + &n, &alpha, a, &lda, b, &ldb ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trmm( const Order, const Side, const UpLo, const TransA, + const Diag, const fortran_int_t m, const fortran_int_t n, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CTRMM( &blas_option< Side >::value, &blas_option< UpLo >::value, + &blas_option< TransA >::value, &blas_option< Diag >::value, &m, + &n, &alpha, a, &lda, b, &ldb ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trmm( const Order, const Side, const UpLo, const TransA, + const Diag, const fortran_int_t m, const fortran_int_t n, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZTRMM( &blas_option< Side >::value, &blas_option< UpLo >::value, + &blas_option< TransA >::value, &blas_option< Diag >::value, &m, + &n, &alpha, a, &lda, b, &ldb ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to trmm. +// +template< typename Value > +struct trmm_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename MatrixB > + static result_type invoke( const Side side, const value_type alpha, + const MatrixA& a, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type transa; + typedef typename result_of::uplo_tag< MatrixA, transa >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + detail::trmm( order(), side, uplo(), transa(), diag(), + bindings::size_row(b), bindings::size_column(b), alpha, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the trmm_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for trmm. Its overload differs for +// +template< typename Side, typename MatrixA, typename MatrixB > +inline typename trmm_impl< typename bindings::value_type< + MatrixA >::type >::result_type +trmm( const Side side, const typename bindings::value_type< + MatrixA >::type alpha, const MatrixA& a, MatrixB& b ) { + trmm_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, alpha, a, b ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/blas/level3/trsm.hpp b/sdk/boost/numeric/bindings/blas/level3/trsm.hpp new file mode 100644 index 0000000..6f91c34 --- /dev/null +++ b/sdk/boost/numeric/bindings/blas/level3/trsm.hpp @@ -0,0 +1,334 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_TRSM_HPP +#define BOOST_NUMERIC_BINDINGS_BLAS_LEVEL3_TRSM_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The BLAS-backend is selected by defining a pre-processor variable, +// which can be one of +// * for CBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// * for CUBLAS, define BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// * netlib-compatible BLAS is the default +// +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +#include +#include +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace blas { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end BLAS-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * float value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trsm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, const float alpha, + const float* a, const int lda, float* b, const int ldb ) { + cblas_strsm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, cblas_option< TransA >::value, + cblas_option< Diag >::value, m, n, alpha, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * double value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trsm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, const double alpha, + const double* a, const int lda, double* b, const int ldb ) { + cblas_dtrsm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, cblas_option< TransA >::value, + cblas_option< Diag >::value, m, n, alpha, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trsm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, const std::complex alpha, + const std::complex* a, const int lda, std::complex* b, + const int ldb ) { + cblas_ctrsm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, cblas_option< TransA >::value, + cblas_option< Diag >::value, m, n, &alpha, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * CBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trsm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, + const std::complex alpha, const std::complex* a, + const int lda, std::complex* b, const int ldb ) { + cblas_ztrsm( cblas_option< Order >::value, cblas_option< Side >::value, + cblas_option< UpLo >::value, cblas_option< TransA >::value, + cblas_option< Diag >::value, m, n, &alpha, a, lda, b, ldb ); +} + +#elif defined BOOST_NUMERIC_BINDINGS_BLAS_CUBLAS +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * float value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trsm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, const float alpha, + const float* a, const int lda, float* b, const int ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasStrsm( blas_option< Side >::value, blas_option< UpLo >::value, + blas_option< TransA >::value, blas_option< Diag >::value, m, n, + alpha, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * double value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trsm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, const double alpha, + const double* a, const int lda, double* b, const int ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasDtrsm( blas_option< Side >::value, blas_option< UpLo >::value, + blas_option< TransA >::value, blas_option< Diag >::value, m, n, + alpha, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trsm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, const std::complex alpha, + const std::complex* a, const int lda, std::complex* b, + const int ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasCtrsm( blas_option< Side >::value, blas_option< UpLo >::value, + blas_option< TransA >::value, blas_option< Diag >::value, m, n, + alpha, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * CUBLAS backend, and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trsm( const Order, const Side, const UpLo, const TransA, + const Diag, const int m, const int n, + const std::complex alpha, const std::complex* a, + const int lda, std::complex* b, const int ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + cublasZtrsm( blas_option< Side >::value, blas_option< UpLo >::value, + blas_option< TransA >::value, blas_option< Diag >::value, m, n, + alpha, a, lda, b, ldb ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * float value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trsm( const Order, const Side, const UpLo, const TransA, + const Diag, const fortran_int_t m, const fortran_int_t n, + const float alpha, const float* a, const fortran_int_t lda, float* b, + const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_STRSM( &blas_option< Side >::value, &blas_option< UpLo >::value, + &blas_option< TransA >::value, &blas_option< Diag >::value, &m, + &n, &alpha, a, &lda, b, &ldb ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * double value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trsm( const Order, const Side, const UpLo, const TransA, + const Diag, const fortran_int_t m, const fortran_int_t n, + const double alpha, const double* a, const fortran_int_t lda, + double* b, const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_DTRSM( &blas_option< Side >::value, &blas_option< UpLo >::value, + &blas_option< TransA >::value, &blas_option< Diag >::value, &m, + &n, &alpha, a, &lda, b, &ldb ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trsm( const Order, const Side, const UpLo, const TransA, + const Diag, const fortran_int_t m, const fortran_int_t n, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_CTRSM( &blas_option< Side >::value, &blas_option< UpLo >::value, + &blas_option< TransA >::value, &blas_option< Diag >::value, &m, + &n, &alpha, a, &lda, b, &ldb ); +} + +// +// Overloaded function for dispatching to +// * netlib-compatible BLAS backend (the default), and +// * complex value-type. +// +template< typename Order, typename Side, typename UpLo, typename TransA, + typename Diag > +inline void trsm( const Order, const Side, const UpLo, const TransA, + const Diag, const fortran_int_t m, const fortran_int_t n, + const std::complex alpha, const std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + BLAS_ZTRSM( &blas_option< Side >::value, &blas_option< UpLo >::value, + &blas_option< TransA >::value, &blas_option< Diag >::value, &m, + &n, &alpha, a, &lda, b, &ldb ); +} + +#endif + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to trsm. +// +template< typename Value > +struct trsm_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + typedef void result_type; + + // + // Static member function that + // * Deduces the required arguments for dispatching to BLAS, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename MatrixB > + static result_type invoke( const Side side, const value_type alpha, + const MatrixA& a, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type transa; + typedef typename result_of::uplo_tag< MatrixA, transa >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::has_linear_array< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + detail::trsm( order(), side, uplo(), transa(), diag(), + bindings::size_row(b), bindings::size_column(b), alpha, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b) ); + } +}; + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. Calls +// to these functions are passed to the trsm_impl classes. In the +// documentation, the const-overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for trsm. Its overload differs for +// +template< typename Side, typename MatrixA, typename MatrixB > +inline typename trsm_impl< typename bindings::value_type< + MatrixA >::type >::result_type +trsm( const Side side, const typename bindings::value_type< + MatrixA >::type alpha, const MatrixA& a, MatrixB& b ) { + trsm_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, alpha, a, b ); +} + +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/boost/array.hpp b/sdk/boost/numeric/bindings/boost/array.hpp new file mode 100644 index 0000000..22f2c8d --- /dev/null +++ b/sdk/boost/numeric/bindings/boost/array.hpp @@ -0,0 +1,47 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BOOST_ARRAY_HPP +#define BOOST_NUMERIC_BINDINGS_BOOST_ARRAY_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, std::size_t N, typename Id, typename Enable > +struct adaptor< boost::array, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, mpl::int_ >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, tag::contiguous > + > property_map; + + static value_type* begin_value( Id& t ) { + return t.begin(); + } + + static value_type* end_value( Id& t ) { + return t.end(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/boost/multi_array.hpp b/sdk/boost/numeric/bindings/boost/multi_array.hpp new file mode 100644 index 0000000..5dd0c8b --- /dev/null +++ b/sdk/boost/numeric/bindings/boost/multi_array.hpp @@ -0,0 +1,87 @@ +// +// Copyright (c) 2010 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_BOOST_MULTI_ARRAY_HPP +#define BOOST_NUMERIC_BINDINGS_BOOST_MULTI_ARRAY_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename Map, typename AddressingIndex > +struct multi_array_dim_inserter { + + typedef typename mpl::insert< + typename mpl::insert< + Map, + mpl::pair< tag::size_type< AddressingIndex::value >, std::ptrdiff_t > + >::type, + mpl::pair< tag::stride_type< AddressingIndex::value >, std::ptrdiff_t > + >::type type; + +}; + +template< typename T, std::size_t Dim, typename Alloc, typename Id, typename Enable > +struct adaptor< boost::multi_array, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::tensor< Dim > >, + mpl::pair< tag::data_order, tag::row_major >, + mpl::pair< tag::data_structure, tag::linear_array > + > basic_map; + typedef typename mpl::fold< + mpl::range_c< std::size_t, 1, Dim+1 >, + basic_map, + multi_array_dim_inserter< + mpl::_1, + mpl::_2 + > + >::type property_map; + + // Sizes are only reachable if Addressing Index <= Dim, otherwise + // the default (1) will be returned + static std::ptrdiff_t size1( const Id& id ) { + return id.shape()[0]; + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.shape()[1]; + } + + static std::ptrdiff_t stride1( const Id& id ) { + return id.strides()[0]; + } + + // Only reachable if dimension D is sufficient + static std::ptrdiff_t stride2( const Id& id ) { + return id.strides()[1]; + } + + static value_type* begin_value( Id& id ) { + return id.data(); + } + + static value_type* end_value( Id& id ) { + return id.data()+id.num_elements(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/column.hpp b/sdk/boost/numeric/bindings/column.hpp new file mode 100644 index 0000000..f636006 --- /dev/null +++ b/sdk/boost/numeric/bindings/column.hpp @@ -0,0 +1,96 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_COLUMN_HPP +#define BOOST_NUMERIC_BINDINGS_COLUMN_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T > +struct column_wrapper: + adaptable_type< column_wrapper >, + reference_wrapper { + + column_wrapper( T& t, std::size_t index ): + reference_wrapper(t), + m_index( index ) {} + + std::size_t m_index; +}; + +template< typename T, typename Id, typename Enable > +struct adaptor< column_wrapper, Id, Enable > { + + typedef typename bindings::value_type< T>::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, typename result_of::size1::type >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, typename result_of::stride1::type > + > property_map; + + static typename result_of::size1::type size1( const Id& id ) { + return bindings::size1( id.get() ); + } + + static typename result_of::begin_value< T >::type begin_value( Id& id ) { + return bindings::begin_value( id.get() ) + + offset( id.get(), 0, id.m_index ); + } + + static typename result_of::end_value< T >::type end_value( Id& id ) { + return bindings::begin_value( id.get() ) + + offset( id.get(), size1(id), id.m_index ); + } + + static typename result_of::stride1::type stride1( const Id& id ) { + return bindings::stride1( id.get() ); + } + +}; + + +} // namespace detail + +namespace result_of { + +template< typename T > +struct column { + typedef detail::column_wrapper type; +}; + +} + +template< typename T > +detail::column_wrapper const column( T& underlying, std::size_t index ) { + return detail::column_wrapper( underlying, index ); +} + +template< typename T > +detail::column_wrapper const column( const T& underlying, std::size_t index ) { + return detail::column_wrapper( underlying, index ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/conj.hpp b/sdk/boost/numeric/bindings/conj.hpp new file mode 100644 index 0000000..888c70b --- /dev/null +++ b/sdk/boost/numeric/bindings/conj.hpp @@ -0,0 +1,48 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_CONJ_HPP +#define BOOST_NUMERIC_BINDINGS_CONJ_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { + +namespace result_of { + +template< typename T > +struct conj { + typedef detail::trans_wrapper< + T, + typename mpl::if_< + detail::is_same_at< T, tag::value_transform, tag::conjugate >, + mpl::pair< tag::value_transform, mpl::void_ >, + mpl::pair< tag::value_transform, tag::conjugate > + >::type + > type; +}; + +} + +template< typename T > +typename result_of::conj< T >::type const conj( T& t ) { + return typename result_of::conj< T >::type( t ); +} + +template< typename T > +typename result_of::conj< const T >::type const conj( const T& t ) { + return typename result_of::conj< const T >::type( t ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/data_order.hpp b/sdk/boost/numeric/bindings/data_order.hpp new file mode 100644 index 0000000..ad3eb89 --- /dev/null +++ b/sdk/boost/numeric/bindings/data_order.hpp @@ -0,0 +1,44 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DATA_ORDER_HPP +#define BOOST_NUMERIC_BINDINGS_DATA_ORDER_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace result_of { + +template< typename T, typename Enable = void > +struct data_order {}; + +template< typename T > +struct data_order< T, typename boost::enable_if< is_column_major >::type > { + typedef tag::column_major type; +}; + +template< typename T > +struct data_order< T, typename boost::enable_if< is_row_major >::type > { + typedef tag::row_major type; +}; + +} // namespace result_of + +template< typename T > +typename result_of::data_order::type data_order( const T& ) { + return typename result_of::data_order::type(); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/data_side.hpp b/sdk/boost/numeric/bindings/data_side.hpp new file mode 100644 index 0000000..babdcfd --- /dev/null +++ b/sdk/boost/numeric/bindings/data_side.hpp @@ -0,0 +1,35 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DATA_SIDE_HPP +#define BOOST_NUMERIC_BINDINGS_DATA_SIDE_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace result_of { + +template< typename T > +struct data_side { + typedef typename detail::property_at< T, tag::data_side >::type type; +}; + +} // namespace result_of + +template< typename T > +typename result_of::data_side::type data_side( const T& ) { + return result_of::data_side::type(); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/detail/adaptable_type.hpp b/sdk/boost/numeric/bindings/detail/adaptable_type.hpp new file mode 100644 index 0000000..a03281a --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/adaptable_type.hpp @@ -0,0 +1,43 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_ADAPTABLE_TYPE_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_ADAPTABLE_TYPE_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename Derived > +struct adaptable_type { + + inline + Derived& derived() { + return *static_cast(this); + } + + inline + Derived const& derived() const { + return *static_cast(this); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +template< typename T > +std::ostream& operator<<( std::ostream& os, + boost::numeric::bindings::detail::adaptable_type const& object ); + +#endif diff --git a/sdk/boost/numeric/bindings/detail/adaptor.hpp b/sdk/boost/numeric/bindings/detail/adaptor.hpp new file mode 100644 index 0000000..1577514 --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/adaptor.hpp @@ -0,0 +1,51 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_ADAPTOR_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_ADAPTOR_HPP + +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Id, typename Enable = void > +struct adaptor { + typedef mpl::map< + mpl::pair< tag::value_type, void > + > property_map; +}; + +template< typename T > +struct is_adaptable: is_numeric< typename mpl::at< + typename adaptor< typename boost::remove_const::type, T >::property_map, + tag::value_type >::type > {}; + +template< typename T, typename Enable = void > +struct adaptor_access {}; + +template< typename T > +struct adaptor_access< T, typename boost::enable_if< is_adaptable >::type >: + adaptor< typename boost::remove_const::type, T > {}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#include +#include + +#endif diff --git a/sdk/boost/numeric/bindings/detail/array.hpp b/sdk/boost/numeric/bindings/detail/array.hpp new file mode 100644 index 0000000..d5a7070 --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/array.hpp @@ -0,0 +1,127 @@ +// +// Copyright (c) 2003 Kresimir Fresl +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_ARRAY_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_ARRAY_HPP + +#include +#include +#include + + +/* + very simple dynamic array class which is used in `higher level' + bindings functions for pivot and work arrays + + Namely, there are (at least) two versions of all bindings functions + where called LAPACK function expects work and/or pivot array, e.g. + + `lower' level (user should provide work and pivot arrays): + int sysv (SymmA& a, IVec& i, MatrB& b, Work& w); + + `higher' level (with `internal' work and pivot arrays): + int sysv (SymmA& a, MatrB& b); + + Probably you ask why I didn't use std::vector. There are two reasons. + First is efficiency -- std::vector's constructor initialises vector + elements. Second is consistency. LAPACK functions use `info' parameter + as an error indicator. On the other hand, std::vector's allocator can + throw an exception if memory allocation fails. detail::array's + constructor uses `new (nothrow)' which returns 0 if allocation fails. + So I can check whether array::storage == 0 and return appropriate error + in `info'.*/ + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template +class array : private noncopyable { +public: + typedef std::ptrdiff_t size_type ; + + array (size_type n) { + stg = new (std::nothrow) T[n]; + sz = (stg != 0) ? n : 0; + } + + ~array() { + delete[] stg; + } + + size_type size() const { + return sz; + } + + bool valid() const { + return stg != 0; + } + + void resize (int n) { + delete[] stg; + stg = new (std::nothrow) T[n]; + sz = (stg != 0) ? n : 0; + } + + T* storage() { + return stg; + } + + T const* storage() const { + return stg; + } + + T& operator[] (int i) { + return stg[i]; + } + + T const& operator[] (int i) const { + return stg[i]; + } + +private: + size_type sz; + T* stg; +}; + + +template< typename T, typename Id, typename Enable > +struct adaptor< array< T >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, tag::contiguous > + > property_map; + + static std::ptrdiff_t size1( const Id& t ) { + return t.size(); + } + + static value_type* begin_value( Id& t ) { + return t.storage(); + } + + static value_type* end_value( Id& t ) { + return t.storage() + t.size(); + } + +}; + + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/detail/basic_unwrapper.hpp b/sdk/boost/numeric/bindings/detail/basic_unwrapper.hpp new file mode 100644 index 0000000..115427f --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/basic_unwrapper.hpp @@ -0,0 +1,56 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_BASIC_UNWRAPPER_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_BASIC_UNWRAPPER_HPP + +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Id > +struct basic_unwrapper { + + static typename result_of::size1< T >::type size1( const Id& id ) { + return bindings::size1( id.get() ); + } + + static typename result_of::size2< T >::type size2( const Id& id ) { + return bindings::size2( id.get() ); + } + + static typename result_of::stride1< T >::type stride1( const Id& id ) { + return bindings::stride1( id.get() ); + } + + static typename result_of::stride2< T >::type stride2( const Id& id ) { + return bindings::stride2( id.get() ); + } + + static typename result_of::begin_value< T >::type begin_value( Id& id ) { + return bindings::begin_value( id.get() ); + } + + static typename result_of::end_value< T >::type end_value( Id& id ) { + return bindings::end_value( id.get() ); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/detail/basic_wrapper.hpp b/sdk/boost/numeric/bindings/detail/basic_wrapper.hpp new file mode 100644 index 0000000..53b9dc0 --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/basic_wrapper.hpp @@ -0,0 +1,41 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_BASIC_WRAPPER_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_BASIC_WRAPPER_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename P1 = mpl::void_, typename P2 = mpl::void_, + typename P3 = mpl::void_, typename P4 = mpl::void_ > +struct basic_wrapper: reference_wrapper { + basic_wrapper( T& t ): reference_wrapper( t ) {} +}; + +template< typename T, typename P1, typename P2, typename P3, typename P4, + typename Id, typename Enable > +struct adaptor< basic_wrapper, Id, Enable >: + basic_unwrapper< T, Id > { + + typedef typename property_insert< T, P1, P2, P3, P4 >::type property_map; + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/detail/complex_utils.hpp b/sdk/boost/numeric/bindings/detail/complex_utils.hpp new file mode 100644 index 0000000..ad6cf13 --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/complex_utils.hpp @@ -0,0 +1,182 @@ +// +// Copyright (c) 2003 Kresimir Fresl +// Copyright (c) 2010 Thomas Klimpel +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_COMPLEX_UTILS_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_COMPLEX_UTILS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +namespace detail { + +#ifdef BOOST_NUMERIC_BINDINGS_BY_THE_BOOK +template +void inshuffle(It it, std::size_t n) { + if (n==0) return; + for (std::size_t i = 0; 2*i < n; ++i) { + std::size_t k = 2*i + 1; + while (2*k <= n) k *= 2; + typename std::iterator_traits::value_type tmp = it[n+i]; + it[n+i] = it[k-1]; + while (k % 2 == 0) { + it[k-1] = it[(k/2)-1]; + k /= 2; + } + it[k-1] = tmp; + } + std::size_t kmin = 1; + while (2*kmin <= n) kmin *= 2; + for (std::size_t i = 0; 4*i+1 < n; ++i) { + std::size_t k = 2*i + 1; + while (2*k <= n) k *= 2; + std::size_t k1 = 2*(i+1) + 1; + while (2*k1 <= n) k1 *= 2; + if (k > k1) { + if (k1 < kmin) { + kmin = k1; + inshuffle(it+n, i+1); + } + else + inshuffle(it+n+1, i); + } + } + return inshuffle(it+n+(n%2), n/2); +} +#else +template +void inshuffle(It it, std::size_t n) { + while (n > 0) { + std::size_t kmin = 1; + while (kmin <= n) + kmin *= 2; + { + std::size_t kk = kmin/2; + It itn = it + n; + for (std::size_t i = 0, s = (n+1)/2; i < s; ++i) { + std::size_t k = (2*i+1)*kk; + while (k > n) { + k /= 2; + kk /= 2; + } + // apply the cyclic permutation + typename std::iterator_traits::value_type tmp = itn[i]; + itn[i] = it[k-1]; + while (k % 2 == 0) { + it[k-1] = it[(k/2)-1]; + k /= 2; + } + it[k-1] = tmp; + } + } + // the optimized computation of k fails for n=2, + // so skip the 'normalization' loop when possible + if (n > 3) { + std::size_t kk = kmin/4; + for (std::size_t i = 1; 4*i < n+3; ++i) { + std::size_t k = (2*i+1)*kk; + if (k > n) { + kk /= 2; + if (k < kmin) { + kmin = k; + // if kmin is updated, do an in-shuffle + inshuffle(it+n, i); + } + else + // otherwise do an out-shuffle + inshuffle(it+n+1, i-1); + } + } + } + // implement the tail recursion as an iteration + it += n+(n%2); + n /= 2; + } +} +#endif + +// Reorders a real array followed by an imaginary array to a true complex array +// where real and imaginary part of each number directly follow each other. +template +typename boost::enable_if< is_complex< typename bindings::value_type< VectorW >::type >, void >::type +interlace (VectorW& w) { + typedef typename bindings::value_type< VectorW >::type value_type; + typedef typename bindings::remove_imaginary< value_type >::type real_type; + value_type* pw = bindings::begin_value(w); + std::ptrdiff_t n = bindings::end_value(w) - pw; + if (n < 2) return; + inshuffle(reinterpret_cast (pw)+1, n-1); +} + +} // namespace detail + +namespace result_of { + +template< typename VectorW > +struct real_part_view { + typedef typename bindings::result_of::vector_view< typename + bindings::remove_imaginary< typename + bindings::value_type< VectorW >::type + >::type >::type type; +}; + +template< typename VectorW > +struct imag_part_view { + typedef typename bindings::result_of::vector_view< typename + bindings::remove_imaginary< typename + bindings::value_type< VectorW >::type + >::type >::type type; +}; + +} // namespace result_of + +namespace detail { + +// Creates a real vector_view to the first half of the complex array, +// which is intended to be filled by the real part +template +typename boost::enable_if< is_complex< typename bindings::value_type< VectorW >::type >, + typename result_of::real_part_view< VectorW >::type const >::type +real_part_view (VectorW& w) { + typedef typename bindings::value_type< VectorW >::type value_type; + typedef typename bindings::remove_imaginary< value_type >::type real_type; + value_type* pw = bindings::begin_value(w); + std::ptrdiff_t n = bindings::end_value(w) - pw; + return bindings::vector_view(reinterpret_cast (pw), n); +} + +// Creates a real vector_view to the second half of the complex array, +// which is intended to be filled by the imaginary part +template +typename boost::enable_if< is_complex< typename bindings::value_type< VectorW >::type >, + typename result_of::imag_part_view< VectorW >::type const >::type +imag_part_view (VectorW& w) { + typedef typename bindings::value_type< VectorW >::type value_type; + typedef typename bindings::remove_imaginary< value_type >::type real_type; + value_type* pw = bindings::begin_value(w); + std::ptrdiff_t n = bindings::end_value(w) - pw; + return bindings::vector_view(reinterpret_cast (pw)+n, n); +} + +} // namespace detail + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/detail/config/fortran.hpp b/sdk/boost/numeric/bindings/detail/config/fortran.hpp new file mode 100644 index 0000000..3307858 --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/config/fortran.hpp @@ -0,0 +1,88 @@ +// +// Copyright (C) 2002, 2003 Si-Lab b.v.b.a., Toon Knapen and Kresimir Fresl +// 2010 Thomas Klimpel +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_CONFIG_FORTRAN_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_CONFIG_FORTRAN_HPP + +#if defined(BIND_FORTRAN_LOWERCASE_UNDERSCORE) || defined(BIND_FORTRAN_LOWERCASE) || defined(BIND_FORTRAN_UPPERCASE_UNDERSCORE) || defined(BIND_FORTRAN_UPPERCASE) +// Allow manual override of the defaults, e.g. if you want to use a fortran +// lib compiled with gcc from MSVC +#else + +// We have no chance of determining the conventions for linking C with Fortran +// here, because they only depend on the fortran compiler and it's command line +// switches, but not on the C++ compiler which compiles these lines. + +// We default to lowercase underscore, because this is much more common than +// the other option. (The previous automatic configuration only selected the +// other option in case of "defined(__IBMCPP__) || defined(_MSC_VER)".) +#define BIND_FORTRAN_LOWERCASE_UNDERSCORE + +#endif + +// Next we define macro's to convert our symbols to +// the current convention +#if defined(BIND_FORTRAN_LOWERCASE_UNDERSCORE) +#define FORTRAN_ID( id ) id##_ +#define FORTRAN_ID2( id, ID2 ) id##_ +#elif defined(BIND_FORTRAN_LOWERCASE) +#define FORTRAN_ID( id ) id +#define FORTRAN_ID2( id, ID2 ) id +#elif defined(BIND_FORTRAN_UPPERCASE_UNDERSCORE) +#define FORTRAN_ID2( id, ID2 ) ID2##_ +#elif defined(BIND_FORTRAN_UPPERCASE) +#define FORTRAN_ID2( id, ID2 ) ID2 +#else +#error do not know how to bind to fortran calling convention +#endif + + +#ifdef BIND_FORTRAN_F2C_RETURN_CONVENTIONS +// "g77" or clapack or "gfortran -ff2c" +#define BIND_FORTRAN_RETURN_REAL_DOUBLE +#define BIND_FORTRAN_RETURN_COMPLEX_FIRST_ARG +#elif BIND_FORTRAN_MKL_RETURN_CONVENTIONS +// mkl +#define BIND_FORTRAN_RETURN_COMPLEX_FIRST_ARG +#elif BIND_FORTRAN_OSX_RETURN_CONVENTIONS +// OS X +#define BIND_FORTRAN_RETURN_COMPLEX_LAST_ARG +#else +// "g77 -fno-f2c" or "gfortran" +#endif + + +// "g77" or "gfortran" or mkl_intel_lp64 +//#undef BIND_FORTRAN_INTEGER_8 +// clapack or "gfortran -fdefault-integer-8" or mkl_intel_ilp64 +//#define BIND_FORTRAN_INTEGER_8 + +// Most fortran compilers use fortran_int_t := int by default, so we follow +// this default, even so f2c (=clapack) uses "typedef long int integer;" +#ifndef BIND_FORTRAN_INTEGER_8 +typedef int fortran_int_t; +#else +typedef std::ptrdiff_t fortran_int_t; +#endif + +// Looks like fortran_int_t and fortran_bool_t should be identical, the unsigned is +// required so overloads can distinguish between fortran_bool_t and fortran_int_t. +#ifndef BIND_FORTRAN_INTEGER_8 +typedef unsigned int fortran_bool_t; +#else +typedef std::size_t fortran_bool_t; +#endif + +// This definition of external_fp is identical to the definition of L_fp from +// f2c, and it seems to work more or less. These functions return fortran_bool_t, +// but they don't all take the same type of arguments. A reinterpret_cast will +// probably work for most compilers to extend the allowed function signatures. +typedef fortran_bool_t (*external_fp)(...); + +#endif // BOOST_NUMERIC_BINDINGS_TRAITS_FORTRAN_H diff --git a/sdk/boost/numeric/bindings/detail/convert_to.hpp b/sdk/boost/numeric/bindings/detail/convert_to.hpp new file mode 100644 index 0000000..6a6ee10 --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/convert_to.hpp @@ -0,0 +1,25 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_CONVERT_TO_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_CONVERT_TO_HPP + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename Target, typename Source > +struct convert_to {}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/detail/copy_const.hpp b/sdk/boost/numeric/bindings/detail/copy_const.hpp new file mode 100644 index 0000000..9a04390 --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/copy_const.hpp @@ -0,0 +1,32 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_COPY_CONST_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_COPY_CONST_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename Source, typename Target > +struct copy_const { + typedef typename mpl::if_< is_const, + typename add_const::type, Target >::type type; +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/detail/generate_functions.hpp b/sdk/boost/numeric/bindings/detail/generate_functions.hpp new file mode 100644 index 0000000..2208ef7 --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/generate_functions.hpp @@ -0,0 +1,48 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_GENERATE_FUNCTIONS_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_GENERATE_FUNCTIONS_HPP + +#include +#include + +// +// Macro used to generate convenience functions +// + +#define GENERATE_FUNCTIONS( function_name, suffix, tag ) \ +\ +namespace result_of {\ +\ +template< typename T > \ +struct BOOST_PP_CAT( function_name, suffix ) { \ + typedef typename detail::\ + BOOST_PP_CAT( function_name, _impl ) \ + ::result_type type; \ +}; \ +\ +}\ +\ +template< typename T >\ +typename result_of:: BOOST_PP_CAT( function_name, suffix )::type \ +BOOST_PP_CAT( function_name, suffix )( T& t ) {\ + return detail:: \ + BOOST_PP_CAT( function_name, _impl ) \ + ::invoke( t );\ +}\ +\ +template< typename T >\ +typename result_of:: BOOST_PP_CAT( function_name, suffix )::type \ +BOOST_PP_CAT( function_name, suffix )( const T& t ) {\ + return detail:: \ + BOOST_PP_CAT( function_name, _impl ) \ + ::invoke( t );\ +} + +#endif diff --git a/sdk/boost/numeric/bindings/detail/get.hpp b/sdk/boost/numeric/bindings/detail/get.hpp new file mode 100644 index 0000000..035bccb --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/get.hpp @@ -0,0 +1,96 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_GET_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_GET_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename Key > +struct get_dispatch {}; + +#define GENERATE_GET( z, which, unused ) \ +template<> \ +struct get_dispatch< tag::size_type > { \ + template< typename T > \ + static std::ptrdiff_t invoke( const T& t ) { \ + return detail::adaptor_access:: \ + BOOST_PP_CAT( size, which )( t ); \ + } \ +};\ +\ +template<> \ +struct get_dispatch< tag::stride_type > { \ + template< typename T > \ + static std::ptrdiff_t invoke( const T& t ) { \ + return detail::adaptor_access:: \ + BOOST_PP_CAT( stride, which )( t ); \ + } \ +};\ +\ +template<> \ +struct get_dispatch< tag::bandwidth_type > { \ + template< typename T > \ + static std::ptrdiff_t invoke( const T& t ) { \ + return detail::adaptor_access:: \ + BOOST_PP_CAT( bandwidth, which )( t ); \ + } \ +}; + +BOOST_PP_REPEAT_FROM_TO(1,3,GENERATE_GET,~) + +template< typename T, typename Key, typename Enable = void > +struct get_impl {}; + +template< typename T, typename Key > +struct get_impl< T, Key, typename boost::enable_if< + is_same_at< T, Key, std::ptrdiff_t > >::type > { + + typedef std::ptrdiff_t result_type; + + static std::ptrdiff_t invoke( const T& t ) { + return get_dispatch::invoke( t ); + } + +}; + +template< typename T, typename Key > +struct get_impl< T, Key, typename boost::enable_if< + mpl::not_< is_same_at< T, Key, std::ptrdiff_t > > >::type > { + + typedef typename property_at< T, Key >::type result_type; + + static result_type invoke( const T& ) { + return result_type(); + } + +}; + +template< typename T, typename Key > +struct result_of_get { + typedef typename get_impl< T, Key >::result_type type; +}; + +template< typename Key, typename T > +typename result_of_get< T, Key >::type get( const T& t ) { + return get_impl< T, Key >::invoke( t ); +} + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/detail/if_left.hpp b/sdk/boost/numeric/bindings/detail/if_left.hpp new file mode 100644 index 0000000..afdb74e --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/if_left.hpp @@ -0,0 +1,53 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_IF_LEFT_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_IF_LEFT_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename Side, typename Left, typename Right > +struct if_left_impl { + + typedef Right result_type; + + static result_type invoke( Left, Right right ) { + return right; + } + +}; + +template< typename Left, typename Right > +struct if_left_impl< tag::left, Left, Right > { + + typedef Left result_type; + + static result_type invoke( Left left, Right ) { + return left; + } + +}; + +// by-value +template< typename Side, typename Left, typename Right > +typename if_left_impl< Side, const Left, const Right >::result_type +if_left( const Side, const Left left, const Right right ) { + return if_left_impl< Side, const Left, const Right >::invoke( left, right ); +} + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/detail/if_row_major.hpp b/sdk/boost/numeric/bindings/detail/if_row_major.hpp new file mode 100644 index 0000000..00d4fe6 --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/if_row_major.hpp @@ -0,0 +1,34 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_IF_ROW_MAJOR_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_IF_ROW_MAJOR_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename Order, typename True, typename False > +struct if_row_major { + typedef False type; +}; + +template< typename True, typename False > +struct if_row_major< tag::row_major, True, False > { + typedef True type; +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/detail/linear_iterator.hpp b/sdk/boost/numeric/bindings/detail/linear_iterator.hpp new file mode 100644 index 0000000..4b1cb1e --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/linear_iterator.hpp @@ -0,0 +1,89 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_LINEAR_ITERATOR_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_LINEAR_ITERATOR_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename StrideType > +class linear_iterator: public boost::iterator_adaptor< + linear_iterator, + T*, use_default, random_access_traversal_tag > { +public: + + typedef mpl::int_ stride_type; + + linear_iterator(): + linear_iterator::iterator_adaptor_(0) {} + + explicit linear_iterator( T* p, StrideType ignore ): + linear_iterator::iterator_adaptor_(p) {} + +private: + friend class boost::iterator_core_access; + + void advance( int n ) { + (this->base_reference()) += n * stride_type::value; + } + + void decrement() { + (this->base_reference()) -= stride_type::value; + } + + void increment() { + (this->base_reference()) += stride_type::value; + } + +}; + +template< typename T > +class linear_iterator< T, std::ptrdiff_t >: public boost::iterator_adaptor< + linear_iterator< T, std::ptrdiff_t >, + T*, use_default, random_access_traversal_tag > { +public: + + typedef std::ptrdiff_t stride_type; + + linear_iterator(): + linear_iterator::iterator_adaptor_(0), + m_stride(0) {} + + explicit linear_iterator( T* p, std::ptrdiff_t stride ): + linear_iterator::iterator_adaptor_(p), + m_stride( stride ) {} + +private: + friend class boost::iterator_core_access; + + void advance( int n ) { + (this->base_reference()) += n * m_stride; + } + + void decrement() { + (this->base_reference()) -= m_stride; + } + + void increment() { + (this->base_reference()) += m_stride; + } + + std::ptrdiff_t m_stride; +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/detail/offset.hpp b/sdk/boost/numeric/bindings/detail/offset.hpp new file mode 100644 index 0000000..e60fd5b --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/offset.hpp @@ -0,0 +1,72 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_OFFSET_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_OFFSET_HPP + +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Enable = void > +struct offset_impl {}; + +template< typename T > +struct offset_impl< T, typename boost::enable_if< has_linear_array< T > >::type > { + + static std::ptrdiff_t invoke( const T& t, std::ptrdiff_t i1 ) { + return i1 * bindings::stride1( t ); + } + + static std::ptrdiff_t invoke( const T& t, std::ptrdiff_t i1, std::ptrdiff_t i2 ) { + return i1 * bindings::stride1( t ) + + i2 * bindings::stride2( t ); + } + +}; + +template< typename T > +struct offset_impl< T, + typename boost::enable_if< + mpl::and_< + has_band_array< T >, + is_column_major< T > + > + >::type > { + + static std::ptrdiff_t invoke( const T& t, std::ptrdiff_t i1, std::ptrdiff_t i2 ) { + return i1 * bindings::stride1( t ) + + i2 * (bindings::stride2( t )-1); + } + +}; + +template< typename T > +std::ptrdiff_t offset( const T& t, std::ptrdiff_t i1 ) { + return offset_impl< T >::invoke( t, i1 ); +} + +template< typename T > +std::ptrdiff_t offset( const T& t, std::ptrdiff_t i1, std::ptrdiff_t i2 ) { + return offset_impl< T >::invoke( t, i1, i2 ); +} + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/detail/pod.hpp b/sdk/boost/numeric/bindings/detail/pod.hpp new file mode 100644 index 0000000..3eeb4a6 --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/pod.hpp @@ -0,0 +1,90 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_POD_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_POD_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Id > +struct adaptor< T, Id, typename boost::enable_if< is_numeric >::type > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::scalar >, + mpl::pair< tag::size_type<1>, mpl::int_<1> >, + mpl::pair< tag::data_structure, tag::linear_array > + > property_map; + + static value_type* begin_value( Id& t ) { + return &t; + } + +}; + +template< typename T, std::size_t N, typename Id > +struct adaptor< T[N], Id, typename boost::enable_if< is_numeric >::type > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, mpl::int_ >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, tag::contiguous > + > property_map; + + static value_type* begin_value( Id& t ) { + return &t[0]; + } + + static value_type* end_value( Id& t ) { + return &t[N]; + } + +}; + +template< typename T, std::size_t M, std::size_t N, typename Id > +struct adaptor< T[M][N], Id, typename boost::enable_if< is_numeric >::type > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, mpl::int_ >, + mpl::pair< tag::size_type<2>, mpl::int_ >, + mpl::pair< tag::matrix_type, tag::general >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::data_order, tag::row_major >, + mpl::pair< tag::stride_type<1>, mpl::int_ >, + mpl::pair< tag::stride_type<2>, tag::contiguous > + > property_map; + + static value_type* begin_value( Id& t ) { + return &t[0][0]; + } + + static value_type* end_value( Id& t ) { + return &t[M][N]; + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/detail/property_map.hpp b/sdk/boost/numeric/bindings/detail/property_map.hpp new file mode 100644 index 0000000..69dc1cd --- /dev/null +++ b/sdk/boost/numeric/bindings/detail/property_map.hpp @@ -0,0 +1,73 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_PROPERTY_MAP_HPP +#define BOOST_NUMERIC_BINDINGS_DETAIL_PROPERTY_MAP_HPP + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Key > +struct property_has_key: mpl::has_key< typename adaptor_access::property_map, Key > {}; + +template< typename T, typename Key > +struct property_at { + typedef typename mpl::at< typename adaptor_access::property_map, Key >::type type; +}; + +template< typename T > +struct property_map_of { + typedef typename adaptor_access::property_map type; +}; + + +template< typename T, typename Key, typename Value > +struct is_same_at: is_same< typename property_at< T, Key >::type, Value > {}; + +// +// Meta-function to insert multiple pairs into a map by using fold. Using the +// provided mpl::insert can (only) insert elements in a map one-by-one. +// +template< typename T, + typename P1 = mpl::na, typename P2 = mpl::na, typename P3 = mpl::na, + typename P4 = mpl::na, typename P5 = mpl::na, typename P6 = mpl::na, + typename P7 = mpl::na, typename P8 = mpl::na, typename P9 = mpl::na, + typename P10 = mpl::na > +struct property_insert { + + typedef mpl::vector< P1, P2, P3, P4, P5, P6, P7, P8, P9, P10 > pair_vector; + typedef typename property_map_of< T >::type properties; + + typedef typename mpl::fold< + pair_vector, + properties, + mpl::if_< + is_same< mpl::_2, mpl::void_ >, + mpl::_1, + mpl::insert< mpl::_1, mpl::_2 > + > + >::type type; + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/diag_tag.hpp b/sdk/boost/numeric/bindings/diag_tag.hpp new file mode 100644 index 0000000..e3138e5 --- /dev/null +++ b/sdk/boost/numeric/bindings/diag_tag.hpp @@ -0,0 +1,56 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_DIAG_TAG_HPP +#define BOOST_NUMERIC_BINDINGS_DIAG_TAG_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +namespace detail { + +template< typename T > +struct diag_tag_impl { + typedef tag::non_unit type; +}; + +template<> +struct diag_tag_impl< tag::unit_triangular > { + typedef tag::unit type; +}; + +} // namespace detail + +namespace result_of { + +template< typename T > +struct diag_tag { + typedef typename detail::diag_tag_impl< + typename detail::property_at< T, tag::matrix_type >::type + >::type type; +}; + +} // namespace result_of + +// +// diag_tag will output tags that are compatible with BLAS and LAPACK +// +template< typename T, typename Order > +typename result_of::diag_tag< T >::type diag_tag( const T& t ) { + return result_of::diag_tag< T >::type(); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/eigen/matrix.hpp b/sdk/boost/numeric/bindings/eigen/matrix.hpp new file mode 100644 index 0000000..0248fcd --- /dev/null +++ b/sdk/boost/numeric/bindings/eigen/matrix.hpp @@ -0,0 +1,92 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_EIGEN_MATRIX_HPP +#define BOOST_NUMERIC_BINDINGS_EIGEN_MATRIX_HPP + +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< int Value > +struct eigen_size_type { + typedef typename mpl::if_< + mpl::bool_< Value == Eigen::Dynamic >, + std::ptrdiff_t, + mpl::int_ + >::type type; +}; + +template< int Value > +struct eigen_data_order { + typedef typename mpl::if_< + mpl::bool_< Value & Eigen::RowMajorBit >, + tag::row_major, + tag::column_major + >::type type; +}; + +template< typename T, int Rows, int Cols, int Options, + typename Id, typename Enable > +struct adaptor< Eigen::Matrix< T, Rows, Cols, Options >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef typename eigen_size_type< Rows >::type size_type1; + typedef typename eigen_size_type< Cols >::type size_type2; + typedef typename eigen_data_order< Options >::type data_order; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, size_type1 >, + mpl::pair< tag::size_type<2>, size_type2 >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::data_order, data_order >, + mpl::pair< tag::stride_type<1>, + typename if_row_major< data_order, size_type2, tag::contiguous >::type >, + mpl::pair< tag::stride_type<2>, + typename if_row_major< data_order, tag::contiguous, size_type1 >::type > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.rows(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.cols(); + } + + static value_type* begin_value( Id& id ) { + return id.data(); + } + + static value_type* end_value( Id& id ) { + return id.data() + id.size(); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return id.cols(); + } + + static std::ptrdiff_t stride2( const Id& id ) { + return id.rows(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/eigen/sparsematrix.hpp b/sdk/boost/numeric/bindings/eigen/sparsematrix.hpp new file mode 100644 index 0000000..95cf5cb --- /dev/null +++ b/sdk/boost/numeric/bindings/eigen/sparsematrix.hpp @@ -0,0 +1,92 @@ +// +// Copyright (c) 2009--2010 +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_EIGEN_SPARSEMATRIX_HPP +#define BOOST_NUMERIC_BINDINGS_EIGEN_SPARSEMATRIX_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< int Value > +struct eigen_data_order { + typedef typename mpl::if_< + mpl::bool_< Value & Eigen::RowMajorBit >, + tag::row_major, + tag::column_major + >::type type; +}; + +template< typename T, int Flags, typename Id, typename Enable > +struct adaptor< Eigen::SparseMatrix< T, Flags >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef typename copy_const< + Id, + //??? (Sorry, couldn't find it. Maybe fix it later.) + std::ptrdiff_t + >::type index_type; + typedef typename eigen_data_order< Flags >::type data_order; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::index_type, index_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::size_type<2>, std::ptrdiff_t >, + mpl::pair< tag::matrix_type, tag::general >, + mpl::pair< tag::data_structure, tag::compressed_sparse >, + mpl::pair< tag::data_order, data_order >, + mpl::pair< tag::index_base, mpl::int_<0> > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.rows(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.cols(); + } + + static value_type* begin_value( Id& id ) { + return id._valuePtr(); + } + + static value_type* end_value( Id& id ) { + return id._valuePtr() + id.nonZeros(); + } + + static index_type* begin_compressed_index_major( Id& id ) { + return id._outerIndexPtr(); + } + + static index_type* end_compressed_index_major( Id& id ) { + return id._outerIndexPtr() + id.outerSize() + 1; + } + + static index_type* begin_index_minor( Id& id ) { + return id._innerIndexPtr(); + } + + static index_type* end_index_minor( Id& id ) { + return id._innerIndexPtr() + id.nonZeros(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/end.hpp b/sdk/boost/numeric/bindings/end.hpp new file mode 100644 index 0000000..cfaa578 --- /dev/null +++ b/sdk/boost/numeric/bindings/end.hpp @@ -0,0 +1,139 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_END_HPP +#define BOOST_NUMERIC_BINDINGS_END_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { + +namespace detail { + +template< typename T, typename Tag > +struct end_impl {}; + +template< typename T > +struct end_impl< T, tag::value > { + typedef typename bindings::value_type< T>::type* result_type; + + static result_type invoke( T& t ) { + return adaptor_access::end_value( t ); + } +}; + +template< typename T, int N > +struct end_impl< T, tag::addressing_index > { + + typedef tag::addressing_index tag_type; + + typedef linear_iterator< + typename bindings::value_type< T>::type, + typename result_of::stride< T, tag_type >::type + > result_type; + + static result_type invoke( T& t ) { + return result_type( adaptor_access::end_value( t ), stride(t, tag_type() ) ); + } +}; + +template< typename T > +struct end_impl< T, tag::index_major > { + typedef typename detail::property_at< T, tag::index_type >::type* result_type; + + static result_type invoke( T& t ) { + return adaptor_access::end_index_major( t ); + } +}; + +template< typename T > +struct end_impl< T, tag::compressed_index_major > { + typedef typename detail::property_at< T, tag::index_type >::type* result_type; + + static result_type invoke( T& t ) { + return adaptor_access::end_compressed_index_major( t ); + } +}; + +template< typename T > +struct end_impl< T, tag::index_minor > { + typedef typename detail::property_at< T, tag::index_type >::type* result_type; + + static result_type invoke( T& t ) { + return adaptor_access::end_index_minor( t ); + } +}; + +} // namespace detail + +namespace result_of { + +template< typename T, typename Tag = tag::addressing_index<1> > +struct end { + BOOST_STATIC_ASSERT( (is_tag::value) ); + typedef typename detail::end_impl::result_type type; +}; + +} // namespace result_of + +// +// Free Functions +// + +// +// Overloads like end( t, tag ); +// +template< typename T, typename Tag > +inline typename result_of::end::type +end( T& t, Tag ) { + return detail::end_impl::invoke( t ); +} + +template< typename T, typename Tag > +inline typename result_of::end::type +end( const T& t, Tag ) { + return detail::end_impl::invoke( t ); +} + +// Overloads for types with rank <= 1 (scalars, vectors) +// In theory, we could provide overloads for matrices here, too, +// if their minimal_rank is at most 1. + +template< typename T > +typename boost::enable_if< mpl::less< rank, mpl::int_<2> >, + typename result_of::end< T, tag::addressing_index<1> >::type >::type +end( T& t ) { + return detail::end_impl >::invoke( t ); +} + +template< typename T > +typename boost::enable_if< mpl::less< rank, mpl::int_<2> >, + typename result_of::end< const T >::type >::type +end( const T& t ) { + return detail::end_impl >::invoke( t ); +} + +#define GENERATE_END_INDEX( z, which, unused ) \ +GENERATE_FUNCTIONS( end, which, mpl::int_ ) + +BOOST_PP_REPEAT_FROM_TO(1,3,GENERATE_END_INDEX,~) +GENERATE_FUNCTIONS( end, _value, tag::value ) +GENERATE_FUNCTIONS( end, _row, tag::addressing_index<1> ) +GENERATE_FUNCTIONS( end, _column, tag::addressing_index<2> ) + +GENERATE_FUNCTIONS( end, _index_major, tag::index_major ) +GENERATE_FUNCTIONS( end, _compressed_index_major, tag::compressed_index_major ) +GENERATE_FUNCTIONS( end, _index_minor, tag::index_minor ) + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/glas/compressed.hpp b/sdk/boost/numeric/bindings/glas/compressed.hpp new file mode 100644 index 0000000..f3bd246 --- /dev/null +++ b/sdk/boost/numeric/bindings/glas/compressed.hpp @@ -0,0 +1,84 @@ +// +// Copyright (c) 2009--2010 +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_GLAS_COMPRESSED_HPP +#define BOOST_NUMERIC_BINDINGS_GLAS_COMPRESSED_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename O, typename IndexType, typename NNZType, int IB, typename Id, typename Enable > +struct adaptor< glas::sparse_matrix< T, glas::compressed_sparse_structure >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef typename copy_const< Id, IndexType >::type index_type; + typedef typename convert_to< tag::data_order, O >::type data_order; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::index_type, index_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::size_type<2>, std::ptrdiff_t >, + mpl::pair< tag::matrix_type, tag::general >, + mpl::pair< tag::data_structure, tag::compressed_sparse >, + mpl::pair< tag::data_order, data_order >, + mpl::pair< tag::index_base, mpl::int_ > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.num_rows(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.num_columns(); + } + + static value_type* begin_value( Id& id ) { + return bindings::begin_value( id.value_array() ); + } + + static value_type* end_value( Id& id ) { + return bindings::begin_value( id.value_array() ) + id.nnz(); + } + + static index_type* begin_compressed_index_major( Id& id ) { + return bindings::begin_value( id.sparse_structure().compressed_index_array() ); + } + + static index_type* end_compressed_index_major( Id& id ) { + return bindings::end_value( id.sparse_structure().compressed_index_array() ); + } + + static index_type* begin_index_minor( Id& id ) { + return bindings::begin_value( id.sparse_structure().index_array() ); + } + + static index_type* end_index_minor( Id& id ) { + return bindings::begin_value( id.sparse_structure().index_array() ) + id.nnz(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/glas/dense_matrix.hpp b/sdk/boost/numeric/bindings/glas/dense_matrix.hpp new file mode 100644 index 0000000..a63f43f --- /dev/null +++ b/sdk/boost/numeric/bindings/glas/dense_matrix.hpp @@ -0,0 +1,71 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_GLAS_DENSE_MATRIX_HPP +#define BOOST_NUMERIC_BINDINGS_GLAS_DENSE_MATRIX_HPP + +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename O, typename Id, typename Enable > +struct adaptor< glas::dense_matrix< T, O >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef typename convert_to< tag::data_order, O >::type data_order; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::size_type<2>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::data_order, data_order >, + mpl::pair< tag::stride_type<1>, + typename if_row_major< data_order, std::ptrdiff_t, tag::contiguous >::type >, + mpl::pair< tag::stride_type<2>, + typename if_row_major< data_order, tag::contiguous, std::ptrdiff_t >::type > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.num_rows(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.num_columns(); + } + + static value_type* begin_value( Id& id ) { + return id.storage_ptr(); + } + + static value_type* end_value( Id& id ) { + return id.storage_ptr() + id.num_rows() * id.num_columns(); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return id.num_columns(); + } + + static std::ptrdiff_t stride2( const Id& id ) { + return id.num_rows(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/glas/dense_vector.hpp b/sdk/boost/numeric/bindings/glas/dense_vector.hpp new file mode 100644 index 0000000..5f42530 --- /dev/null +++ b/sdk/boost/numeric/bindings/glas/dense_vector.hpp @@ -0,0 +1,51 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_GLAS_DENSE_VECTOR_HPP +#define BOOST_NUMERIC_BINDINGS_GLAS_DENSE_VECTOR_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Id, typename Enable > +struct adaptor< glas::dense_vector< T >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, tag::contiguous > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static value_type* begin_value( Id& id ) { + return id.storage_ptr(); + } + + static value_type* end_value( Id& id ) { + return id.storage_ptr() + id.size(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/glas/dense_vector_collection.hpp b/sdk/boost/numeric/bindings/glas/dense_vector_collection.hpp new file mode 100644 index 0000000..ee97d17 --- /dev/null +++ b/sdk/boost/numeric/bindings/glas/dense_vector_collection.hpp @@ -0,0 +1,84 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_GLAS_DENSE_VECTOR_COLLECTION_HPP +#define BOOST_NUMERIC_BINDINGS_GLAS_DENSE_VECTOR_COLLECTION_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +// Need a helper type here, because +// glas::fixed_size doesn't work for any T +template< typename T, typename Enable = void > +struct glas_vector_size_type { + typedef std::ptrdiff_t type; +}; + +template< typename T > +struct glas_vector_size_type< + T, typename boost::enable_if< glas::FixedSizeVectorExpression >::type > { + typedef mpl::int_< glas::fixed_size::value > type; +}; + +template< typename T, typename Id > +struct adaptor< T, Id, typename boost::enable_if< glas::DenseVectorCollection >::type > { + + typedef typename copy_const< Id, typename glas::value_type::type >::type value_type; + typedef typename glas_vector_size_type< T >::type size_type1; + typedef typename mpl::if_< + glas::ContiguousDenseVectorCollection, + tag::contiguous, + std::ptrdiff_t + >::type stride_type1; + + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, size_type1 >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, stride_type1 > + > property_map; + + // Only called in case of dynamic sizes + static std::ptrdiff_t size1( const Id& id ) { + return glas::size( id ); + } + + static value_type* begin_value( Id& id ) { + return glas::storage_ptr( id ); + } + + static value_type* end_value( Id& id ) { + return glas::storage_ptr( id ) + offset( id, bindings::size1( id ) ); + } + + // Only called in case of dynamic strides + static std::ptrdiff_t stride1( const Id& id ) { + return glas::stride( id ); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/glas/detail/convert_to.hpp b/sdk/boost/numeric/bindings/glas/detail/convert_to.hpp new file mode 100644 index 0000000..53a40fd --- /dev/null +++ b/sdk/boost/numeric/bindings/glas/detail/convert_to.hpp @@ -0,0 +1,36 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_GLAS_DETAIL_CONVERT_TO_HPP +#define BOOST_NUMERIC_BINDINGS_GLAS_DETAIL_CONVERT_TO_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template<> +struct convert_to< bindings::tag::data_order, glas::row_orientation > { + typedef bindings::tag::row_major type; +}; + +template<> +struct convert_to< bindings::tag::data_order, glas::column_orientation > { + typedef bindings::tag::column_major type; +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/has_band_array.hpp b/sdk/boost/numeric/bindings/has_band_array.hpp new file mode 100644 index 0000000..b540be7 --- /dev/null +++ b/sdk/boost/numeric/bindings/has_band_array.hpp @@ -0,0 +1,28 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_HAS_BAND_ARRAY_HPP +#define BOOST_NUMERIC_BINDINGS_HAS_BAND_ARRAY_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +struct has_band_array: + detail::is_same_at< T, tag::data_structure, tag::band_array > {}; + + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/has_linear_array.hpp b/sdk/boost/numeric/bindings/has_linear_array.hpp new file mode 100644 index 0000000..b71d597 --- /dev/null +++ b/sdk/boost/numeric/bindings/has_linear_array.hpp @@ -0,0 +1,32 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_HAS_LINEAR_ARRAY_HPP +#define BOOST_NUMERIC_BINDINGS_HAS_LINEAR_ARRAY_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T, typename Enable = void > +struct has_linear_array: mpl::false_ {}; + +template< typename T > +struct has_linear_array< + T, + typename boost::enable_if< detail::is_adaptable >::type >: + detail::is_same_at< T, tag::data_structure, tag::linear_array > {}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/has_rank.hpp b/sdk/boost/numeric/bindings/has_rank.hpp new file mode 100644 index 0000000..40fe7fc --- /dev/null +++ b/sdk/boost/numeric/bindings/has_rank.hpp @@ -0,0 +1,36 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_HAS_RANK_HPP +#define BOOST_NUMERIC_BINDINGS_HAS_RANK_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T, int N, typename Enable = void > +struct has_rank {}; + +template< typename T, int N > +struct has_rank< + T, N, + typename boost::enable_if< detail::is_adaptable >::type + >: + mpl::equal_to< + typename detail::property_at< T, tag::entity >::type, + mpl::int_< N > + > {}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/has_static_size.hpp b/sdk/boost/numeric/bindings/has_static_size.hpp new file mode 100644 index 0000000..fedac11 --- /dev/null +++ b/sdk/boost/numeric/bindings/has_static_size.hpp @@ -0,0 +1,52 @@ +// +// Copyright (c) 2010 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_HAS_STATIC_SIZE_HPP +#define BOOST_NUMERIC_BINDINGS_HAS_STATIC_SIZE_HPP + +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T > +struct is_static_size_property: mpl::false_ {}; + +template< int N, int M > +struct is_static_size_property< mpl::pair< tag::size_type, mpl::int_ > >: mpl::true_ {}; + +} // namespace detail + +template< typename T, typename Enable = void > +struct has_static_size: mpl::false_ {}; + +template< typename T > +struct has_static_size< + T, + typename boost::enable_if< detail::is_adaptable >::type >: + + // count the number of static size properties, + // should be equal to the rank of the object + mpl::equal_to< + mpl::count_if< + typename detail::property_map_of< T >::type, + detail::is_static_size_property< mpl::_ > + >, + typename detail::property_at< T, tag::entity >::type + >::type {}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/has_static_stride.hpp b/sdk/boost/numeric/bindings/has_static_stride.hpp new file mode 100644 index 0000000..f491323 --- /dev/null +++ b/sdk/boost/numeric/bindings/has_static_stride.hpp @@ -0,0 +1,52 @@ +// +// Copyright (c) 2010 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_HAS_STATIC_STRIDE_HPP +#define BOOST_NUMERIC_BINDINGS_HAS_STATIC_STRIDE_HPP + +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T > +struct is_static_stride_property: mpl::false_ {}; + +template< int N, int M > +struct is_static_stride_property< mpl::pair< tag::stride_type, mpl::int_ > >: mpl::true_ {}; + +} // namespace detail + +template< typename T, typename Enable = void > +struct has_static_stride: mpl::false_ {}; + +template< typename T > +struct has_static_stride< + T, + typename boost::enable_if< detail::is_adaptable >::type >: + + // count the number of static stride properties, + // should be equal to the rank of the object + mpl::equal_to< + mpl::count_if< + typename detail::property_map_of< T >::type, + detail::is_static_stride_property< mpl::_ > + >, + typename detail::property_at< T, tag::entity >::type + >::type {}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/has_triangular_array.hpp b/sdk/boost/numeric/bindings/has_triangular_array.hpp new file mode 100644 index 0000000..159624c --- /dev/null +++ b/sdk/boost/numeric/bindings/has_triangular_array.hpp @@ -0,0 +1,27 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_HAS_TRIANGULAR_ARRAY_HPP +#define BOOST_NUMERIC_BINDINGS_HAS_TRIANGULAR_ARRAY_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +struct has_triangular_array: + detail::is_same_at< T, tag::data_structure, tag::triangular_array > {}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/herm.hpp b/sdk/boost/numeric/bindings/herm.hpp new file mode 100644 index 0000000..cd86466 --- /dev/null +++ b/sdk/boost/numeric/bindings/herm.hpp @@ -0,0 +1,44 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_HERM_HPP +#define BOOST_NUMERIC_BINDINGS_HERM_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace result_of { + +template< typename T > +struct herm { + typedef detail::basic_wrapper< + T, + mpl::pair< tag::matrix_type, tag::hermitian > + > type; +}; + +} // namespace result_of + +template< typename T > +typename result_of::herm< T >::type const herm( T& underlying ) { + return typename result_of::herm< T >::type( underlying ); +} + +template< typename T > +typename result_of::herm< const T >::type const herm( const T& underlying ) { + return typename result_of::herm< const T >::type( underlying ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/index_base.hpp b/sdk/boost/numeric/bindings/index_base.hpp new file mode 100644 index 0000000..886b66e --- /dev/null +++ b/sdk/boost/numeric/bindings/index_base.hpp @@ -0,0 +1,35 @@ +// +// Copyright (c) 2010 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_INDEX_BASE_HPP +#define BOOST_NUMERIC_BINDINGS_INDEX_BASE_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace result_of { + +template< typename T > +struct index_base { + typedef typename detail::property_at< T, tag::index_base >::type type; +}; + +} // namespace result_of + +template< typename T > +typename result_of::index_base::type index_base( const T& ) { + return typename result_of::index_base::type(); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/io.hpp b/sdk/boost/numeric/bindings/io.hpp new file mode 100644 index 0000000..3121e8f --- /dev/null +++ b/sdk/boost/numeric/bindings/io.hpp @@ -0,0 +1,52 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_IO_HPP +#define BOOST_NUMERIC_BINDINGS_IO_HPP + +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename Stream, typename T > +Stream& pretty_print( Stream& os, const T& t ) { + namespace bindings = ::boost::numeric::bindings; + os << "[" << size1(t) << "] "; + typename bindings::result_of::begin< const T >::type i = bindings::begin(t); + if ( i != bindings::end(t) ) { + os << *i; + ++i; + } + for( ; i != bindings::end(t); ++i ) { + os << " " << *i; + } + return os; +} + +} // detail +} // bindings +} // numeric +} // boost + + +template< typename T > +std::ostream& operator<<( std::ostream& os, + const boost::numeric::bindings::detail::adaptable_type& object ) { + return boost::numeric::bindings::detail::pretty_print( os, object.derived() ); +} + + +#endif diff --git a/sdk/boost/numeric/bindings/is_column_major.hpp b/sdk/boost/numeric/bindings/is_column_major.hpp new file mode 100644 index 0000000..dd76099 --- /dev/null +++ b/sdk/boost/numeric/bindings/is_column_major.hpp @@ -0,0 +1,32 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_IS_COLUMN_MAJOR_HPP +#define BOOST_NUMERIC_BINDINGS_IS_COLUMN_MAJOR_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +struct is_column_major: + mpl::if_< + detail::property_has_key< T, tag::data_order >, + detail::is_same_at< T, tag::data_order, tag::column_major >, + mpl::true_ + >::type {}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/is_complex.hpp b/sdk/boost/numeric/bindings/is_complex.hpp new file mode 100644 index 0000000..ff146f6 --- /dev/null +++ b/sdk/boost/numeric/bindings/is_complex.hpp @@ -0,0 +1,25 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_IS_COMPLEX_HPP +#define BOOST_NUMERIC_BINDINGS_IS_COMPLEX_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +struct is_complex: boost::is_complex {}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/is_mutable.hpp b/sdk/boost/numeric/bindings/is_mutable.hpp new file mode 100644 index 0000000..3c185e4 --- /dev/null +++ b/sdk/boost/numeric/bindings/is_mutable.hpp @@ -0,0 +1,33 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_IS_MUTABLE_HPP +#define BOOST_NUMERIC_BINDINGS_IS_MUTABLE_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T, typename Enable = void > +struct is_mutable: mpl::false_ {}; + +template< typename T > +struct is_mutable< T, typename boost::enable_if< detail::is_adaptable >::type >: + is_same< + typename bindings::value_type< T>::type, + typename remove_const< typename bindings::value_type< T>::type >::type + > {}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/is_numeric.hpp b/sdk/boost/numeric/bindings/is_numeric.hpp new file mode 100644 index 0000000..4067d66 --- /dev/null +++ b/sdk/boost/numeric/bindings/is_numeric.hpp @@ -0,0 +1,28 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_IS_NUMERIC_HPP +#define BOOST_NUMERIC_BINDINGS_IS_NUMERIC_HPP + +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +struct is_numeric: mpl::or_< is_real, is_complex, is_integral > {}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/is_real.hpp b/sdk/boost/numeric/bindings/is_real.hpp new file mode 100644 index 0000000..3aab698 --- /dev/null +++ b/sdk/boost/numeric/bindings/is_real.hpp @@ -0,0 +1,25 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_IS_REAL_HPP +#define BOOST_NUMERIC_BINDINGS_IS_REAL_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +struct is_real: boost::is_floating_point {}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/is_row_major.hpp b/sdk/boost/numeric/bindings/is_row_major.hpp new file mode 100644 index 0000000..76a5606 --- /dev/null +++ b/sdk/boost/numeric/bindings/is_row_major.hpp @@ -0,0 +1,32 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_IS_ROW_MAJOR_HPP +#define BOOST_NUMERIC_BINDINGS_IS_ROW_MAJOR_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +struct is_row_major: + mpl::if_< + detail::property_has_key< T, tag::data_order >, + detail::is_same_at< T, tag::data_order, tag::row_major >, + mpl::false_ + >::type {}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/is_symmetric.hpp b/sdk/boost/numeric/bindings/is_symmetric.hpp new file mode 100644 index 0000000..83d3728 --- /dev/null +++ b/sdk/boost/numeric/bindings/is_symmetric.hpp @@ -0,0 +1,27 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_IS_SYMMETRIC_HPP +#define BOOST_NUMERIC_BINDINGS_IS_SYMMETRIC_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +struct is_symmetric: + detail::is_same_at< T, tag::matrix_type, tag::symmetric > {}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack.hpp b/sdk/boost/numeric/bindings/lapack.hpp new file mode 100644 index 0000000..92a3b72 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack.hpp @@ -0,0 +1,16 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_HPP + +#include +#include +#include + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary.hpp new file mode 100644 index 0000000..3260af4 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary.hpp @@ -0,0 +1,48 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/ilaenv.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/ilaenv.hpp new file mode 100644 index 0000000..0d1c766 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/ilaenv.hpp @@ -0,0 +1,38 @@ +/* + * + * Copyright (c) Toon Knapen, Kresimir Fresl and Matthias Troyer 2003 + * + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + * + * KF acknowledges the support of the Faculty of Civil Engineering, + * University of Zagreb, Croatia. + * + */ + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_ILAENV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_ILAENV_HPP + +#include +#include + +namespace boost { namespace numeric { namespace bindings { namespace lapack { + +// +// ilaenv() is called from the LAPACK routines to choose +// problem-dependent parameters such as the block sizes +// for the local environment. +// + +inline std::ptrdiff_t ilaenv( const fortran_int_t ispec, const char* name, + const char* opts, const fortran_int_t n1 = -1, const fortran_int_t n2 = -1, + const fortran_int_t n3 = -1, const fortran_int_t n4 = -1) { + return LAPACK_ILAENV( &ispec, name, opts, &n1, &n2, &n3, &n4, + std::strlen (name), std::strlen (opts) ); +} + +}}}} + +#endif + diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/labrd.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/labrd.hpp new file mode 100644 index 0000000..54e4c66 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/labrd.hpp @@ -0,0 +1,301 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LABRD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LABRD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for labrd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t labrd( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nb, float* a, const fortran_int_t lda, float* d, + float* e, float* tauq, float* taup, float* x, const fortran_int_t ldx, + float* y, const fortran_int_t ldy ) { + fortran_int_t info(0); + LAPACK_SLABRD( &m, &n, &nb, a, &lda, d, e, tauq, taup, x, &ldx, y, &ldy ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t labrd( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nb, double* a, const fortran_int_t lda, double* d, + double* e, double* tauq, double* taup, double* x, + const fortran_int_t ldx, double* y, const fortran_int_t ldy ) { + fortran_int_t info(0); + LAPACK_DLABRD( &m, &n, &nb, a, &lda, d, e, tauq, taup, x, &ldx, y, &ldy ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t labrd( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nb, std::complex* a, + const fortran_int_t lda, float* d, float* e, + std::complex* tauq, std::complex* taup, + std::complex* x, const fortran_int_t ldx, + std::complex* y, const fortran_int_t ldy ) { + fortran_int_t info(0); + LAPACK_CLABRD( &m, &n, &nb, a, &lda, d, e, tauq, taup, x, &ldx, y, &ldy ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t labrd( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nb, std::complex* a, + const fortran_int_t lda, double* d, double* e, + std::complex* tauq, std::complex* taup, + std::complex* x, const fortran_int_t ldx, + std::complex* y, const fortran_int_t ldy ) { + fortran_int_t info(0); + LAPACK_ZLABRD( &m, &n, &nb, a, &lda, d, e, tauq, taup, x, &ldx, y, &ldy ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to labrd. +// +template< typename Value, typename Enable = void > +struct labrd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct labrd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAUQ, typename VectorTAUP, typename MatrixX, + typename MatrixY > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAUQ& tauq, VectorTAUP& taup, MatrixX& x, MatrixY& y ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixY >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixY >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(e) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(taup) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(tauq) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::size_minor(y) == 1 || + bindings::stride_minor(y) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::stride_major(y) >= bindings::size_column(a) ); + return detail::labrd( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(tauq), + bindings::begin_value(taup), bindings::begin_value(x), + bindings::stride_major(x), bindings::begin_value(y), + bindings::stride_major(y) ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct labrd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAUQ, typename VectorTAUP, typename MatrixX, + typename MatrixY > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAUQ& tauq, VectorTAUP& taup, MatrixX& x, MatrixY& y ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixY >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixY >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(e) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(taup) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(tauq) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::size_minor(y) == 1 || + bindings::stride_minor(y) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(y) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::labrd( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(tauq), + bindings::begin_value(taup), bindings::begin_value(x), + bindings::stride_major(x), bindings::begin_value(y), + bindings::stride_major(y) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the labrd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for labrd. Its overload differs for +// +template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAUQ, typename VectorTAUP, typename MatrixX, + typename MatrixY > +inline std::ptrdiff_t labrd( MatrixA& a, VectorD& d, VectorE& e, + VectorTAUQ& tauq, VectorTAUP& taup, MatrixX& x, MatrixY& y ) { + return labrd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, d, e, tauq, taup, x, y ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lacgv.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lacgv.hpp new file mode 100644 index 0000000..e23ddd6 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lacgv.hpp @@ -0,0 +1,122 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LACGV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LACGV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lacgv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t lacgv( const fortran_int_t n, std::complex* x, + const fortran_int_t incx ) { + fortran_int_t info(0); + LAPACK_CLACGV( &n, x, &incx ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t lacgv( const fortran_int_t n, std::complex* x, + const fortran_int_t incx ) { + fortran_int_t info(0); + LAPACK_ZLACGV( &n, x, &incx ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lacgv. +// +template< typename Value > +struct lacgv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorX > + static std::ptrdiff_t invoke( const fortran_int_t n, VectorX& x, + const fortran_int_t incx ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_ASSERT( n >= 0 ); + return detail::lacgv( n, bindings::begin_value(x), incx ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lacgv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lacgv. Its overload differs for +// +template< typename VectorX > +inline std::ptrdiff_t lacgv( const fortran_int_t n, VectorX& x, + const fortran_int_t incx ) { + return lacgv_impl< typename bindings::value_type< + VectorX >::type >::invoke( n, x, incx ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lacon.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lacon.hpp new file mode 100644 index 0000000..5ff3eaa --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lacon.hpp @@ -0,0 +1,296 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LACON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LACON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lacon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t lacon( const fortran_int_t n, float* v, float* x, + fortran_int_t* isgn, float& est, fortran_int_t& kase ) { + fortran_int_t info(0); + LAPACK_SLACON( &n, v, x, isgn, &est, &kase ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t lacon( const fortran_int_t n, double* v, double* x, + fortran_int_t* isgn, double& est, fortran_int_t& kase ) { + fortran_int_t info(0); + LAPACK_DLACON( &n, v, x, isgn, &est, &kase ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t lacon( const fortran_int_t n, std::complex* v, + std::complex* x, float& est, fortran_int_t& kase ) { + fortran_int_t info(0); + LAPACK_CLACON( &n, v, x, &est, &kase ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t lacon( const fortran_int_t n, std::complex* v, + std::complex* x, double& est, fortran_int_t& kase ) { + fortran_int_t info(0); + LAPACK_ZLACON( &n, v, x, &est, &kase ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lacon. +// +template< typename Value, typename Enable = void > +struct lacon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct lacon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename V, typename ISGN > + static std::ptrdiff_t invoke( const fortran_int_t n, VectorX& x, + real_type& est, fortran_int_t& kase, detail::workspace2< V, + ISGN > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_isgn( n )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_v( n )); + BOOST_ASSERT( n >= 1 ); + return detail::lacon( n, + bindings::begin_value(work.select(real_type())), + bindings::begin_value(x), + bindings::begin_value(work.select(fortran_int_t())), est, + kase ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorX > + static std::ptrdiff_t invoke( const fortran_int_t n, VectorX& x, + real_type& est, fortran_int_t& kase, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_v( min_size_v( n ) ); + bindings::detail::array< + fortran_int_t > tmp_isgn( min_size_isgn( n ) ); + return invoke( n, x, est, kase, workspace( tmp_v, tmp_isgn ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorX > + static std::ptrdiff_t invoke( const fortran_int_t n, VectorX& x, + real_type& est, fortran_int_t& kase, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( n, x, est, kase, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array v. + // + static std::ptrdiff_t min_size_v( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array isgn. + // + static std::ptrdiff_t min_size_isgn( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct lacon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename V > + static std::ptrdiff_t invoke( const fortran_int_t n, VectorX& x, + real_type& est, fortran_int_t& kase, detail::workspace1< + V > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_v( n )); + BOOST_ASSERT( n >= 1 ); + return detail::lacon( n, + bindings::begin_value(work.select(value_type())), + bindings::begin_value(x), est, kase ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorX > + static std::ptrdiff_t invoke( const fortran_int_t n, VectorX& x, + real_type& est, fortran_int_t& kase, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_v( min_size_v( n ) ); + return invoke( n, x, est, kase, workspace( tmp_v ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorX > + static std::ptrdiff_t invoke( const fortran_int_t n, VectorX& x, + real_type& est, fortran_int_t& kase, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( n, x, est, kase, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array v. + // + static std::ptrdiff_t min_size_v( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lacon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lacon. Its overload differs for +// * User-defined workspace +// +template< typename VectorX, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +lacon( const fortran_int_t n, VectorX& x, typename remove_imaginary< + typename bindings::value_type< VectorX >::type >::type& est, + fortran_int_t& kase, Workspace work ) { + return lacon_impl< typename bindings::value_type< + VectorX >::type >::invoke( n, x, est, kase, work ); +} + +// +// Overloaded function for lacon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorX > +inline typename boost::disable_if< detail::is_workspace< VectorX >, + std::ptrdiff_t >::type +lacon( const fortran_int_t n, VectorX& x, typename remove_imaginary< + typename bindings::value_type< VectorX >::type >::type& est, + fortran_int_t& kase ) { + return lacon_impl< typename bindings::value_type< + VectorX >::type >::invoke( n, x, est, kase, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/laebz.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/laebz.hpp new file mode 100644 index 0000000..e1fe74b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/laebz.hpp @@ -0,0 +1,287 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LAEBZ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LAEBZ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for laebz is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t laebz( const fortran_int_t ijob, + const fortran_int_t nitmax, const fortran_int_t n, + const fortran_int_t mmax, const fortran_int_t minp, + const fortran_int_t nbmin, const float abstol, const float reltol, + const float pivmin, const float* d, const float* e, const float* e2, + fortran_int_t* nval, float* ab, float* c, fortran_int_t& mout, + fortran_int_t* nab, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SLAEBZ( &ijob, &nitmax, &n, &mmax, &minp, &nbmin, &abstol, &reltol, + &pivmin, d, e, e2, nval, ab, c, &mout, nab, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t laebz( const fortran_int_t ijob, + const fortran_int_t nitmax, const fortran_int_t n, + const fortran_int_t mmax, const fortran_int_t minp, + const fortran_int_t nbmin, const double abstol, const double reltol, + const double pivmin, const double* d, const double* e, + const double* e2, fortran_int_t* nval, double* ab, double* c, + fortran_int_t& mout, fortran_int_t* nab, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DLAEBZ( &ijob, &nitmax, &n, &mmax, &minp, &nbmin, &abstol, &reltol, + &pivmin, d, e, e2, nval, ab, c, &mout, nab, work, iwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to laebz. +// +template< typename Value > +struct laebz_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorE2, + typename VectorNVAL, typename MatrixAB, typename VectorC, + typename MatrixNAB, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const fortran_int_t nitmax, const fortran_int_t n, + const fortran_int_t minp, const fortran_int_t nbmin, + const real_type abstol, const real_type reltol, + const real_type pivmin, const VectorD& d, const VectorE& e, + const VectorE2& e2, VectorNVAL& nval, MatrixAB& ab, VectorC& c, + fortran_int_t& mout, MatrixNAB& nab, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE2 >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorNVAL >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixNAB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorNVAL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixNAB >::value) ); + BOOST_ASSERT( bindings::size(d) >= n ); + BOOST_ASSERT( bindings::size(e) >= n ); + BOOST_ASSERT( bindings::size(e2) >= n ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::stride_major(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::stride_major(ab) )); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + return detail::laebz( ijob, nitmax, n, bindings::stride_major(ab), + minp, nbmin, abstol, reltol, pivmin, bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(e2), + bindings::begin_value(nval), bindings::begin_value(ab), + bindings::begin_value(c), mout, bindings::begin_value(nab), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorE2, + typename VectorNVAL, typename MatrixAB, typename VectorC, + typename MatrixNAB > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const fortran_int_t nitmax, const fortran_int_t n, + const fortran_int_t minp, const fortran_int_t nbmin, + const real_type abstol, const real_type reltol, + const real_type pivmin, const VectorD& d, const VectorE& e, + const VectorE2& e2, VectorNVAL& nval, MatrixAB& ab, VectorC& c, + fortran_int_t& mout, MatrixNAB& nab, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::stride_major(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::stride_major(ab) ) ); + return invoke( ijob, nitmax, n, minp, nbmin, abstol, reltol, pivmin, + d, e, e2, nval, ab, c, mout, nab, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorE2, + typename VectorNVAL, typename MatrixAB, typename VectorC, + typename MatrixNAB > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const fortran_int_t nitmax, const fortran_int_t n, + const fortran_int_t minp, const fortran_int_t nbmin, + const real_type abstol, const real_type reltol, + const real_type pivmin, const VectorD& d, const VectorE& e, + const VectorE2& e2, VectorNVAL& nval, MatrixAB& ab, VectorC& c, + fortran_int_t& mout, MatrixNAB& nab, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( ijob, nitmax, n, minp, nbmin, abstol, reltol, pivmin, + d, e, e2, nval, ab, c, mout, nab, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t mmax ) { + return mmax; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t mmax ) { + return mmax; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the laebz_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for laebz. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename VectorE2, + typename VectorNVAL, typename MatrixAB, typename VectorC, + typename MatrixNAB, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +laebz( const fortran_int_t ijob, const fortran_int_t nitmax, + const fortran_int_t n, const fortran_int_t minp, + const fortran_int_t nbmin, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type abstol, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type reltol, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type pivmin, + const VectorD& d, const VectorE& e, const VectorE2& e2, + VectorNVAL& nval, MatrixAB& ab, VectorC& c, fortran_int_t& mout, + MatrixNAB& nab, Workspace work ) { + return laebz_impl< typename bindings::value_type< + VectorD >::type >::invoke( ijob, nitmax, n, minp, nbmin, abstol, + reltol, pivmin, d, e, e2, nval, ab, c, mout, nab, work ); +} + +// +// Overloaded function for laebz. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename VectorE2, + typename VectorNVAL, typename MatrixAB, typename VectorC, + typename MatrixNAB > +inline typename boost::disable_if< detail::is_workspace< MatrixNAB >, + std::ptrdiff_t >::type +laebz( const fortran_int_t ijob, const fortran_int_t nitmax, + const fortran_int_t n, const fortran_int_t minp, + const fortran_int_t nbmin, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type abstol, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type reltol, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type pivmin, + const VectorD& d, const VectorE& e, const VectorE2& e2, + VectorNVAL& nval, MatrixAB& ab, VectorC& c, fortran_int_t& mout, + MatrixNAB& nab ) { + return laebz_impl< typename bindings::value_type< + VectorD >::type >::invoke( ijob, nitmax, n, minp, nbmin, abstol, + reltol, pivmin, d, e, e2, nval, ab, c, mout, nab, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lalsd.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lalsd.hpp new file mode 100644 index 0000000..6f12582 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lalsd.hpp @@ -0,0 +1,425 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LALSD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LALSD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lalsd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t lalsd( const char uplo, const fortran_int_t smlsiz, + const fortran_int_t n, const fortran_int_t nrhs, float* d, float* e, + float* b, const fortran_int_t ldb, const float rcond, + fortran_int_t& rank, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SLALSD( &uplo, &smlsiz, &n, &nrhs, d, e, b, &ldb, &rcond, &rank, + work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t lalsd( const char uplo, const fortran_int_t smlsiz, + const fortran_int_t n, const fortran_int_t nrhs, double* d, double* e, + double* b, const fortran_int_t ldb, const double rcond, + fortran_int_t& rank, double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DLALSD( &uplo, &smlsiz, &n, &nrhs, d, e, b, &ldb, &rcond, &rank, + work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t lalsd( const char uplo, const fortran_int_t smlsiz, + const fortran_int_t n, const fortran_int_t nrhs, float* d, float* e, + std::complex* b, const fortran_int_t ldb, const float rcond, + fortran_int_t& rank, std::complex* work, float* rwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_CLALSD( &uplo, &smlsiz, &n, &nrhs, d, e, b, &ldb, &rcond, &rank, + work, rwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t lalsd( const char uplo, const fortran_int_t smlsiz, + const fortran_int_t n, const fortran_int_t nrhs, double* d, double* e, + std::complex* b, const fortran_int_t ldb, const double rcond, + fortran_int_t& rank, std::complex* work, double* rwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_ZLALSD( &uplo, &smlsiz, &n, &nrhs, d, e, b, &ldb, &rcond, &rank, + work, rwork, iwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lalsd. +// +template< typename Value, typename Enable = void > +struct lalsd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct lalsd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixB, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char uplo, + const fortran_int_t smlsiz, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixB& b, const real_type rcond, + fortran_int_t& rank, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + std::ptrdiff_t nlvl = std::max< std::ptrdiff_t >( 0, + static_cast( + std::log(static_cast(n)/static_cast(smlsiz+ + 1)) / + std::log(static_cast(2.)) ) + 1 ); + BOOST_ASSERT( bindings::size(e) >= n-1 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n, nlvl )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n, smlsiz, nlvl, bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(b) >= 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( n >= 0 ); + return detail::lalsd( uplo, smlsiz, n, bindings::size_column(b), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(b), bindings::stride_major(b), rcond, + rank, bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename MatrixB > + static std::ptrdiff_t invoke( const char uplo, + const fortran_int_t smlsiz, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixB& b, const real_type rcond, + fortran_int_t& rank, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + std::ptrdiff_t nlvl = std::max< std::ptrdiff_t >( 0, + static_cast( + std::log(static_cast(n)/static_cast(smlsiz+ + 1)) / + std::log(static_cast(2.)) ) + 1 ); + bindings::detail::array< real_type > tmp_work( min_size_work( n, + smlsiz, nlvl, bindings::size_column(b) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n, nlvl ) ); + return invoke( uplo, smlsiz, n, d, e, b, rcond, rank, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename MatrixB > + static std::ptrdiff_t invoke( const char uplo, + const fortran_int_t smlsiz, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixB& b, const real_type rcond, + fortran_int_t& rank, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( uplo, smlsiz, n, d, e, b, rcond, rank, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t smlsiz, const std::ptrdiff_t nlvl, + const std::ptrdiff_t nrhs ) { + std::ptrdiff_t smlsiz_plus_one = smlsiz + 1; + return 9*n + 2*n*smlsiz + 8*n*nlvl + n*nrhs + + smlsiz_plus_one * smlsiz_plus_one; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n, + const std::ptrdiff_t nlvl ) { + return 3*n*nlvl + 11*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct lalsd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixB, + typename WORK, typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const char uplo, + const fortran_int_t smlsiz, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixB& b, const real_type rcond, + fortran_int_t& rank, detail::workspace3< WORK, RWORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + std::ptrdiff_t nlvl = std::max< std::ptrdiff_t >( 0, + static_cast( + std::log(static_cast(n)/ + static_cast(smlsiz+1)) / + std::log(static_cast(2.))) + 1 ); + BOOST_ASSERT( bindings::size(e) >= n-1 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n, nlvl )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( n, smlsiz, nlvl, bindings::size_column(b) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( n, bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(b) >= 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( n >= 0 ); + return detail::lalsd( uplo, smlsiz, n, bindings::size_column(b), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(b), bindings::stride_major(b), rcond, + rank, bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename MatrixB > + static std::ptrdiff_t invoke( const char uplo, + const fortran_int_t smlsiz, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixB& b, const real_type rcond, + fortran_int_t& rank, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + std::ptrdiff_t nlvl = std::max< std::ptrdiff_t >( 0, + static_cast( + std::log(static_cast(n)/ + static_cast(smlsiz+1)) / + std::log(static_cast(2.))) + 1 ); + bindings::detail::array< value_type > tmp_work( min_size_work( n, + bindings::size_column(b) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( n, + smlsiz, nlvl, bindings::size_column(b) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n, nlvl ) ); + return invoke( uplo, smlsiz, n, d, e, b, rcond, rank, + workspace( tmp_work, tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename MatrixB > + static std::ptrdiff_t invoke( const char uplo, + const fortran_int_t smlsiz, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixB& b, const real_type rcond, + fortran_int_t& rank, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( uplo, smlsiz, n, d, e, b, rcond, rank, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t nrhs ) { + return n*nrhs; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n, + const std::ptrdiff_t smlsiz, const std::ptrdiff_t nlvl, + const std::ptrdiff_t nrhs ) { + std::ptrdiff_t smlsiz_plus_one = smlsiz + 1; + return 9*n + 2*n*smlsiz + 8*n*nlvl + 3*smlsiz*nrhs + + smlsiz_plus_one * smlsiz_plus_one; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n, + const std::ptrdiff_t nlvl ) { + return 3*n*nlvl+11*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lalsd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lalsd. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename MatrixB, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +lalsd( const char uplo, const fortran_int_t smlsiz, + const fortran_int_t n, VectorD& d, VectorE& e, MatrixB& b, + const typename remove_imaginary< typename bindings::value_type< + MatrixB >::type >::type rcond, fortran_int_t& rank, + Workspace work ) { + return lalsd_impl< typename bindings::value_type< + MatrixB >::type >::invoke( uplo, smlsiz, n, d, e, b, rcond, rank, + work ); +} + +// +// Overloaded function for lalsd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename MatrixB > +inline typename boost::disable_if< detail::is_workspace< MatrixB >, + std::ptrdiff_t >::type +lalsd( const char uplo, const fortran_int_t smlsiz, + const fortran_int_t n, VectorD& d, VectorE& e, MatrixB& b, + const typename remove_imaginary< typename bindings::value_type< + MatrixB >::type >::type rcond, fortran_int_t& rank ) { + return lalsd_impl< typename bindings::value_type< + MatrixB >::type >::invoke( uplo, smlsiz, n, d, e, b, rcond, rank, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/langb.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/langb.hpp new file mode 100644 index 0000000..f3800bf --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/langb.hpp @@ -0,0 +1,223 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANGB_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANGB_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for langb is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t langb( const char norm, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, const float* ab, + const fortran_int_t ldab, float* work ) { + fortran_int_t info(0); + LAPACK_SLANGB( &norm, &n, &kl, &ku, ab, &ldab, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t langb( const char norm, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, const double* ab, + const fortran_int_t ldab, double* work ) { + fortran_int_t info(0); + LAPACK_DLANGB( &norm, &n, &kl, &ku, ab, &ldab, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t langb( const char norm, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const std::complex* ab, const fortran_int_t ldab, + float* work ) { + fortran_int_t info(0); + LAPACK_CLANGB( &norm, &n, &kl, &ku, ab, &ldab, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t langb( const char norm, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const std::complex* ab, const fortran_int_t ldab, + double* work ) { + fortran_int_t info(0); + LAPACK_ZLANGB( &norm, &n, &kl, &ku, ab, &ldab, work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to langb. +// +template< typename Value > +struct langb_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename WORK > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower(ab) >= 0 ); + BOOST_ASSERT( bindings::bandwidth_upper(ab) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( norm, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + bindings::bandwidth_lower(ab)+bindings::bandwidth_upper(ab)+ + 1 ); + return detail::langb( norm, bindings::size_column(ab), + bindings::bandwidth_lower(ab), bindings::bandwidth_upper(ab), + bindings::begin_value(ab), bindings::stride_major(ab), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( norm, + bindings::size_column(ab) ) ); + return invoke( norm, ab, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( norm, ab, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char norm, + const std::ptrdiff_t n ) { + if ( norm == 'I' ) + return std::max< std::ptrdiff_t >( 1, n ); + else + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the langb_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for langb. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +langb( const char norm, const MatrixAB& ab, Workspace work ) { + return langb_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( norm, ab, work ); +} + +// +// Overloaded function for langb. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB > +inline typename boost::disable_if< detail::is_workspace< MatrixAB >, + std::ptrdiff_t >::type +langb( const char norm, const MatrixAB& ab ) { + return langb_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( norm, ab, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lange.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lange.hpp new file mode 100644 index 0000000..2ecb8e5 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lange.hpp @@ -0,0 +1,218 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANGE_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANGE_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lange is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t lange( const char norm, const fortran_int_t m, + const fortran_int_t n, const float* a, const fortran_int_t lda, + float* work ) { + fortran_int_t info(0); + LAPACK_SLANGE( &norm, &m, &n, a, &lda, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t lange( const char norm, const fortran_int_t m, + const fortran_int_t n, const double* a, const fortran_int_t lda, + double* work ) { + fortran_int_t info(0); + LAPACK_DLANGE( &norm, &m, &n, a, &lda, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t lange( const char norm, const fortran_int_t m, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, float* work ) { + fortran_int_t info(0); + LAPACK_CLANGE( &norm, &m, &n, a, &lda, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t lange( const char norm, const fortran_int_t m, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, double* work ) { + fortran_int_t info(0); + LAPACK_ZLANGE( &norm, &m, &n, a, &lda, work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lange. +// +template< typename Value > +struct lange_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename WORK > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( norm, bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< + std::ptrdiff_t >(bindings::size_row(a),1) ); + return detail::lange( norm, bindings::size_row(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( norm, + bindings::size_row(a) ) ); + return invoke( norm, a, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( norm, a, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char norm, + const std::ptrdiff_t m ) { + if ( norm == 'I' ) + return std::max< std::ptrdiff_t >( 1, m ); + else + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lange_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lange. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +lange( const char norm, const MatrixA& a, Workspace work ) { + return lange_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, work ); +} + +// +// Overloaded function for lange. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA > +inline typename boost::disable_if< detail::is_workspace< MatrixA >, + std::ptrdiff_t >::type +lange( const char norm, const MatrixA& a ) { + return lange_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lanhb.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lanhb.hpp new file mode 100644 index 0000000..4ea0ef1 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lanhb.hpp @@ -0,0 +1,203 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANHB_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANHB_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lanhb is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lanhb( const char norm, const UpLo, + const fortran_int_t n, const fortran_int_t k, + const std::complex* ab, const fortran_int_t ldab, + float* work ) { + fortran_int_t info(0); + LAPACK_CLANHB( &norm, &lapack_option< UpLo >::value, &n, &k, ab, &ldab, + work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lanhb( const char norm, const UpLo, + const fortran_int_t n, const fortran_int_t k, + const std::complex* ab, const fortran_int_t ldab, + double* work ) { + fortran_int_t info(0); + LAPACK_ZLANHB( &norm, &lapack_option< UpLo >::value, &n, &k, ab, &ldab, + work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lanhb. +// +template< typename Value > +struct lanhb_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename WORK > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower(ab) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( norm, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + bindings::bandwidth_lower(ab)+1 ); + return detail::lanhb( norm, uplo(), bindings::size_column(ab), + bindings::bandwidth_lower(ab), bindings::begin_value(ab), + bindings::stride_major(ab), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( norm, + bindings::size_column(ab) ) ); + return invoke( norm, ab, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( norm, ab, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char norm, + const std::ptrdiff_t n ) { + if ( norm == 'I' || norm == '1' || norm == 'O' ) + return std::max< std::ptrdiff_t >( 1, n ); + else + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lanhb_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lanhb. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +lanhb( const char norm, const MatrixAB& ab, Workspace work ) { + return lanhb_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( norm, ab, work ); +} + +// +// Overloaded function for lanhb. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB > +inline typename boost::disable_if< detail::is_workspace< MatrixAB >, + std::ptrdiff_t >::type +lanhb( const char norm, const MatrixAB& ab ) { + return lanhb_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( norm, ab, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lanhe.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lanhe.hpp new file mode 100644 index 0000000..217cdbc --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lanhe.hpp @@ -0,0 +1,196 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANHE_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANHE_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lanhe is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lanhe( const char norm, const UpLo, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, float* work ) { + fortran_int_t info(0); + LAPACK_CLANHE( &norm, &lapack_option< UpLo >::value, &n, a, &lda, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lanhe( const char norm, const UpLo, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, double* work ) { + fortran_int_t info(0); + LAPACK_ZLANHE( &norm, &lapack_option< UpLo >::value, &n, a, &lda, work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lanhe. +// +template< typename Value > +struct lanhe_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename WORK > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( norm, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< + std::ptrdiff_t >(bindings::size_column(a),1) ); + return detail::lanhe( norm, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( norm, + bindings::size_column(a) ) ); + return invoke( norm, a, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( norm, a, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char norm, + const std::ptrdiff_t n ) { + if ( norm == 'I' || norm == '1' || norm == 'O' ) + return std::max< std::ptrdiff_t >( 1, n ); + else + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lanhe_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lanhe. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +lanhe( const char norm, const MatrixA& a, Workspace work ) { + return lanhe_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, work ); +} + +// +// Overloaded function for lanhe. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA > +inline typename boost::disable_if< detail::is_workspace< MatrixA >, + std::ptrdiff_t >::type +lanhe( const char norm, const MatrixA& a ) { + return lanhe_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lanhp.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lanhp.hpp new file mode 100644 index 0000000..712ed68 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lanhp.hpp @@ -0,0 +1,188 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANHP_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANHP_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lanhp is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lanhp( const char norm, const UpLo, + const fortran_int_t n, const std::complex* ap, float* work ) { + fortran_int_t info(0); + LAPACK_CLANHP( &norm, &lapack_option< UpLo >::value, &n, ap, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lanhp( const char norm, const UpLo, + const fortran_int_t n, const std::complex* ap, double* work ) { + fortran_int_t info(0); + LAPACK_ZLANHP( &norm, &lapack_option< UpLo >::value, &n, ap, work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lanhp. +// +template< typename Value > +struct lanhp_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename WORK > + static std::ptrdiff_t invoke( const char norm, const MatrixAP& ap, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( norm, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::lanhp( norm, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const char norm, const MatrixAP& ap, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( norm, + bindings::size_column(ap) ) ); + return invoke( norm, ap, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const char norm, const MatrixAP& ap, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( norm, ap, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char norm, + const std::ptrdiff_t n ) { + if ( norm == 'I' || norm == '1' || norm == 'O' ) + return std::max< std::ptrdiff_t >( 1, n ); + else + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lanhp_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lanhp. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +lanhp( const char norm, const MatrixAP& ap, Workspace work ) { + return lanhp_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( norm, ap, work ); +} + +// +// Overloaded function for lanhp. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP > +inline typename boost::disable_if< detail::is_workspace< MatrixAP >, + std::ptrdiff_t >::type +lanhp( const char norm, const MatrixAP& ap ) { + return lanhp_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( norm, ap, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lanhs.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lanhs.hpp new file mode 100644 index 0000000..10a776b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lanhs.hpp @@ -0,0 +1,213 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANHS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANHS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lanhs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t lanhs( const char norm, const fortran_int_t n, + const float* a, const fortran_int_t lda, float* work ) { + fortran_int_t info(0); + LAPACK_SLANHS( &norm, &n, a, &lda, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t lanhs( const char norm, const fortran_int_t n, + const double* a, const fortran_int_t lda, double* work ) { + fortran_int_t info(0); + LAPACK_DLANHS( &norm, &n, a, &lda, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t lanhs( const char norm, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, float* work ) { + fortran_int_t info(0); + LAPACK_CLANHS( &norm, &n, a, &lda, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t lanhs( const char norm, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + double* work ) { + fortran_int_t info(0); + LAPACK_ZLANHS( &norm, &n, a, &lda, work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lanhs. +// +template< typename Value > +struct lanhs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename WORK > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( norm, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< + std::ptrdiff_t >(bindings::size_column(a),1) ); + return detail::lanhs( norm, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( norm, + bindings::size_column(a) ) ); + return invoke( norm, a, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( norm, a, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char norm, + const std::ptrdiff_t n ) { + if ( norm == 'I' ) + return std::max< std::ptrdiff_t >( 1, n ); + else + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lanhs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lanhs. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +lanhs( const char norm, const MatrixA& a, Workspace work ) { + return lanhs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, work ); +} + +// +// Overloaded function for lanhs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA > +inline typename boost::disable_if< detail::is_workspace< MatrixA >, + std::ptrdiff_t >::type +lanhs( const char norm, const MatrixA& a ) { + return lanhs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lansb.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lansb.hpp new file mode 100644 index 0000000..7ee287b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lansb.hpp @@ -0,0 +1,233 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANSB_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANSB_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lansb is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lansb( const char norm, const UpLo, + const fortran_int_t n, const fortran_int_t k, const float* ab, + const fortran_int_t ldab, float* work ) { + fortran_int_t info(0); + LAPACK_SLANSB( &norm, &lapack_option< UpLo >::value, &n, &k, ab, &ldab, + work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lansb( const char norm, const UpLo, + const fortran_int_t n, const fortran_int_t k, const double* ab, + const fortran_int_t ldab, double* work ) { + fortran_int_t info(0); + LAPACK_DLANSB( &norm, &lapack_option< UpLo >::value, &n, &k, ab, &ldab, + work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lansb( const char norm, const UpLo, + const fortran_int_t n, const fortran_int_t k, + const std::complex* ab, const fortran_int_t ldab, + float* work ) { + fortran_int_t info(0); + LAPACK_CLANSB( &norm, &lapack_option< UpLo >::value, &n, &k, ab, &ldab, + work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lansb( const char norm, const UpLo, + const fortran_int_t n, const fortran_int_t k, + const std::complex* ab, const fortran_int_t ldab, + double* work ) { + fortran_int_t info(0); + LAPACK_ZLANSB( &norm, &lapack_option< UpLo >::value, &n, &k, ab, &ldab, + work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lansb. +// +template< typename Value > +struct lansb_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename WORK > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower(ab) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( norm, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + bindings::bandwidth_lower(ab)+1 ); + return detail::lansb( norm, uplo(), bindings::size_column(ab), + bindings::bandwidth_lower(ab), bindings::begin_value(ab), + bindings::stride_major(ab), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( norm, + bindings::size_column(ab) ) ); + return invoke( norm, ab, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( norm, ab, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char norm, + const std::ptrdiff_t n ) { + if ( norm == 'I' || norm == '1' || norm == 'O' ) + return std::max< std::ptrdiff_t >( 1, n ); + else + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lansb_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lansb. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +lansb( const char norm, const MatrixAB& ab, Workspace work ) { + return lansb_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( norm, ab, work ); +} + +// +// Overloaded function for lansb. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB > +inline typename boost::disable_if< detail::is_workspace< MatrixAB >, + std::ptrdiff_t >::type +lansb( const char norm, const MatrixAB& ab ) { + return lansb_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( norm, ab, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lansp.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lansp.hpp new file mode 100644 index 0000000..72c2e60 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lansp.hpp @@ -0,0 +1,214 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANSP_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANSP_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lansp is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lansp( const char norm, const UpLo, + const fortran_int_t n, const float* ap, float* work ) { + fortran_int_t info(0); + LAPACK_SLANSP( &norm, &lapack_option< UpLo >::value, &n, ap, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lansp( const char norm, const UpLo, + const fortran_int_t n, const double* ap, double* work ) { + fortran_int_t info(0); + LAPACK_DLANSP( &norm, &lapack_option< UpLo >::value, &n, ap, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lansp( const char norm, const UpLo, + const fortran_int_t n, const std::complex* ap, float* work ) { + fortran_int_t info(0); + LAPACK_CLANSP( &norm, &lapack_option< UpLo >::value, &n, ap, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lansp( const char norm, const UpLo, + const fortran_int_t n, const std::complex* ap, double* work ) { + fortran_int_t info(0); + LAPACK_ZLANSP( &norm, &lapack_option< UpLo >::value, &n, ap, work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lansp. +// +template< typename Value > +struct lansp_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename WORK > + static std::ptrdiff_t invoke( const char norm, const MatrixAP& ap, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( norm, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::lansp( norm, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const char norm, const MatrixAP& ap, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( norm, + bindings::size_column(ap) ) ); + return invoke( norm, ap, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const char norm, const MatrixAP& ap, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( norm, ap, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char norm, + const std::ptrdiff_t n ) { + if ( norm == 'I' || norm == '1' || norm == 'O' ) + return std::max< std::ptrdiff_t >( 1, n ); + else + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lansp_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lansp. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +lansp( const char norm, const MatrixAP& ap, Workspace work ) { + return lansp_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( norm, ap, work ); +} + +// +// Overloaded function for lansp. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP > +inline typename boost::disable_if< detail::is_workspace< MatrixAP >, + std::ptrdiff_t >::type +lansp( const char norm, const MatrixAP& ap ) { + return lansp_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( norm, ap, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lansy.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lansy.hpp new file mode 100644 index 0000000..6ee9216 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lansy.hpp @@ -0,0 +1,224 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANSY_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANSY_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lansy is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lansy( const char norm, const UpLo, + const fortran_int_t n, const float* a, const fortran_int_t lda, + float* work ) { + fortran_int_t info(0); + LAPACK_SLANSY( &norm, &lapack_option< UpLo >::value, &n, a, &lda, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lansy( const char norm, const UpLo, + const fortran_int_t n, const double* a, const fortran_int_t lda, + double* work ) { + fortran_int_t info(0); + LAPACK_DLANSY( &norm, &lapack_option< UpLo >::value, &n, a, &lda, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lansy( const char norm, const UpLo, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, float* work ) { + fortran_int_t info(0); + LAPACK_CLANSY( &norm, &lapack_option< UpLo >::value, &n, a, &lda, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t lansy( const char norm, const UpLo, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, double* work ) { + fortran_int_t info(0); + LAPACK_ZLANSY( &norm, &lapack_option< UpLo >::value, &n, a, &lda, work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lansy. +// +template< typename Value > +struct lansy_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename WORK > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( norm, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< + std::ptrdiff_t >(bindings::size_column(a),1) ); + return detail::lansy( norm, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( norm, + bindings::size_column(a) ) ); + return invoke( norm, a, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( norm, a, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char norm, + const std::ptrdiff_t n ) { + if ( norm == 'I' || norm == '1' || norm == 'O' ) + return std::max< std::ptrdiff_t >( 1, n ); + else + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lansy_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lansy. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +lansy( const char norm, const MatrixA& a, Workspace work ) { + return lansy_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, work ); +} + +// +// Overloaded function for lansy. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA > +inline typename boost::disable_if< detail::is_workspace< MatrixA >, + std::ptrdiff_t >::type +lansy( const char norm, const MatrixA& a ) { + return lansy_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lantb.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lantb.hpp new file mode 100644 index 0000000..e4c660c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lantb.hpp @@ -0,0 +1,238 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANTB_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANTB_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lantb is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Diag > +inline std::ptrdiff_t lantb( const char norm, const char uplo, const Diag, + const fortran_int_t n, const fortran_int_t k, const float* ab, + const fortran_int_t ldab, float* work ) { + fortran_int_t info(0); + LAPACK_SLANTB( &norm, &uplo, &lapack_option< Diag >::value, &n, &k, ab, + &ldab, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Diag > +inline std::ptrdiff_t lantb( const char norm, const char uplo, const Diag, + const fortran_int_t n, const fortran_int_t k, const double* ab, + const fortran_int_t ldab, double* work ) { + fortran_int_t info(0); + LAPACK_DLANTB( &norm, &uplo, &lapack_option< Diag >::value, &n, &k, ab, + &ldab, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Diag > +inline std::ptrdiff_t lantb( const char norm, const char uplo, const Diag, + const fortran_int_t n, const fortran_int_t k, + const std::complex* ab, const fortran_int_t ldab, + float* work ) { + fortran_int_t info(0); + LAPACK_CLANTB( &norm, &uplo, &lapack_option< Diag >::value, &n, &k, ab, + &ldab, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Diag > +inline std::ptrdiff_t lantb( const char norm, const char uplo, const Diag, + const fortran_int_t n, const fortran_int_t k, + const std::complex* ab, const fortran_int_t ldab, + double* work ) { + fortran_int_t info(0); + LAPACK_ZLANTB( &norm, &uplo, &lapack_option< Diag >::value, &n, &k, ab, + &ldab, work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lantb. +// +template< typename Value > +struct lantb_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename WORK > + static std::ptrdiff_t invoke( const char norm, const char uplo, + const fortran_int_t k, const MatrixAB& ab, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( norm, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= k+1 ); + BOOST_ASSERT( k >= 0 ); + return detail::lantb( norm, uplo, diag(), bindings::size_column(ab), + k, bindings::begin_value(ab), bindings::stride_major(ab), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const char norm, const char uplo, + const fortran_int_t k, const MatrixAB& ab, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + bindings::detail::array< real_type > tmp_work( min_size_work( norm, + bindings::size_column(ab) ) ); + return invoke( norm, uplo, k, ab, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const char norm, const char uplo, + const fortran_int_t k, const MatrixAB& ab, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + return invoke( norm, uplo, k, ab, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char norm, + const std::ptrdiff_t n ) { + if ( norm == 'I' ) + return std::max< std::ptrdiff_t >( 1, n ); + else + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lantb_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lantb. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +lantb( const char norm, const char uplo, const fortran_int_t k, + const MatrixAB& ab, Workspace work ) { + return lantb_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( norm, uplo, k, ab, work ); +} + +// +// Overloaded function for lantb. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB > +inline typename boost::disable_if< detail::is_workspace< MatrixAB >, + std::ptrdiff_t >::type +lantb( const char norm, const char uplo, const fortran_int_t k, + const MatrixAB& ab ) { + return lantb_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( norm, uplo, k, ab, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lantp.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lantp.hpp new file mode 100644 index 0000000..0a50314 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lantp.hpp @@ -0,0 +1,216 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANTP_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANTP_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lantp is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Diag > +inline std::ptrdiff_t lantp( const char norm, const char uplo, const Diag, + const fortran_int_t n, const float* ap, float* work ) { + fortran_int_t info(0); + LAPACK_SLANTP( &norm, &uplo, &lapack_option< Diag >::value, &n, ap, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Diag > +inline std::ptrdiff_t lantp( const char norm, const char uplo, const Diag, + const fortran_int_t n, const double* ap, double* work ) { + fortran_int_t info(0); + LAPACK_DLANTP( &norm, &uplo, &lapack_option< Diag >::value, &n, ap, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Diag > +inline std::ptrdiff_t lantp( const char norm, const char uplo, const Diag, + const fortran_int_t n, const std::complex* ap, float* work ) { + fortran_int_t info(0); + LAPACK_CLANTP( &norm, &uplo, &lapack_option< Diag >::value, &n, ap, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Diag > +inline std::ptrdiff_t lantp( const char norm, const char uplo, const Diag, + const fortran_int_t n, const std::complex* ap, double* work ) { + fortran_int_t info(0); + LAPACK_ZLANTP( &norm, &uplo, &lapack_option< Diag >::value, &n, ap, work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lantp. +// +template< typename Value > +struct lantp_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename WORK > + static std::ptrdiff_t invoke( const char norm, const char uplo, + const MatrixAP& ap, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( norm, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::lantp( norm, uplo, diag(), bindings::size_column(ap), + bindings::begin_value(ap), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const char norm, const char uplo, + const MatrixAP& ap, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + bindings::detail::array< real_type > tmp_work( min_size_work( norm, + bindings::size_column(ap) ) ); + return invoke( norm, uplo, ap, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const char norm, const char uplo, + const MatrixAP& ap, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + return invoke( norm, uplo, ap, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char norm, + const std::ptrdiff_t n ) { + if ( norm == 'I' ) + return std::max< std::ptrdiff_t >( 1, n ); + else + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lantp_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lantp. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +lantp( const char norm, const char uplo, const MatrixAP& ap, + Workspace work ) { + return lantp_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( norm, uplo, ap, work ); +} + +// +// Overloaded function for lantp. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP > +inline typename boost::disable_if< detail::is_workspace< MatrixAP >, + std::ptrdiff_t >::type +lantp( const char norm, const char uplo, const MatrixAP& ap ) { + return lantp_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( norm, uplo, ap, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/lantr.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/lantr.hpp new file mode 100644 index 0000000..8e82ce4 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/lantr.hpp @@ -0,0 +1,235 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANTR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LANTR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for lantr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t lantr( const char norm, const UpLo, const Diag, + const fortran_int_t m, const fortran_int_t n, const float* a, + const fortran_int_t lda, float* work ) { + fortran_int_t info(0); + LAPACK_SLANTR( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &m, &n, a, &lda, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t lantr( const char norm, const UpLo, const Diag, + const fortran_int_t m, const fortran_int_t n, const double* a, + const fortran_int_t lda, double* work ) { + fortran_int_t info(0); + LAPACK_DLANTR( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &m, &n, a, &lda, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t lantr( const char norm, const UpLo, const Diag, + const fortran_int_t m, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, float* work ) { + fortran_int_t info(0); + LAPACK_CLANTR( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &m, &n, a, &lda, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t lantr( const char norm, const UpLo, const Diag, + const fortran_int_t m, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + double* work ) { + fortran_int_t info(0); + LAPACK_ZLANTR( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &m, &n, a, &lda, work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to lantr. +// +template< typename Value > +struct lantr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename WORK > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( norm, bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< + std::ptrdiff_t >(bindings::size_row(a),1) ); + return detail::lantr( norm, uplo(), diag(), bindings::size_row(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + bindings::detail::array< real_type > tmp_work( min_size_work( norm, + bindings::size_row(a) ) ); + return invoke( norm, a, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + return invoke( norm, a, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char norm, + const std::ptrdiff_t m ) { + if ( norm == 'I' ) + return std::max< std::ptrdiff_t >( 1, m ); + else + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the lantr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for lantr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +lantr( const char norm, const MatrixA& a, Workspace work ) { + return lantr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, work ); +} + +// +// Overloaded function for lantr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA > +inline typename boost::disable_if< detail::is_workspace< MatrixA >, + std::ptrdiff_t >::type +lantr( const char norm, const MatrixA& a ) { + return lantr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/larf.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/larf.hpp new file mode 100644 index 0000000..c87efad --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/larf.hpp @@ -0,0 +1,362 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for larf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side > +inline std::ptrdiff_t larf( const Side, const fortran_int_t m, + const fortran_int_t n, const float* v, const fortran_int_t incv, + const float tau, float* c, const fortran_int_t ldc, float* work ) { + fortran_int_t info(0); + LAPACK_SLARF( &lapack_option< Side >::value, &m, &n, v, &incv, &tau, c, + &ldc, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side > +inline std::ptrdiff_t larf( const Side, const fortran_int_t m, + const fortran_int_t n, const double* v, const fortran_int_t incv, + const double tau, double* c, const fortran_int_t ldc, double* work ) { + fortran_int_t info(0); + LAPACK_DLARF( &lapack_option< Side >::value, &m, &n, v, &incv, &tau, c, + &ldc, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t larf( const Side, const fortran_int_t m, + const fortran_int_t n, const std::complex* v, + const fortran_int_t incv, const std::complex tau, + std::complex* c, const fortran_int_t ldc, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_CLARF( &lapack_option< Side >::value, &m, &n, v, &incv, &tau, c, + &ldc, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t larf( const Side, const fortran_int_t m, + const fortran_int_t n, const std::complex* v, + const fortran_int_t incv, const std::complex tau, + std::complex* c, const fortran_int_t ldc, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZLARF( &lapack_option< Side >::value, &m, &n, v, &incv, &tau, c, + &ldc, work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to larf. +// +template< typename Value, typename Enable = void > +struct larf_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct larf_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorV, typename MatrixC, + typename WORK > + static std::ptrdiff_t invoke( const Side side, const VectorV& v, + const real_type tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorV >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::larf( side, bindings::size_row(c), + bindings::size_column(c), bindings::begin_value(v), + bindings::stride(v), tau, bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorV, typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const VectorV& v, + const real_type tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, v, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorV, typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const VectorV& v, + const real_type tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( side, v, tau, c, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct larf_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorV, typename MatrixC, + typename WORK > + static std::ptrdiff_t invoke( const Side side, const VectorV& v, + const value_type tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorV >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::larf( side, bindings::size_row(c), + bindings::size_column(c), bindings::begin_value(v), + bindings::stride(v), tau, bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorV, typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const VectorV& v, + const value_type tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, v, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorV, typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const VectorV& v, + const value_type tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( side, v, tau, c, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the larf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for larf. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename VectorV, typename MatrixC, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +larf( const Side side, const VectorV& v, + const typename remove_imaginary< typename bindings::value_type< + VectorV >::type >::type tau, MatrixC& c, Workspace work ) { + return larf_impl< typename bindings::value_type< + VectorV >::type >::invoke( side, v, tau, c, work ); +} + +// +// Overloaded function for larf. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorV, typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +larf( const Side side, const VectorV& v, + const typename remove_imaginary< typename bindings::value_type< + VectorV >::type >::type tau, MatrixC& c ) { + return larf_impl< typename bindings::value_type< + VectorV >::type >::invoke( side, v, tau, c, optimal_workspace() ); +} + +// +// Overloaded function for larf. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename VectorV, typename MatrixC, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +larf( const Side side, const VectorV& v, + const typename bindings::value_type< VectorV >::type tau, MatrixC& c, + Workspace work ) { + return larf_impl< typename bindings::value_type< + VectorV >::type >::invoke( side, v, tau, c, work ); +} + +// +// Overloaded function for larf. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorV, typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +larf( const Side side, const VectorV& v, + const typename bindings::value_type< VectorV >::type tau, + MatrixC& c ) { + return larf_impl< typename bindings::value_type< + VectorV >::type >::invoke( side, v, tau, c, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/larfb.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/larfb.hpp new file mode 100644 index 0000000..e36cc9d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/larfb.hpp @@ -0,0 +1,393 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARFB_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARFB_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for larfb is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t larfb( const Side, const Trans, const char direct, + const char storev, const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, const float* v, const fortran_int_t ldv, + const float* t, const fortran_int_t ldt, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t ldwork ) { + fortran_int_t info(0); + LAPACK_SLARFB( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &direct, &storev, &m, &n, &k, v, &ldv, t, &ldt, c, + &ldc, work, &ldwork ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t larfb( const Side, const Trans, const char direct, + const char storev, const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, const double* v, const fortran_int_t ldv, + const double* t, const fortran_int_t ldt, double* c, + const fortran_int_t ldc, double* work, const fortran_int_t ldwork ) { + fortran_int_t info(0); + LAPACK_DLARFB( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &direct, &storev, &m, &n, &k, v, &ldv, t, &ldt, c, + &ldc, work, &ldwork ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t larfb( const Side, const Trans, const char direct, + const char storev, const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, const std::complex* v, + const fortran_int_t ldv, const std::complex* t, + const fortran_int_t ldt, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t ldwork ) { + fortran_int_t info(0); + LAPACK_CLARFB( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &direct, &storev, &m, &n, &k, v, &ldv, t, &ldt, c, + &ldc, work, &ldwork ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t larfb( const Side, const Trans, const char direct, + const char storev, const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, const std::complex* v, + const fortran_int_t ldv, const std::complex* t, + const fortran_int_t ldt, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t ldwork ) { + fortran_int_t info(0); + LAPACK_ZLARFB( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &direct, &storev, &m, &n, &k, v, &ldv, t, &ldt, c, + &ldc, work, &ldwork ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to larfb. +// +template< typename Value, typename Enable = void > +struct larfb_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct larfb_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixV, typename MatrixT, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const char direct, + const char storev, const MatrixV& v, const MatrixT& t, MatrixC& c, + const fortran_int_t ldwork, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixT >::type order; + typedef typename result_of::trans_tag< MatrixV, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixV >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixV >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( ldwork, bindings::size_column(t) )); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_minor(t) == 1 || + bindings::stride_minor(t) == 1 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + BOOST_ASSERT( bindings::stride_major(t) >= bindings::size_column(t) ); + BOOST_ASSERT( direct == 'F' || direct == 'B' ); + BOOST_ASSERT( storev == 'C' || storev == 'R' ); + return detail::larfb( side, trans(), direct, storev, + bindings::size_row(c), bindings::size_column(c), + bindings::size_column(t), bindings::begin_value(v), + bindings::stride_major(v), bindings::begin_value(t), + bindings::stride_major(t), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), ldwork ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixV, typename MatrixT, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const char direct, + const char storev, const MatrixV& v, const MatrixT& t, MatrixC& c, + const fortran_int_t ldwork, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixT >::type order; + typedef typename result_of::trans_tag< MatrixV, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( ldwork, + bindings::size_column(t) ) ); + return invoke( side, direct, storev, v, t, c, ldwork, + workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixV, typename MatrixT, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const char direct, + const char storev, const MatrixV& v, const MatrixT& t, MatrixC& c, + const fortran_int_t ldwork, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixT >::type order; + typedef typename result_of::trans_tag< MatrixV, order >::type trans; + return invoke( side, direct, storev, v, t, c, ldwork, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t ldwork, + const std::ptrdiff_t k ) { + return ldwork * k; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct larfb_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixV, typename MatrixT, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const char direct, + const char storev, const MatrixV& v, const MatrixT& t, MatrixC& c, + const fortran_int_t ldwork, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixT >::type order; + typedef typename result_of::trans_tag< MatrixV, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixV >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixV >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( ldwork, bindings::size_column(t) )); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_minor(t) == 1 || + bindings::stride_minor(t) == 1 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + BOOST_ASSERT( bindings::stride_major(t) >= bindings::size_column(t) ); + BOOST_ASSERT( direct == 'F' || direct == 'B' ); + BOOST_ASSERT( storev == 'C' || storev == 'R' ); + return detail::larfb( side, trans(), direct, storev, + bindings::size_row(c), bindings::size_column(c), + bindings::size_column(t), bindings::begin_value(v), + bindings::stride_major(v), bindings::begin_value(t), + bindings::stride_major(t), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(value_type())), ldwork ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixV, typename MatrixT, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const char direct, + const char storev, const MatrixV& v, const MatrixT& t, MatrixC& c, + const fortran_int_t ldwork, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixT >::type order; + typedef typename result_of::trans_tag< MatrixV, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( ldwork, + bindings::size_column(t) ) ); + return invoke( side, direct, storev, v, t, c, ldwork, + workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixV, typename MatrixT, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const char direct, + const char storev, const MatrixV& v, const MatrixT& t, MatrixC& c, + const fortran_int_t ldwork, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixT >::type order; + typedef typename result_of::trans_tag< MatrixV, order >::type trans; + return invoke( side, direct, storev, v, t, c, ldwork, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t ldwork, + const std::ptrdiff_t k ) { + return ldwork * k; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the larfb_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for larfb. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixV, typename MatrixT, typename MatrixC, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +larfb( const Side side, const char direct, const char storev, + const MatrixV& v, const MatrixT& t, MatrixC& c, + const fortran_int_t ldwork, Workspace work ) { + return larfb_impl< typename bindings::value_type< + MatrixV >::type >::invoke( side, direct, storev, v, t, c, ldwork, + work ); +} + +// +// Overloaded function for larfb. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixV, typename MatrixT, typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +larfb( const Side side, const char direct, const char storev, + const MatrixV& v, const MatrixT& t, MatrixC& c, + const fortran_int_t ldwork ) { + return larfb_impl< typename bindings::value_type< + MatrixV >::type >::invoke( side, direct, storev, v, t, c, ldwork, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/larfg.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/larfg.hpp new file mode 100644 index 0000000..10fc213 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/larfg.hpp @@ -0,0 +1,195 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARFG_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARFG_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for larfg is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t larfg( const fortran_int_t n, float& alpha, float* x, + const fortran_int_t incx, float& tau ) { + fortran_int_t info(0); + LAPACK_SLARFG( &n, &alpha, x, &incx, &tau ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t larfg( const fortran_int_t n, double& alpha, double* x, + const fortran_int_t incx, double& tau ) { + fortran_int_t info(0); + LAPACK_DLARFG( &n, &alpha, x, &incx, &tau ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t larfg( const fortran_int_t n, std::complex& alpha, + std::complex* x, const fortran_int_t incx, + std::complex& tau ) { + fortran_int_t info(0); + LAPACK_CLARFG( &n, &alpha, x, &incx, &tau ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t larfg( const fortran_int_t n, + std::complex& alpha, std::complex* x, + const fortran_int_t incx, std::complex& tau ) { + fortran_int_t info(0); + LAPACK_ZLARFG( &n, &alpha, x, &incx, &tau ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to larfg. +// +template< typename Value, typename Enable = void > +struct larfg_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct larfg_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorX > + static std::ptrdiff_t invoke( const fortran_int_t n, real_type& alpha, + VectorX& x, real_type& tau ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + return detail::larfg( n, alpha, bindings::begin_value(x), + bindings::stride(x), tau ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct larfg_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorX > + static std::ptrdiff_t invoke( const fortran_int_t n, value_type& alpha, + VectorX& x, value_type& tau ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + return detail::larfg( n, alpha, bindings::begin_value(x), + bindings::stride(x), tau ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the larfg_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for larfg. Its overload differs for +// +template< typename VectorX > +inline std::ptrdiff_t larfg( const fortran_int_t n, + typename remove_imaginary< typename bindings::value_type< + VectorX >::type >::type& alpha, VectorX& x, typename remove_imaginary< + typename bindings::value_type< VectorX >::type >::type& tau ) { + return larfg_impl< typename bindings::value_type< + VectorX >::type >::invoke( n, alpha, x, tau ); +} + +// +// Overloaded function for larfg. Its overload differs for +// +template< typename VectorX > +inline std::ptrdiff_t larfg( const fortran_int_t n, + typename bindings::value_type< VectorX >::type& alpha, VectorX& x, + typename bindings::value_type< VectorX >::type& tau ) { + return larfg_impl< typename bindings::value_type< + VectorX >::type >::invoke( n, alpha, x, tau ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/larft.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/larft.hpp new file mode 100644 index 0000000..644e3e6 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/larft.hpp @@ -0,0 +1,179 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARFT_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARFT_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for larft is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t larft( const char direct, const char storev, + const fortran_int_t n, const fortran_int_t k, float* v, + const fortran_int_t ldv, const float* tau, float* t, + const fortran_int_t ldt ) { + fortran_int_t info(0); + LAPACK_SLARFT( &direct, &storev, &n, &k, v, &ldv, tau, t, &ldt ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t larft( const char direct, const char storev, + const fortran_int_t n, const fortran_int_t k, double* v, + const fortran_int_t ldv, const double* tau, double* t, + const fortran_int_t ldt ) { + fortran_int_t info(0); + LAPACK_DLARFT( &direct, &storev, &n, &k, v, &ldv, tau, t, &ldt ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t larft( const char direct, const char storev, + const fortran_int_t n, const fortran_int_t k, std::complex* v, + const fortran_int_t ldv, const std::complex* tau, + std::complex* t, const fortran_int_t ldt ) { + fortran_int_t info(0); + LAPACK_CLARFT( &direct, &storev, &n, &k, v, &ldv, tau, t, &ldt ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t larft( const char direct, const char storev, + const fortran_int_t n, const fortran_int_t k, std::complex* v, + const fortran_int_t ldv, const std::complex* tau, + std::complex* t, const fortran_int_t ldt ) { + fortran_int_t info(0); + LAPACK_ZLARFT( &direct, &storev, &n, &k, v, &ldv, tau, t, &ldt ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to larft. +// +template< typename Value > +struct larft_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixV, typename VectorTAU, typename MatrixT > + static std::ptrdiff_t invoke( const char direct, const char storev, + const fortran_int_t n, const fortran_int_t k, MatrixV& v, + const VectorTAU& tau, MatrixT& t ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixV >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixV >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixT >::value) ); + BOOST_ASSERT( bindings::size(tau) >= k ); + BOOST_ASSERT( bindings::size_minor(t) == 1 || + bindings::stride_minor(t) == 1 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::stride_major(t) >= k ); + BOOST_ASSERT( direct == 'F' || direct == 'B' ); + BOOST_ASSERT( k >= 1 ); + BOOST_ASSERT( n >= 0 ); + BOOST_ASSERT( storev == 'C' || storev == 'R' ); + return detail::larft( direct, storev, n, k, bindings::begin_value(v), + bindings::stride_major(v), bindings::begin_value(tau), + bindings::begin_value(t), bindings::stride_major(t) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the larft_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for larft. Its overload differs for +// +template< typename MatrixV, typename VectorTAU, typename MatrixT > +inline std::ptrdiff_t larft( const char direct, const char storev, + const fortran_int_t n, const fortran_int_t k, MatrixV& v, + const VectorTAU& tau, MatrixT& t ) { + return larft_impl< typename bindings::value_type< + MatrixV >::type >::invoke( direct, storev, n, k, v, tau, t ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/larfx.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/larfx.hpp new file mode 100644 index 0000000..06ac150 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/larfx.hpp @@ -0,0 +1,364 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARFX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARFX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for larfx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side > +inline std::ptrdiff_t larfx( const Side, const fortran_int_t m, + const fortran_int_t n, const float* v, const float tau, float* c, + const fortran_int_t ldc, float* work ) { + fortran_int_t info(0); + LAPACK_SLARFX( &lapack_option< Side >::value, &m, &n, v, &tau, c, &ldc, + work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side > +inline std::ptrdiff_t larfx( const Side, const fortran_int_t m, + const fortran_int_t n, const double* v, const double tau, double* c, + const fortran_int_t ldc, double* work ) { + fortran_int_t info(0); + LAPACK_DLARFX( &lapack_option< Side >::value, &m, &n, v, &tau, c, &ldc, + work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t larfx( const Side, const fortran_int_t m, + const fortran_int_t n, const std::complex* v, + const std::complex tau, std::complex* c, + const fortran_int_t ldc, std::complex* work ) { + fortran_int_t info(0); + LAPACK_CLARFX( &lapack_option< Side >::value, &m, &n, v, &tau, c, &ldc, + work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t larfx( const Side, const fortran_int_t m, + const fortran_int_t n, const std::complex* v, + const std::complex tau, std::complex* c, + const fortran_int_t ldc, std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZLARFX( &lapack_option< Side >::value, &m, &n, v, &tau, c, &ldc, + work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to larfx. +// +template< typename Value, typename Enable = void > +struct larfx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct larfx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorV, typename MatrixC, + typename WORK > + static std::ptrdiff_t invoke( const Side side, const VectorV& v, + const real_type tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorV >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::larfx( side, bindings::size_row(c), + bindings::size_column(c), bindings::begin_value(v), tau, + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorV, typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const VectorV& v, + const real_type tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, v, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorV, typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const VectorV& v, + const real_type tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( side, v, tau, c, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + std::ptrdiff_t order = bindings::detail::if_left( side, n, m ); + if ( order < 11) + return 1; + else + return std::max< std::ptrdiff_t >( 1, order ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct larfx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorV, typename MatrixC, + typename WORK > + static std::ptrdiff_t invoke( const Side side, const VectorV& v, + const value_type tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorV >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::larfx( side, bindings::size_row(c), + bindings::size_column(c), bindings::begin_value(v), tau, + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorV, typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const VectorV& v, + const value_type tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, v, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorV, typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const VectorV& v, + const value_type tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( side, v, tau, c, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + std::ptrdiff_t order = bindings::detail::if_left( side, n, m ); + if ( order < 11) + return 1; + else + return std::max< std::ptrdiff_t >( 1, order ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the larfx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for larfx. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename VectorV, typename MatrixC, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +larfx( const Side side, const VectorV& v, + const typename remove_imaginary< typename bindings::value_type< + VectorV >::type >::type tau, MatrixC& c, Workspace work ) { + return larfx_impl< typename bindings::value_type< + VectorV >::type >::invoke( side, v, tau, c, work ); +} + +// +// Overloaded function for larfx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorV, typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +larfx( const Side side, const VectorV& v, + const typename remove_imaginary< typename bindings::value_type< + VectorV >::type >::type tau, MatrixC& c ) { + return larfx_impl< typename bindings::value_type< + VectorV >::type >::invoke( side, v, tau, c, optimal_workspace() ); +} + +// +// Overloaded function for larfx. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename VectorV, typename MatrixC, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +larfx( const Side side, const VectorV& v, + const typename bindings::value_type< VectorV >::type tau, MatrixC& c, + Workspace work ) { + return larfx_impl< typename bindings::value_type< + VectorV >::type >::invoke( side, v, tau, c, work ); +} + +// +// Overloaded function for larfx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorV, typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +larfx( const Side side, const VectorV& v, + const typename bindings::value_type< VectorV >::type tau, + MatrixC& c ) { + return larfx_impl< typename bindings::value_type< + VectorV >::type >::invoke( side, v, tau, c, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/largv.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/largv.hpp new file mode 100644 index 0000000..b9e6d3a --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/largv.hpp @@ -0,0 +1,210 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARGV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARGV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for largv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t largv( const fortran_int_t n, float* x, + const fortran_int_t incx, float* y, const fortran_int_t incy, + float* c, const fortran_int_t incc ) { + fortran_int_t info(0); + LAPACK_SLARGV( &n, x, &incx, y, &incy, c, &incc ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t largv( const fortran_int_t n, double* x, + const fortran_int_t incx, double* y, const fortran_int_t incy, + double* c, const fortran_int_t incc ) { + fortran_int_t info(0); + LAPACK_DLARGV( &n, x, &incx, y, &incy, c, &incc ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t largv( const fortran_int_t n, std::complex* x, + const fortran_int_t incx, std::complex* y, + const fortran_int_t incy, float* c, const fortran_int_t incc ) { + fortran_int_t info(0); + LAPACK_CLARGV( &n, x, &incx, y, &incy, c, &incc ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t largv( const fortran_int_t n, std::complex* x, + const fortran_int_t incx, std::complex* y, + const fortran_int_t incy, double* c, const fortran_int_t incc ) { + fortran_int_t info(0); + LAPACK_ZLARGV( &n, x, &incx, y, &incy, c, &incc ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to largv. +// +template< typename Value, typename Enable = void > +struct largv_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct largv_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY, typename VectorC > + static std::ptrdiff_t invoke( const fortran_int_t n, VectorX& x, + VectorY& y, VectorC& c ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorC >::value) ); + BOOST_ASSERT( bindings::size(c) >= 1+(n-1)*bindings::stride(c) ); + BOOST_ASSERT( bindings::size(x) >= 1+(n-1)*bindings::stride(x) ); + BOOST_ASSERT( bindings::size(y) >= 1+(n-1)*bindings::stride(y) ); + return detail::largv( n, bindings::begin_value(x), + bindings::stride(x), bindings::begin_value(y), + bindings::stride(y), bindings::begin_value(c), + bindings::stride(c) ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct largv_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorX, typename VectorY, typename VectorC > + static std::ptrdiff_t invoke( const fortran_int_t n, VectorX& x, + VectorY& y, VectorC& c ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorX >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorC >::value) ); + BOOST_ASSERT( bindings::size(c) >= 1+(n-1)*bindings::stride(c) ); + BOOST_ASSERT( bindings::size(x) >= 1+(n-1)*bindings::stride(x) ); + BOOST_ASSERT( bindings::size(y) >= 1+(n-1)*bindings::stride(y) ); + return detail::largv( n, bindings::begin_value(x), + bindings::stride(x), bindings::begin_value(y), + bindings::stride(y), bindings::begin_value(c), + bindings::stride(c) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the largv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for largv. Its overload differs for +// +template< typename VectorX, typename VectorY, typename VectorC > +inline std::ptrdiff_t largv( const fortran_int_t n, VectorX& x, + VectorY& y, VectorC& c ) { + return largv_impl< typename bindings::value_type< + VectorX >::type >::invoke( n, x, y, c ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/larnv.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/larnv.hpp new file mode 100644 index 0000000..089dd1a --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/larnv.hpp @@ -0,0 +1,149 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARNV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARNV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for larnv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t larnv( const fortran_int_t idist, fortran_int_t* iseed, + const fortran_int_t n, float* x ) { + fortran_int_t info(0); + LAPACK_SLARNV( &idist, iseed, &n, x ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t larnv( const fortran_int_t idist, fortran_int_t* iseed, + const fortran_int_t n, double* x ) { + fortran_int_t info(0); + LAPACK_DLARNV( &idist, iseed, &n, x ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t larnv( const fortran_int_t idist, fortran_int_t* iseed, + const fortran_int_t n, std::complex* x ) { + fortran_int_t info(0); + LAPACK_CLARNV( &idist, iseed, &n, x ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t larnv( const fortran_int_t idist, fortran_int_t* iseed, + const fortran_int_t n, std::complex* x ) { + fortran_int_t info(0); + LAPACK_ZLARNV( &idist, iseed, &n, x ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to larnv. +// +template< typename Value > +struct larnv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorISEED, typename VectorX > + static std::ptrdiff_t invoke( const fortran_int_t idist, + VectorISEED& iseed, const fortran_int_t n, VectorX& x ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorISEED >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_ASSERT( bindings::size(iseed) >= 4 ); + BOOST_ASSERT( bindings::size(x) >= n ); + return detail::larnv( idist, bindings::begin_value(iseed), n, + bindings::begin_value(x) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the larnv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for larnv. Its overload differs for +// +template< typename VectorISEED, typename VectorX > +inline std::ptrdiff_t larnv( const fortran_int_t idist, + VectorISEED& iseed, const fortran_int_t n, VectorX& x ) { + return larnv_impl< typename bindings::value_type< + VectorX >::type >::invoke( idist, iseed, n, x ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/larrb.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/larrb.hpp new file mode 100644 index 0000000..e110ef7 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/larrb.hpp @@ -0,0 +1,271 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARRB_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARRB_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for larrb is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t larrb( const fortran_int_t n, const float* d, + const float* lld, const fortran_int_t ifirst, + const fortran_int_t ilast, const float rtol1, const float rtol2, + const fortran_int_t offset, float* w, float* wgap, float* werr, + float* work, fortran_int_t* iwork, const float pivmin, + const float spdiam, const fortran_int_t twist ) { + fortran_int_t info(0); + LAPACK_SLARRB( &n, d, lld, &ifirst, &ilast, &rtol1, &rtol2, &offset, w, + wgap, werr, work, iwork, &pivmin, &spdiam, &twist, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t larrb( const fortran_int_t n, const double* d, + const double* lld, const fortran_int_t ifirst, + const fortran_int_t ilast, const double rtol1, const double rtol2, + const fortran_int_t offset, double* w, double* wgap, double* werr, + double* work, fortran_int_t* iwork, const double pivmin, + const double spdiam, const fortran_int_t twist ) { + fortran_int_t info(0); + LAPACK_DLARRB( &n, d, lld, &ifirst, &ilast, &rtol1, &rtol2, &offset, w, + wgap, werr, work, iwork, &pivmin, &spdiam, &twist, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to larrb. +// +template< typename Value > +struct larrb_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorLLD, typename VectorW, + typename VectorWGAP, typename VectorWERR, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t n, const VectorD& d, + const VectorLLD& lld, const fortran_int_t ifirst, + const fortran_int_t ilast, const real_type rtol1, + const real_type rtol2, const fortran_int_t offset, VectorW& w, + VectorWGAP& wgap, VectorWERR& werr, const real_type pivmin, + const real_type spdiam, const fortran_int_t twist, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorLLD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWGAP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWGAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWERR >::value) ); + BOOST_ASSERT( bindings::size(d) >= n ); + BOOST_ASSERT( bindings::size(lld) >= n-1 ); + BOOST_ASSERT( bindings::size(w) >= n ); + BOOST_ASSERT( bindings::size(werr) >= n ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n )); + return detail::larrb( n, bindings::begin_value(d), + bindings::begin_value(lld), ifirst, ilast, rtol1, rtol2, + offset, bindings::begin_value(w), bindings::begin_value(wgap), + bindings::begin_value(werr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + pivmin, spdiam, twist ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorLLD, typename VectorW, + typename VectorWGAP, typename VectorWERR > + static std::ptrdiff_t invoke( const fortran_int_t n, const VectorD& d, + const VectorLLD& lld, const fortran_int_t ifirst, + const fortran_int_t ilast, const real_type rtol1, + const real_type rtol2, const fortran_int_t offset, VectorW& w, + VectorWGAP& wgap, VectorWERR& werr, const real_type pivmin, + const real_type spdiam, const fortran_int_t twist, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( n ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n ) ); + return invoke( n, d, lld, ifirst, ilast, rtol1, rtol2, offset, w, + wgap, werr, pivmin, spdiam, twist, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorLLD, typename VectorW, + typename VectorWGAP, typename VectorWERR > + static std::ptrdiff_t invoke( const fortran_int_t n, const VectorD& d, + const VectorLLD& lld, const fortran_int_t ifirst, + const fortran_int_t ilast, const real_type rtol1, + const real_type rtol2, const fortran_int_t offset, VectorW& w, + VectorWGAP& wgap, VectorWERR& werr, const real_type pivmin, + const real_type spdiam, const fortran_int_t twist, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( n, d, lld, ifirst, ilast, rtol1, rtol2, offset, w, + wgap, werr, pivmin, spdiam, twist, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the larrb_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for larrb. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorLLD, typename VectorW, + typename VectorWGAP, typename VectorWERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +larrb( const fortran_int_t n, const VectorD& d, const VectorLLD& lld, + const fortran_int_t ifirst, const fortran_int_t ilast, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type rtol1, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type rtol2, + const fortran_int_t offset, VectorW& w, VectorWGAP& wgap, + VectorWERR& werr, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type pivmin, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type spdiam, const fortran_int_t twist, + Workspace work ) { + return larrb_impl< typename bindings::value_type< + VectorD >::type >::invoke( n, d, lld, ifirst, ilast, rtol1, rtol2, + offset, w, wgap, werr, pivmin, spdiam, twist, work ); +} + +// +// Overloaded function for larrb. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorLLD, typename VectorW, + typename VectorWGAP, typename VectorWERR > +inline typename boost::disable_if< detail::is_workspace< VectorWERR >, + std::ptrdiff_t >::type +larrb( const fortran_int_t n, const VectorD& d, const VectorLLD& lld, + const fortran_int_t ifirst, const fortran_int_t ilast, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type rtol1, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type rtol2, + const fortran_int_t offset, VectorW& w, VectorWGAP& wgap, + VectorWERR& werr, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type pivmin, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type spdiam, const fortran_int_t twist ) { + return larrb_impl< typename bindings::value_type< + VectorD >::type >::invoke( n, d, lld, ifirst, ilast, rtol1, rtol2, + offset, w, wgap, werr, pivmin, spdiam, twist, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/larre.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/larre.hpp new file mode 100644 index 0000000..003a5fd --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/larre.hpp @@ -0,0 +1,332 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARRE_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARRE_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for larre is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t larre( const char range, const fortran_int_t n, + float& vl, float& vu, const fortran_int_t il, const fortran_int_t iu, + float* d, float* e, float* e2, const float rtol1, const float rtol2, + const float spltol, fortran_int_t& nsplit, fortran_int_t* isplit, + fortran_int_t& m, float* w, float* werr, float* wgap, + fortran_int_t* iblock, fortran_int_t* indexw, float* gers, + float& pivmin, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SLARRE( &range, &n, &vl, &vu, &il, &iu, d, e, e2, &rtol1, &rtol2, + &spltol, &nsplit, isplit, &m, w, werr, wgap, iblock, indexw, gers, + &pivmin, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t larre( const char range, const fortran_int_t n, + double& vl, double& vu, const fortran_int_t il, + const fortran_int_t iu, double* d, double* e, double* e2, + const double rtol1, const double rtol2, const double spltol, + fortran_int_t& nsplit, fortran_int_t* isplit, fortran_int_t& m, + double* w, double* werr, double* wgap, fortran_int_t* iblock, + fortran_int_t* indexw, double* gers, double& pivmin, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DLARRE( &range, &n, &vl, &vu, &il, &iu, d, e, e2, &rtol1, &rtol2, + &spltol, &nsplit, isplit, &m, w, werr, wgap, iblock, indexw, gers, + &pivmin, work, iwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to larre. +// +template< typename Value > +struct larre_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorE2, + typename VectorISPLIT, typename VectorW, typename VectorWERR, + typename VectorWGAP, typename VectorIBLOCK, typename VectorINDEXW, + typename VectorGERS, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char range, const fortran_int_t n, + real_type& vl, real_type& vu, const fortran_int_t il, + const fortran_int_t iu, VectorD& d, VectorE& e, VectorE2& e2, + const real_type rtol1, const real_type rtol2, + const real_type spltol, fortran_int_t& nsplit, + VectorISPLIT& isplit, fortran_int_t& m, VectorW& w, + VectorWERR& werr, VectorWGAP& wgap, VectorIBLOCK& iblock, + VectorINDEXW& indexw, VectorGERS& gers, real_type& pivmin, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE2 >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWGAP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorGERS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorISPLIT >::type >::type, + typename remove_const< typename bindings::value_type< + VectorIBLOCK >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorISPLIT >::type >::type, + typename remove_const< typename bindings::value_type< + VectorINDEXW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE2 >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorISPLIT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWGAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIBLOCK >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorINDEXW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorGERS >::value) ); + BOOST_ASSERT( bindings::size(d) >= n ); + BOOST_ASSERT( bindings::size(e) >= n ); + BOOST_ASSERT( bindings::size(e2) >= n ); + BOOST_ASSERT( bindings::size(gers) >= 2*n ); + BOOST_ASSERT( bindings::size(indexw) >= n ); + BOOST_ASSERT( bindings::size(isplit) >= n ); + BOOST_ASSERT( bindings::size(w) >= n ); + BOOST_ASSERT( bindings::size(werr) >= n ); + BOOST_ASSERT( bindings::size(wgap) >= n ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n )); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::larre( range, n, vl, vu, il, iu, + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(e2), rtol1, rtol2, spltol, nsplit, + bindings::begin_value(isplit), m, bindings::begin_value(w), + bindings::begin_value(werr), bindings::begin_value(wgap), + bindings::begin_value(iblock), bindings::begin_value(indexw), + bindings::begin_value(gers), pivmin, + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorE2, + typename VectorISPLIT, typename VectorW, typename VectorWERR, + typename VectorWGAP, typename VectorIBLOCK, typename VectorINDEXW, + typename VectorGERS > + static std::ptrdiff_t invoke( const char range, const fortran_int_t n, + real_type& vl, real_type& vu, const fortran_int_t il, + const fortran_int_t iu, VectorD& d, VectorE& e, VectorE2& e2, + const real_type rtol1, const real_type rtol2, + const real_type spltol, fortran_int_t& nsplit, + VectorISPLIT& isplit, fortran_int_t& m, VectorW& w, + VectorWERR& werr, VectorWGAP& wgap, VectorIBLOCK& iblock, + VectorINDEXW& indexw, VectorGERS& gers, real_type& pivmin, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( n ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n ) ); + return invoke( range, n, vl, vu, il, iu, d, e, e2, rtol1, rtol2, + spltol, nsplit, isplit, m, w, werr, wgap, iblock, indexw, + gers, pivmin, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorE2, + typename VectorISPLIT, typename VectorW, typename VectorWERR, + typename VectorWGAP, typename VectorIBLOCK, typename VectorINDEXW, + typename VectorGERS > + static std::ptrdiff_t invoke( const char range, const fortran_int_t n, + real_type& vl, real_type& vu, const fortran_int_t il, + const fortran_int_t iu, VectorD& d, VectorE& e, VectorE2& e2, + const real_type rtol1, const real_type rtol2, + const real_type spltol, fortran_int_t& nsplit, + VectorISPLIT& isplit, fortran_int_t& m, VectorW& w, + VectorWERR& werr, VectorWGAP& wgap, VectorIBLOCK& iblock, + VectorINDEXW& indexw, VectorGERS& gers, real_type& pivmin, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( range, n, vl, vu, il, iu, d, e, e2, rtol1, rtol2, + spltol, nsplit, isplit, m, w, werr, wgap, iblock, indexw, + gers, pivmin, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 6*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the larre_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for larre. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename VectorE2, + typename VectorISPLIT, typename VectorW, typename VectorWERR, + typename VectorWGAP, typename VectorIBLOCK, typename VectorINDEXW, + typename VectorGERS, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +larre( const char range, const fortran_int_t n, + typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type& vl, typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type& vu, + const fortran_int_t il, const fortran_int_t iu, VectorD& d, + VectorE& e, VectorE2& e2, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type rtol1, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type rtol2, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type spltol, + fortran_int_t& nsplit, VectorISPLIT& isplit, fortran_int_t& m, + VectorW& w, VectorWERR& werr, VectorWGAP& wgap, VectorIBLOCK& iblock, + VectorINDEXW& indexw, VectorGERS& gers, typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type& pivmin, + Workspace work ) { + return larre_impl< typename bindings::value_type< + VectorD >::type >::invoke( range, n, vl, vu, il, iu, d, e, e2, + rtol1, rtol2, spltol, nsplit, isplit, m, w, werr, wgap, iblock, + indexw, gers, pivmin, work ); +} + +// +// Overloaded function for larre. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename VectorE2, + typename VectorISPLIT, typename VectorW, typename VectorWERR, + typename VectorWGAP, typename VectorIBLOCK, typename VectorINDEXW, + typename VectorGERS > +inline typename boost::disable_if< detail::is_workspace< VectorGERS >, + std::ptrdiff_t >::type +larre( const char range, const fortran_int_t n, + typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type& vl, typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type& vu, + const fortran_int_t il, const fortran_int_t iu, VectorD& d, + VectorE& e, VectorE2& e2, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type rtol1, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type rtol2, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type spltol, + fortran_int_t& nsplit, VectorISPLIT& isplit, fortran_int_t& m, + VectorW& w, VectorWERR& werr, VectorWGAP& wgap, VectorIBLOCK& iblock, + VectorINDEXW& indexw, VectorGERS& gers, typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type& pivmin ) { + return larre_impl< typename bindings::value_type< + VectorD >::type >::invoke( range, n, vl, vu, il, iu, d, e, e2, + rtol1, rtol2, spltol, nsplit, isplit, m, w, werr, wgap, iblock, + indexw, gers, pivmin, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/larz.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/larz.hpp new file mode 100644 index 0000000..91cedfb --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/larz.hpp @@ -0,0 +1,370 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARZ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LARZ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for larz is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side > +inline std::ptrdiff_t larz( const Side, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t l, const float* v, + const fortran_int_t incv, const float tau, float* c, + const fortran_int_t ldc, float* work ) { + fortran_int_t info(0); + LAPACK_SLARZ( &lapack_option< Side >::value, &m, &n, &l, v, &incv, &tau, + c, &ldc, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side > +inline std::ptrdiff_t larz( const Side, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t l, const double* v, + const fortran_int_t incv, const double tau, double* c, + const fortran_int_t ldc, double* work ) { + fortran_int_t info(0); + LAPACK_DLARZ( &lapack_option< Side >::value, &m, &n, &l, v, &incv, &tau, + c, &ldc, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t larz( const Side, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t l, + const std::complex* v, const fortran_int_t incv, + const std::complex tau, std::complex* c, + const fortran_int_t ldc, std::complex* work ) { + fortran_int_t info(0); + LAPACK_CLARZ( &lapack_option< Side >::value, &m, &n, &l, v, &incv, &tau, + c, &ldc, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t larz( const Side, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t l, + const std::complex* v, const fortran_int_t incv, + const std::complex tau, std::complex* c, + const fortran_int_t ldc, std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZLARZ( &lapack_option< Side >::value, &m, &n, &l, v, &incv, &tau, + c, &ldc, work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to larz. +// +template< typename Value, typename Enable = void > +struct larz_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct larz_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorV, typename MatrixC, + typename WORK > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t l, + const VectorV& v, const real_type tau, MatrixC& c, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorV >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::larz( side, bindings::size_row(c), + bindings::size_column(c), l, bindings::begin_value(v), + bindings::stride(v), tau, bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorV, typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t l, + const VectorV& v, const real_type tau, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, l, v, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorV, typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t l, + const VectorV& v, const real_type tau, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( side, l, v, tau, c, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct larz_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorV, typename MatrixC, + typename WORK > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t l, + const VectorV& v, const value_type tau, MatrixC& c, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorV >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::larz( side, bindings::size_row(c), + bindings::size_column(c), l, bindings::begin_value(v), + bindings::stride(v), tau, bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorV, typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t l, + const VectorV& v, const value_type tau, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, l, v, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorV, typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t l, + const VectorV& v, const value_type tau, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( side, l, v, tau, c, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the larz_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for larz. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename VectorV, typename MatrixC, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +larz( const Side side, const fortran_int_t l, const VectorV& v, + const typename remove_imaginary< typename bindings::value_type< + VectorV >::type >::type tau, MatrixC& c, Workspace work ) { + return larz_impl< typename bindings::value_type< + VectorV >::type >::invoke( side, l, v, tau, c, work ); +} + +// +// Overloaded function for larz. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorV, typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +larz( const Side side, const fortran_int_t l, const VectorV& v, + const typename remove_imaginary< typename bindings::value_type< + VectorV >::type >::type tau, MatrixC& c ) { + return larz_impl< typename bindings::value_type< + VectorV >::type >::invoke( side, l, v, tau, c, + optimal_workspace() ); +} + +// +// Overloaded function for larz. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename VectorV, typename MatrixC, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +larz( const Side side, const fortran_int_t l, const VectorV& v, + const typename bindings::value_type< VectorV >::type tau, MatrixC& c, + Workspace work ) { + return larz_impl< typename bindings::value_type< + VectorV >::type >::invoke( side, l, v, tau, c, work ); +} + +// +// Overloaded function for larz. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorV, typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +larz( const Side side, const fortran_int_t l, const VectorV& v, + const typename bindings::value_type< VectorV >::type tau, + MatrixC& c ) { + return larz_impl< typename bindings::value_type< + VectorV >::type >::invoke( side, l, v, tau, c, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/latrd.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/latrd.hpp new file mode 100644 index 0000000..0ac7d40 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/latrd.hpp @@ -0,0 +1,251 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LATRD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LATRD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for latrd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t latrd( const UpLo, const fortran_int_t n, + const fortran_int_t nb, float* a, const fortran_int_t lda, float* e, + float* tau, float* w, const fortran_int_t ldw ) { + fortran_int_t info(0); + LAPACK_SLATRD( &lapack_option< UpLo >::value, &n, &nb, a, &lda, e, tau, w, + &ldw ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t latrd( const UpLo, const fortran_int_t n, + const fortran_int_t nb, double* a, const fortran_int_t lda, double* e, + double* tau, double* w, const fortran_int_t ldw ) { + fortran_int_t info(0); + LAPACK_DLATRD( &lapack_option< UpLo >::value, &n, &nb, a, &lda, e, tau, w, + &ldw ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t latrd( const UpLo, const fortran_int_t n, + const fortran_int_t nb, std::complex* a, + const fortran_int_t lda, float* e, std::complex* tau, + std::complex* w, const fortran_int_t ldw ) { + fortran_int_t info(0); + LAPACK_CLATRD( &lapack_option< UpLo >::value, &n, &nb, a, &lda, e, tau, w, + &ldw ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t latrd( const UpLo, const fortran_int_t n, + const fortran_int_t nb, std::complex* a, + const fortran_int_t lda, double* e, std::complex* tau, + std::complex* w, const fortran_int_t ldw ) { + fortran_int_t info(0); + LAPACK_ZLATRD( &lapack_option< UpLo >::value, &n, &nb, a, &lda, e, tau, w, + &ldw ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to latrd. +// +template< typename Value, typename Enable = void > +struct latrd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct latrd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorE, typename VectorTAU, + typename MatrixW > + static std::ptrdiff_t invoke( const fortran_int_t nb, MatrixA& a, + VectorE& e, VectorTAU& tau, MatrixW& w ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixW >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixW >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(w) == 1 || + bindings::stride_minor(w) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(w) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::latrd( uplo(), bindings::size_column(a), nb, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(e), bindings::begin_value(tau), + bindings::begin_value(w), bindings::stride_major(w) ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct latrd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorE, typename VectorTAU, + typename MatrixW > + static std::ptrdiff_t invoke( const fortran_int_t nb, MatrixA& a, + VectorE& e, VectorTAU& tau, MatrixW& w ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixW >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixW >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(w) == 1 || + bindings::stride_minor(w) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(w) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::latrd( uplo(), bindings::size_column(a), nb, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(e), bindings::begin_value(tau), + bindings::begin_value(w), bindings::stride_major(w) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the latrd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for latrd. Its overload differs for +// +template< typename MatrixA, typename VectorE, typename VectorTAU, + typename MatrixW > +inline std::ptrdiff_t latrd( const fortran_int_t nb, MatrixA& a, + VectorE& e, VectorTAU& tau, MatrixW& w ) { + return latrd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( nb, a, e, tau, w ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/latrs.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/latrs.hpp new file mode 100644 index 0000000..948138c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/latrs.hpp @@ -0,0 +1,244 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LATRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LATRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for latrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Trans, typename Diag > +inline std::ptrdiff_t latrs( const char uplo, const Trans, const Diag, + const char normin, const fortran_int_t n, const float* a, + const fortran_int_t lda, float* x, float& scale, float* cnorm ) { + fortran_int_t info(0); + LAPACK_SLATRS( &uplo, &lapack_option< Trans >::value, &lapack_option< + Diag >::value, &normin, &n, a, &lda, x, &scale, cnorm, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Trans, typename Diag > +inline std::ptrdiff_t latrs( const char uplo, const Trans, const Diag, + const char normin, const fortran_int_t n, const double* a, + const fortran_int_t lda, double* x, double& scale, double* cnorm ) { + fortran_int_t info(0); + LAPACK_DLATRS( &uplo, &lapack_option< Trans >::value, &lapack_option< + Diag >::value, &normin, &n, a, &lda, x, &scale, cnorm, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans, typename Diag > +inline std::ptrdiff_t latrs( const char uplo, const Trans, const Diag, + const char normin, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + std::complex* x, float& scale, float* cnorm ) { + fortran_int_t info(0); + LAPACK_CLATRS( &uplo, &lapack_option< Trans >::value, &lapack_option< + Diag >::value, &normin, &n, a, &lda, x, &scale, cnorm, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans, typename Diag > +inline std::ptrdiff_t latrs( const char uplo, const Trans, const Diag, + const char normin, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + std::complex* x, double& scale, double* cnorm ) { + fortran_int_t info(0); + LAPACK_ZLATRS( &uplo, &lapack_option< Trans >::value, &lapack_option< + Diag >::value, &normin, &n, a, &lda, x, &scale, cnorm, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to latrs. +// +template< typename Value, typename Enable = void > +struct latrs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct latrs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorX, typename VectorCNORM > + static std::ptrdiff_t invoke( const char uplo, const char normin, + const MatrixA& a, VectorX& x, real_type& scale, + VectorCNORM& cnorm ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename blas::detail::default_order< MatrixA >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorCNORM >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorCNORM >::value) ); + BOOST_ASSERT( bindings::size(x) >= bindings::size_column_op(a, + trans()) ); + BOOST_ASSERT( bindings::size_column_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( normin == 'Y' || normin == 'N' ); + return detail::latrs( uplo, trans(), diag(), normin, + bindings::size_column_op(a, trans()), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(x), scale, + bindings::begin_value(cnorm) ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct latrs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorX, typename VectorCNORM > + static std::ptrdiff_t invoke( const char uplo, const char normin, + const MatrixA& a, VectorX& x, real_type& scale, + VectorCNORM& cnorm ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename blas::detail::default_order< MatrixA >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorCNORM >::value) ); + BOOST_ASSERT( bindings::size(x) >= bindings::size_column_op(a, + trans()) ); + BOOST_ASSERT( bindings::size_column_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( normin == 'Y' || normin == 'N' ); + return detail::latrs( uplo, trans(), diag(), normin, + bindings::size_column_op(a, trans()), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(x), scale, + bindings::begin_value(cnorm) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the latrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for latrs. Its overload differs for +// +template< typename MatrixA, typename VectorX, typename VectorCNORM > +inline std::ptrdiff_t latrs( const char uplo, const char normin, + const MatrixA& a, VectorX& x, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& scale, + VectorCNORM& cnorm ) { + return latrs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( uplo, normin, a, x, scale, cnorm ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/auxiliary/latrz.hpp b/sdk/boost/numeric/bindings/lapack/auxiliary/latrz.hpp new file mode 100644 index 0000000..067933d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/auxiliary/latrz.hpp @@ -0,0 +1,313 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LATRZ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_AUXILIARY_LATRZ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for latrz is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t latrz( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t l, float* a, const fortran_int_t lda, float* tau, + float* work ) { + fortran_int_t info(0); + LAPACK_SLATRZ( &m, &n, &l, a, &lda, tau, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t latrz( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t l, double* a, const fortran_int_t lda, + double* tau, double* work ) { + fortran_int_t info(0); + LAPACK_DLATRZ( &m, &n, &l, a, &lda, tau, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t latrz( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t l, std::complex* a, + const fortran_int_t lda, std::complex* tau, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_CLATRZ( &m, &n, &l, a, &lda, tau, work ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t latrz( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t l, std::complex* a, + const fortran_int_t lda, std::complex* tau, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZLATRZ( &m, &n, &l, a, &lda, tau, work ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to latrz. +// +template< typename Value, typename Enable = void > +struct latrz_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct latrz_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::latrz( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( a, tau, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return m; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct latrz_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::latrz( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( a, tau, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return m; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the latrz_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for latrz. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +latrz( MatrixA& a, VectorTAU& tau, Workspace work ) { + return latrz_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for latrz. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +latrz( MatrixA& a, VectorTAU& tau ) { + return latrz_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational.hpp b/sdk/boost/numeric/bindings/lapack/computational.hpp new file mode 100644 index 0000000..d282788 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational.hpp @@ -0,0 +1,174 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/bdsdc.hpp b/sdk/boost/numeric/bindings/lapack/computational/bdsdc.hpp new file mode 100644 index 0000000..eb646c8 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/bdsdc.hpp @@ -0,0 +1,256 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_BDSDC_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_BDSDC_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for bdsdc is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t bdsdc( const char uplo, const char compq, + const fortran_int_t n, float* d, float* e, float* u, + const fortran_int_t ldu, float* vt, const fortran_int_t ldvt, + float* q, fortran_int_t* iq, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SBDSDC( &uplo, &compq, &n, d, e, u, &ldu, vt, &ldvt, q, iq, work, + iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t bdsdc( const char uplo, const char compq, + const fortran_int_t n, double* d, double* e, double* u, + const fortran_int_t ldu, double* vt, const fortran_int_t ldvt, + double* q, fortran_int_t* iq, double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DBDSDC( &uplo, &compq, &n, d, e, u, &ldu, vt, &ldvt, q, iq, work, + iwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to bdsdc. +// +template< typename Value > +struct bdsdc_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixU, + typename MatrixVT, typename VectorQ, typename VectorIQ, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char uplo, const char compq, + const fortran_int_t n, VectorD& d, VectorE& e, MatrixU& u, + MatrixVT& vt, VectorQ& q, VectorIQ& iq, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVT >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIQ >::value) ); + BOOST_ASSERT( bindings::size(e) >= n-1 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( compq, n )); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(vt) == 1 || + bindings::stride_minor(vt) == 1 ); + BOOST_ASSERT( compq == 'N' || compq == 'P' || compq == 'I' ); + BOOST_ASSERT( n >= 0 ); + return detail::bdsdc( uplo, compq, n, bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(u), + bindings::stride_major(u), bindings::begin_value(vt), + bindings::stride_major(vt), bindings::begin_value(q), + bindings::begin_value(iq), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename MatrixU, + typename MatrixVT, typename VectorQ, typename VectorIQ > + static std::ptrdiff_t invoke( const char uplo, const char compq, + const fortran_int_t n, VectorD& d, VectorE& e, MatrixU& u, + MatrixVT& vt, VectorQ& q, VectorIQ& iq, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( compq, + n ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n ) ); + return invoke( uplo, compq, n, d, e, u, vt, q, iq, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename MatrixU, + typename MatrixVT, typename VectorQ, typename VectorIQ > + static std::ptrdiff_t invoke( const char uplo, const char compq, + const fortran_int_t n, VectorD& d, VectorE& e, MatrixU& u, + MatrixVT& vt, VectorQ& q, VectorIQ& iq, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( uplo, compq, n, d, e, u, vt, q, iq, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char compq, + const std::ptrdiff_t n ) { + switch ( compq ) { + case 'N': return 4*n; + case 'P': return 6*n; + case 'I': return 3*n*n + 4*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 8*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the bdsdc_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for bdsdc. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename MatrixU, + typename MatrixVT, typename VectorQ, typename VectorIQ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +bdsdc( const char uplo, const char compq, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixU& u, MatrixVT& vt, VectorQ& q, + VectorIQ& iq, Workspace work ) { + return bdsdc_impl< typename bindings::value_type< + VectorD >::type >::invoke( uplo, compq, n, d, e, u, vt, q, iq, + work ); +} + +// +// Overloaded function for bdsdc. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename MatrixU, + typename MatrixVT, typename VectorQ, typename VectorIQ > +inline typename boost::disable_if< detail::is_workspace< VectorIQ >, + std::ptrdiff_t >::type +bdsdc( const char uplo, const char compq, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixU& u, MatrixVT& vt, VectorQ& q, + VectorIQ& iq ) { + return bdsdc_impl< typename bindings::value_type< + VectorD >::type >::invoke( uplo, compq, n, d, e, u, vt, q, iq, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/bdsqr.hpp b/sdk/boost/numeric/bindings/lapack/computational/bdsqr.hpp new file mode 100644 index 0000000..88ee85d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/bdsqr.hpp @@ -0,0 +1,401 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_BDSQR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_BDSQR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for bdsqr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t bdsqr( const char uplo, const fortran_int_t n, + const fortran_int_t ncvt, const fortran_int_t nru, + const fortran_int_t ncc, float* d, float* e, float* vt, + const fortran_int_t ldvt, float* u, const fortran_int_t ldu, float* c, + const fortran_int_t ldc, float* work ) { + fortran_int_t info(0); + LAPACK_SBDSQR( &uplo, &n, &ncvt, &nru, &ncc, d, e, vt, &ldvt, u, &ldu, c, + &ldc, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t bdsqr( const char uplo, const fortran_int_t n, + const fortran_int_t ncvt, const fortran_int_t nru, + const fortran_int_t ncc, double* d, double* e, double* vt, + const fortran_int_t ldvt, double* u, const fortran_int_t ldu, + double* c, const fortran_int_t ldc, double* work ) { + fortran_int_t info(0); + LAPACK_DBDSQR( &uplo, &n, &ncvt, &nru, &ncc, d, e, vt, &ldvt, u, &ldu, c, + &ldc, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t bdsqr( const char uplo, const fortran_int_t n, + const fortran_int_t ncvt, const fortran_int_t nru, + const fortran_int_t ncc, float* d, float* e, std::complex* vt, + const fortran_int_t ldvt, std::complex* u, + const fortran_int_t ldu, std::complex* c, + const fortran_int_t ldc, float* rwork ) { + fortran_int_t info(0); + LAPACK_CBDSQR( &uplo, &n, &ncvt, &nru, &ncc, d, e, vt, &ldvt, u, &ldu, c, + &ldc, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t bdsqr( const char uplo, const fortran_int_t n, + const fortran_int_t ncvt, const fortran_int_t nru, + const fortran_int_t ncc, double* d, double* e, + std::complex* vt, const fortran_int_t ldvt, + std::complex* u, const fortran_int_t ldu, + std::complex* c, const fortran_int_t ldc, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZBDSQR( &uplo, &n, &ncvt, &nru, &ncc, d, e, vt, &ldvt, u, &ldu, c, + &ldc, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to bdsqr. +// +template< typename Value, typename Enable = void > +struct bdsqr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct bdsqr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixVT, + typename MatrixU, typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const char uplo, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixVT& vt, MatrixU& u, MatrixC& c, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n, bindings::size_column(vt), + bindings::size_row(u), bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_column(vt) >= 0 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(vt) == 1 || + bindings::stride_minor(vt) == 1 ); + BOOST_ASSERT( bindings::size_row(u) >= 0 ); + BOOST_ASSERT( bindings::stride_major(u) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(u)) ); + BOOST_ASSERT( n >= 0 ); + return detail::bdsqr( uplo, n, bindings::size_column(vt), + bindings::size_row(u), bindings::size_column(c), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(vt), bindings::stride_major(vt), + bindings::begin_value(u), bindings::stride_major(u), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename MatrixVT, + typename MatrixU, typename MatrixC > + static std::ptrdiff_t invoke( const char uplo, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixVT& vt, MatrixU& u, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( n, + bindings::size_column(vt), bindings::size_row(u), + bindings::size_column(c) ) ); + return invoke( uplo, n, d, e, vt, u, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename MatrixVT, + typename MatrixU, typename MatrixC > + static std::ptrdiff_t invoke( const char uplo, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixVT& vt, MatrixU& u, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( uplo, n, d, e, vt, u, c, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t ncvt, const std::ptrdiff_t nru, + const std::ptrdiff_t ncc ) { + if ( ncvt == 0 && nru == 0 && ncc == 0 ) + return 2*n; + else + return std::max< std::ptrdiff_t >(1, 4*n); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct bdsqr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixVT, + typename MatrixU, typename MatrixC, typename RWORK > + static std::ptrdiff_t invoke( const char uplo, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixVT& vt, MatrixU& u, MatrixC& c, + detail::workspace1< RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixVT >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixVT >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( n, bindings::size_column(vt), + bindings::size_row(u), bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_column(vt) >= 0 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(vt) == 1 || + bindings::stride_minor(vt) == 1 ); + BOOST_ASSERT( bindings::size_row(u) >= 0 ); + BOOST_ASSERT( bindings::stride_major(u) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(u)) ); + BOOST_ASSERT( n >= 0 ); + return detail::bdsqr( uplo, n, bindings::size_column(vt), + bindings::size_row(u), bindings::size_column(c), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(vt), bindings::stride_major(vt), + bindings::begin_value(u), bindings::stride_major(u), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename MatrixVT, + typename MatrixU, typename MatrixC > + static std::ptrdiff_t invoke( const char uplo, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixVT& vt, MatrixU& u, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( n, + bindings::size_column(vt), bindings::size_row(u), + bindings::size_column(c) ) ); + return invoke( uplo, n, d, e, vt, u, c, workspace( tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename MatrixVT, + typename MatrixU, typename MatrixC > + static std::ptrdiff_t invoke( const char uplo, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixVT& vt, MatrixU& u, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( uplo, n, d, e, vt, u, c, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n, + const std::ptrdiff_t ncvt, const std::ptrdiff_t nru, + const std::ptrdiff_t ncc ) { + if ( ncvt == 0 && nru == 0 && ncc == 0 ) + return 2*n; + else + return std::max< std::ptrdiff_t >(1, 4*n-4); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the bdsqr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for bdsqr. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename MatrixVT, + typename MatrixU, typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +bdsqr( const char uplo, const fortran_int_t n, VectorD& d, + VectorE& e, MatrixVT& vt, MatrixU& u, MatrixC& c, Workspace work ) { + return bdsqr_impl< typename bindings::value_type< + MatrixVT >::type >::invoke( uplo, n, d, e, vt, u, c, work ); +} + +// +// Overloaded function for bdsqr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename MatrixVT, + typename MatrixU, typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +bdsqr( const char uplo, const fortran_int_t n, VectorD& d, + VectorE& e, MatrixVT& vt, MatrixU& u, MatrixC& c ) { + return bdsqr_impl< typename bindings::value_type< + MatrixVT >::type >::invoke( uplo, n, d, e, vt, u, c, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gbbrd.hpp b/sdk/boost/numeric/bindings/lapack/computational/gbbrd.hpp new file mode 100644 index 0000000..3259fb4 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gbbrd.hpp @@ -0,0 +1,456 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GBBRD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GBBRD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gbbrd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gbbrd( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t ncc, + const fortran_int_t kl, const fortran_int_t ku, float* ab, + const fortran_int_t ldab, float* d, float* e, float* q, + const fortran_int_t ldq, float* pt, const fortran_int_t ldpt, + float* c, const fortran_int_t ldc, float* work ) { + fortran_int_t info(0); + LAPACK_SGBBRD( &vect, &m, &n, &ncc, &kl, &ku, ab, &ldab, d, e, q, &ldq, + pt, &ldpt, c, &ldc, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gbbrd( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t ncc, + const fortran_int_t kl, const fortran_int_t ku, double* ab, + const fortran_int_t ldab, double* d, double* e, double* q, + const fortran_int_t ldq, double* pt, const fortran_int_t ldpt, + double* c, const fortran_int_t ldc, double* work ) { + fortran_int_t info(0); + LAPACK_DGBBRD( &vect, &m, &n, &ncc, &kl, &ku, ab, &ldab, d, e, q, &ldq, + pt, &ldpt, c, &ldc, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gbbrd( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t ncc, + const fortran_int_t kl, const fortran_int_t ku, + std::complex* ab, const fortran_int_t ldab, float* d, float* e, + std::complex* q, const fortran_int_t ldq, + std::complex* pt, const fortran_int_t ldpt, + std::complex* c, const fortran_int_t ldc, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGBBRD( &vect, &m, &n, &ncc, &kl, &ku, ab, &ldab, d, e, q, &ldq, + pt, &ldpt, c, &ldc, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gbbrd( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t ncc, + const fortran_int_t kl, const fortran_int_t ku, + std::complex* ab, const fortran_int_t ldab, double* d, + double* e, std::complex* q, const fortran_int_t ldq, + std::complex* pt, const fortran_int_t ldpt, + std::complex* c, const fortran_int_t ldc, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGBBRD( &vect, &m, &n, &ncc, &kl, &ku, ab, &ldab, d, e, q, &ldq, + pt, &ldpt, c, &ldc, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gbbrd. +// +template< typename Value, typename Enable = void > +struct gbbrd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gbbrd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ, typename MatrixPT, typename MatrixC, + typename WORK > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, MatrixPT& pt, MatrixC& c, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixPT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixPT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixPT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower(ab) >= 0 ); + BOOST_ASSERT( bindings::bandwidth_upper(ab) >= 0 ); + BOOST_ASSERT( bindings::size(d) >= std::min< + std::ptrdiff_t >(bindings::size_row(ab), + bindings::size_column(ab)) ); + BOOST_ASSERT( bindings::size(e) >= std::min< + std::ptrdiff_t >(bindings::size_row(ab), + bindings::size_column(ab))-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(ab), + bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_minor(pt) == 1 || + bindings::stride_minor(pt) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_row(ab) >= 0 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + bindings::bandwidth_lower(ab)+bindings::bandwidth_upper(ab)+ + 1 ); + BOOST_ASSERT( vect == 'N' || vect == 'Q' || vect == 'P' || + vect == 'B' ); + return detail::gbbrd( vect, bindings::size_row(ab), + bindings::size_column(ab), bindings::size_column(c), + bindings::bandwidth_lower(ab), bindings::bandwidth_upper(ab), + bindings::begin_value(ab), bindings::stride_major(ab), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(pt), bindings::stride_major(pt), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ, typename MatrixPT, typename MatrixC > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, MatrixPT& pt, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(ab), bindings::size_column(ab) ) ); + return invoke( vect, ab, d, e, q, pt, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ, typename MatrixPT, typename MatrixC > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, MatrixPT& pt, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( vect, ab, d, e, q, pt, c, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n ) { + return 2*std::max< std::ptrdiff_t >(m,n); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gbbrd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ, typename MatrixPT, typename MatrixC, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, MatrixPT& pt, MatrixC& c, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixPT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixPT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixPT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower(ab) >= 0 ); + BOOST_ASSERT( bindings::bandwidth_upper(ab) >= 0 ); + BOOST_ASSERT( bindings::size(d) >= std::min< + std::ptrdiff_t >(bindings::size_row(ab), + bindings::size_column(ab)) ); + BOOST_ASSERT( bindings::size(e) >= std::min< + std::ptrdiff_t >(bindings::size_row(ab), + bindings::size_column(ab))-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_row(ab), + bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(ab), + bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_minor(pt) == 1 || + bindings::stride_minor(pt) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_row(ab) >= 0 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + bindings::bandwidth_lower(ab)+bindings::bandwidth_upper(ab)+ + 1 ); + BOOST_ASSERT( vect == 'N' || vect == 'Q' || vect == 'P' || + vect == 'B' ); + return detail::gbbrd( vect, bindings::size_row(ab), + bindings::size_column(ab), bindings::size_column(c), + bindings::bandwidth_lower(ab), bindings::bandwidth_upper(ab), + bindings::begin_value(ab), bindings::stride_major(ab), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(pt), bindings::stride_major(pt), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ, typename MatrixPT, typename MatrixC > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, MatrixPT& pt, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(ab), bindings::size_column(ab) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_row(ab), bindings::size_column(ab) ) ); + return invoke( vect, ab, d, e, q, pt, c, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ, typename MatrixPT, typename MatrixC > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, MatrixPT& pt, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( vect, ab, d, e, q, pt, c, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(m,n); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t m, + const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(m,n); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gbbrd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gbbrd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ, typename MatrixPT, typename MatrixC, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gbbrd( const char vect, MatrixAB& ab, VectorD& d, VectorE& e, MatrixQ& q, + MatrixPT& pt, MatrixC& c, Workspace work ) { + return gbbrd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( vect, ab, d, e, q, pt, c, work ); +} + +// +// Overloaded function for gbbrd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ, typename MatrixPT, typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +gbbrd( const char vect, MatrixAB& ab, VectorD& d, VectorE& e, MatrixQ& q, + MatrixPT& pt, MatrixC& c ) { + return gbbrd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( vect, ab, d, e, q, pt, c, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gbcon.hpp b/sdk/boost/numeric/bindings/lapack/computational/gbcon.hpp new file mode 100644 index 0000000..1fdbae4 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gbcon.hpp @@ -0,0 +1,364 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GBCON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GBCON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gbcon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gbcon( const char norm, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, const float* ab, + const fortran_int_t ldab, const fortran_int_t* ipiv, + const float anorm, float& rcond, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SGBCON( &norm, &n, &kl, &ku, ab, &ldab, ipiv, &anorm, &rcond, work, + iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gbcon( const char norm, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, const double* ab, + const fortran_int_t ldab, const fortran_int_t* ipiv, + const double anorm, double& rcond, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DGBCON( &norm, &n, &kl, &ku, ab, &ldab, ipiv, &anorm, &rcond, work, + iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gbcon( const char norm, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const std::complex* ab, const fortran_int_t ldab, + const fortran_int_t* ipiv, const float anorm, float& rcond, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGBCON( &norm, &n, &kl, &ku, ab, &ldab, ipiv, &anorm, &rcond, work, + rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gbcon( const char norm, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const std::complex* ab, const fortran_int_t ldab, + const fortran_int_t* ipiv, const double anorm, double& rcond, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGBCON( &norm, &n, &kl, &ku, ab, &ldab, ipiv, &anorm, &rcond, work, + rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gbcon. +// +template< typename Value, typename Enable = void > +struct gbcon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gbcon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorIPIV, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + const VectorIPIV& ipiv, const real_type anorm, real_type& rcond, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower(ab) >= 0 ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ab) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + 2*bindings::bandwidth_lower(ab)+(bindings::bandwidth_upper(ab)- + bindings::bandwidth_lower(ab))+1 ); + BOOST_ASSERT( (bindings::bandwidth_upper(ab)- + bindings::bandwidth_lower(ab)) >= 0 ); + BOOST_ASSERT( norm == '1' || norm == 'O' || norm == 'I' ); + return detail::gbcon( norm, bindings::size_column(ab), + bindings::bandwidth_lower(ab), (bindings::bandwidth_upper(ab)- + bindings::bandwidth_lower(ab)), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(ipiv), + anorm, rcond, bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename VectorIPIV > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + const VectorIPIV& ipiv, const real_type anorm, real_type& rcond, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ab) ) ); + return invoke( norm, ab, ipiv, anorm, rcond, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename VectorIPIV > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + const VectorIPIV& ipiv, const real_type anorm, real_type& rcond, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( norm, ab, ipiv, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gbcon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorIPIV, typename WORK, + typename RWORK > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + const VectorIPIV& ipiv, const real_type anorm, real_type& rcond, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower(ab) >= 0 ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ab) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + 2*bindings::bandwidth_lower(ab)+(bindings::bandwidth_upper(ab)- + bindings::bandwidth_lower(ab))+1 ); + BOOST_ASSERT( (bindings::bandwidth_upper(ab)- + bindings::bandwidth_lower(ab)) >= 0 ); + BOOST_ASSERT( norm == '1' || norm == 'O' || norm == 'I' ); + return detail::gbcon( norm, bindings::size_column(ab), + bindings::bandwidth_lower(ab), (bindings::bandwidth_upper(ab)- + bindings::bandwidth_lower(ab)), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(ipiv), + anorm, rcond, + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename VectorIPIV > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + const VectorIPIV& ipiv, const real_type anorm, real_type& rcond, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ab) ) ); + return invoke( norm, ab, ipiv, anorm, rcond, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename VectorIPIV > + static std::ptrdiff_t invoke( const char norm, const MatrixAB& ab, + const VectorIPIV& ipiv, const real_type anorm, real_type& rcond, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( norm, ab, ipiv, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gbcon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gbcon. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename VectorIPIV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gbcon( const char norm, const MatrixAB& ab, const VectorIPIV& ipiv, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type& rcond, + Workspace work ) { + return gbcon_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( norm, ab, ipiv, anorm, rcond, work ); +} + +// +// Overloaded function for gbcon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename VectorIPIV > +inline typename boost::disable_if< detail::is_workspace< VectorIPIV >, + std::ptrdiff_t >::type +gbcon( const char norm, const MatrixAB& ab, const VectorIPIV& ipiv, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type& rcond ) { + return gbcon_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( norm, ab, ipiv, anorm, rcond, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gbequ.hpp b/sdk/boost/numeric/bindings/lapack/computational/gbequ.hpp new file mode 100644 index 0000000..553c5ac --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gbequ.hpp @@ -0,0 +1,238 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GBEQU_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GBEQU_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gbequ is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gbequ( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, const float* ab, + const fortran_int_t ldab, float* r, float* c, float& rowcnd, + float& colcnd, float& amax ) { + fortran_int_t info(0); + LAPACK_SGBEQU( &m, &n, &kl, &ku, ab, &ldab, r, c, &rowcnd, &colcnd, &amax, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gbequ( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, const double* ab, + const fortran_int_t ldab, double* r, double* c, double& rowcnd, + double& colcnd, double& amax ) { + fortran_int_t info(0); + LAPACK_DGBEQU( &m, &n, &kl, &ku, ab, &ldab, r, c, &rowcnd, &colcnd, &amax, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gbequ( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const std::complex* ab, const fortran_int_t ldab, float* r, + float* c, float& rowcnd, float& colcnd, float& amax ) { + fortran_int_t info(0); + LAPACK_CGBEQU( &m, &n, &kl, &ku, ab, &ldab, r, c, &rowcnd, &colcnd, &amax, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gbequ( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const std::complex* ab, const fortran_int_t ldab, double* r, + double* c, double& rowcnd, double& colcnd, double& amax ) { + fortran_int_t info(0); + LAPACK_ZGBEQU( &m, &n, &kl, &ku, ab, &ldab, r, c, &rowcnd, &colcnd, &amax, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gbequ. +// +template< typename Value, typename Enable = void > +struct gbequ_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gbequ_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorR, typename VectorC > + static std::ptrdiff_t invoke( const MatrixAB& ab, VectorR& r, VectorC& c, + real_type& rowcnd, real_type& colcnd, real_type& amax ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorC >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower(ab) >= 0 ); + BOOST_ASSERT( bindings::bandwidth_upper(ab) >= 0 ); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_row(ab) >= 0 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + bindings::bandwidth_lower(ab)+bindings::bandwidth_upper(ab)+ + 1 ); + return detail::gbequ( bindings::size_row(ab), + bindings::size_column(ab), bindings::bandwidth_lower(ab), + bindings::bandwidth_upper(ab), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(r), + bindings::begin_value(c), rowcnd, colcnd, amax ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gbequ_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorR, typename VectorC > + static std::ptrdiff_t invoke( const MatrixAB& ab, VectorR& r, VectorC& c, + real_type& rowcnd, real_type& colcnd, real_type& amax ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorC >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower(ab) >= 0 ); + BOOST_ASSERT( bindings::bandwidth_upper(ab) >= 0 ); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_row(ab) >= 0 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + bindings::bandwidth_lower(ab)+bindings::bandwidth_upper(ab)+ + 1 ); + return detail::gbequ( bindings::size_row(ab), + bindings::size_column(ab), bindings::bandwidth_lower(ab), + bindings::bandwidth_upper(ab), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(r), + bindings::begin_value(c), rowcnd, colcnd, amax ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gbequ_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gbequ. Its overload differs for +// +template< typename MatrixAB, typename VectorR, typename VectorC > +inline std::ptrdiff_t gbequ( const MatrixAB& ab, VectorR& r, VectorC& c, + typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type& rowcnd, typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type& colcnd, + typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type& amax ) { + return gbequ_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab, r, c, rowcnd, colcnd, amax ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gbrfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/gbrfs.hpp new file mode 100644 index 0000000..92df468 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gbrfs.hpp @@ -0,0 +1,499 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GBRFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GBRFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gbrfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Trans > +inline std::ptrdiff_t gbrfs( const Trans, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const fortran_int_t nrhs, const float* ab, const fortran_int_t ldab, + const float* afb, const fortran_int_t ldafb, + const fortran_int_t* ipiv, const float* b, const fortran_int_t ldb, + float* x, const fortran_int_t ldx, float* ferr, float* berr, + float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SGBRFS( &lapack_option< Trans >::value, &n, &kl, &ku, &nrhs, ab, + &ldab, afb, &ldafb, ipiv, b, &ldb, x, &ldx, ferr, berr, work, + iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Trans > +inline std::ptrdiff_t gbrfs( const Trans, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const fortran_int_t nrhs, const double* ab, const fortran_int_t ldab, + const double* afb, const fortran_int_t ldafb, + const fortran_int_t* ipiv, const double* b, const fortran_int_t ldb, + double* x, const fortran_int_t ldx, double* ferr, double* berr, + double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DGBRFS( &lapack_option< Trans >::value, &n, &kl, &ku, &nrhs, ab, + &ldab, afb, &ldafb, ipiv, b, &ldb, x, &ldx, ferr, berr, work, + iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gbrfs( const Trans, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const fortran_int_t nrhs, const std::complex* ab, + const fortran_int_t ldab, const std::complex* afb, + const fortran_int_t ldafb, const fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float* ferr, + float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGBRFS( &lapack_option< Trans >::value, &n, &kl, &ku, &nrhs, ab, + &ldab, afb, &ldafb, ipiv, b, &ldb, x, &ldx, ferr, berr, work, + rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gbrfs( const Trans, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const fortran_int_t nrhs, const std::complex* ab, + const fortran_int_t ldab, const std::complex* afb, + const fortran_int_t ldafb, const fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, double* ferr, + double* berr, std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGBRFS( &lapack_option< Trans >::value, &n, &kl, &ku, &nrhs, ab, + &ldab, afb, &ldafb, ipiv, b, &ldb, x, &ldx, ferr, berr, work, + rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gbrfs. +// +template< typename Value, typename Enable = void > +struct gbrfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gbrfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const MatrixAB& ab, const MatrixAFB& afb, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAFB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower_op(ab, trans()) >= 0 ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column_op(ab, + trans()) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column_op(ab, trans()) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column_op(ab, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(ab, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(afb) == 1 || + bindings::stride_minor(afb) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + bindings::bandwidth_lower_op(ab, trans())+ + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans()))+1 ); + BOOST_ASSERT( bindings::stride_major(afb) >= + 2*bindings::bandwidth_lower_op(ab, trans())+ + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans()))+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans())) >= 0 ); + return detail::gbrfs( trans(), bindings::size_column_op(ab, trans()), + bindings::bandwidth_lower_op(ab, trans()), + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans())), + bindings::size_column(b), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(afb), + bindings::stride_major(afb), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAB& ab, const MatrixAFB& afb, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAFB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column_op(ab, trans()) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column_op(ab, trans()) ) ); + return invoke( ab, afb, ipiv, b, x, ferr, berr, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAB& ab, const MatrixAFB& afb, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAFB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + return invoke( ab, afb, ipiv, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gbrfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const MatrixAB& ab, const MatrixAFB& afb, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAFB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower_op(ab, trans()) >= 0 ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column_op(ab, + trans()) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column_op(ab, trans()) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column_op(ab, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(ab, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(afb) == 1 || + bindings::stride_minor(afb) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + bindings::bandwidth_lower_op(ab, trans())+ + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans()))+1 ); + BOOST_ASSERT( bindings::stride_major(afb) >= + 2*bindings::bandwidth_lower_op(ab, trans())+ + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans()))+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans())) >= 0 ); + return detail::gbrfs( trans(), bindings::size_column_op(ab, trans()), + bindings::bandwidth_lower_op(ab, trans()), + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans())), + bindings::size_column(b), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(afb), + bindings::stride_major(afb), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAB& ab, const MatrixAFB& afb, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAFB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column_op(ab, trans()) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column_op(ab, trans()) ) ); + return invoke( ab, afb, ipiv, b, x, ferr, berr, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAB& ab, const MatrixAFB& afb, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAFB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + return invoke( ab, afb, ipiv, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gbrfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gbrfs. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gbrfs( const MatrixAB& ab, const MatrixAFB& afb, const VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + Workspace work ) { + return gbrfs_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab, afb, ipiv, b, x, ferr, berr, + work ); +} + +// +// Overloaded function for gbrfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +gbrfs( const MatrixAB& ab, const MatrixAFB& afb, const VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr ) { + return gbrfs_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab, afb, ipiv, b, x, ferr, berr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gbtrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/gbtrf.hpp new file mode 100644 index 0000000..25667e5 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gbtrf.hpp @@ -0,0 +1,170 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GBTRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GBTRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gbtrf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gbtrf( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, float* ab, + const fortran_int_t ldab, fortran_int_t* ipiv ) { + fortran_int_t info(0); + LAPACK_SGBTRF( &m, &n, &kl, &ku, ab, &ldab, ipiv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gbtrf( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, double* ab, + const fortran_int_t ldab, fortran_int_t* ipiv ) { + fortran_int_t info(0); + LAPACK_DGBTRF( &m, &n, &kl, &ku, ab, &ldab, ipiv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gbtrf( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + std::complex* ab, const fortran_int_t ldab, + fortran_int_t* ipiv ) { + fortran_int_t info(0); + LAPACK_CGBTRF( &m, &n, &kl, &ku, ab, &ldab, ipiv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gbtrf( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + std::complex* ab, const fortran_int_t ldab, + fortran_int_t* ipiv ) { + fortran_int_t info(0); + LAPACK_ZGBTRF( &m, &n, &kl, &ku, ab, &ldab, ipiv, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gbtrf. +// +template< typename Value > +struct gbtrf_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixAB& ab, VectorIPIV& ipiv ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower(ab) >= 0 ); + BOOST_ASSERT( bindings::size(ipiv) >= std::min< + std::ptrdiff_t >(bindings::size_row(ab), + bindings::size_column(ab)) ); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_row(ab) >= 0 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + 2*bindings::bandwidth_lower(ab)+(bindings::bandwidth_upper(ab)- + bindings::bandwidth_lower(ab))+1 ); + BOOST_ASSERT( (bindings::bandwidth_upper(ab)- + bindings::bandwidth_lower(ab)) >= 0 ); + return detail::gbtrf( bindings::size_row(ab), + bindings::size_column(ab), bindings::bandwidth_lower(ab), + (bindings::bandwidth_upper(ab)-bindings::bandwidth_lower(ab)), + bindings::begin_value(ab), bindings::stride_major(ab), + bindings::begin_value(ipiv) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gbtrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gbtrf. Its overload differs for +// +template< typename MatrixAB, typename VectorIPIV > +inline std::ptrdiff_t gbtrf( MatrixAB& ab, VectorIPIV& ipiv ) { + return gbtrf_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab, ipiv ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gbtrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/gbtrs.hpp new file mode 100644 index 0000000..42a2b41 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gbtrs.hpp @@ -0,0 +1,195 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GBTRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GBTRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gbtrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Trans > +inline std::ptrdiff_t gbtrs( const Trans, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const fortran_int_t nrhs, const float* ab, const fortran_int_t ldab, + const fortran_int_t* ipiv, float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SGBTRS( &lapack_option< Trans >::value, &n, &kl, &ku, &nrhs, ab, + &ldab, ipiv, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Trans > +inline std::ptrdiff_t gbtrs( const Trans, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const fortran_int_t nrhs, const double* ab, const fortran_int_t ldab, + const fortran_int_t* ipiv, double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DGBTRS( &lapack_option< Trans >::value, &n, &kl, &ku, &nrhs, ab, + &ldab, ipiv, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gbtrs( const Trans, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const fortran_int_t nrhs, const std::complex* ab, + const fortran_int_t ldab, const fortran_int_t* ipiv, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CGBTRS( &lapack_option< Trans >::value, &n, &kl, &ku, &nrhs, ab, + &ldab, ipiv, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gbtrs( const Trans, const fortran_int_t n, + const fortran_int_t kl, const fortran_int_t ku, + const fortran_int_t nrhs, const std::complex* ab, + const fortran_int_t ldab, const fortran_int_t* ipiv, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZGBTRS( &lapack_option< Trans >::value, &n, &kl, &ku, &nrhs, ab, + &ldab, ipiv, b, &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gbtrs. +// +template< typename Value > +struct gbtrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( const MatrixAB& ab, const VectorIPIV& ipiv, + MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower_op(ab, trans()) >= 0 ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column_op(ab, + trans()) ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(ab, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + 2*bindings::bandwidth_lower_op(ab, trans())+ + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans()))+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans())) >= 0 ); + return detail::gbtrs( trans(), bindings::size_column_op(ab, trans()), + bindings::bandwidth_lower_op(ab, trans()), + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans())), + bindings::size_column(b), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gbtrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gbtrs. Its overload differs for +// +template< typename MatrixAB, typename VectorIPIV, typename MatrixB > +inline std::ptrdiff_t gbtrs( const MatrixAB& ab, const VectorIPIV& ipiv, + MatrixB& b ) { + return gbtrs_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab, ipiv, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gebak.hpp b/sdk/boost/numeric/bindings/lapack/computational/gebak.hpp new file mode 100644 index 0000000..25ee911 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gebak.hpp @@ -0,0 +1,222 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEBAK_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEBAK_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gebak is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side > +inline std::ptrdiff_t gebak( const char job, const Side, const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, const float* scale, + const fortran_int_t m, float* v, const fortran_int_t ldv ) { + fortran_int_t info(0); + LAPACK_SGEBAK( &job, &lapack_option< Side >::value, &n, &ilo, &ihi, scale, + &m, v, &ldv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side > +inline std::ptrdiff_t gebak( const char job, const Side, const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, const double* scale, + const fortran_int_t m, double* v, const fortran_int_t ldv ) { + fortran_int_t info(0); + LAPACK_DGEBAK( &job, &lapack_option< Side >::value, &n, &ilo, &ihi, scale, + &m, v, &ldv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t gebak( const char job, const Side, const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, const float* scale, + const fortran_int_t m, std::complex* v, + const fortran_int_t ldv ) { + fortran_int_t info(0); + LAPACK_CGEBAK( &job, &lapack_option< Side >::value, &n, &ilo, &ihi, scale, + &m, v, &ldv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t gebak( const char job, const Side, const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, const double* scale, + const fortran_int_t m, std::complex* v, + const fortran_int_t ldv ) { + fortran_int_t info(0); + LAPACK_ZGEBAK( &job, &lapack_option< Side >::value, &n, &ilo, &ihi, scale, + &m, v, &ldv, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gebak. +// +template< typename Value, typename Enable = void > +struct gebak_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gebak_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorSCALE, typename MatrixV > + static std::ptrdiff_t invoke( const char job, const Side side, + const fortran_int_t ilo, const fortran_int_t ihi, + const VectorSCALE& scale, MatrixV& v ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorSCALE >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) ); + BOOST_ASSERT( bindings::size(scale) >= bindings::size_row(v) ); + BOOST_ASSERT( bindings::size_column(v) >= 0 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::size_row(v) >= 0 ); + BOOST_ASSERT( bindings::stride_major(v) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(v)) ); + BOOST_ASSERT( job == 'N' || job == 'P' || job == 'S' || job == 'B' ); + return detail::gebak( job, side, bindings::size_row(v), ilo, ihi, + bindings::begin_value(scale), bindings::size_column(v), + bindings::begin_value(v), bindings::stride_major(v) ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gebak_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorSCALE, typename MatrixV > + static std::ptrdiff_t invoke( const char job, const Side side, + const fortran_int_t ilo, const fortran_int_t ihi, + const VectorSCALE& scale, MatrixV& v ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) ); + BOOST_ASSERT( bindings::size(scale) >= bindings::size_row(v) ); + BOOST_ASSERT( bindings::size_column(v) >= 0 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::size_row(v) >= 0 ); + BOOST_ASSERT( bindings::stride_major(v) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(v)) ); + BOOST_ASSERT( job == 'N' || job == 'P' || job == 'S' || job == 'B' ); + return detail::gebak( job, side, bindings::size_row(v), ilo, ihi, + bindings::begin_value(scale), bindings::size_column(v), + bindings::begin_value(v), bindings::stride_major(v) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gebak_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gebak. Its overload differs for +// +template< typename Side, typename VectorSCALE, typename MatrixV > +inline std::ptrdiff_t gebak( const char job, const Side side, + const fortran_int_t ilo, const fortran_int_t ihi, + const VectorSCALE& scale, MatrixV& v ) { + return gebak_impl< typename bindings::value_type< + MatrixV >::type >::invoke( job, side, ilo, ihi, scale, v ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gebal.hpp b/sdk/boost/numeric/bindings/lapack/computational/gebal.hpp new file mode 100644 index 0000000..ddf4437 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gebal.hpp @@ -0,0 +1,209 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEBAL_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEBAL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gebal is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gebal( const char job, const fortran_int_t n, float* a, + const fortran_int_t lda, fortran_int_t& ilo, fortran_int_t& ihi, + float* scale ) { + fortran_int_t info(0); + LAPACK_SGEBAL( &job, &n, a, &lda, &ilo, &ihi, scale, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gebal( const char job, const fortran_int_t n, double* a, + const fortran_int_t lda, fortran_int_t& ilo, fortran_int_t& ihi, + double* scale ) { + fortran_int_t info(0); + LAPACK_DGEBAL( &job, &n, a, &lda, &ilo, &ihi, scale, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gebal( const char job, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, fortran_int_t& ilo, + fortran_int_t& ihi, float* scale ) { + fortran_int_t info(0); + LAPACK_CGEBAL( &job, &n, a, &lda, &ilo, &ihi, scale, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gebal( const char job, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, fortran_int_t& ilo, + fortran_int_t& ihi, double* scale ) { + fortran_int_t info(0); + LAPACK_ZGEBAL( &job, &n, a, &lda, &ilo, &ihi, scale, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gebal. +// +template< typename Value, typename Enable = void > +struct gebal_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gebal_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorSCALE > + static std::ptrdiff_t invoke( const char job, MatrixA& a, + fortran_int_t& ilo, fortran_int_t& ihi, + VectorSCALE& scale ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorSCALE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorSCALE >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( job == 'N' || job == 'P' || job == 'S' || job == 'B' ); + return detail::gebal( job, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), ilo, ihi, + bindings::begin_value(scale) ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gebal_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorSCALE > + static std::ptrdiff_t invoke( const char job, MatrixA& a, + fortran_int_t& ilo, fortran_int_t& ihi, + VectorSCALE& scale ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorSCALE >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( job == 'N' || job == 'P' || job == 'S' || job == 'B' ); + return detail::gebal( job, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), ilo, ihi, + bindings::begin_value(scale) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gebal_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gebal. Its overload differs for +// +template< typename MatrixA, typename VectorSCALE > +inline std::ptrdiff_t gebal( const char job, MatrixA& a, + fortran_int_t& ilo, fortran_int_t& ihi, VectorSCALE& scale ) { + return gebal_impl< typename bindings::value_type< + MatrixA >::type >::invoke( job, a, ilo, ihi, scale ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gebrd.hpp b/sdk/boost/numeric/bindings/lapack/computational/gebrd.hpp new file mode 100644 index 0000000..8b451d5 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gebrd.hpp @@ -0,0 +1,391 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEBRD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEBRD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gebrd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gebrd( const fortran_int_t m, const fortran_int_t n, + float* a, const fortran_int_t lda, float* d, float* e, float* tauq, + float* taup, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGEBRD( &m, &n, a, &lda, d, e, tauq, taup, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gebrd( const fortran_int_t m, const fortran_int_t n, + double* a, const fortran_int_t lda, double* d, double* e, + double* tauq, double* taup, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGEBRD( &m, &n, a, &lda, d, e, tauq, taup, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gebrd( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, float* d, float* e, + std::complex* tauq, std::complex* taup, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CGEBRD( &m, &n, a, &lda, d, e, tauq, taup, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gebrd( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, double* d, + double* e, std::complex* tauq, std::complex* taup, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZGEBRD( &m, &n, a, &lda, d, e, tauq, taup, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gebrd. +// +template< typename Value, typename Enable = void > +struct gebrd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gebrd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAUQ, typename VectorTAUP, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAUQ& tauq, VectorTAUP& taup, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUP >::value) ); + BOOST_ASSERT( bindings::size(d) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(taup) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(tauq) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::gebrd( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(tauq), bindings::begin_value(taup), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAUQ, typename VectorTAUP > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAUQ& tauq, VectorTAUP& taup, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a) ) ); + return invoke( a, d, e, tauq, taup, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAUQ, typename VectorTAUP > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAUQ& tauq, VectorTAUP& taup, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::gebrd( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(tauq), bindings::begin_value(taup), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, d, e, tauq, taup, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,std::max< std::ptrdiff_t >(m,n)); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gebrd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAUQ, typename VectorTAUP, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAUQ& tauq, VectorTAUP& taup, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUP >::value) ); + BOOST_ASSERT( bindings::size(d) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(taup) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(tauq) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::gebrd( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(tauq), bindings::begin_value(taup), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAUQ, typename VectorTAUP > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAUQ& tauq, VectorTAUP& taup, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a) ) ); + return invoke( a, d, e, tauq, taup, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAUQ, typename VectorTAUP > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAUQ& tauq, VectorTAUP& taup, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::gebrd( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(tauq), bindings::begin_value(taup), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, d, e, tauq, taup, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,std::max< std::ptrdiff_t >(m,n)); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gebrd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gebrd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAUQ, typename VectorTAUP, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gebrd( MatrixA& a, VectorD& d, VectorE& e, VectorTAUQ& tauq, + VectorTAUP& taup, Workspace work ) { + return gebrd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, d, e, tauq, taup, work ); +} + +// +// Overloaded function for gebrd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAUQ, typename VectorTAUP > +inline typename boost::disable_if< detail::is_workspace< VectorTAUP >, + std::ptrdiff_t >::type +gebrd( MatrixA& a, VectorD& d, VectorE& e, VectorTAUQ& tauq, + VectorTAUP& taup ) { + return gebrd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, d, e, tauq, taup, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gecon.hpp b/sdk/boost/numeric/bindings/lapack/computational/gecon.hpp new file mode 100644 index 0000000..e613feb --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gecon.hpp @@ -0,0 +1,333 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GECON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GECON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gecon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gecon( const char norm, const fortran_int_t n, + const float* a, const fortran_int_t lda, const float anorm, + float& rcond, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SGECON( &norm, &n, a, &lda, &anorm, &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gecon( const char norm, const fortran_int_t n, + const double* a, const fortran_int_t lda, const double anorm, + double& rcond, double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DGECON( &norm, &n, a, &lda, &anorm, &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gecon( const char norm, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const float anorm, float& rcond, std::complex* work, + float* rwork ) { + fortran_int_t info(0); + LAPACK_CGECON( &norm, &n, a, &lda, &anorm, &rcond, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gecon( const char norm, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const double anorm, double& rcond, std::complex* work, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGECON( &norm, &n, a, &lda, &anorm, &rcond, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gecon. +// +template< typename Value, typename Enable = void > +struct gecon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gecon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + const real_type anorm, real_type& rcond, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( norm == '1' || norm == 'O' || norm == 'I' ); + return detail::gecon( norm, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), anorm, + rcond, bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + const real_type anorm, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( norm, a, anorm, rcond, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + const real_type anorm, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( norm, a, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 4*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gecon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + const real_type anorm, real_type& rcond, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( norm == '1' || norm == 'O' || norm == 'I' ); + return detail::gecon( norm, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), anorm, + rcond, bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + const real_type anorm, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( norm, a, anorm, rcond, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + const real_type anorm, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( norm, a, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gecon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gecon. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gecon( const char norm, const MatrixA& a, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond, + Workspace work ) { + return gecon_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, anorm, rcond, work ); +} + +// +// Overloaded function for gecon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA > +inline typename boost::disable_if< detail::is_workspace< MatrixA >, + std::ptrdiff_t >::type +gecon( const char norm, const MatrixA& a, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond ) { + return gecon_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, anorm, rcond, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/geequ.hpp b/sdk/boost/numeric/bindings/lapack/computational/geequ.hpp new file mode 100644 index 0000000..26e4005 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/geequ.hpp @@ -0,0 +1,221 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEEQU_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEEQU_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for geequ is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t geequ( const fortran_int_t m, const fortran_int_t n, + const float* a, const fortran_int_t lda, float* r, float* c, + float& rowcnd, float& colcnd, float& amax ) { + fortran_int_t info(0); + LAPACK_SGEEQU( &m, &n, a, &lda, r, c, &rowcnd, &colcnd, &amax, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t geequ( const fortran_int_t m, const fortran_int_t n, + const double* a, const fortran_int_t lda, double* r, double* c, + double& rowcnd, double& colcnd, double& amax ) { + fortran_int_t info(0); + LAPACK_DGEEQU( &m, &n, a, &lda, r, c, &rowcnd, &colcnd, &amax, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geequ( const fortran_int_t m, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, float* r, + float* c, float& rowcnd, float& colcnd, float& amax ) { + fortran_int_t info(0); + LAPACK_CGEEQU( &m, &n, a, &lda, r, c, &rowcnd, &colcnd, &amax, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geequ( const fortran_int_t m, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, double* r, + double* c, double& rowcnd, double& colcnd, double& amax ) { + fortran_int_t info(0); + LAPACK_ZGEEQU( &m, &n, a, &lda, r, c, &rowcnd, &colcnd, &amax, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to geequ. +// +template< typename Value, typename Enable = void > +struct geequ_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct geequ_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorR, typename VectorC > + static std::ptrdiff_t invoke( const MatrixA& a, VectorR& r, VectorC& c, + real_type& rowcnd, real_type& colcnd, real_type& amax ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorC >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::geequ( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(r), bindings::begin_value(c), rowcnd, + colcnd, amax ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct geequ_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorR, typename VectorC > + static std::ptrdiff_t invoke( const MatrixA& a, VectorR& r, VectorC& c, + real_type& rowcnd, real_type& colcnd, real_type& amax ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorC >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::geequ( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(r), bindings::begin_value(c), rowcnd, + colcnd, amax ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the geequ_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for geequ. Its overload differs for +// +template< typename MatrixA, typename VectorR, typename VectorC > +inline std::ptrdiff_t geequ( const MatrixA& a, VectorR& r, VectorC& c, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& rowcnd, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& colcnd, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& amax ) { + return geequ_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, r, c, rowcnd, colcnd, amax ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gehrd.hpp b/sdk/boost/numeric/bindings/lapack/computational/gehrd.hpp new file mode 100644 index 0000000..741d5dd --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gehrd.hpp @@ -0,0 +1,332 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEHRD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEHRD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gehrd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gehrd( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, float* a, const fortran_int_t lda, + float* tau, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGEHRD( &n, &ilo, &ihi, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gehrd( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, double* a, const fortran_int_t lda, + double* tau, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGEHRD( &n, &ilo, &ihi, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gehrd( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, std::complex* a, + const fortran_int_t lda, std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CGEHRD( &n, &ilo, &ihi, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gehrd( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, std::complex* a, + const fortran_int_t lda, std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZGEHRD( &n, &ilo, &ihi, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gehrd. +// +template< typename Value, typename Enable = void > +struct gehrd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gehrd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( const fortran_int_t ilo, + const fortran_int_t ihi, MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_column(a)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::gehrd( bindings::size_column(a), ilo, ihi, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t ilo, + const fortran_int_t ihi, MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( ilo, ihi, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t ilo, + const fortran_int_t ihi, MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::gehrd( bindings::size_column(a), ilo, ihi, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( ilo, ihi, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,n); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gehrd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( const fortran_int_t ilo, + const fortran_int_t ihi, MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_column(a)-1 ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::gehrd( bindings::size_column(a), ilo, ihi, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t ilo, + const fortran_int_t ihi, MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( ilo, ihi, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t ilo, + const fortran_int_t ihi, MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::gehrd( bindings::size_column(a), ilo, ihi, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( ilo, ihi, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,n); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gehrd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gehrd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gehrd( const fortran_int_t ilo, const fortran_int_t ihi, + MatrixA& a, VectorTAU& tau, Workspace work ) { + return gehrd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( ilo, ihi, a, tau, work ); +} + +// +// Overloaded function for gehrd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +gehrd( const fortran_int_t ilo, const fortran_int_t ihi, + MatrixA& a, VectorTAU& tau ) { + return gehrd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( ilo, ihi, a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gelqf.hpp b/sdk/boost/numeric/bindings/lapack/computational/gelqf.hpp new file mode 100644 index 0000000..f06cc94 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gelqf.hpp @@ -0,0 +1,330 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GELQF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GELQF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gelqf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gelqf( const fortran_int_t m, const fortran_int_t n, + float* a, const fortran_int_t lda, float* tau, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGELQF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gelqf( const fortran_int_t m, const fortran_int_t n, + double* a, const fortran_int_t lda, double* tau, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGELQF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gelqf( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CGELQF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gelqf( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZGELQF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gelqf. +// +template< typename Value, typename Enable = void > +struct gelqf_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gelqf_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::gelqf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::gelqf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return std::max< std::ptrdiff_t >(1,m); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gelqf_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::gelqf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::gelqf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return std::max< std::ptrdiff_t >(1,m); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gelqf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gelqf. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gelqf( MatrixA& a, VectorTAU& tau, Workspace work ) { + return gelqf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for gelqf. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +gelqf( MatrixA& a, VectorTAU& tau ) { + return gelqf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/geqlf.hpp b/sdk/boost/numeric/bindings/lapack/computational/geqlf.hpp new file mode 100644 index 0000000..1238a33 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/geqlf.hpp @@ -0,0 +1,330 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEQLF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEQLF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for geqlf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t geqlf( const fortran_int_t m, const fortran_int_t n, + float* a, const fortran_int_t lda, float* tau, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGEQLF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t geqlf( const fortran_int_t m, const fortran_int_t n, + double* a, const fortran_int_t lda, double* tau, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGEQLF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geqlf( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CGEQLF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geqlf( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZGEQLF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to geqlf. +// +template< typename Value, typename Enable = void > +struct geqlf_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct geqlf_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::geqlf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::geqlf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,n); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct geqlf_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::geqlf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::geqlf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,n); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the geqlf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for geqlf. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +geqlf( MatrixA& a, VectorTAU& tau, Workspace work ) { + return geqlf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for geqlf. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +geqlf( MatrixA& a, VectorTAU& tau ) { + return geqlf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/geqp3.hpp b/sdk/boost/numeric/bindings/lapack/computational/geqp3.hpp new file mode 100644 index 0000000..b8c34ce --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/geqp3.hpp @@ -0,0 +1,352 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEQP3_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEQP3_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for geqp3 is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t geqp3( const fortran_int_t m, const fortran_int_t n, + float* a, const fortran_int_t lda, fortran_int_t* jpvt, float* tau, + float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGEQP3( &m, &n, a, &lda, jpvt, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t geqp3( const fortran_int_t m, const fortran_int_t n, + double* a, const fortran_int_t lda, fortran_int_t* jpvt, double* tau, + double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGEQP3( &m, &n, a, &lda, jpvt, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geqp3( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, fortran_int_t* jpvt, + std::complex* tau, std::complex* work, + const fortran_int_t lwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGEQP3( &m, &n, a, &lda, jpvt, tau, work, &lwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geqp3( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, fortran_int_t* jpvt, + std::complex* tau, std::complex* work, + const fortran_int_t lwork, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGEQP3( &m, &n, a, &lda, jpvt, tau, work, &lwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to geqp3. +// +template< typename Value, typename Enable = void > +struct geqp3_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct geqp3_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorJPVT, typename VectorTAU, + typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorJPVT& jpvt, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorJPVT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::geqp3( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(jpvt), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorJPVT, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorJPVT& jpvt, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, jpvt, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorJPVT, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorJPVT& jpvt, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::geqp3( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(jpvt), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, jpvt, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n+1; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct geqp3_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorJPVT, typename VectorTAU, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorJPVT& jpvt, VectorTAU& tau, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorJPVT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::geqp3( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(jpvt), bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorJPVT, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorJPVT& jpvt, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( a, jpvt, tau, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorJPVT, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorJPVT& jpvt, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + detail::geqp3( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(jpvt), bindings::begin_value(tau), + &opt_size_work, -1, bindings::begin_value(tmp_rwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, jpvt, tau, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n+1; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the geqp3_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for geqp3. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorJPVT, typename VectorTAU, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +geqp3( MatrixA& a, VectorJPVT& jpvt, VectorTAU& tau, Workspace work ) { + return geqp3_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, jpvt, tau, work ); +} + +// +// Overloaded function for geqp3. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorJPVT, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +geqp3( MatrixA& a, VectorJPVT& jpvt, VectorTAU& tau ) { + return geqp3_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, jpvt, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/geqrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/geqrf.hpp new file mode 100644 index 0000000..1cc321a --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/geqrf.hpp @@ -0,0 +1,330 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEQRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GEQRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for geqrf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t geqrf( const fortran_int_t m, const fortran_int_t n, + float* a, const fortran_int_t lda, float* tau, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGEQRF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t geqrf( const fortran_int_t m, const fortran_int_t n, + double* a, const fortran_int_t lda, double* tau, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGEQRF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geqrf( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CGEQRF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geqrf( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZGEQRF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to geqrf. +// +template< typename Value, typename Enable = void > +struct geqrf_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct geqrf_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::geqrf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::geqrf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,n); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct geqrf_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::geqrf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::geqrf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,n); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the geqrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for geqrf. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +geqrf( MatrixA& a, VectorTAU& tau, Workspace work ) { + return geqrf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for geqrf. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +geqrf( MatrixA& a, VectorTAU& tau ) { + return geqrf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gerfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/gerfs.hpp new file mode 100644 index 0000000..c9f509f --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gerfs.hpp @@ -0,0 +1,469 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GERFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GERFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gerfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Trans > +inline std::ptrdiff_t gerfs( const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const float* a, const fortran_int_t lda, + const float* af, const fortran_int_t ldaf, const fortran_int_t* ipiv, + const float* b, const fortran_int_t ldb, float* x, + const fortran_int_t ldx, float* ferr, float* berr, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SGERFS( &lapack_option< Trans >::value, &n, &nrhs, a, &lda, af, + &ldaf, ipiv, b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Trans > +inline std::ptrdiff_t gerfs( const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const double* a, const fortran_int_t lda, + const double* af, const fortran_int_t ldaf, const fortran_int_t* ipiv, + const double* b, const fortran_int_t ldb, double* x, + const fortran_int_t ldx, double* ferr, double* berr, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DGERFS( &lapack_option< Trans >::value, &n, &nrhs, a, &lda, af, + &ldaf, ipiv, b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gerfs( const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const std::complex* af, + const fortran_int_t ldaf, const fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float* ferr, + float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGERFS( &lapack_option< Trans >::value, &n, &nrhs, a, &lda, af, + &ldaf, ipiv, b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gerfs( const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const std::complex* af, + const fortran_int_t ldaf, const fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, double* ferr, + double* berr, std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGERFS( &lapack_option< Trans >::value, &n, &nrhs, a, &lda, af, + &ldaf, ipiv, b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gerfs. +// +template< typename Value, typename Enable = void > +struct gerfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gerfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAF >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column_op(a, + trans()) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column_op(a, trans()) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column_op(a, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + return detail::gerfs( trans(), bindings::size_column_op(a, trans()), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAF >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column_op(a, trans()) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column_op(a, trans()) ) ); + return invoke( a, af, ipiv, b, x, ferr, berr, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAF >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + return invoke( a, af, ipiv, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gerfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAF >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column_op(a, + trans()) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column_op(a, trans()) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column_op(a, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + return detail::gerfs( trans(), bindings::size_column_op(a, trans()), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAF >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column_op(a, trans()) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column_op(a, trans()) ) ); + return invoke( a, af, ipiv, b, x, ferr, berr, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAF >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + return invoke( a, af, ipiv, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gerfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gerfs. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gerfs( const MatrixA& a, const MatrixAF& af, const VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + Workspace work ) { + return gerfs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, af, ipiv, b, x, ferr, berr, work ); +} + +// +// Overloaded function for gerfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +gerfs( const MatrixA& a, const MatrixAF& af, const VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr ) { + return gerfs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, af, ipiv, b, x, ferr, berr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gerqf.hpp b/sdk/boost/numeric/bindings/lapack/computational/gerqf.hpp new file mode 100644 index 0000000..d42000b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gerqf.hpp @@ -0,0 +1,330 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GERQF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GERQF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gerqf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gerqf( const fortran_int_t m, const fortran_int_t n, + float* a, const fortran_int_t lda, float* tau, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGERQF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gerqf( const fortran_int_t m, const fortran_int_t n, + double* a, const fortran_int_t lda, double* tau, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGERQF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gerqf( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CGERQF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gerqf( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZGERQF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gerqf. +// +template< typename Value, typename Enable = void > +struct gerqf_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gerqf_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::gerqf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::gerqf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return std::max< std::ptrdiff_t >(1,m); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gerqf_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::gerqf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::gerqf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return std::max< std::ptrdiff_t >(1,m); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gerqf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gerqf. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gerqf( MatrixA& a, VectorTAU& tau, Workspace work ) { + return gerqf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for gerqf. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +gerqf( MatrixA& a, VectorTAU& tau ) { + return gerqf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/getrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/getrf.hpp new file mode 100644 index 0000000..27b3fc7 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/getrf.hpp @@ -0,0 +1,228 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GETRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GETRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for getrf is selected by defining a pre-processor +// variable, which can be one of +// * for ATLAS's CLAPACK, define BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// * netlib-compatible LAPACK is the default +// +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * float value-type. +// +template< typename Order > +inline std::ptrdiff_t getrf( Order, const int m, const int n, float* a, + const int lda, int* ipiv ) { + return clapack_sgetrf( clapack_option< Order >::value, m, n, a, lda, + ipiv ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * double value-type. +// +template< typename Order > +inline std::ptrdiff_t getrf( Order, const int m, const int n, double* a, + const int lda, int* ipiv ) { + return clapack_dgetrf( clapack_option< Order >::value, m, n, a, lda, + ipiv ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order > +inline std::ptrdiff_t getrf( Order, const int m, const int n, + std::complex* a, const int lda, int* ipiv ) { + return clapack_cgetrf( clapack_option< Order >::value, m, n, a, lda, + ipiv ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order > +inline std::ptrdiff_t getrf( Order, const int m, const int n, + std::complex* a, const int lda, int* ipiv ) { + return clapack_zgetrf( clapack_option< Order >::value, m, n, a, lda, + ipiv ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Order > +inline std::ptrdiff_t getrf( Order, const fortran_int_t m, + const fortran_int_t n, float* a, const fortran_int_t lda, + fortran_int_t* ipiv ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_SGETRF( &m, &n, a, &lda, ipiv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Order > +inline std::ptrdiff_t getrf( Order, const fortran_int_t m, + const fortran_int_t n, double* a, const fortran_int_t lda, + fortran_int_t* ipiv ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_DGETRF( &m, &n, a, &lda, ipiv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order > +inline std::ptrdiff_t getrf( Order, const fortran_int_t m, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, fortran_int_t* ipiv ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_CGETRF( &m, &n, a, &lda, ipiv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order > +inline std::ptrdiff_t getrf( Order, const fortran_int_t m, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, fortran_int_t* ipiv ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_ZGETRF( &m, &n, a, &lda, ipiv, &info ); + return info; +} + +#endif +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to getrf. +// +template< typename Value > +struct getrf_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::getrf( order(), bindings::size_row(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the getrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for getrf. Its overload differs for +// +template< typename MatrixA, typename VectorIPIV > +inline std::ptrdiff_t getrf( MatrixA& a, VectorIPIV& ipiv ) { + return getrf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/getri.hpp b/sdk/boost/numeric/bindings/lapack/computational/getri.hpp new file mode 100644 index 0000000..3bc5e7e --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/getri.hpp @@ -0,0 +1,399 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GETRI_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GETRI_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for getri is selected by defining a pre-processor +// variable, which can be one of +// * for ATLAS's CLAPACK, define BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// * netlib-compatible LAPACK is the default +// +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * float value-type. +// +template< typename Order > +inline std::ptrdiff_t getri( Order, const int n, float* a, const int lda, + const int* ipiv, float* work, const int lwork ) { + return clapack_sgetri( clapack_option< Order >::value, n, a, lda, ipiv ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * double value-type. +// +template< typename Order > +inline std::ptrdiff_t getri( Order, const int n, double* a, const int lda, + const int* ipiv, double* work, const int lwork ) { + return clapack_dgetri( clapack_option< Order >::value, n, a, lda, ipiv ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order > +inline std::ptrdiff_t getri( Order, const int n, std::complex* a, + const int lda, const int* ipiv, std::complex* work, + const int lwork ) { + return clapack_cgetri( clapack_option< Order >::value, n, a, lda, ipiv ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order > +inline std::ptrdiff_t getri( Order, const int n, std::complex* a, + const int lda, const int* ipiv, std::complex* work, + const int lwork ) { + return clapack_zgetri( clapack_option< Order >::value, n, a, lda, ipiv ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Order > +inline std::ptrdiff_t getri( Order, const fortran_int_t n, float* a, + const fortran_int_t lda, const fortran_int_t* ipiv, float* work, + const fortran_int_t lwork ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_SGETRI( &n, a, &lda, ipiv, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Order > +inline std::ptrdiff_t getri( Order, const fortran_int_t n, double* a, + const fortran_int_t lda, const fortran_int_t* ipiv, double* work, + const fortran_int_t lwork ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_DGETRI( &n, a, &lda, ipiv, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order > +inline std::ptrdiff_t getri( Order, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + const fortran_int_t* ipiv, std::complex* work, + const fortran_int_t lwork ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_CGETRI( &n, a, &lda, ipiv, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order > +inline std::ptrdiff_t getri( Order, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + const fortran_int_t* ipiv, std::complex* work, + const fortran_int_t lwork ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_ZGETRI( &n, a, &lda, ipiv, work, &lwork, &info ); + return info; +} + +#endif +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to getri. +// +template< typename Value, typename Enable = void > +struct getri_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct getri_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::getri( order(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK + bindings::detail::array< real_type > tmp_work( 0 ); +#else + real_type opt_size_work; + detail::getri( order(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); +#endif + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK + return 0; +#else + return std::max< std::ptrdiff_t >(1,n); +#endif + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct getri_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::getri( order(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK + bindings::detail::array< value_type > tmp_work( 0 ); +#else + value_type opt_size_work; + detail::getri( order(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); +#endif + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK + return 0; +#else + return std::max< std::ptrdiff_t >(1,n); +#endif + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the getri_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for getri. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorIPIV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +getri( MatrixA& a, const VectorIPIV& ipiv, Workspace work ) { + return getri_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, work ); +} + +// +// Overloaded function for getri. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorIPIV > +inline typename boost::disable_if< detail::is_workspace< VectorIPIV >, + std::ptrdiff_t >::type +getri( MatrixA& a, const VectorIPIV& ipiv ) { + return getri_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/getrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/getrs.hpp new file mode 100644 index 0000000..a88ee67 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/getrs.hpp @@ -0,0 +1,255 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GETRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GETRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for getrs is selected by defining a pre-processor +// variable, which can be one of +// * for ATLAS's CLAPACK, define BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// * netlib-compatible LAPACK is the default +// +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * float value-type. +// +template< typename Order, typename Trans > +inline std::ptrdiff_t getrs( Order, const Trans, const int n, const int nrhs, + const float* a, const int lda, const int* ipiv, float* b, + const int ldb ) { + return clapack_sgetrs + ( clapack_option< Order >::value, clapack_option< Trans >::value, n, nrhs, + a, lda, ipiv, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * double value-type. +// +template< typename Order, typename Trans > +inline std::ptrdiff_t getrs( Order, const Trans, const int n, const int nrhs, + const double* a, const int lda, const int* ipiv, double* b, + const int ldb ) { + return clapack_dgetrs + ( clapack_option< Order >::value, clapack_option< Trans >::value, n, nrhs, + a, lda, ipiv, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order, typename Trans > +inline std::ptrdiff_t getrs( Order, const Trans, const int n, const int nrhs, + const std::complex* a, const int lda, const int* ipiv, + std::complex* b, const int ldb ) { + return clapack_cgetrs + ( clapack_option< Order >::value, clapack_option< Trans >::value, n, nrhs, + a, lda, ipiv, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order, typename Trans > +inline std::ptrdiff_t getrs( Order, const Trans, const int n, const int nrhs, + const std::complex* a, const int lda, const int* ipiv, + std::complex* b, const int ldb ) { + return clapack_zgetrs + ( clapack_option< Order >::value, clapack_option< Trans >::value, n, nrhs, + a, lda, ipiv, b, ldb ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Order, typename Trans > +inline std::ptrdiff_t getrs( Order, const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const float* a, const fortran_int_t lda, + const fortran_int_t* ipiv, float* b, const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_SGETRS( &lapack_option< Trans >::value, &n, &nrhs, a, &lda, ipiv, + b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Order, typename Trans > +inline std::ptrdiff_t getrs( Order, const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const double* a, const fortran_int_t lda, + const fortran_int_t* ipiv, double* b, const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_DGETRS( &lapack_option< Trans >::value, &n, &nrhs, a, &lda, ipiv, + b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order, typename Trans > +inline std::ptrdiff_t getrs( Order, const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const fortran_int_t* ipiv, + std::complex* b, const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_CGETRS( &lapack_option< Trans >::value, &n, &nrhs, a, &lda, ipiv, + b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order, typename Trans > +inline std::ptrdiff_t getrs( Order, const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const fortran_int_t* ipiv, + std::complex* b, const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_ZGETRS( &lapack_option< Trans >::value, &n, &nrhs, a, &lda, ipiv, + b, &ldb, &info ); + return info; +} + +#endif +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to getrs. +// +template< typename Value > +struct getrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column_op(a, + trans()) ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + return detail::getrs( order(), trans(), bindings::size_column_op(a, + trans()), bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the getrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for getrs. Its overload differs for +// +template< typename MatrixA, typename VectorIPIV, typename MatrixB > +inline std::ptrdiff_t getrs( const MatrixA& a, const VectorIPIV& ipiv, + MatrixB& b ) { + return getrs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ggbak.hpp b/sdk/boost/numeric/bindings/lapack/computational/ggbak.hpp new file mode 100644 index 0000000..35f2dc1 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ggbak.hpp @@ -0,0 +1,242 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GGBAK_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GGBAK_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ggbak is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side > +inline std::ptrdiff_t ggbak( const char job, const Side, const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, const float* lscale, + const float* rscale, const fortran_int_t m, float* v, + const fortran_int_t ldv ) { + fortran_int_t info(0); + LAPACK_SGGBAK( &job, &lapack_option< Side >::value, &n, &ilo, &ihi, + lscale, rscale, &m, v, &ldv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side > +inline std::ptrdiff_t ggbak( const char job, const Side, const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, + const double* lscale, const double* rscale, const fortran_int_t m, + double* v, const fortran_int_t ldv ) { + fortran_int_t info(0); + LAPACK_DGGBAK( &job, &lapack_option< Side >::value, &n, &ilo, &ihi, + lscale, rscale, &m, v, &ldv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t ggbak( const char job, const Side, const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, const float* lscale, + const float* rscale, const fortran_int_t m, std::complex* v, + const fortran_int_t ldv ) { + fortran_int_t info(0); + LAPACK_CGGBAK( &job, &lapack_option< Side >::value, &n, &ilo, &ihi, + lscale, rscale, &m, v, &ldv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t ggbak( const char job, const Side, const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, + const double* lscale, const double* rscale, const fortran_int_t m, + std::complex* v, const fortran_int_t ldv ) { + fortran_int_t info(0); + LAPACK_ZGGBAK( &job, &lapack_option< Side >::value, &n, &ilo, &ihi, + lscale, rscale, &m, v, &ldv, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ggbak. +// +template< typename Value, typename Enable = void > +struct ggbak_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ggbak_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorLSCALE, typename VectorRSCALE, + typename MatrixV > + static std::ptrdiff_t invoke( const char job, const Side side, + const fortran_int_t ilo, const fortran_int_t ihi, + const VectorLSCALE& lscale, const VectorRSCALE& rscale, + MatrixV& v ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorLSCALE >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRSCALE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorLSCALE >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) ); + BOOST_ASSERT( bindings::size(lscale) >= bindings::size_row(v) ); + BOOST_ASSERT( bindings::size(rscale) >= bindings::size_row(v) ); + BOOST_ASSERT( bindings::size_column(v) >= 0 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::size_row(v) >= 0 ); + BOOST_ASSERT( bindings::stride_major(v) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(v)) ); + BOOST_ASSERT( job == 'N' || job == 'P' || job == 'S' || job == 'B' ); + return detail::ggbak( job, side, bindings::size_row(v), ilo, ihi, + bindings::begin_value(lscale), bindings::begin_value(rscale), + bindings::size_column(v), bindings::begin_value(v), + bindings::stride_major(v) ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ggbak_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorLSCALE, typename VectorRSCALE, + typename MatrixV > + static std::ptrdiff_t invoke( const char job, const Side side, + const fortran_int_t ilo, const fortran_int_t ihi, + const VectorLSCALE& lscale, const VectorRSCALE& rscale, + MatrixV& v ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorLSCALE >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRSCALE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) ); + BOOST_ASSERT( bindings::size(lscale) >= bindings::size_row(v) ); + BOOST_ASSERT( bindings::size(rscale) >= bindings::size_row(v) ); + BOOST_ASSERT( bindings::size_column(v) >= 0 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::size_row(v) >= 0 ); + BOOST_ASSERT( bindings::stride_major(v) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(v)) ); + BOOST_ASSERT( job == 'N' || job == 'P' || job == 'S' || job == 'B' ); + return detail::ggbak( job, side, bindings::size_row(v), ilo, ihi, + bindings::begin_value(lscale), bindings::begin_value(rscale), + bindings::size_column(v), bindings::begin_value(v), + bindings::stride_major(v) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ggbak_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ggbak. Its overload differs for +// +template< typename Side, typename VectorLSCALE, typename VectorRSCALE, + typename MatrixV > +inline std::ptrdiff_t ggbak( const char job, const Side side, + const fortran_int_t ilo, const fortran_int_t ihi, + const VectorLSCALE& lscale, const VectorRSCALE& rscale, MatrixV& v ) { + return ggbak_impl< typename bindings::value_type< + MatrixV >::type >::invoke( job, side, ilo, ihi, lscale, rscale, + v ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ggbal.hpp b/sdk/boost/numeric/bindings/lapack/computational/ggbal.hpp new file mode 100644 index 0000000..fe20575 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ggbal.hpp @@ -0,0 +1,376 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GGBAL_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GGBAL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ggbal is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ggbal( const char job, const fortran_int_t n, float* a, + const fortran_int_t lda, float* b, const fortran_int_t ldb, + fortran_int_t& ilo, fortran_int_t& ihi, float* lscale, float* rscale, + float* work ) { + fortran_int_t info(0); + LAPACK_SGGBAL( &job, &n, a, &lda, b, &ldb, &ilo, &ihi, lscale, rscale, + work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ggbal( const char job, const fortran_int_t n, double* a, + const fortran_int_t lda, double* b, const fortran_int_t ldb, + fortran_int_t& ilo, fortran_int_t& ihi, double* lscale, + double* rscale, double* work ) { + fortran_int_t info(0); + LAPACK_DGGBAL( &job, &n, a, &lda, b, &ldb, &ilo, &ihi, lscale, rscale, + work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggbal( const char job, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, fortran_int_t& ilo, + fortran_int_t& ihi, float* lscale, float* rscale, float* work ) { + fortran_int_t info(0); + LAPACK_CGGBAL( &job, &n, a, &lda, b, &ldb, &ilo, &ihi, lscale, rscale, + work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggbal( const char job, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, fortran_int_t& ilo, + fortran_int_t& ihi, double* lscale, double* rscale, double* work ) { + fortran_int_t info(0); + LAPACK_ZGGBAL( &job, &n, a, &lda, b, &ldb, &ilo, &ihi, lscale, rscale, + work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ggbal. +// +template< typename Value, typename Enable = void > +struct ggbal_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ggbal_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorLSCALE, + typename VectorRSCALE, typename WORK > + static std::ptrdiff_t invoke( const char job, MatrixA& a, MatrixB& b, + fortran_int_t& ilo, fortran_int_t& ihi, + VectorLSCALE& lscale, VectorRSCALE& rscale, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorLSCALE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRSCALE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorLSCALE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRSCALE >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( job, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( job == 'N' || job == 'P' || job == 'S' || job == 'B' ); + return detail::ggbal( job, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), ilo, ihi, + bindings::begin_value(lscale), bindings::begin_value(rscale), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorLSCALE, + typename VectorRSCALE > + static std::ptrdiff_t invoke( const char job, MatrixA& a, MatrixB& b, + fortran_int_t& ilo, fortran_int_t& ihi, + VectorLSCALE& lscale, VectorRSCALE& rscale, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( job, + bindings::size_column(a) ) ); + return invoke( job, a, b, ilo, ihi, lscale, rscale, + workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorLSCALE, + typename VectorRSCALE > + static std::ptrdiff_t invoke( const char job, MatrixA& a, MatrixB& b, + fortran_int_t& ilo, fortran_int_t& ihi, + VectorLSCALE& lscale, VectorRSCALE& rscale, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( job, a, b, ilo, ihi, lscale, rscale, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char job, + const std::ptrdiff_t n ) { + if ( job == 'S' || job == 'B' ) + return std::max< std::ptrdiff_t >(1, 6*n); + else // if ( job == 'N' || job == 'P' ) + return 1; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ggbal_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorLSCALE, + typename VectorRSCALE, typename WORK > + static std::ptrdiff_t invoke( const char job, MatrixA& a, MatrixB& b, + fortran_int_t& ilo, fortran_int_t& ihi, + VectorLSCALE& lscale, VectorRSCALE& rscale, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorLSCALE >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRSCALE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorLSCALE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRSCALE >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( job, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( job == 'N' || job == 'P' || job == 'S' || job == 'B' ); + return detail::ggbal( job, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), ilo, ihi, + bindings::begin_value(lscale), bindings::begin_value(rscale), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorLSCALE, + typename VectorRSCALE > + static std::ptrdiff_t invoke( const char job, MatrixA& a, MatrixB& b, + fortran_int_t& ilo, fortran_int_t& ihi, + VectorLSCALE& lscale, VectorRSCALE& rscale, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( job, + bindings::size_column(a) ) ); + return invoke( job, a, b, ilo, ihi, lscale, rscale, + workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorLSCALE, + typename VectorRSCALE > + static std::ptrdiff_t invoke( const char job, MatrixA& a, MatrixB& b, + fortran_int_t& ilo, fortran_int_t& ihi, + VectorLSCALE& lscale, VectorRSCALE& rscale, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( job, a, b, ilo, ihi, lscale, rscale, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char job, + const std::ptrdiff_t n ) { + if ( job == 'S' || job == 'B' ) + return std::max< std::ptrdiff_t >(1, 6*n); + else // if ( job == 'N' || job == 'P' ) + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ggbal_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ggbal. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorLSCALE, + typename VectorRSCALE, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ggbal( const char job, MatrixA& a, MatrixB& b, fortran_int_t& ilo, + fortran_int_t& ihi, VectorLSCALE& lscale, VectorRSCALE& rscale, + Workspace work ) { + return ggbal_impl< typename bindings::value_type< + MatrixA >::type >::invoke( job, a, b, ilo, ihi, lscale, rscale, + work ); +} + +// +// Overloaded function for ggbal. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorLSCALE, + typename VectorRSCALE > +inline typename boost::disable_if< detail::is_workspace< VectorRSCALE >, + std::ptrdiff_t >::type +ggbal( const char job, MatrixA& a, MatrixB& b, fortran_int_t& ilo, + fortran_int_t& ihi, VectorLSCALE& lscale, VectorRSCALE& rscale ) { + return ggbal_impl< typename bindings::value_type< + MatrixA >::type >::invoke( job, a, b, ilo, ihi, lscale, rscale, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gghrd.hpp b/sdk/boost/numeric/bindings/lapack/computational/gghrd.hpp new file mode 100644 index 0000000..91d4671 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gghrd.hpp @@ -0,0 +1,209 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GGHRD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GGHRD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gghrd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gghrd( const char compq, const char compz, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, float* a, const fortran_int_t lda, float* b, + const fortran_int_t ldb, float* q, const fortran_int_t ldq, float* z, + const fortran_int_t ldz ) { + fortran_int_t info(0); + LAPACK_SGGHRD( &compq, &compz, &n, &ilo, &ihi, a, &lda, b, &ldb, q, &ldq, + z, &ldz, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gghrd( const char compq, const char compz, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, double* a, const fortran_int_t lda, + double* b, const fortran_int_t ldb, double* q, + const fortran_int_t ldq, double* z, const fortran_int_t ldz ) { + fortran_int_t info(0); + LAPACK_DGGHRD( &compq, &compz, &n, &ilo, &ihi, a, &lda, b, &ldb, q, &ldq, + z, &ldz, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gghrd( const char compq, const char compz, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, std::complex* q, + const fortran_int_t ldq, std::complex* z, + const fortran_int_t ldz ) { + fortran_int_t info(0); + LAPACK_CGGHRD( &compq, &compz, &n, &ilo, &ihi, a, &lda, b, &ldb, q, &ldq, + z, &ldz, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gghrd( const char compq, const char compz, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, std::complex* q, + const fortran_int_t ldq, std::complex* z, + const fortran_int_t ldz ) { + fortran_int_t info(0); + LAPACK_ZGGHRD( &compq, &compz, &n, &ilo, &ihi, a, &lda, b, &ldb, q, &ldq, + z, &ldz, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gghrd. +// +template< typename Value > +struct gghrd_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixQ, + typename MatrixZ > + static std::ptrdiff_t invoke( const char compq, const char compz, + const fortran_int_t ilo, MatrixA& a, MatrixB& b, MatrixQ& q, + MatrixZ& z ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( compq == 'N' || compq == 'I' || compq == 'V' ); + BOOST_ASSERT( compz == 'N' || compz == 'I' || compz == 'V' ); + return detail::gghrd( compq, compz, bindings::size_column(a), ilo, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(q), + bindings::stride_major(q), bindings::begin_value(z), + bindings::stride_major(z) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gghrd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gghrd. Its overload differs for +// +template< typename MatrixA, typename MatrixB, typename MatrixQ, + typename MatrixZ > +inline std::ptrdiff_t gghrd( const char compq, const char compz, + const fortran_int_t ilo, MatrixA& a, MatrixB& b, MatrixQ& q, + MatrixZ& z ) { + return gghrd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( compq, compz, ilo, a, b, q, z ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ggqrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/ggqrf.hpp new file mode 100644 index 0000000..838f097 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ggqrf.hpp @@ -0,0 +1,403 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GGQRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GGQRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ggqrf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ggqrf( const fortran_int_t n, const fortran_int_t m, + const fortran_int_t p, float* a, const fortran_int_t lda, float* taua, + float* b, const fortran_int_t ldb, float* taub, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGGQRF( &n, &m, &p, a, &lda, taua, b, &ldb, taub, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ggqrf( const fortran_int_t n, const fortran_int_t m, + const fortran_int_t p, double* a, const fortran_int_t lda, + double* taua, double* b, const fortran_int_t ldb, double* taub, + double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGGQRF( &n, &m, &p, a, &lda, taua, b, &ldb, taub, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggqrf( const fortran_int_t n, const fortran_int_t m, + const fortran_int_t p, std::complex* a, + const fortran_int_t lda, std::complex* taua, + std::complex* b, const fortran_int_t ldb, + std::complex* taub, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CGGQRF( &n, &m, &p, a, &lda, taua, b, &ldb, taub, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggqrf( const fortran_int_t n, const fortran_int_t m, + const fortran_int_t p, std::complex* a, + const fortran_int_t lda, std::complex* taua, + std::complex* b, const fortran_int_t ldb, + std::complex* taub, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZGGQRF( &n, &m, &p, a, &lda, taua, b, &ldb, taub, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ggqrf. +// +template< typename Value, typename Enable = void > +struct ggqrf_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ggqrf_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAUA& taua, MatrixB& b, + VectorTAUB& taub, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUB >::value) ); + BOOST_ASSERT( bindings::size(taua) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(taub) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(b)) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a), bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::ggqrf( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(taua), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(taub), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAUA& taua, MatrixB& b, + VectorTAUB& taub, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b) ) ); + return invoke( a, taua, b, taub, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAUA& taua, MatrixB& b, + VectorTAUB& taub, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::ggqrf( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(taua), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(taub), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, taua, b, taub, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t m, const std::ptrdiff_t p ) { + return std::max< std::ptrdiff_t >(1,std::max< std::ptrdiff_t >(n, + std::max< std::ptrdiff_t >(m,p))); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ggqrf_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAUA& taua, MatrixB& b, + VectorTAUB& taub, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUB >::value) ); + BOOST_ASSERT( bindings::size(taua) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(taub) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(b)) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a), bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::ggqrf( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(taua), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(taub), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAUA& taua, MatrixB& b, + VectorTAUB& taub, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b) ) ); + return invoke( a, taua, b, taub, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAUA& taua, MatrixB& b, + VectorTAUB& taub, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::ggqrf( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(taua), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(taub), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, taua, b, taub, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t m, const std::ptrdiff_t p ) { + return std::max< std::ptrdiff_t >(1,std::max< std::ptrdiff_t >(n, + std::max< std::ptrdiff_t >(m,p))); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ggqrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ggqrf. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ggqrf( MatrixA& a, VectorTAUA& taua, MatrixB& b, VectorTAUB& taub, + Workspace work ) { + return ggqrf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, taua, b, taub, work ); +} + +// +// Overloaded function for ggqrf. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB > +inline typename boost::disable_if< detail::is_workspace< VectorTAUB >, + std::ptrdiff_t >::type +ggqrf( MatrixA& a, VectorTAUA& taua, MatrixB& b, VectorTAUB& taub ) { + return ggqrf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, taua, b, taub, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ggrqf.hpp b/sdk/boost/numeric/bindings/lapack/computational/ggrqf.hpp new file mode 100644 index 0000000..0721969 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ggrqf.hpp @@ -0,0 +1,403 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GGRQF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GGRQF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ggrqf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ggrqf( const fortran_int_t m, const fortran_int_t p, + const fortran_int_t n, float* a, const fortran_int_t lda, float* taua, + float* b, const fortran_int_t ldb, float* taub, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGGRQF( &m, &p, &n, a, &lda, taua, b, &ldb, taub, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ggrqf( const fortran_int_t m, const fortran_int_t p, + const fortran_int_t n, double* a, const fortran_int_t lda, + double* taua, double* b, const fortran_int_t ldb, double* taub, + double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGGRQF( &m, &p, &n, a, &lda, taua, b, &ldb, taub, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggrqf( const fortran_int_t m, const fortran_int_t p, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* taua, + std::complex* b, const fortran_int_t ldb, + std::complex* taub, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CGGRQF( &m, &p, &n, a, &lda, taua, b, &ldb, taub, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggrqf( const fortran_int_t m, const fortran_int_t p, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* taua, + std::complex* b, const fortran_int_t ldb, + std::complex* taub, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZGGRQF( &m, &p, &n, a, &lda, taua, b, &ldb, taub, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ggrqf. +// +template< typename Value, typename Enable = void > +struct ggrqf_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ggrqf_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAUA& taua, MatrixB& b, + VectorTAUB& taub, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUB >::value) ); + BOOST_ASSERT( bindings::size(taua) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(taub) >= std::min< + std::ptrdiff_t >(bindings::size_row(b), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a), + bindings::size_row(a), bindings::size_row(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::size_row(b) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(b)) ); + return detail::ggrqf( bindings::size_row(a), bindings::size_row(b), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(taua), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(taub), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAUA& taua, MatrixB& b, + VectorTAUB& taub, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a), bindings::size_row(a), + bindings::size_row(b) ) ); + return invoke( a, taua, b, taub, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAUA& taua, MatrixB& b, + VectorTAUB& taub, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::ggrqf( bindings::size_row(a), bindings::size_row(b), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(taua), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(taub), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, taua, b, taub, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t m, const std::ptrdiff_t p ) { + return std::max< std::ptrdiff_t >(1,std::max< std::ptrdiff_t >(n, + std::max< std::ptrdiff_t >(m,p))); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ggrqf_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAUA& taua, MatrixB& b, + VectorTAUB& taub, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAUB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAUB >::value) ); + BOOST_ASSERT( bindings::size(taua) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(taub) >= std::min< + std::ptrdiff_t >(bindings::size_row(b), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a), + bindings::size_row(a), bindings::size_row(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::size_row(b) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(b)) ); + return detail::ggrqf( bindings::size_row(a), bindings::size_row(b), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(taua), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(taub), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAUA& taua, MatrixB& b, + VectorTAUB& taub, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a), bindings::size_row(a), + bindings::size_row(b) ) ); + return invoke( a, taua, b, taub, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAUA& taua, MatrixB& b, + VectorTAUB& taub, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::ggrqf( bindings::size_row(a), bindings::size_row(b), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(taua), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(taub), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, taua, b, taub, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t m, const std::ptrdiff_t p ) { + return std::max< std::ptrdiff_t >(1,std::max< std::ptrdiff_t >(n, + std::max< std::ptrdiff_t >(m,p))); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ggrqf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ggrqf. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ggrqf( MatrixA& a, VectorTAUA& taua, MatrixB& b, VectorTAUB& taub, + Workspace work ) { + return ggrqf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, taua, b, taub, work ); +} + +// +// Overloaded function for ggrqf. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAUA, typename MatrixB, + typename VectorTAUB > +inline typename boost::disable_if< detail::is_workspace< VectorTAUB >, + std::ptrdiff_t >::type +ggrqf( MatrixA& a, VectorTAUA& taua, MatrixB& b, VectorTAUB& taub ) { + return ggrqf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, taua, b, taub, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ggsvp.hpp b/sdk/boost/numeric/bindings/lapack/computational/ggsvp.hpp new file mode 100644 index 0000000..c63944c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ggsvp.hpp @@ -0,0 +1,525 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GGSVP_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GGSVP_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ggsvp is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ggsvp( const char jobu, const char jobv, const char jobq, + const fortran_int_t m, const fortran_int_t p, const fortran_int_t n, + float* a, const fortran_int_t lda, float* b, const fortran_int_t ldb, + const float tola, const float tolb, fortran_int_t& k, + fortran_int_t& l, float* u, const fortran_int_t ldu, float* v, + const fortran_int_t ldv, float* q, const fortran_int_t ldq, + fortran_int_t* iwork, float* tau, float* work ) { + fortran_int_t info(0); + LAPACK_SGGSVP( &jobu, &jobv, &jobq, &m, &p, &n, a, &lda, b, &ldb, &tola, + &tolb, &k, &l, u, &ldu, v, &ldv, q, &ldq, iwork, tau, work, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ggsvp( const char jobu, const char jobv, const char jobq, + const fortran_int_t m, const fortran_int_t p, const fortran_int_t n, + double* a, const fortran_int_t lda, double* b, + const fortran_int_t ldb, const double tola, const double tolb, + fortran_int_t& k, fortran_int_t& l, double* u, + const fortran_int_t ldu, double* v, const fortran_int_t ldv, + double* q, const fortran_int_t ldq, fortran_int_t* iwork, double* tau, + double* work ) { + fortran_int_t info(0); + LAPACK_DGGSVP( &jobu, &jobv, &jobq, &m, &p, &n, a, &lda, b, &ldb, &tola, + &tolb, &k, &l, u, &ldu, v, &ldv, q, &ldq, iwork, tau, work, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggsvp( const char jobu, const char jobv, const char jobq, + const fortran_int_t m, const fortran_int_t p, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, const float tola, + const float tolb, fortran_int_t& k, fortran_int_t& l, + std::complex* u, const fortran_int_t ldu, + std::complex* v, const fortran_int_t ldv, + std::complex* q, const fortran_int_t ldq, fortran_int_t* iwork, + float* rwork, std::complex* tau, std::complex* work ) { + fortran_int_t info(0); + LAPACK_CGGSVP( &jobu, &jobv, &jobq, &m, &p, &n, a, &lda, b, &ldb, &tola, + &tolb, &k, &l, u, &ldu, v, &ldv, q, &ldq, iwork, rwork, tau, work, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggsvp( const char jobu, const char jobv, const char jobq, + const fortran_int_t m, const fortran_int_t p, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, const double tola, + const double tolb, fortran_int_t& k, fortran_int_t& l, + std::complex* u, const fortran_int_t ldu, + std::complex* v, const fortran_int_t ldv, + std::complex* q, const fortran_int_t ldq, + fortran_int_t* iwork, double* rwork, std::complex* tau, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZGGSVP( &jobu, &jobv, &jobq, &m, &p, &n, a, &lda, b, &ldb, &tola, + &tolb, &k, &l, u, &ldu, v, &ldv, q, &ldq, iwork, rwork, tau, work, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ggsvp. +// +template< typename Value, typename Enable = void > +struct ggsvp_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ggsvp_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixU, + typename MatrixV, typename MatrixQ, typename IWORK, typename TAU, + typename WORK > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, MatrixA& a, MatrixB& b, const real_type tola, + const real_type tolb, fortran_int_t& k, fortran_int_t& l, + MatrixU& u, MatrixV& v, MatrixQ& q, detail::workspace3< IWORK, + TAU, WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_tau( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a), + bindings::size_row(a), bindings::size_row(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::size_row(b) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(b)) ); + BOOST_ASSERT( jobq == 'Q' || jobq == 'N' ); + BOOST_ASSERT( jobu == 'U' || jobu == 'N' ); + BOOST_ASSERT( jobv == 'V' || jobv == 'N' ); + return detail::ggsvp( jobu, jobv, jobq, bindings::size_row(a), + bindings::size_row(b), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), tola, + tolb, k, l, bindings::begin_value(u), + bindings::stride_major(u), bindings::begin_value(v), + bindings::stride_major(v), bindings::begin_value(q), + bindings::stride_major(q), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename MatrixU, + typename MatrixV, typename MatrixQ > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, MatrixA& a, MatrixB& b, const real_type tola, + const real_type tolb, fortran_int_t& k, fortran_int_t& l, + MatrixU& u, MatrixV& v, MatrixQ& q, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + bindings::detail::array< + real_type > tmp_tau( min_size_tau( bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a), bindings::size_row(a), + bindings::size_row(b) ) ); + return invoke( jobu, jobv, jobq, a, b, tola, tolb, k, l, u, v, q, + workspace( tmp_iwork, tmp_tau, tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename MatrixU, + typename MatrixV, typename MatrixQ > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, MatrixA& a, MatrixB& b, const real_type tola, + const real_type tolb, fortran_int_t& k, fortran_int_t& l, + MatrixU& u, MatrixV& v, MatrixQ& q, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( jobu, jobv, jobq, a, b, tola, tolb, k, l, u, v, q, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array tau. + // + static std::ptrdiff_t min_size_tau( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t m, const std::ptrdiff_t p ) { + return std::max< std::ptrdiff_t >(3*n,std::max< std::ptrdiff_t >(m,p)); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ggsvp_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixU, + typename MatrixV, typename MatrixQ, typename IWORK, + typename RWORK, typename TAU, typename WORK > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, MatrixA& a, MatrixB& b, const real_type tola, + const real_type tolb, fortran_int_t& k, fortran_int_t& l, + MatrixU& u, MatrixV& v, MatrixQ& q, detail::workspace4< IWORK, + RWORK, TAU, WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_tau( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a), + bindings::size_row(a), bindings::size_row(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::size_row(b) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(b)) ); + BOOST_ASSERT( jobq == 'Q' || jobq == 'N' ); + BOOST_ASSERT( jobu == 'U' || jobu == 'N' ); + BOOST_ASSERT( jobv == 'V' || jobv == 'N' ); + return detail::ggsvp( jobu, jobv, jobq, bindings::size_row(a), + bindings::size_row(b), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), tola, + tolb, k, l, bindings::begin_value(u), + bindings::stride_major(u), bindings::begin_value(v), + bindings::stride_major(v), bindings::begin_value(q), + bindings::stride_major(q), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename MatrixU, + typename MatrixV, typename MatrixQ > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, MatrixA& a, MatrixB& b, const real_type tola, + const real_type tolb, fortran_int_t& k, fortran_int_t& l, + MatrixU& u, MatrixV& v, MatrixQ& q, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< + value_type > tmp_tau( min_size_tau( bindings::size_column(a) ) ); + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a), bindings::size_row(a), + bindings::size_row(b) ) ); + return invoke( jobu, jobv, jobq, a, b, tola, tolb, k, l, u, v, q, + workspace( tmp_iwork, tmp_rwork, tmp_tau, tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename MatrixU, + typename MatrixV, typename MatrixQ > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, MatrixA& a, MatrixB& b, const real_type tola, + const real_type tolb, fortran_int_t& k, fortran_int_t& l, + MatrixU& u, MatrixV& v, MatrixQ& q, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( jobu, jobv, jobq, a, b, tola, tolb, k, l, u, v, q, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array tau. + // + static std::ptrdiff_t min_size_tau( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t m, const std::ptrdiff_t p ) { + return std::max< std::ptrdiff_t >(3*n,std::max< std::ptrdiff_t >(m,p)); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ggsvp_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ggsvp. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename MatrixU, + typename MatrixV, typename MatrixQ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ggsvp( const char jobu, const char jobv, const char jobq, MatrixA& a, + MatrixB& b, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type tola, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type tolb, fortran_int_t& k, + fortran_int_t& l, MatrixU& u, MatrixV& v, MatrixQ& q, + Workspace work ) { + return ggsvp_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobu, jobv, jobq, a, b, tola, tolb, k, + l, u, v, q, work ); +} + +// +// Overloaded function for ggsvp. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename MatrixU, + typename MatrixV, typename MatrixQ > +inline typename boost::disable_if< detail::is_workspace< MatrixQ >, + std::ptrdiff_t >::type +ggsvp( const char jobu, const char jobv, const char jobq, MatrixA& a, + MatrixB& b, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type tola, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type tolb, fortran_int_t& k, + fortran_int_t& l, MatrixU& u, MatrixV& v, MatrixQ& q ) { + return ggsvp_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobu, jobv, jobq, a, b, tola, tolb, k, + l, u, v, q, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gtrfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/gtrfs.hpp new file mode 100644 index 0000000..d04406e --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gtrfs.hpp @@ -0,0 +1,561 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GTRFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GTRFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gtrfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Trans > +inline std::ptrdiff_t gtrfs( const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const float* dl, const float* d, + const float* du, const float* dlf, const float* df, const float* duf, + const float* du2, const fortran_int_t* ipiv, const float* b, + const fortran_int_t ldb, float* x, const fortran_int_t ldx, + float* ferr, float* berr, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SGTRFS( &lapack_option< Trans >::value, &n, &nrhs, dl, d, du, dlf, + df, duf, du2, ipiv, b, &ldb, x, &ldx, ferr, berr, work, iwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Trans > +inline std::ptrdiff_t gtrfs( const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const double* dl, const double* d, + const double* du, const double* dlf, const double* df, + const double* duf, const double* du2, const fortran_int_t* ipiv, + const double* b, const fortran_int_t ldb, double* x, + const fortran_int_t ldx, double* ferr, double* berr, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DGTRFS( &lapack_option< Trans >::value, &n, &nrhs, dl, d, du, dlf, + df, duf, du2, ipiv, b, &ldb, x, &ldx, ferr, berr, work, iwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gtrfs( const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* dl, + const std::complex* d, const std::complex* du, + const std::complex* dlf, const std::complex* df, + const std::complex* duf, const std::complex* du2, + const fortran_int_t* ipiv, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, float* ferr, float* berr, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGTRFS( &lapack_option< Trans >::value, &n, &nrhs, dl, d, du, dlf, + df, duf, du2, ipiv, b, &ldb, x, &ldx, ferr, berr, work, rwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gtrfs( const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* dl, + const std::complex* d, const std::complex* du, + const std::complex* dlf, const std::complex* df, + const std::complex* duf, const std::complex* du2, + const fortran_int_t* ipiv, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, double* ferr, double* berr, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGTRFS( &lapack_option< Trans >::value, &n, &nrhs, dl, d, du, dlf, + df, duf, du2, ipiv, b, &ldb, x, &ldx, ferr, berr, work, rwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gtrfs. +// +template< typename Value, typename Enable = void > +struct gtrfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gtrfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const VectorDL& dl, const VectorD& d, + const VectorDU& du, const VectorDLF& dlf, const VectorDF& df, + const VectorDUF& duf, const VectorDU2& du2, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorD, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDLF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDUF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDU2 >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column_op(d, + trans()) ); + BOOST_ASSERT( bindings::size(df) >= bindings::size_column_op(d, + trans()) ); + BOOST_ASSERT( bindings::size(dl) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(dlf) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(du) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(du2) >= bindings::size_column_op(d, + trans())-2 ); + BOOST_ASSERT( bindings::size(duf) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column_op(d, + trans()) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column_op(d, trans()) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column_op(d, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(d, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(d, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(d, trans())) ); + return detail::gtrfs( trans(), bindings::size_column_op(d, trans()), + bindings::size_column(b), bindings::begin_value(dl), + bindings::begin_value(d), bindings::begin_value(du), + bindings::begin_value(dlf), bindings::begin_value(df), + bindings::begin_value(duf), bindings::begin_value(du2), + bindings::begin_value(ipiv), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const VectorDL& dl, const VectorD& d, + const VectorDU& du, const VectorDLF& dlf, const VectorDF& df, + const VectorDUF& duf, const VectorDU2& du2, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorD, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column_op(d, trans()) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column_op(d, trans()) ) ); + return invoke( dl, d, du, dlf, df, duf, du2, ipiv, b, x, ferr, berr, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const VectorDL& dl, const VectorD& d, + const VectorDU& du, const VectorDLF& dlf, const VectorDF& df, + const VectorDUF& duf, const VectorDU2& du2, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorD, order >::type trans; + return invoke( dl, d, du, dlf, df, duf, du2, ipiv, b, x, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gtrfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const VectorDL& dl, const VectorD& d, + const VectorDU& du, const VectorDLF& dlf, const VectorDF& df, + const VectorDUF& duf, const VectorDU2& du2, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorD, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDLF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDUF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDU2 >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column_op(d, + trans()) ); + BOOST_ASSERT( bindings::size(df) >= bindings::size_column_op(d, + trans()) ); + BOOST_ASSERT( bindings::size(dl) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(dlf) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(du) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(du2) >= bindings::size_column_op(d, + trans())-2 ); + BOOST_ASSERT( bindings::size(duf) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column_op(d, + trans()) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column_op(d, trans()) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column_op(d, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(d, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(d, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(d, trans())) ); + return detail::gtrfs( trans(), bindings::size_column_op(d, trans()), + bindings::size_column(b), bindings::begin_value(dl), + bindings::begin_value(d), bindings::begin_value(du), + bindings::begin_value(dlf), bindings::begin_value(df), + bindings::begin_value(duf), bindings::begin_value(du2), + bindings::begin_value(ipiv), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const VectorDL& dl, const VectorD& d, + const VectorDU& du, const VectorDLF& dlf, const VectorDF& df, + const VectorDUF& duf, const VectorDU2& du2, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorD, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column_op(d, trans()) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column_op(d, trans()) ) ); + return invoke( dl, d, du, dlf, df, duf, du2, ipiv, b, x, ferr, berr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const VectorDL& dl, const VectorD& d, + const VectorDU& du, const VectorDLF& dlf, const VectorDF& df, + const VectorDUF& duf, const VectorDU2& du2, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorD, order >::type trans; + return invoke( dl, d, du, dlf, df, duf, du2, ipiv, b, x, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gtrfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gtrfs. Its overload differs for +// * User-defined workspace +// +template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gtrfs( const VectorDL& dl, const VectorD& d, const VectorDU& du, + const VectorDLF& dlf, const VectorDF& df, const VectorDUF& duf, + const VectorDU2& du2, const VectorIPIV& ipiv, const MatrixB& b, + MatrixX& x, VectorFERR& ferr, VectorBERR& berr, Workspace work ) { + return gtrfs_impl< typename bindings::value_type< + VectorDL >::type >::invoke( dl, d, du, dlf, df, duf, du2, ipiv, b, + x, ferr, berr, work ); +} + +// +// Overloaded function for gtrfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +gtrfs( const VectorDL& dl, const VectorD& d, const VectorDU& du, + const VectorDLF& dlf, const VectorDF& df, const VectorDUF& duf, + const VectorDU2& du2, const VectorIPIV& ipiv, const MatrixB& b, + MatrixX& x, VectorFERR& ferr, VectorBERR& berr ) { + return gtrfs_impl< typename bindings::value_type< + VectorDL >::type >::invoke( dl, d, du, dlf, df, duf, du2, ipiv, b, + x, ferr, berr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/gttrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/gttrs.hpp new file mode 100644 index 0000000..caa43e1 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/gttrs.hpp @@ -0,0 +1,206 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GTTRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_GTTRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gttrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Trans > +inline std::ptrdiff_t gttrs( const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const float* dl, const float* d, + const float* du, const float* du2, const fortran_int_t* ipiv, + float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SGTTRS( &lapack_option< Trans >::value, &n, &nrhs, dl, d, du, du2, + ipiv, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Trans > +inline std::ptrdiff_t gttrs( const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const double* dl, const double* d, + const double* du, const double* du2, const fortran_int_t* ipiv, + double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DGTTRS( &lapack_option< Trans >::value, &n, &nrhs, dl, d, du, du2, + ipiv, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gttrs( const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* dl, + const std::complex* d, const std::complex* du, + const std::complex* du2, const fortran_int_t* ipiv, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CGTTRS( &lapack_option< Trans >::value, &n, &nrhs, dl, d, du, du2, + ipiv, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gttrs( const Trans, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* dl, + const std::complex* d, const std::complex* du, + const std::complex* du2, const fortran_int_t* ipiv, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZGTTRS( &lapack_option< Trans >::value, &n, &nrhs, dl, d, du, du2, + ipiv, b, &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gttrs. +// +template< typename Value > +struct gttrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDU2, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( const VectorDL& dl, const VectorD& d, + const VectorDU& du, const VectorDU2& du2, const VectorIPIV& ipiv, + MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorD, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDU2 >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column_op(d, + trans()) ); + BOOST_ASSERT( bindings::size(dl) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(du) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(du2) >= bindings::size_column_op(d, + trans())-2 ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column_op(d, + trans()) ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(d, trans())) ); + return detail::gttrs( trans(), bindings::size_column_op(d, trans()), + bindings::size_column(b), bindings::begin_value(dl), + bindings::begin_value(d), bindings::begin_value(du), + bindings::begin_value(du2), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gttrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gttrs. Its overload differs for +// +template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDU2, typename VectorIPIV, typename MatrixB > +inline std::ptrdiff_t gttrs( const VectorDL& dl, const VectorD& d, + const VectorDU& du, const VectorDU2& du2, const VectorIPIV& ipiv, + MatrixB& b ) { + return gttrs_impl< typename bindings::value_type< + VectorDL >::type >::invoke( dl, d, du, du2, ipiv, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hbgst.hpp b/sdk/boost/numeric/bindings/lapack/computational/hbgst.hpp new file mode 100644 index 0000000..9cce0bf --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hbgst.hpp @@ -0,0 +1,383 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HBGST_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HBGST_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hbgst is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgst( const char vect, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + float* ab, const fortran_int_t ldab, const float* bb, + const fortran_int_t ldbb, float* x, const fortran_int_t ldx, + float* work ) { + fortran_int_t info(0); + LAPACK_SSBGST( &vect, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, x, &ldx, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgst( const char vect, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + double* ab, const fortran_int_t ldab, const double* bb, + const fortran_int_t ldbb, double* x, const fortran_int_t ldx, + double* work ) { + fortran_int_t info(0); + LAPACK_DSBGST( &vect, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, x, &ldx, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgst( const char vect, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + std::complex* ab, const fortran_int_t ldab, + const std::complex* bb, const fortran_int_t ldbb, + std::complex* x, const fortran_int_t ldx, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CHBGST( &vect, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, x, &ldx, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgst( const char vect, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + std::complex* ab, const fortran_int_t ldab, + const std::complex* bb, const fortran_int_t ldbb, + std::complex* x, const fortran_int_t ldx, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZHBGST( &vect, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, x, &ldx, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hbgst. +// +template< typename Value, typename Enable = void > +struct hbgst_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hbgst_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixBB, typename MatrixX, + typename WORK > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, + const MatrixBB& bb, MatrixX& x, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(bb) == 1 || + bindings::stride_minor(bb) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(bb) >= bindings::bandwidth(bb, + uplo())+1 ); + BOOST_ASSERT( vect == 'N' || vect == 'V' ); + return detail::hbgst( vect, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(x), + bindings::stride_major(x), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixBB, typename MatrixX > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, + const MatrixBB& bb, MatrixX& x, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + return invoke( vect, ab, bb, x, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixBB, typename MatrixX > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, + const MatrixBB& bb, MatrixX& x, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( vect, ab, bb, x, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hbgst_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixBB, typename MatrixX, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, + const MatrixBB& bb, MatrixX& x, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(bb) == 1 || + bindings::stride_minor(bb) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(bb) >= bindings::bandwidth(bb, + uplo())+1 ); + BOOST_ASSERT( vect == 'N' || vect == 'V' ); + return detail::hbgst( vect, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(x), + bindings::stride_major(x), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixBB, typename MatrixX > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, + const MatrixBB& bb, MatrixX& x, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ab) ) ); + return invoke( vect, ab, bb, x, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixBB, typename MatrixX > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, + const MatrixBB& bb, MatrixX& x, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( vect, ab, bb, x, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hbgst_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hbgst. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixBB, typename MatrixX, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hbgst( const char vect, MatrixAB& ab, const MatrixBB& bb, MatrixX& x, + Workspace work ) { + return hbgst_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( vect, ab, bb, x, work ); +} + +// +// Overloaded function for hbgst. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixBB, typename MatrixX > +inline typename boost::disable_if< detail::is_workspace< MatrixX >, + std::ptrdiff_t >::type +hbgst( const char vect, MatrixAB& ab, const MatrixBB& bb, MatrixX& x ) { + return hbgst_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( vect, ab, bb, x, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hbtrd.hpp b/sdk/boost/numeric/bindings/lapack/computational/hbtrd.hpp new file mode 100644 index 0000000..8284670 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hbtrd.hpp @@ -0,0 +1,370 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HBTRD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HBTRD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hbtrd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbtrd( const char vect, const UpLo, + const fortran_int_t n, const fortran_int_t kd, float* ab, + const fortran_int_t ldab, float* d, float* e, float* q, + const fortran_int_t ldq, float* work ) { + fortran_int_t info(0); + LAPACK_SSBTRD( &vect, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, + d, e, q, &ldq, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbtrd( const char vect, const UpLo, + const fortran_int_t n, const fortran_int_t kd, double* ab, + const fortran_int_t ldab, double* d, double* e, double* q, + const fortran_int_t ldq, double* work ) { + fortran_int_t info(0); + LAPACK_DSBTRD( &vect, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, + d, e, q, &ldq, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbtrd( const char vect, const UpLo, + const fortran_int_t n, const fortran_int_t kd, + std::complex* ab, const fortran_int_t ldab, float* d, float* e, + std::complex* q, const fortran_int_t ldq, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_CHBTRD( &vect, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, + d, e, q, &ldq, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbtrd( const char vect, const UpLo, + const fortran_int_t n, const fortran_int_t kd, + std::complex* ab, const fortran_int_t ldab, double* d, + double* e, std::complex* q, const fortran_int_t ldq, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZHBTRD( &vect, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, + d, e, q, &ldq, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hbtrd. +// +template< typename Value, typename Enable = void > +struct hbtrd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hbtrd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ, typename WORK > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column(ab) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( vect == 'N' || vect == 'V' || vect == 'U' ); + return detail::hbtrd( vect, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(q), + bindings::stride_major(q), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + return invoke( vect, ab, d, e, q, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( vect, ab, d, e, q, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hbtrd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ, typename WORK > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column(ab) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( vect == 'N' || vect == 'V' || vect == 'U' ); + return detail::hbtrd( vect, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(q), + bindings::stride_major(q), + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + return invoke( vect, ab, d, e, q, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( vect, ab, d, e, q, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hbtrd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hbtrd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hbtrd( const char vect, MatrixAB& ab, VectorD& d, VectorE& e, MatrixQ& q, + Workspace work ) { + return hbtrd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( vect, ab, d, e, q, work ); +} + +// +// Overloaded function for hbtrd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ > +inline typename boost::disable_if< detail::is_workspace< MatrixQ >, + std::ptrdiff_t >::type +hbtrd( const char vect, MatrixAB& ab, VectorD& d, VectorE& e, + MatrixQ& q ) { + return hbtrd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( vect, ab, d, e, q, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hecon.hpp b/sdk/boost/numeric/bindings/lapack/computational/hecon.hpp new file mode 100644 index 0000000..d88cb8c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hecon.hpp @@ -0,0 +1,338 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HECON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HECON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hecon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hecon( const UpLo, const fortran_int_t n, const float* a, + const fortran_int_t lda, const fortran_int_t* ipiv, const float anorm, + float& rcond, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SSYCON( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, &anorm, + &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hecon( const UpLo, const fortran_int_t n, + const double* a, const fortran_int_t lda, const fortran_int_t* ipiv, + const double anorm, double& rcond, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DSYCON( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, &anorm, + &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hecon( const UpLo, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const fortran_int_t* ipiv, const float anorm, float& rcond, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_CHECON( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, &anorm, + &rcond, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hecon( const UpLo, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const fortran_int_t* ipiv, const double anorm, double& rcond, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZHECON( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, &anorm, + &rcond, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hecon. +// +template< typename Value, typename Enable = void > +struct hecon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hecon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::hecon( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), anorm, rcond, + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( a, ipiv, anorm, rcond, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, ipiv, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hecon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::hecon( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), anorm, rcond, + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, ipiv, anorm, rcond, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, ipiv, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hecon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hecon. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorIPIV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hecon( const MatrixA& a, const VectorIPIV& ipiv, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond, + Workspace work ) { + return hecon_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, anorm, rcond, work ); +} + +// +// Overloaded function for hecon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorIPIV > +inline typename boost::disable_if< detail::is_workspace< VectorIPIV >, + std::ptrdiff_t >::type +hecon( const MatrixA& a, const VectorIPIV& ipiv, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond ) { + return hecon_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, anorm, rcond, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hegst.hpp b/sdk/boost/numeric/bindings/lapack/computational/hegst.hpp new file mode 100644 index 0000000..d00cf65 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hegst.hpp @@ -0,0 +1,179 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HEGST_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HEGST_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hegst is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegst( const fortran_int_t itype, const UpLo, + const fortran_int_t n, float* a, const fortran_int_t lda, + const float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SSYGST( &itype, &lapack_option< UpLo >::value, &n, a, &lda, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegst( const fortran_int_t itype, const UpLo, + const fortran_int_t n, double* a, const fortran_int_t lda, + const double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DSYGST( &itype, &lapack_option< UpLo >::value, &n, a, &lda, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegst( const fortran_int_t itype, const UpLo, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, const std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CHEGST( &itype, &lapack_option< UpLo >::value, &n, a, &lda, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegst( const fortran_int_t itype, const UpLo, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, const std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZHEGST( &itype, &lapack_option< UpLo >::value, &n, a, &lda, b, + &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hegst. +// +template< typename Value > +struct hegst_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB > + static std::ptrdiff_t invoke( const fortran_int_t itype, MatrixA& a, + const MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::hegst( itype, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hegst_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hegst. Its overload differs for +// +template< typename MatrixA, typename MatrixB > +inline std::ptrdiff_t hegst( const fortran_int_t itype, MatrixA& a, + const MatrixB& b ) { + return hegst_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, a, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/herfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/herfs.hpp new file mode 100644 index 0000000..55eec4a --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/herfs.hpp @@ -0,0 +1,464 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HERFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HERFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for herfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t herfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const float* a, const fortran_int_t lda, + const float* af, const fortran_int_t ldaf, const fortran_int_t* ipiv, + const float* b, const fortran_int_t ldb, float* x, + const fortran_int_t ldx, float* ferr, float* berr, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SSYRFS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, af, + &ldaf, ipiv, b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t herfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const double* a, const fortran_int_t lda, + const double* af, const fortran_int_t ldaf, const fortran_int_t* ipiv, + const double* b, const fortran_int_t ldb, double* x, + const fortran_int_t ldx, double* ferr, double* berr, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DSYRFS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, af, + &ldaf, ipiv, b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t herfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const std::complex* af, + const fortran_int_t ldaf, const fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float* ferr, + float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CHERFS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, af, + &ldaf, ipiv, b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t herfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const std::complex* af, + const fortran_int_t ldaf, const fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, double* ferr, + double* berr, std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZHERFS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, af, + &ldaf, ipiv, b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to herfs. +// +template< typename Value, typename Enable = void > +struct herfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct herfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::herfs( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( a, af, ipiv, b, x, ferr, berr, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, af, ipiv, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct herfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::herfs( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( a, af, ipiv, b, x, ferr, berr, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, af, ipiv, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the herfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for herfs. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +herfs( const MatrixA& a, const MatrixAF& af, const VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + Workspace work ) { + return herfs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, af, ipiv, b, x, ferr, berr, work ); +} + +// +// Overloaded function for herfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +herfs( const MatrixA& a, const MatrixAF& af, const VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr ) { + return herfs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, af, ipiv, b, x, ferr, berr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hetrd.hpp b/sdk/boost/numeric/bindings/lapack/computational/hetrd.hpp new file mode 100644 index 0000000..885249d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hetrd.hpp @@ -0,0 +1,368 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HETRD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HETRD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hetrd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetrd( const UpLo, const fortran_int_t n, float* a, + const fortran_int_t lda, float* d, float* e, float* tau, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SSYTRD( &lapack_option< UpLo >::value, &n, a, &lda, d, e, tau, + work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetrd( const UpLo, const fortran_int_t n, double* a, + const fortran_int_t lda, double* d, double* e, double* tau, + double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DSYTRD( &lapack_option< UpLo >::value, &n, a, &lda, d, e, tau, + work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetrd( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, float* d, float* e, + std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CHETRD( &lapack_option< UpLo >::value, &n, a, &lda, d, e, tau, + work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetrd( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, double* d, + double* e, std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZHETRD( &lapack_option< UpLo >::value, &n, a, &lda, d, e, tau, + work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hetrd. +// +template< typename Value, typename Enable = void > +struct hetrd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hetrd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAU& tau, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_column(a)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work()); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::hetrd( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAU& tau, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work() ); + return invoke( a, d, e, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAU& tau, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + detail::hetrd( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, d, e, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work() { + return 1; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hetrd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAU& tau, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_column(a)-1 ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work()); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::hetrd( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAU& tau, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work() ); + return invoke( a, d, e, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAU& tau, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + detail::hetrd( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, d, e, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work() { + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hetrd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hetrd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hetrd( MatrixA& a, VectorD& d, VectorE& e, VectorTAU& tau, + Workspace work ) { + return hetrd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, d, e, tau, work ); +} + +// +// Overloaded function for hetrd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +hetrd( MatrixA& a, VectorD& d, VectorE& e, VectorTAU& tau ) { + return hetrd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, d, e, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hetrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/hetrf.hpp new file mode 100644 index 0000000..bf13fdb --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hetrf.hpp @@ -0,0 +1,325 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HETRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HETRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hetrf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetrf( const UpLo, const fortran_int_t n, float* a, + const fortran_int_t lda, fortran_int_t* ipiv, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SSYTRF( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetrf( const UpLo, const fortran_int_t n, double* a, + const fortran_int_t lda, fortran_int_t* ipiv, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DSYTRF( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetrf( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, fortran_int_t* ipiv, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CHETRF( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetrf( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, fortran_int_t* ipiv, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZHETRF( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hetrf. +// +template< typename Value, typename Enable = void > +struct hetrf_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hetrf_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work()); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::hetrf( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work() ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + detail::hetrf( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work() { + return 1; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hetrf_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work()); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::hetrf( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work() ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + detail::hetrf( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work() { + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hetrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hetrf. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorIPIV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hetrf( MatrixA& a, VectorIPIV& ipiv, Workspace work ) { + return hetrf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, work ); +} + +// +// Overloaded function for hetrf. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorIPIV > +inline typename boost::disable_if< detail::is_workspace< VectorIPIV >, + std::ptrdiff_t >::type +hetrf( MatrixA& a, VectorIPIV& ipiv ) { + return hetrf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hetri.hpp b/sdk/boost/numeric/bindings/lapack/computational/hetri.hpp new file mode 100644 index 0000000..5d58ab5 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hetri.hpp @@ -0,0 +1,310 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HETRI_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HETRI_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hetri is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetri( const UpLo, const fortran_int_t n, float* a, + const fortran_int_t lda, const fortran_int_t* ipiv, float* work ) { + fortran_int_t info(0); + LAPACK_SSYTRI( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetri( const UpLo, const fortran_int_t n, double* a, + const fortran_int_t lda, const fortran_int_t* ipiv, double* work ) { + fortran_int_t info(0); + LAPACK_DSYTRI( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetri( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + const fortran_int_t* ipiv, std::complex* work ) { + fortran_int_t info(0); + LAPACK_CHETRI( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetri( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + const fortran_int_t* ipiv, std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZHETRI( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hetri. +// +template< typename Value, typename Enable = void > +struct hetri_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hetri_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::hetri( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, ipiv, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hetri_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::hetri( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, ipiv, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hetri_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hetri. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorIPIV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hetri( MatrixA& a, const VectorIPIV& ipiv, Workspace work ) { + return hetri_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, work ); +} + +// +// Overloaded function for hetri. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorIPIV > +inline typename boost::disable_if< detail::is_workspace< VectorIPIV >, + std::ptrdiff_t >::type +hetri( MatrixA& a, const VectorIPIV& ipiv ) { + return hetri_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hetrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/hetrs.hpp new file mode 100644 index 0000000..1781860 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hetrs.hpp @@ -0,0 +1,182 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HETRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HETRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hetrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const float* a, const fortran_int_t lda, + const fortran_int_t* ipiv, float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SSYTRS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const double* a, const fortran_int_t lda, + const fortran_int_t* ipiv, double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DSYTRS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const fortran_int_t* ipiv, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CHETRS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hetrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const fortran_int_t* ipiv, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZHETRS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hetrs. +// +template< typename Value > +struct hetrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::hetrs( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hetrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hetrs. Its overload differs for +// +template< typename MatrixA, typename VectorIPIV, typename MatrixB > +inline std::ptrdiff_t hetrs( const MatrixA& a, const VectorIPIV& ipiv, + MatrixB& b ) { + return hetrs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hgeqz.hpp b/sdk/boost/numeric/bindings/lapack/computational/hgeqz.hpp new file mode 100644 index 0000000..d36aede --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hgeqz.hpp @@ -0,0 +1,525 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HGEQZ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HGEQZ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hgeqz is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t hgeqz( const char job, const char compq, + const char compz, const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, float* h, const fortran_int_t ldh, float* t, + const fortran_int_t ldt, float* alphar, float* alphai, float* beta, + float* q, const fortran_int_t ldq, float* z, const fortran_int_t ldz, + float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SHGEQZ( &job, &compq, &compz, &n, &ilo, &ihi, h, &ldh, t, &ldt, + alphar, alphai, beta, q, &ldq, z, &ldz, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t hgeqz( const char job, const char compq, + const char compz, const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, double* h, const fortran_int_t ldh, + double* t, const fortran_int_t ldt, double* alphar, double* alphai, + double* beta, double* q, const fortran_int_t ldq, double* z, + const fortran_int_t ldz, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DHGEQZ( &job, &compq, &compz, &n, &ilo, &ihi, h, &ldh, t, &ldt, + alphar, alphai, beta, q, &ldq, z, &ldz, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t hgeqz( const char job, const char compq, + const char compz, const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, std::complex* h, + const fortran_int_t ldh, std::complex* t, + const fortran_int_t ldt, std::complex* alpha, + std::complex* beta, std::complex* q, + const fortran_int_t ldq, std::complex* z, + const fortran_int_t ldz, std::complex* work, + const fortran_int_t lwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CHGEQZ( &job, &compq, &compz, &n, &ilo, &ihi, h, &ldh, t, &ldt, + alpha, beta, q, &ldq, z, &ldz, work, &lwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t hgeqz( const char job, const char compq, + const char compz, const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, std::complex* h, + const fortran_int_t ldh, std::complex* t, + const fortran_int_t ldt, std::complex* alpha, + std::complex* beta, std::complex* q, + const fortran_int_t ldq, std::complex* z, + const fortran_int_t ldz, std::complex* work, + const fortran_int_t lwork, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZHGEQZ( &job, &compq, &compz, &n, &ilo, &ihi, h, &ldh, t, &ldt, + alpha, beta, q, &ldq, z, &ldz, work, &lwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hgeqz. +// +template< typename Value, typename Enable = void > +struct hgeqz_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hgeqz_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixH, typename MatrixT, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixQ, + typename MatrixZ, typename WORK > + static std::ptrdiff_t invoke( const char job, const char compq, + const char compz, const fortran_int_t ilo, MatrixH& h, + MatrixT& t, VectorALPHAR& alphar, VectorALPHAI& alphai, + VectorBETA& beta, MatrixQ& q, MatrixZ& z, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixH >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAI >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixH >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAI >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(alphar) >= bindings::size_column(h) ); + BOOST_ASSERT( bindings::size(beta) >= bindings::size_column(h) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(h) )); + BOOST_ASSERT( bindings::size_column(h) >= 0 ); + BOOST_ASSERT( bindings::size_minor(h) == 1 || + bindings::stride_minor(h) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(t) == 1 || + bindings::stride_minor(t) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(h) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(h)) ); + BOOST_ASSERT( bindings::stride_major(t) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(h)) ); + BOOST_ASSERT( compq == 'N' || compq == 'I' || compq == 'V' ); + BOOST_ASSERT( compz == 'N' || compz == 'I' || compz == 'V' ); + BOOST_ASSERT( job == 'E' || job == 'S' ); + return detail::hgeqz( job, compq, compz, bindings::size_column(h), + ilo, bindings::size_column(h), bindings::begin_value(h), + bindings::stride_major(h), bindings::begin_value(t), + bindings::stride_major(t), bindings::begin_value(alphar), + bindings::begin_value(alphai), bindings::begin_value(beta), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixH, typename MatrixT, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixQ, + typename MatrixZ > + static std::ptrdiff_t invoke( const char job, const char compq, + const char compz, const fortran_int_t ilo, MatrixH& h, + MatrixT& t, VectorALPHAR& alphar, VectorALPHAI& alphai, + VectorBETA& beta, MatrixQ& q, MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(h) ) ); + return invoke( job, compq, compz, ilo, h, t, alphar, alphai, beta, q, + z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixH, typename MatrixT, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixQ, + typename MatrixZ > + static std::ptrdiff_t invoke( const char job, const char compq, + const char compz, const fortran_int_t ilo, MatrixH& h, + MatrixT& t, VectorALPHAR& alphar, VectorALPHAI& alphai, + VectorBETA& beta, MatrixQ& q, MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::hgeqz( job, compq, compz, bindings::size_column(h), ilo, + bindings::size_column(h), bindings::begin_value(h), + bindings::stride_major(h), bindings::begin_value(t), + bindings::stride_major(t), bindings::begin_value(alphar), + bindings::begin_value(alphai), bindings::begin_value(beta), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( job, compq, compz, ilo, h, t, alphar, alphai, beta, q, + z, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,n); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hgeqz_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixH, typename MatrixT, typename VectorALPHA, + typename VectorBETA, typename MatrixQ, typename MatrixZ, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char job, const char compq, + const char compz, const fortran_int_t ilo, MatrixH& h, + MatrixT& t, VectorALPHA& alpha, VectorBETA& beta, MatrixQ& q, + MatrixZ& z, detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixH >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixH >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(alpha) >= bindings::size_column(h) ); + BOOST_ASSERT( bindings::size(beta) >= bindings::size_column(h) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(h) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(h) )); + BOOST_ASSERT( bindings::size_column(h) >= 0 ); + BOOST_ASSERT( bindings::size_minor(h) == 1 || + bindings::stride_minor(h) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(t) == 1 || + bindings::stride_minor(t) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(h) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(h)) ); + BOOST_ASSERT( bindings::stride_major(t) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(h)) ); + BOOST_ASSERT( compq == 'N' || compq == 'I' || compq == 'V' ); + BOOST_ASSERT( compz == 'N' || compz == 'I' || compz == 'V' ); + BOOST_ASSERT( job == 'E' || job == 'S' ); + return detail::hgeqz( job, compq, compz, bindings::size_column(h), + ilo, bindings::size_column(h), bindings::begin_value(h), + bindings::stride_major(h), bindings::begin_value(t), + bindings::stride_major(t), bindings::begin_value(alpha), + bindings::begin_value(beta), bindings::begin_value(q), + bindings::stride_major(q), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixH, typename MatrixT, typename VectorALPHA, + typename VectorBETA, typename MatrixQ, typename MatrixZ > + static std::ptrdiff_t invoke( const char job, const char compq, + const char compz, const fortran_int_t ilo, MatrixH& h, + MatrixT& t, VectorALPHA& alpha, VectorBETA& beta, MatrixQ& q, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(h) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(h) ) ); + return invoke( job, compq, compz, ilo, h, t, alpha, beta, q, z, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixH, typename MatrixT, typename VectorALPHA, + typename VectorBETA, typename MatrixQ, typename MatrixZ > + static std::ptrdiff_t invoke( const char job, const char compq, + const char compz, const fortran_int_t ilo, MatrixH& h, + MatrixT& t, VectorALPHA& alpha, VectorBETA& beta, MatrixQ& q, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(h) ) ); + detail::hgeqz( job, compq, compz, bindings::size_column(h), ilo, + bindings::size_column(h), bindings::begin_value(h), + bindings::stride_major(h), bindings::begin_value(t), + bindings::stride_major(t), bindings::begin_value(alpha), + bindings::begin_value(beta), bindings::begin_value(q), + bindings::stride_major(q), bindings::begin_value(z), + bindings::stride_major(z), &opt_size_work, -1, + bindings::begin_value(tmp_rwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( job, compq, compz, ilo, h, t, alpha, beta, q, z, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,n); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hgeqz_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hgeqz. Its overload differs for +// * User-defined workspace +// +template< typename MatrixH, typename MatrixT, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixQ, + typename MatrixZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hgeqz( const char job, const char compq, const char compz, + const fortran_int_t ilo, MatrixH& h, MatrixT& t, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixQ& q, MatrixZ& z, Workspace work ) { + return hgeqz_impl< typename bindings::value_type< + MatrixH >::type >::invoke( job, compq, compz, ilo, h, t, alphar, + alphai, beta, q, z, work ); +} + +// +// Overloaded function for hgeqz. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixH, typename MatrixT, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixQ, + typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +hgeqz( const char job, const char compq, const char compz, + const fortran_int_t ilo, MatrixH& h, MatrixT& t, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixQ& q, MatrixZ& z ) { + return hgeqz_impl< typename bindings::value_type< + MatrixH >::type >::invoke( job, compq, compz, ilo, h, t, alphar, + alphai, beta, q, z, optimal_workspace() ); +} + +// +// Overloaded function for hgeqz. Its overload differs for +// * User-defined workspace +// +template< typename MatrixH, typename MatrixT, typename VectorALPHA, + typename VectorBETA, typename MatrixQ, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hgeqz( const char job, const char compq, const char compz, + const fortran_int_t ilo, MatrixH& h, MatrixT& t, + VectorALPHA& alpha, VectorBETA& beta, MatrixQ& q, MatrixZ& z, + Workspace work ) { + return hgeqz_impl< typename bindings::value_type< + MatrixH >::type >::invoke( job, compq, compz, ilo, h, t, alpha, + beta, q, z, work ); +} + +// +// Overloaded function for hgeqz. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixH, typename MatrixT, typename VectorALPHA, + typename VectorBETA, typename MatrixQ, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +hgeqz( const char job, const char compq, const char compz, + const fortran_int_t ilo, MatrixH& h, MatrixT& t, + VectorALPHA& alpha, VectorBETA& beta, MatrixQ& q, MatrixZ& z ) { + return hgeqz_impl< typename bindings::value_type< + MatrixH >::type >::invoke( job, compq, compz, ilo, h, t, alpha, + beta, q, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hpcon.hpp b/sdk/boost/numeric/bindings/lapack/computational/hpcon.hpp new file mode 100644 index 0000000..64e0a55 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hpcon.hpp @@ -0,0 +1,322 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPCON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPCON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hpcon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpcon( const UpLo, const fortran_int_t n, + const float* ap, const fortran_int_t* ipiv, const float anorm, + float& rcond, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SSPCON( &lapack_option< UpLo >::value, &n, ap, ipiv, &anorm, + &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpcon( const UpLo, const fortran_int_t n, + const double* ap, const fortran_int_t* ipiv, const double anorm, + double& rcond, double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DSPCON( &lapack_option< UpLo >::value, &n, ap, ipiv, &anorm, + &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpcon( const UpLo, const fortran_int_t n, + const std::complex* ap, const fortran_int_t* ipiv, + const float anorm, float& rcond, std::complex* work ) { + fortran_int_t info(0); + LAPACK_CHPCON( &lapack_option< UpLo >::value, &n, ap, ipiv, &anorm, + &rcond, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpcon( const UpLo, const fortran_int_t n, + const std::complex* ap, const fortran_int_t* ipiv, + const double anorm, double& rcond, std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZHPCON( &lapack_option< UpLo >::value, &n, ap, ipiv, &anorm, + &rcond, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hpcon. +// +template< typename Value, typename Enable = void > +struct hpcon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hpcon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::hpcon( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(ipiv), anorm, + rcond, bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( ap, ipiv, anorm, rcond, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, ipiv, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hpcon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::hpcon( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(ipiv), anorm, + rcond, bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + return invoke( ap, ipiv, anorm, rcond, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, ipiv, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hpcon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hpcon. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename VectorIPIV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hpcon( const MatrixAP& ap, const VectorIPIV& ipiv, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type& rcond, + Workspace work ) { + return hpcon_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv, anorm, rcond, work ); +} + +// +// Overloaded function for hpcon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename VectorIPIV > +inline typename boost::disable_if< detail::is_workspace< VectorIPIV >, + std::ptrdiff_t >::type +hpcon( const MatrixAP& ap, const VectorIPIV& ipiv, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type& rcond ) { + return hpcon_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv, anorm, rcond, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hprfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/hprfs.hpp new file mode 100644 index 0000000..bd18b6c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hprfs.hpp @@ -0,0 +1,439 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPRFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPRFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hprfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hprfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const float* ap, const float* afp, + const fortran_int_t* ipiv, const float* b, const fortran_int_t ldb, + float* x, const fortran_int_t ldx, float* ferr, float* berr, + float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SSPRFS( &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, ipiv, b, + &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hprfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const double* ap, const double* afp, + const fortran_int_t* ipiv, const double* b, const fortran_int_t ldb, + double* x, const fortran_int_t ldx, double* ferr, double* berr, + double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DSPRFS( &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, ipiv, b, + &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hprfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* ap, + const std::complex* afp, const fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float* ferr, + float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CHPRFS( &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, ipiv, b, + &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hprfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* ap, + const std::complex* afp, const fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, double* ferr, + double* berr, std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZHPRFS( &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, ipiv, b, + &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hprfs. +// +template< typename Value, typename Enable = void > +struct hprfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hprfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + return detail::hprfs( uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(afp), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( ap, afp, ipiv, b, x, ferr, berr, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, afp, ipiv, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hprfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + return detail::hprfs( uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(afp), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ap) ) ); + return invoke( ap, afp, ipiv, b, x, ferr, berr, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, afp, ipiv, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hprfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hprfs. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hprfs( const MatrixAP& ap, const MatrixAFP& afp, const VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + Workspace work ) { + return hprfs_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, afp, ipiv, b, x, ferr, berr, + work ); +} + +// +// Overloaded function for hprfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +hprfs( const MatrixAP& ap, const MatrixAFP& afp, const VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr ) { + return hprfs_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, afp, ipiv, b, x, ferr, berr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hptrd.hpp b/sdk/boost/numeric/bindings/lapack/computational/hptrd.hpp new file mode 100644 index 0000000..0c26823 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hptrd.hpp @@ -0,0 +1,226 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPTRD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPTRD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hptrd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptrd( const UpLo, const fortran_int_t n, float* ap, + float* d, float* e, float* tau ) { + fortran_int_t info(0); + LAPACK_SSPTRD( &lapack_option< UpLo >::value, &n, ap, d, e, tau, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptrd( const UpLo, const fortran_int_t n, double* ap, + double* d, double* e, double* tau ) { + fortran_int_t info(0); + LAPACK_DSPTRD( &lapack_option< UpLo >::value, &n, ap, d, e, tau, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptrd( const UpLo, const fortran_int_t n, + std::complex* ap, float* d, float* e, + std::complex* tau ) { + fortran_int_t info(0); + LAPACK_CHPTRD( &lapack_option< UpLo >::value, &n, ap, d, e, tau, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptrd( const UpLo, const fortran_int_t n, + std::complex* ap, double* d, double* e, + std::complex* tau ) { + fortran_int_t info(0); + LAPACK_ZHPTRD( &lapack_option< UpLo >::value, &n, ap, d, e, tau, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hptrd. +// +template< typename Value, typename Enable = void > +struct hptrd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hptrd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorD, typename VectorE, + typename VectorTAU > + static std::ptrdiff_t invoke( MatrixAP& ap, VectorD& d, VectorE& e, + VectorTAU& tau ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_column(ap)-1 ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::hptrd( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(tau) ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hptrd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorD, typename VectorE, + typename VectorTAU > + static std::ptrdiff_t invoke( MatrixAP& ap, VectorD& d, VectorE& e, + VectorTAU& tau ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_column(ap)-1 ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::hptrd( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(tau) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hptrd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hptrd. Its overload differs for +// +template< typename MatrixAP, typename VectorD, typename VectorE, + typename VectorTAU > +inline std::ptrdiff_t hptrd( MatrixAP& ap, VectorD& d, VectorE& e, + VectorTAU& tau ) { + return hptrd_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, d, e, tau ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hptrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/hptrf.hpp new file mode 100644 index 0000000..caa40cc --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hptrf.hpp @@ -0,0 +1,152 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPTRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPTRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hptrf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptrf( const UpLo, const fortran_int_t n, float* ap, + fortran_int_t* ipiv ) { + fortran_int_t info(0); + LAPACK_SSPTRF( &lapack_option< UpLo >::value, &n, ap, ipiv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptrf( const UpLo, const fortran_int_t n, double* ap, + fortran_int_t* ipiv ) { + fortran_int_t info(0); + LAPACK_DSPTRF( &lapack_option< UpLo >::value, &n, ap, ipiv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptrf( const UpLo, const fortran_int_t n, + std::complex* ap, fortran_int_t* ipiv ) { + fortran_int_t info(0); + LAPACK_CHPTRF( &lapack_option< UpLo >::value, &n, ap, ipiv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptrf( const UpLo, const fortran_int_t n, + std::complex* ap, fortran_int_t* ipiv ) { + fortran_int_t info(0); + LAPACK_ZHPTRF( &lapack_option< UpLo >::value, &n, ap, ipiv, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hptrf. +// +template< typename Value > +struct hptrf_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixAP& ap, VectorIPIV& ipiv ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::hptrf( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(ipiv) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hptrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hptrf. Its overload differs for +// +template< typename MatrixAP, typename VectorIPIV > +inline std::ptrdiff_t hptrf( MatrixAP& ap, VectorIPIV& ipiv ) { + return hptrf_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hptri.hpp b/sdk/boost/numeric/bindings/lapack/computational/hptri.hpp new file mode 100644 index 0000000..a99fa83 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hptri.hpp @@ -0,0 +1,293 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPTRI_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPTRI_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hptri is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptri( const UpLo, const fortran_int_t n, float* ap, + const fortran_int_t* ipiv, float* work ) { + fortran_int_t info(0); + LAPACK_SSPTRI( &lapack_option< UpLo >::value, &n, ap, ipiv, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptri( const UpLo, const fortran_int_t n, double* ap, + const fortran_int_t* ipiv, double* work ) { + fortran_int_t info(0); + LAPACK_DSPTRI( &lapack_option< UpLo >::value, &n, ap, ipiv, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptri( const UpLo, const fortran_int_t n, + std::complex* ap, const fortran_int_t* ipiv, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_CHPTRI( &lapack_option< UpLo >::value, &n, ap, ipiv, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptri( const UpLo, const fortran_int_t n, + std::complex* ap, const fortran_int_t* ipiv, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZHPTRI( &lapack_option< UpLo >::value, &n, ap, ipiv, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hptri. +// +template< typename Value, typename Enable = void > +struct hptri_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hptri_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixAP& ap, const VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::hptri( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(ipiv), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixAP& ap, const VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + return invoke( ap, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixAP& ap, const VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, ipiv, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hptri_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixAP& ap, const VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::hptri( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(ipiv), + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixAP& ap, const VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + return invoke( ap, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixAP& ap, const VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, ipiv, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hptri_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hptri. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename VectorIPIV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hptri( MatrixAP& ap, const VectorIPIV& ipiv, Workspace work ) { + return hptri_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv, work ); +} + +// +// Overloaded function for hptri. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename VectorIPIV > +inline typename boost::disable_if< detail::is_workspace< VectorIPIV >, + std::ptrdiff_t >::type +hptri( MatrixAP& ap, const VectorIPIV& ipiv ) { + return hptri_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hptrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/hptrs.hpp new file mode 100644 index 0000000..cb4cd20 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hptrs.hpp @@ -0,0 +1,177 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPTRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HPTRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hptrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const float* ap, const fortran_int_t* ipiv, + float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SSPTRS( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const double* ap, const fortran_int_t* ipiv, + double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DSPTRS( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* ap, + const fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CHPTRS( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hptrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* ap, + const fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZHPTRS( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, + &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hptrs. +// +template< typename Value > +struct hptrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + return detail::hptrs( uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(ipiv), bindings::begin_value(b), + bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hptrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hptrs. Its overload differs for +// +template< typename MatrixAP, typename VectorIPIV, typename MatrixB > +inline std::ptrdiff_t hptrs( const MatrixAP& ap, const VectorIPIV& ipiv, + MatrixB& b ) { + return hptrs_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hsein.hpp b/sdk/boost/numeric/bindings/lapack/computational/hsein.hpp new file mode 100644 index 0000000..e5a6407 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hsein.hpp @@ -0,0 +1,500 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HSEIN_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HSEIN_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hsein is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side > +inline std::ptrdiff_t hsein( const Side, const char eigsrc, const char initv, + fortran_bool_t* select, const fortran_int_t n, const float* h, + const fortran_int_t ldh, float* wr, const float* wi, float* vl, + const fortran_int_t ldvl, float* vr, const fortran_int_t ldvr, + const fortran_int_t mm, fortran_int_t& m, float* work, + fortran_int_t* ifaill, fortran_int_t* ifailr ) { + fortran_int_t info(0); + LAPACK_SHSEIN( &lapack_option< Side >::value, &eigsrc, &initv, select, &n, + h, &ldh, wr, wi, vl, &ldvl, vr, &ldvr, &mm, &m, work, ifaill, + ifailr, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side > +inline std::ptrdiff_t hsein( const Side, const char eigsrc, const char initv, + fortran_bool_t* select, const fortran_int_t n, const double* h, + const fortran_int_t ldh, double* wr, const double* wi, double* vl, + const fortran_int_t ldvl, double* vr, const fortran_int_t ldvr, + const fortran_int_t mm, fortran_int_t& m, double* work, + fortran_int_t* ifaill, fortran_int_t* ifailr ) { + fortran_int_t info(0); + LAPACK_DHSEIN( &lapack_option< Side >::value, &eigsrc, &initv, select, &n, + h, &ldh, wr, wi, vl, &ldvl, vr, &ldvr, &mm, &m, work, ifaill, + ifailr, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t hsein( const Side, const char eigsrc, const char initv, + const fortran_bool_t* select, const fortran_int_t n, + const std::complex* h, const fortran_int_t ldh, + std::complex* w, std::complex* vl, + const fortran_int_t ldvl, std::complex* vr, + const fortran_int_t ldvr, const fortran_int_t mm, fortran_int_t& m, + std::complex* work, float* rwork, fortran_int_t* ifaill, + fortran_int_t* ifailr ) { + fortran_int_t info(0); + LAPACK_CHSEIN( &lapack_option< Side >::value, &eigsrc, &initv, select, &n, + h, &ldh, w, vl, &ldvl, vr, &ldvr, &mm, &m, work, rwork, ifaill, + ifailr, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t hsein( const Side, const char eigsrc, const char initv, + const fortran_bool_t* select, const fortran_int_t n, + const std::complex* h, const fortran_int_t ldh, + std::complex* w, std::complex* vl, + const fortran_int_t ldvl, std::complex* vr, + const fortran_int_t ldvr, const fortran_int_t mm, fortran_int_t& m, + std::complex* work, double* rwork, fortran_int_t* ifaill, + fortran_int_t* ifailr ) { + fortran_int_t info(0); + LAPACK_ZHSEIN( &lapack_option< Side >::value, &eigsrc, &initv, select, &n, + h, &ldh, w, vl, &ldvl, vr, &ldvr, &mm, &m, work, rwork, ifaill, + ifailr, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hsein. +// +template< typename Value, typename Enable = void > +struct hsein_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hsein_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorSELECT, typename MatrixH, + typename VectorWR, typename VectorWI, typename MatrixVL, + typename MatrixVR, typename VectorIFAILL, typename VectorIFAILR, + typename WORK > + static std::ptrdiff_t invoke( const Side side, const char eigsrc, + const char initv, VectorSELECT& select, const MatrixH& h, + VectorWR& wr, const VectorWI& wi, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m, + VectorIFAILL& ifaill, VectorIFAILR& ifailr, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixH >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWI >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorIFAILL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorIFAILR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorSELECT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAILL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAILR >::value) ); + BOOST_ASSERT( bindings::size(select) >= bindings::size_column(h) ); + BOOST_ASSERT( bindings::size(wi) >= bindings::size_column(h) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(h) )); + BOOST_ASSERT( bindings::size(wr) >= bindings::size_column(h) ); + BOOST_ASSERT( bindings::size_column(h) >= 0 ); + BOOST_ASSERT( bindings::size_minor(h) == 1 || + bindings::stride_minor(h) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(h) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(h)) ); + BOOST_ASSERT( eigsrc == 'Q' || eigsrc == 'N' ); + BOOST_ASSERT( initv == 'N' || initv == 'U' ); + return detail::hsein( side, eigsrc, initv, + bindings::begin_value(select), bindings::size_column(h), + bindings::begin_value(h), bindings::stride_major(h), + bindings::begin_value(wr), bindings::begin_value(wi), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), mm, m, + bindings::begin_value(work.select(real_type())), + bindings::begin_value(ifaill), bindings::begin_value(ifailr) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorSELECT, typename MatrixH, + typename VectorWR, typename VectorWI, typename MatrixVL, + typename MatrixVR, typename VectorIFAILL, typename VectorIFAILR > + static std::ptrdiff_t invoke( const Side side, const char eigsrc, + const char initv, VectorSELECT& select, const MatrixH& h, + VectorWR& wr, const VectorWI& wi, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m, + VectorIFAILL& ifaill, VectorIFAILR& ifailr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(h) ) ); + return invoke( side, eigsrc, initv, select, h, wr, wi, vl, vr, mm, m, + ifaill, ifailr, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorSELECT, typename MatrixH, + typename VectorWR, typename VectorWI, typename MatrixVL, + typename MatrixVR, typename VectorIFAILL, typename VectorIFAILR > + static std::ptrdiff_t invoke( const Side side, const char eigsrc, + const char initv, VectorSELECT& select, const MatrixH& h, + VectorWR& wr, const VectorWI& wi, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m, + VectorIFAILL& ifaill, VectorIFAILR& ifailr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( side, eigsrc, initv, select, h, wr, wi, vl, vr, mm, m, + ifaill, ifailr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return (n+2)*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hsein_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorSELECT, typename MatrixH, + typename VectorW, typename MatrixVL, typename MatrixVR, + typename VectorIFAILL, typename VectorIFAILR, typename WORK, + typename RWORK > + static std::ptrdiff_t invoke( const Side side, const char eigsrc, + const char initv, const VectorSELECT& select, const MatrixH& h, + VectorW& w, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m, + VectorIFAILL& ifaill, VectorIFAILR& ifailr, detail::workspace2< + WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixH >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorIFAILL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorIFAILR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAILL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAILR >::value) ); + BOOST_ASSERT( bindings::size(select) >= bindings::size_column(h) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(h) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(h) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(h) )); + BOOST_ASSERT( bindings::size_column(h) >= 0 ); + BOOST_ASSERT( bindings::size_minor(h) == 1 || + bindings::stride_minor(h) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(h) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(h)) ); + BOOST_ASSERT( eigsrc == 'Q' || eigsrc == 'N' ); + BOOST_ASSERT( initv == 'N' || initv == 'U' ); + return detail::hsein( side, eigsrc, initv, + bindings::begin_value(select), bindings::size_column(h), + bindings::begin_value(h), bindings::stride_major(h), + bindings::begin_value(w), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), mm, m, + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(ifaill), bindings::begin_value(ifailr) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorSELECT, typename MatrixH, + typename VectorW, typename MatrixVL, typename MatrixVR, + typename VectorIFAILL, typename VectorIFAILR > + static std::ptrdiff_t invoke( const Side side, const char eigsrc, + const char initv, const VectorSELECT& select, const MatrixH& h, + VectorW& w, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m, + VectorIFAILL& ifaill, VectorIFAILR& ifailr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(h) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(h) ) ); + return invoke( side, eigsrc, initv, select, h, w, vl, vr, mm, m, + ifaill, ifailr, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorSELECT, typename MatrixH, + typename VectorW, typename MatrixVL, typename MatrixVR, + typename VectorIFAILL, typename VectorIFAILR > + static std::ptrdiff_t invoke( const Side side, const char eigsrc, + const char initv, const VectorSELECT& select, const MatrixH& h, + VectorW& w, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m, + VectorIFAILL& ifaill, VectorIFAILR& ifailr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( side, eigsrc, initv, select, h, w, vl, vr, mm, m, + ifaill, ifailr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hsein_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hsein. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename VectorSELECT, typename MatrixH, + typename VectorWR, typename VectorWI, typename MatrixVL, + typename MatrixVR, typename VectorIFAILL, typename VectorIFAILR, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hsein( const Side side, const char eigsrc, const char initv, + VectorSELECT& select, const MatrixH& h, VectorWR& wr, + const VectorWI& wi, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m, + VectorIFAILL& ifaill, VectorIFAILR& ifailr, Workspace work ) { + return hsein_impl< typename bindings::value_type< + MatrixH >::type >::invoke( side, eigsrc, initv, select, h, wr, wi, + vl, vr, mm, m, ifaill, ifailr, work ); +} + +// +// Overloaded function for hsein. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorSELECT, typename MatrixH, + typename VectorWR, typename VectorWI, typename MatrixVL, + typename MatrixVR, typename VectorIFAILL, typename VectorIFAILR > +inline typename boost::disable_if< detail::is_workspace< VectorIFAILR >, + std::ptrdiff_t >::type +hsein( const Side side, const char eigsrc, const char initv, + VectorSELECT& select, const MatrixH& h, VectorWR& wr, + const VectorWI& wi, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m, + VectorIFAILL& ifaill, VectorIFAILR& ifailr ) { + return hsein_impl< typename bindings::value_type< + MatrixH >::type >::invoke( side, eigsrc, initv, select, h, wr, wi, + vl, vr, mm, m, ifaill, ifailr, optimal_workspace() ); +} + +// +// Overloaded function for hsein. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename VectorSELECT, typename MatrixH, + typename VectorW, typename MatrixVL, typename MatrixVR, + typename VectorIFAILL, typename VectorIFAILR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hsein( const Side side, const char eigsrc, const char initv, + const VectorSELECT& select, const MatrixH& h, VectorW& w, + MatrixVL& vl, MatrixVR& vr, const fortran_int_t mm, + fortran_int_t& m, VectorIFAILL& ifaill, VectorIFAILR& ifailr, + Workspace work ) { + return hsein_impl< typename bindings::value_type< + MatrixH >::type >::invoke( side, eigsrc, initv, select, h, w, vl, + vr, mm, m, ifaill, ifailr, work ); +} + +// +// Overloaded function for hsein. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorSELECT, typename MatrixH, + typename VectorW, typename MatrixVL, typename MatrixVR, + typename VectorIFAILL, typename VectorIFAILR > +inline typename boost::disable_if< detail::is_workspace< VectorIFAILR >, + std::ptrdiff_t >::type +hsein( const Side side, const char eigsrc, const char initv, + const VectorSELECT& select, const MatrixH& h, VectorW& w, + MatrixVL& vl, MatrixVR& vr, const fortran_int_t mm, + fortran_int_t& m, VectorIFAILL& ifaill, VectorIFAILR& ifailr ) { + return hsein_impl< typename bindings::value_type< + MatrixH >::type >::invoke( side, eigsrc, initv, select, h, w, vl, + vr, mm, m, ifaill, ifailr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/hseqr.hpp b/sdk/boost/numeric/bindings/lapack/computational/hseqr.hpp new file mode 100644 index 0000000..a72fff4 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/hseqr.hpp @@ -0,0 +1,463 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HSEQR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_HSEQR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hseqr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t hseqr( const char job, const char compz, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, float* h, const fortran_int_t ldh, float* wr, + float* wi, float* z, const fortran_int_t ldz, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SHSEQR( &job, &compz, &n, &ilo, &ihi, h, &ldh, wr, wi, z, &ldz, + work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t hseqr( const char job, const char compz, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, double* h, const fortran_int_t ldh, + double* wr, double* wi, double* z, const fortran_int_t ldz, + double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DHSEQR( &job, &compz, &n, &ilo, &ihi, h, &ldh, wr, wi, z, &ldz, + work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t hseqr( const char job, const char compz, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, std::complex* h, + const fortran_int_t ldh, std::complex* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CHSEQR( &job, &compz, &n, &ilo, &ihi, h, &ldh, w, z, &ldz, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t hseqr( const char job, const char compz, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, std::complex* h, + const fortran_int_t ldh, std::complex* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZHSEQR( &job, &compz, &n, &ilo, &ihi, h, &ldh, w, z, &ldz, work, + &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hseqr. +// +template< typename Value, typename Enable = void > +struct hseqr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hseqr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixH, typename VectorWR, typename VectorWI, + typename MatrixZ, typename WORK > + static std::ptrdiff_t invoke( const char job, const char compz, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixH& h, VectorWR& wr, VectorWI& wi, MatrixZ& z, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixH >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWI >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixH >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWI >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(h) )); + BOOST_ASSERT( bindings::size(wr) >= bindings::size_column(h) ); + BOOST_ASSERT( bindings::size_column(h) >= 0 ); + BOOST_ASSERT( bindings::size_minor(h) == 1 || + bindings::stride_minor(h) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(h) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(h)) ); + BOOST_ASSERT( compz == 'N' || compz == 'I' || compz == 'V' ); + BOOST_ASSERT( job == 'E' || job == 'S' ); + return detail::hseqr( job, compz, bindings::size_column(h), ilo, ihi, + bindings::begin_value(h), bindings::stride_major(h), + bindings::begin_value(wr), bindings::begin_value(wi), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixH, typename VectorWR, typename VectorWI, + typename MatrixZ > + static std::ptrdiff_t invoke( const char job, const char compz, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixH& h, VectorWR& wr, VectorWI& wi, MatrixZ& z, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(h) ) ); + return invoke( job, compz, ilo, ihi, h, wr, wi, z, + workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixH, typename VectorWR, typename VectorWI, + typename MatrixZ > + static std::ptrdiff_t invoke( const char job, const char compz, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixH& h, VectorWR& wr, VectorWI& wi, MatrixZ& z, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::hseqr( job, compz, bindings::size_column(h), ilo, ihi, + bindings::begin_value(h), bindings::stride_major(h), + bindings::begin_value(wr), bindings::begin_value(wi), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( job, compz, ilo, ihi, h, wr, wi, z, + workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,n); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hseqr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixH, typename VectorW, typename MatrixZ, + typename WORK > + static std::ptrdiff_t invoke( const char job, const char compz, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixH& h, VectorW& w, MatrixZ& z, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixH >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixH >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixH >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(h) )); + BOOST_ASSERT( bindings::size_column(h) >= 0 ); + BOOST_ASSERT( bindings::size_minor(h) == 1 || + bindings::stride_minor(h) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(h) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(h)) ); + BOOST_ASSERT( compz == 'N' || compz == 'I' || compz == 'V' ); + BOOST_ASSERT( job == 'E' || job == 'S' ); + return detail::hseqr( job, compz, bindings::size_column(h), ilo, ihi, + bindings::begin_value(h), bindings::stride_major(h), + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixH, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char job, const char compz, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixH& h, VectorW& w, MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(h) ) ); + return invoke( job, compz, ilo, ihi, h, w, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixH, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char job, const char compz, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixH& h, VectorW& w, MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::hseqr( job, compz, bindings::size_column(h), ilo, ihi, + bindings::begin_value(h), bindings::stride_major(h), + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( job, compz, ilo, ihi, h, w, z, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,n); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hseqr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hseqr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixH, typename VectorWR, typename VectorWI, + typename MatrixZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hseqr( const char job, const char compz, const fortran_int_t ilo, + const fortran_int_t ihi, MatrixH& h, VectorWR& wr, VectorWI& wi, + MatrixZ& z, Workspace work ) { + return hseqr_impl< typename bindings::value_type< + MatrixH >::type >::invoke( job, compz, ilo, ihi, h, wr, wi, z, + work ); +} + +// +// Overloaded function for hseqr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixH, typename VectorWR, typename VectorWI, + typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +hseqr( const char job, const char compz, const fortran_int_t ilo, + const fortran_int_t ihi, MatrixH& h, VectorWR& wr, VectorWI& wi, + MatrixZ& z ) { + return hseqr_impl< typename bindings::value_type< + MatrixH >::type >::invoke( job, compz, ilo, ihi, h, wr, wi, z, + optimal_workspace() ); +} + +// +// Overloaded function for hseqr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixH, typename VectorW, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< mpl::and_< is_complex< + typename bindings::value_type< MatrixH >::type >, + detail::is_workspace< Workspace > >, + std::ptrdiff_t >::type +hseqr( const char job, const char compz, const fortran_int_t ilo, + const fortran_int_t ihi, MatrixH& h, VectorW& w, MatrixZ& z, + Workspace work ) { + return hseqr_impl< typename bindings::value_type< + MatrixH >::type >::invoke( job, compz, ilo, ihi, h, w, z, work ); +} + +// +// Overloaded function for hseqr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixH, typename VectorW, typename MatrixZ > +inline typename boost::disable_if< mpl::or_< is_real< + typename bindings::value_type< MatrixH >::type >, + detail::is_workspace< MatrixZ > >, + std::ptrdiff_t >::type +hseqr( const char job, const char compz, const fortran_int_t ilo, + const fortran_int_t ihi, MatrixH& h, VectorW& w, MatrixZ& z ) { + return hseqr_impl< typename bindings::value_type< + MatrixH >::type >::invoke( job, compz, ilo, ihi, h, w, z, + optimal_workspace() ); +} + +// +// Overloaded function for hseqr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixH, typename VectorW, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< mpl::and_< is_real< + typename bindings::value_type< MatrixH >::type >, + detail::is_workspace< Workspace > >, + std::ptrdiff_t >::type +hseqr( const char job, const char compz, const fortran_int_t ilo, + const fortran_int_t ihi, MatrixH& h, VectorW& w, MatrixZ& z, + Workspace work ) { + std::ptrdiff_t info = hseqr_impl< typename bindings::value_type< + MatrixH >::type >::invoke( job, compz, ilo, ihi, h, + bindings::detail::real_part_view(w), bindings::detail::imag_part_view(w), + z, work ); + bindings::detail::interlace(w); + return info; +} + +// +// Overloaded function for hseqr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixH, typename VectorW, typename MatrixZ > +inline typename boost::disable_if< mpl::or_< is_complex< + typename bindings::value_type< MatrixH >::type >, + detail::is_workspace< MatrixZ > >, + std::ptrdiff_t >::type +hseqr( const char job, const char compz, const fortran_int_t ilo, + const fortran_int_t ihi, MatrixH& h, VectorW& w, MatrixZ& z ) { + std::ptrdiff_t info = hseqr_impl< typename bindings::value_type< + MatrixH >::type >::invoke( job, compz, ilo, ihi, h, + bindings::detail::real_part_view(w), bindings::detail::imag_part_view(w), + z, optimal_workspace() ); + bindings::detail::interlace(w); + return info; +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/opgtr.hpp b/sdk/boost/numeric/bindings/lapack/computational/opgtr.hpp new file mode 100644 index 0000000..78da320 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/opgtr.hpp @@ -0,0 +1,206 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_OPGTR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_OPGTR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for opgtr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t opgtr( const char uplo, const fortran_int_t n, + const float* ap, const float* tau, float* q, const fortran_int_t ldq, + float* work ) { + fortran_int_t info(0); + LAPACK_SOPGTR( &uplo, &n, ap, tau, q, &ldq, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t opgtr( const char uplo, const fortran_int_t n, + const double* ap, const double* tau, double* q, + const fortran_int_t ldq, double* work ) { + fortran_int_t info(0); + LAPACK_DOPGTR( &uplo, &n, ap, tau, q, &ldq, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to opgtr. +// +template< typename Value > +struct opgtr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorAP, typename VectorTAU, typename MatrixQ, + typename WORK > + static std::ptrdiff_t invoke( const char uplo, const VectorAP& ap, + const VectorTAU& tau, MatrixQ& q, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::size(ap) >= + bindings::size_column(q)*(bindings::size_column(q)+1)/2 ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_column(q)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(q) )); + BOOST_ASSERT( bindings::size_column(q) >= 0 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::stride_major(q) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(q)) ); + return detail::opgtr( uplo, bindings::size_column(q), + bindings::begin_value(ap), bindings::begin_value(tau), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorAP, typename VectorTAU, typename MatrixQ > + static std::ptrdiff_t invoke( const char uplo, const VectorAP& ap, + const VectorTAU& tau, MatrixQ& q, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(q) ) ); + return invoke( uplo, ap, tau, q, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorAP, typename VectorTAU, typename MatrixQ > + static std::ptrdiff_t invoke( const char uplo, const VectorAP& ap, + const VectorTAU& tau, MatrixQ& q, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( uplo, ap, tau, q, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n-1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the opgtr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for opgtr. Its overload differs for +// * User-defined workspace +// +template< typename VectorAP, typename VectorTAU, typename MatrixQ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +opgtr( const char uplo, const VectorAP& ap, const VectorTAU& tau, + MatrixQ& q, Workspace work ) { + return opgtr_impl< typename bindings::value_type< + VectorAP >::type >::invoke( uplo, ap, tau, q, work ); +} + +// +// Overloaded function for opgtr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorAP, typename VectorTAU, typename MatrixQ > +inline typename boost::disable_if< detail::is_workspace< MatrixQ >, + std::ptrdiff_t >::type +opgtr( const char uplo, const VectorAP& ap, const VectorTAU& tau, + MatrixQ& q ) { + return opgtr_impl< typename bindings::value_type< + VectorAP >::type >::invoke( uplo, ap, tau, q, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/opmtr.hpp b/sdk/boost/numeric/bindings/lapack/computational/opmtr.hpp new file mode 100644 index 0000000..1135c6c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/opmtr.hpp @@ -0,0 +1,225 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_OPMTR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_OPMTR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for opmtr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t opmtr( const Side, const char uplo, const Trans, + const fortran_int_t m, const fortran_int_t n, const float* ap, + const float* tau, float* c, const fortran_int_t ldc, float* work ) { + fortran_int_t info(0); + LAPACK_SOPMTR( &lapack_option< Side >::value, &uplo, &lapack_option< + Trans >::value, &m, &n, ap, tau, c, &ldc, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t opmtr( const Side, const char uplo, const Trans, + const fortran_int_t m, const fortran_int_t n, const double* ap, + const double* tau, double* c, const fortran_int_t ldc, double* work ) { + fortran_int_t info(0); + LAPACK_DOPMTR( &lapack_option< Side >::value, &uplo, &lapack_option< + Trans >::value, &m, &n, ap, tau, c, &ldc, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to opmtr. +// +template< typename Value > +struct opmtr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorAP, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const char uplo, + const VectorAP& ap, const VectorTAU& tau, MatrixC& c, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorAP, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::opmtr( side, uplo, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::begin_value(ap), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorAP, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const char uplo, + const VectorAP& ap, const VectorTAU& tau, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorAP, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, uplo, ap, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorAP, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const char uplo, + const VectorAP& ap, const VectorTAU& tau, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorAP, order >::type trans; + return invoke( side, uplo, ap, tau, c, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the opmtr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for opmtr. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename VectorAP, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +opmtr( const Side side, const char uplo, const VectorAP& ap, + const VectorTAU& tau, MatrixC& c, Workspace work ) { + return opmtr_impl< typename bindings::value_type< + VectorAP >::type >::invoke( side, uplo, ap, tau, c, work ); +} + +// +// Overloaded function for opmtr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorAP, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +opmtr( const Side side, const char uplo, const VectorAP& ap, + const VectorTAU& tau, MatrixC& c ) { + return opmtr_impl< typename bindings::value_type< + VectorAP >::type >::invoke( side, uplo, ap, tau, c, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/orgbr.hpp b/sdk/boost/numeric/bindings/lapack/computational/orgbr.hpp new file mode 100644 index 0000000..6d92f03 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/orgbr.hpp @@ -0,0 +1,212 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGBR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGBR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for orgbr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t orgbr( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, float* a, + const fortran_int_t lda, const float* tau, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGBR( &vect, &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t orgbr( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, double* a, + const fortran_int_t lda, const double* tau, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGBR( &vect, &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to orgbr. +// +template< typename Value > +struct orgbr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, MatrixA& a, + const VectorTAU& tau, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( m, n )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + m) ); + BOOST_ASSERT( k >= 0 ); + BOOST_ASSERT( m >= 0 ); + BOOST_ASSERT( vect == 'Q' || vect == 'P' ); + return detail::orgbr( vect, m, n, k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, MatrixA& a, + const VectorTAU& tau, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( m, n ) ); + return invoke( vect, m, n, k, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, MatrixA& a, + const VectorTAU& tau, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::orgbr( vect, m, n, k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( vect, m, n, k, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, std::min< std::ptrdiff_t >( m, + n ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the orgbr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for orgbr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +orgbr( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, MatrixA& a, + const VectorTAU& tau, Workspace work ) { + return orgbr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( vect, m, n, k, a, tau, work ); +} + +// +// Overloaded function for orgbr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +orgbr( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, MatrixA& a, + const VectorTAU& tau ) { + return orgbr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( vect, m, n, k, a, tau, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/orghr.hpp b/sdk/boost/numeric/bindings/lapack/computational/orghr.hpp new file mode 100644 index 0000000..ec76dc8 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/orghr.hpp @@ -0,0 +1,209 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGHR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGHR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for orghr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t orghr( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, float* a, const fortran_int_t lda, + const float* tau, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGHR( &n, &ilo, &ihi, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t orghr( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, double* a, const fortran_int_t lda, + const double* tau, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGHR( &n, &ilo, &ihi, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to orghr. +// +template< typename Value > +struct orghr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixA& a, const VectorTAU& tau, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= n-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( ihi, ilo )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( n >= 0 ); + return detail::orghr( n, ilo, ihi, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixA& a, const VectorTAU& tau, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( ihi, + ilo ) ); + return invoke( n, ilo, ihi, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixA& a, const VectorTAU& tau, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::orghr( n, ilo, ihi, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( n, ilo, ihi, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t ihi, + const std::ptrdiff_t ilo ) { + return ihi-ilo; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the orghr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for orghr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +orghr( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, MatrixA& a, const VectorTAU& tau, + Workspace work ) { + return orghr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( n, ilo, ihi, a, tau, work ); +} + +// +// Overloaded function for orghr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +orghr( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, MatrixA& a, const VectorTAU& tau ) { + return orghr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( n, ilo, ihi, a, tau, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/orglq.hpp b/sdk/boost/numeric/bindings/lapack/computational/orglq.hpp new file mode 100644 index 0000000..f97290a --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/orglq.hpp @@ -0,0 +1,203 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGLQ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGLQ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for orglq is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t orglq( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, float* a, const fortran_int_t lda, + const float* tau, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGLQ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t orglq( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, double* a, const fortran_int_t lda, + const double* tau, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGLQ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to orglq. +// +template< typename Value > +struct orglq_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::orglq( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::orglq( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return std::max< std::ptrdiff_t >( 1, m ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the orglq_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for orglq. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +orglq( MatrixA& a, const VectorTAU& tau, Workspace work ) { + return orglq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for orglq. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +orglq( MatrixA& a, const VectorTAU& tau ) { + return orglq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/orgql.hpp b/sdk/boost/numeric/bindings/lapack/computational/orgql.hpp new file mode 100644 index 0000000..859b0d7 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/orgql.hpp @@ -0,0 +1,202 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGQL_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGQL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for orgql is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t orgql( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, float* a, const fortran_int_t lda, + const float* tau, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGQL( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t orgql( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, double* a, const fortran_int_t lda, + const double* tau, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGQL( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to orgql. +// +template< typename Value > +struct orgql_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::orgql( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::orgql( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, n ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the orgql_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for orgql. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +orgql( MatrixA& a, const VectorTAU& tau, Workspace work ) { + return orgql_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for orgql. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +orgql( MatrixA& a, const VectorTAU& tau ) { + return orgql_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/orgqr.hpp b/sdk/boost/numeric/bindings/lapack/computational/orgqr.hpp new file mode 100644 index 0000000..2149f25 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/orgqr.hpp @@ -0,0 +1,202 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGQR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGQR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for orgqr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t orgqr( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, float* a, const fortran_int_t lda, + const float* tau, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGQR( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t orgqr( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, double* a, const fortran_int_t lda, + const double* tau, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGQR( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to orgqr. +// +template< typename Value > +struct orgqr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::orgqr( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::orgqr( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, n ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the orgqr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for orgqr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +orgqr( MatrixA& a, const VectorTAU& tau, Workspace work ) { + return orgqr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for orgqr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +orgqr( MatrixA& a, const VectorTAU& tau ) { + return orgqr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/orgrq.hpp b/sdk/boost/numeric/bindings/lapack/computational/orgrq.hpp new file mode 100644 index 0000000..a7903e5 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/orgrq.hpp @@ -0,0 +1,203 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGRQ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGRQ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for orgrq is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t orgrq( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, float* a, const fortran_int_t lda, + const float* tau, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGRQ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t orgrq( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, double* a, const fortran_int_t lda, + const double* tau, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGRQ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to orgrq. +// +template< typename Value > +struct orgrq_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::orgrq( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::orgrq( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return std::max< std::ptrdiff_t >( 1, m ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the orgrq_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for orgrq. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +orgrq( MatrixA& a, const VectorTAU& tau, Workspace work ) { + return orgrq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for orgrq. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +orgrq( MatrixA& a, const VectorTAU& tau ) { + return orgrq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/orgtr.hpp b/sdk/boost/numeric/bindings/lapack/computational/orgtr.hpp new file mode 100644 index 0000000..2de5d34 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/orgtr.hpp @@ -0,0 +1,208 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGTR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORGTR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for orgtr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t orgtr( const UpLo, const fortran_int_t n, float* a, + const fortran_int_t lda, const float* tau, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGTR( &lapack_option< UpLo >::value, &n, a, &lda, tau, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t orgtr( const UpLo, const fortran_int_t n, double* a, + const fortran_int_t lda, const double* tau, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGTR( &lapack_option< UpLo >::value, &n, a, &lda, tau, work, + &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to orgtr. +// +template< typename Value > +struct orgtr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( const fortran_int_t n, MatrixA& a, + const VectorTAU& tau, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= n-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( n >= 0 ); + return detail::orgtr( uplo(), n, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t n, MatrixA& a, + const VectorTAU& tau, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( n ) ); + return invoke( n, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t n, MatrixA& a, + const VectorTAU& tau, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + detail::orgtr( uplo(), n, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( n, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,n-1); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the orgtr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for orgtr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +orgtr( const fortran_int_t n, MatrixA& a, const VectorTAU& tau, + Workspace work ) { + return orgtr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( n, a, tau, work ); +} + +// +// Overloaded function for orgtr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +orgtr( const fortran_int_t n, MatrixA& a, const VectorTAU& tau ) { + return orgtr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( n, a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ormbr.hpp b/sdk/boost/numeric/bindings/lapack/computational/ormbr.hpp new file mode 100644 index 0000000..a772c51 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ormbr.hpp @@ -0,0 +1,244 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMBR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMBR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ormbr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormbr( const char vect, const Side, const Trans, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t k, + const float* a, const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMBR( &vect, &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormbr( const char vect, const Side, const Trans, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t k, + const double* a, const fortran_int_t lda, const double* tau, + double* c, const fortran_int_t ldc, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMBR( &vect, &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ormbr. +// +template< typename Value > +struct ormbr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const char vect, const Side side, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + BOOST_ASSERT( vect == 'Q' || vect == 'P' ); + return detail::ormbr( vect, side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const char vect, const Side side, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( vect, side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const char vect, const Side side, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::ormbr( vect, side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( vect, side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ormbr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ormbr. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ormbr( const char vect, const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, Workspace work ) { + return ormbr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( vect, side, a, tau, c, work ); +} + +// +// Overloaded function for ormbr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +ormbr( const char vect, const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c ) { + return ormbr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( vect, side, a, tau, c, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ormhr.hpp b/sdk/boost/numeric/bindings/lapack/computational/ormhr.hpp new file mode 100644 index 0000000..87c1404 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ormhr.hpp @@ -0,0 +1,245 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMHR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMHR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ormhr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormhr( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, const float* a, const fortran_int_t lda, + const float* tau, float* c, const fortran_int_t ldc, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMHR( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &ilo, &ihi, a, &lda, tau, c, &ldc, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormhr( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, const double* a, const fortran_int_t lda, + const double* tau, double* c, const fortran_int_t ldc, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMHR( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &ilo, &ihi, a, &lda, tau, c, &ldc, work, + &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ormhr. +// +template< typename Value > +struct ormhr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t ilo, + const fortran_int_t ihi, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::ormhr( side, trans(), bindings::size_row(c), + bindings::size_column(c), ilo, ihi, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t ilo, + const fortran_int_t ihi, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, ilo, ihi, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t ilo, + const fortran_int_t ihi, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::ormhr( side, trans(), bindings::size_row(c), + bindings::size_column(c), ilo, ihi, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, ilo, ihi, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ormhr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ormhr. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ormhr( const Side side, const fortran_int_t ilo, + const fortran_int_t ihi, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, Workspace work ) { + return ormhr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, ilo, ihi, a, tau, c, work ); +} + +// +// Overloaded function for ormhr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +ormhr( const Side side, const fortran_int_t ilo, + const fortran_int_t ihi, const MatrixA& a, const VectorTAU& tau, + MatrixC& c ) { + return ormhr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, ilo, ihi, a, tau, c, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ormlq.hpp b/sdk/boost/numeric/bindings/lapack/computational/ormlq.hpp new file mode 100644 index 0000000..f58b150 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ormlq.hpp @@ -0,0 +1,241 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMLQ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMLQ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ormlq is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormlq( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const float* a, + const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMLQ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormlq( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const double* a, + const fortran_int_t lda, const double* tau, double* c, + const fortran_int_t ldc, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMLQ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ormlq. +// +template< typename Value > +struct ormlq_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size(tau)) ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::ormlq( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::ormlq( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ormlq_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ormlq. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ormlq( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, Workspace work ) { + return ormlq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, work ); +} + +// +// Overloaded function for ormlq. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +ormlq( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c ) { + return ormlq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ormql.hpp b/sdk/boost/numeric/bindings/lapack/computational/ormql.hpp new file mode 100644 index 0000000..4e67c53 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ormql.hpp @@ -0,0 +1,239 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMQL_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMQL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ormql is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormql( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, float* a, + const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMQL( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormql( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, double* a, + const fortran_int_t lda, const double* tau, double* c, + const fortran_int_t ldc, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMQL( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ormql. +// +template< typename Value > +struct ormql_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::ormql( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::ormql( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ormql_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ormql. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ormql( const Side side, MatrixA& a, const VectorTAU& tau, MatrixC& c, + Workspace work ) { + return ormql_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, work ); +} + +// +// Overloaded function for ormql. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +ormql( const Side side, MatrixA& a, const VectorTAU& tau, MatrixC& c ) { + return ormql_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ormqr.hpp b/sdk/boost/numeric/bindings/lapack/computational/ormqr.hpp new file mode 100644 index 0000000..be4a356 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ormqr.hpp @@ -0,0 +1,239 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMQR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMQR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ormqr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormqr( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const float* a, + const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMQR( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormqr( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const double* a, + const fortran_int_t lda, const double* tau, double* c, + const fortran_int_t ldc, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMQR( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ormqr. +// +template< typename Value > +struct ormqr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::ormqr( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::ormqr( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ormqr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ormqr. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ormqr( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, Workspace work ) { + return ormqr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, work ); +} + +// +// Overloaded function for ormqr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +ormqr( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c ) { + return ormqr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ormrq.hpp b/sdk/boost/numeric/bindings/lapack/computational/ormrq.hpp new file mode 100644 index 0000000..5518b81 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ormrq.hpp @@ -0,0 +1,241 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMRQ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMRQ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ormrq is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormrq( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const float* a, + const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMRQ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormrq( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const double* a, + const fortran_int_t lda, const double* tau, double* c, + const fortran_int_t ldc, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMRQ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ormrq. +// +template< typename Value > +struct ormrq_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size(tau)) ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::ormrq( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::ormrq( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ormrq_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ormrq. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ormrq( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, Workspace work ) { + return ormrq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, work ); +} + +// +// Overloaded function for ormrq. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +ormrq( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c ) { + return ormrq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ormrz.hpp b/sdk/boost/numeric/bindings/lapack/computational/ormrz.hpp new file mode 100644 index 0000000..ba6e543 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ormrz.hpp @@ -0,0 +1,244 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMRZ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMRZ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ormrz is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormrz( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const fortran_int_t l, + const float* a, const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMRZ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, &l, a, &lda, tau, c, &ldc, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t ormrz( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const fortran_int_t l, + const double* a, const fortran_int_t lda, const double* tau, + double* c, const fortran_int_t ldc, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMRZ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, &l, a, &lda, tau, c, &ldc, work, + &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ormrz. +// +template< typename Value > +struct ormrz_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size(tau)) ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::ormrz( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::size_column_op(a, trans()), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::ormrz( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::size_column_op(a, trans()), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ormrz_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ormrz. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ormrz( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, Workspace work ) { + return ormrz_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, work ); +} + +// +// Overloaded function for ormrz. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +ormrz( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c ) { + return ormrz_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ormtr.hpp b/sdk/boost/numeric/bindings/lapack/computational/ormtr.hpp new file mode 100644 index 0000000..6375c9b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ormtr.hpp @@ -0,0 +1,241 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMTR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_ORMTR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ormtr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename UpLo, typename Trans > +inline std::ptrdiff_t ormtr( const Side, const UpLo, const Trans, + const fortran_int_t m, const fortran_int_t n, const float* a, + const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMTR( &lapack_option< Side >::value, &lapack_option< + UpLo >::value, &lapack_option< Trans >::value, &m, &n, a, &lda, + tau, c, &ldc, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename UpLo, typename Trans > +inline std::ptrdiff_t ormtr( const Side, const UpLo, const Trans, + const fortran_int_t m, const fortran_int_t n, const double* a, + const fortran_int_t lda, const double* tau, double* c, + const fortran_int_t ldc, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMTR( &lapack_option< Side >::value, &lapack_option< + UpLo >::value, &lapack_option< Trans >::value, &m, &n, a, &lda, + tau, c, &ldc, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ormtr. +// +template< typename Value > +struct ormtr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::ormtr( side, uplo(), trans(), bindings::size_row(c), + bindings::size_column(c), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + real_type opt_size_work; + detail::ormtr( side, uplo(), trans(), bindings::size_row(c), + bindings::size_column(c), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ormtr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ormtr. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ormtr( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, Workspace work ) { + return ormtr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, work ); +} + +// +// Overloaded function for ormtr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +ormtr( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c ) { + return ormtr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pbcon.hpp b/sdk/boost/numeric/bindings/lapack/computational/pbcon.hpp new file mode 100644 index 0000000..4be498b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pbcon.hpp @@ -0,0 +1,347 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PBCON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PBCON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pbcon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbcon( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const float* ab, const fortran_int_t ldab, + const float anorm, float& rcond, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SPBCON( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, &anorm, + &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbcon( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const double* ab, const fortran_int_t ldab, + const double anorm, double& rcond, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DPBCON( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, &anorm, + &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbcon( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const std::complex* ab, + const fortran_int_t ldab, const float anorm, float& rcond, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CPBCON( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, &anorm, + &rcond, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbcon( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const std::complex* ab, + const fortran_int_t ldab, const double anorm, double& rcond, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZPBCON( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, &anorm, + &rcond, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pbcon. +// +template< typename Value, typename Enable = void > +struct pbcon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct pbcon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const MatrixAB& ab, const real_type anorm, + real_type& rcond, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + return detail::pbcon( uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), anorm, rcond, + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const MatrixAB& ab, const real_type anorm, + real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ab) ) ); + return invoke( ab, anorm, rcond, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const MatrixAB& ab, const real_type anorm, + real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( ab, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct pbcon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const MatrixAB& ab, const real_type anorm, + real_type& rcond, detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_ASSERT( bindings::bandwidth_upper(ab) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + bindings::bandwidth_upper(ab)+1 ); + return detail::pbcon( uplo(), bindings::size_column(ab), + bindings::bandwidth_upper(ab), bindings::begin_value(ab), + bindings::stride_major(ab), anorm, rcond, + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const MatrixAB& ab, const real_type anorm, + real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ab) ) ); + return invoke( ab, anorm, rcond, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const MatrixAB& ab, const real_type anorm, + real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( ab, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pbcon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pbcon. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +pbcon( const MatrixAB& ab, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type anorm, + typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type& rcond, Workspace work ) { + return pbcon_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab, anorm, rcond, work ); +} + +// +// Overloaded function for pbcon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB > +inline typename boost::disable_if< detail::is_workspace< MatrixAB >, + std::ptrdiff_t >::type +pbcon( const MatrixAB& ab, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type anorm, + typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type& rcond ) { + return pbcon_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab, anorm, rcond, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pbequ.hpp b/sdk/boost/numeric/bindings/lapack/computational/pbequ.hpp new file mode 100644 index 0000000..41ea7d3 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pbequ.hpp @@ -0,0 +1,221 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PBEQU_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PBEQU_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pbequ is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbequ( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const float* ab, const fortran_int_t ldab, + float* s, float& scond, float& amax ) { + fortran_int_t info(0); + LAPACK_SPBEQU( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, s, + &scond, &amax, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbequ( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const double* ab, const fortran_int_t ldab, + double* s, double& scond, double& amax ) { + fortran_int_t info(0); + LAPACK_DPBEQU( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, s, + &scond, &amax, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbequ( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const std::complex* ab, + const fortran_int_t ldab, float* s, float& scond, float& amax ) { + fortran_int_t info(0); + LAPACK_CPBEQU( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, s, + &scond, &amax, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbequ( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const std::complex* ab, + const fortran_int_t ldab, double* s, double& scond, double& amax ) { + fortran_int_t info(0); + LAPACK_ZPBEQU( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, s, + &scond, &amax, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pbequ. +// +template< typename Value, typename Enable = void > +struct pbequ_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct pbequ_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorS > + static std::ptrdiff_t invoke( const MatrixAB& ab, VectorS& s, + real_type& scond, real_type& amax ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + return detail::pbequ( uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(s), scond, + amax ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct pbequ_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorS > + static std::ptrdiff_t invoke( const MatrixAB& ab, VectorS& s, + real_type& scond, real_type& amax ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + return detail::pbequ( uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(s), scond, + amax ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pbequ_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pbequ. Its overload differs for +// +template< typename MatrixAB, typename VectorS > +inline std::ptrdiff_t pbequ( const MatrixAB& ab, VectorS& s, + typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type& scond, typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type& amax ) { + return pbequ_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab, s, scond, amax ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pbrfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/pbrfs.hpp new file mode 100644 index 0000000..18e470b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pbrfs.hpp @@ -0,0 +1,457 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PBRFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PBRFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pbrfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbrfs( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const fortran_int_t nrhs, const float* ab, + const fortran_int_t ldab, const float* afb, const fortran_int_t ldafb, + const float* b, const fortran_int_t ldb, float* x, + const fortran_int_t ldx, float* ferr, float* berr, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SPBRFS( &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, &ldab, + afb, &ldafb, b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbrfs( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const fortran_int_t nrhs, const double* ab, + const fortran_int_t ldab, const double* afb, + const fortran_int_t ldafb, const double* b, const fortran_int_t ldb, + double* x, const fortran_int_t ldx, double* ferr, double* berr, + double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DPBRFS( &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, &ldab, + afb, &ldafb, b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbrfs( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const fortran_int_t nrhs, + const std::complex* ab, const fortran_int_t ldab, + const std::complex* afb, const fortran_int_t ldafb, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float* ferr, + float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CPBRFS( &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, &ldab, + afb, &ldafb, b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbrfs( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const fortran_int_t nrhs, + const std::complex* ab, const fortran_int_t ldab, + const std::complex* afb, const fortran_int_t ldafb, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, double* ferr, + double* berr, std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZPBRFS( &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, &ldab, + afb, &ldafb, b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pbrfs. +// +template< typename Value, typename Enable = void > +struct pbrfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct pbrfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixAFB, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const MatrixAB& ab, const MatrixAFB& afb, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAFB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(afb) == 1 || + bindings::stride_minor(afb) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(afb) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + return detail::pbrfs( uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::size_column(b), + bindings::begin_value(ab), bindings::stride_major(ab), + bindings::begin_value(afb), bindings::stride_major(afb), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixAFB, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAB& ab, const MatrixAFB& afb, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ab) ) ); + return invoke( ab, afb, b, x, ferr, berr, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixAFB, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAB& ab, const MatrixAFB& afb, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( ab, afb, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct pbrfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixAFB, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const MatrixAB& ab, const MatrixAFB& afb, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAFB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(afb) == 1 || + bindings::stride_minor(afb) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(afb) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + return detail::pbrfs( uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::size_column(b), + bindings::begin_value(ab), bindings::stride_major(ab), + bindings::begin_value(afb), bindings::stride_major(afb), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixAFB, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAB& ab, const MatrixAFB& afb, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ab) ) ); + return invoke( ab, afb, b, x, ferr, berr, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixAFB, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAB& ab, const MatrixAFB& afb, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( ab, afb, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pbrfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pbrfs. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixAFB, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +pbrfs( const MatrixAB& ab, const MatrixAFB& afb, const MatrixB& b, + MatrixX& x, VectorFERR& ferr, VectorBERR& berr, Workspace work ) { + return pbrfs_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab, afb, b, x, ferr, berr, work ); +} + +// +// Overloaded function for pbrfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixAFB, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +pbrfs( const MatrixAB& ab, const MatrixAFB& afb, const MatrixB& b, + MatrixX& x, VectorFERR& ferr, VectorBERR& berr ) { + return pbrfs_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab, afb, b, x, ferr, berr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pbstf.hpp b/sdk/boost/numeric/bindings/lapack/computational/pbstf.hpp new file mode 100644 index 0000000..68cf8e1 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pbstf.hpp @@ -0,0 +1,162 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PBSTF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PBSTF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pbstf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbstf( const UpLo, const fortran_int_t n, + const fortran_int_t kd, float* ab, const fortran_int_t ldab ) { + fortran_int_t info(0); + LAPACK_SPBSTF( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbstf( const UpLo, const fortran_int_t n, + const fortran_int_t kd, double* ab, const fortran_int_t ldab ) { + fortran_int_t info(0); + LAPACK_DPBSTF( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbstf( const UpLo, const fortran_int_t n, + const fortran_int_t kd, std::complex* ab, + const fortran_int_t ldab ) { + fortran_int_t info(0); + LAPACK_CPBSTF( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbstf( const UpLo, const fortran_int_t n, + const fortran_int_t kd, std::complex* ab, + const fortran_int_t ldab ) { + fortran_int_t info(0); + LAPACK_ZPBSTF( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pbstf. +// +template< typename Value > +struct pbstf_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( MatrixAB& ab ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + return detail::pbstf( uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pbstf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pbstf. Its overload differs for +// +template< typename MatrixAB > +inline std::ptrdiff_t pbstf( MatrixAB& ab ) { + return pbstf_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pbtrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/pbtrf.hpp new file mode 100644 index 0000000..8c97e72 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pbtrf.hpp @@ -0,0 +1,162 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PBTRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PBTRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pbtrf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbtrf( const UpLo, const fortran_int_t n, + const fortran_int_t kd, float* ab, const fortran_int_t ldab ) { + fortran_int_t info(0); + LAPACK_SPBTRF( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbtrf( const UpLo, const fortran_int_t n, + const fortran_int_t kd, double* ab, const fortran_int_t ldab ) { + fortran_int_t info(0); + LAPACK_DPBTRF( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbtrf( const UpLo, const fortran_int_t n, + const fortran_int_t kd, std::complex* ab, + const fortran_int_t ldab ) { + fortran_int_t info(0); + LAPACK_CPBTRF( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbtrf( const UpLo, const fortran_int_t n, + const fortran_int_t kd, std::complex* ab, + const fortran_int_t ldab ) { + fortran_int_t info(0); + LAPACK_ZPBTRF( &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pbtrf. +// +template< typename Value > +struct pbtrf_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( MatrixAB& ab ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + return detail::pbtrf( uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pbtrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pbtrf. Its overload differs for +// +template< typename MatrixAB > +inline std::ptrdiff_t pbtrf( MatrixAB& ab ) { + return pbtrf_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pbtrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/pbtrs.hpp new file mode 100644 index 0000000..a8e5bc4 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pbtrs.hpp @@ -0,0 +1,181 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PBTRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PBTRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pbtrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbtrs( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const fortran_int_t nrhs, const float* ab, + const fortran_int_t ldab, float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SPBTRS( &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, &ldab, + b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbtrs( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const fortran_int_t nrhs, const double* ab, + const fortran_int_t ldab, double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DPBTRS( &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, &ldab, + b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbtrs( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const fortran_int_t nrhs, + const std::complex* ab, const fortran_int_t ldab, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CPBTRS( &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, &ldab, + b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbtrs( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const fortran_int_t nrhs, + const std::complex* ab, const fortran_int_t ldab, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZPBTRS( &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, &ldab, + b, &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pbtrs. +// +template< typename Value > +struct pbtrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixB > + static std::ptrdiff_t invoke( const MatrixAB& ab, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + return detail::pbtrs( uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::size_column(b), + bindings::begin_value(ab), bindings::stride_major(ab), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pbtrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pbtrs. Its overload differs for +// +template< typename MatrixAB, typename MatrixB > +inline std::ptrdiff_t pbtrs( const MatrixAB& ab, MatrixB& b ) { + return pbtrs_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pftrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/pftrf.hpp new file mode 100644 index 0000000..0499eec --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pftrf.hpp @@ -0,0 +1,154 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PFTRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PFTRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pftrf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename TransR > +inline std::ptrdiff_t pftrf( const TransR, const char uplo, + const fortran_int_t n, float* a ) { + fortran_int_t info(0); + LAPACK_SPFTRF( &lapack_option< TransR >::value, &uplo, &n, a, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename TransR > +inline std::ptrdiff_t pftrf( const TransR, const char uplo, + const fortran_int_t n, double* a ) { + fortran_int_t info(0); + LAPACK_DPFTRF( &lapack_option< TransR >::value, &uplo, &n, a, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename TransR > +inline std::ptrdiff_t pftrf( const TransR, const char uplo, + const fortran_int_t n, std::complex* a ) { + fortran_int_t info(0); + LAPACK_CPFTRF( &lapack_option< TransR >::value, &uplo, &n, a, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename TransR > +inline std::ptrdiff_t pftrf( const TransR, const char uplo, + const fortran_int_t n, std::complex* a ) { + fortran_int_t info(0); + LAPACK_ZPFTRF( &lapack_option< TransR >::value, &uplo, &n, a, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pftrf. +// +template< typename Value > +struct pftrf_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char uplo, MatrixA& a ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename blas::detail::default_order< MatrixA >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type transr; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_column_op(a, transr()) >= 0 ); + return detail::pftrf( transr(), uplo, bindings::size_column_op(a, + transr()), bindings::begin_value(a) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pftrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pftrf. Its overload differs for +// +template< typename MatrixA > +inline std::ptrdiff_t pftrf( const char uplo, MatrixA& a ) { + return pftrf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( uplo, a ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pftri.hpp b/sdk/boost/numeric/bindings/lapack/computational/pftri.hpp new file mode 100644 index 0000000..8a515d6 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pftri.hpp @@ -0,0 +1,159 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PFTRI_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PFTRI_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pftri is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename TransR, typename UpLo > +inline std::ptrdiff_t pftri( const TransR, const UpLo, const fortran_int_t n, + float* a ) { + fortran_int_t info(0); + LAPACK_SPFTRI( &lapack_option< TransR >::value, &lapack_option< + UpLo >::value, &n, a, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename TransR, typename UpLo > +inline std::ptrdiff_t pftri( const TransR, const UpLo, const fortran_int_t n, + double* a ) { + fortran_int_t info(0); + LAPACK_DPFTRI( &lapack_option< TransR >::value, &lapack_option< + UpLo >::value, &n, a, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename TransR, typename UpLo > +inline std::ptrdiff_t pftri( const TransR, const UpLo, const fortran_int_t n, + std::complex* a ) { + fortran_int_t info(0); + LAPACK_CPFTRI( &lapack_option< TransR >::value, &lapack_option< + UpLo >::value, &n, a, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename TransR, typename UpLo > +inline std::ptrdiff_t pftri( const TransR, const UpLo, const fortran_int_t n, + std::complex* a ) { + fortran_int_t info(0); + LAPACK_ZPFTRI( &lapack_option< TransR >::value, &lapack_option< + UpLo >::value, &n, a, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pftri. +// +template< typename Value > +struct pftri_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA > + static std::ptrdiff_t invoke( MatrixA& a ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename blas::detail::default_order< MatrixA >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type transr; + typedef typename result_of::uplo_tag< MatrixA, transr >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_column_op(a, transr()) >= 0 ); + return detail::pftri( transr(), uplo(), bindings::size_column_op(a, + transr()), bindings::begin_value(a) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pftri_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pftri. Its overload differs for +// +template< typename MatrixA > +inline std::ptrdiff_t pftri( MatrixA& a ) { + return pftri_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pftrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/pftrs.hpp new file mode 100644 index 0000000..97de34d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pftrs.hpp @@ -0,0 +1,173 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PFTRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PFTRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pftrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename TransR, typename UpLo > +inline std::ptrdiff_t pftrs( const TransR, const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const float* a, float* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SPFTRS( &lapack_option< TransR >::value, &lapack_option< + UpLo >::value, &n, &nrhs, a, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename TransR, typename UpLo > +inline std::ptrdiff_t pftrs( const TransR, const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const double* a, double* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DPFTRS( &lapack_option< TransR >::value, &lapack_option< + UpLo >::value, &n, &nrhs, a, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename TransR, typename UpLo > +inline std::ptrdiff_t pftrs( const TransR, const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CPFTRS( &lapack_option< TransR >::value, &lapack_option< + UpLo >::value, &n, &nrhs, a, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename TransR, typename UpLo > +inline std::ptrdiff_t pftrs( const TransR, const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZPFTRS( &lapack_option< TransR >::value, &lapack_option< + UpLo >::value, &n, &nrhs, a, b, &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pftrs. +// +template< typename Value > +struct pftrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB > + static std::ptrdiff_t invoke( const MatrixA& a, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type transr; + typedef typename result_of::uplo_tag< MatrixA, transr >::type uplo; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(a, transr()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, transr())) ); + return detail::pftrs( transr(), uplo(), bindings::size_column_op(a, + transr()), bindings::size_column(b), bindings::begin_value(a), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pftrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pftrs. Its overload differs for +// +template< typename MatrixA, typename MatrixB > +inline std::ptrdiff_t pftrs( const MatrixA& a, MatrixB& b ) { + return pftrs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pocon.hpp b/sdk/boost/numeric/bindings/lapack/computational/pocon.hpp new file mode 100644 index 0000000..fbadc15 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pocon.hpp @@ -0,0 +1,340 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_POCON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_POCON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pocon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pocon( const UpLo, const fortran_int_t n, const float* a, + const fortran_int_t lda, const float anorm, float& rcond, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SPOCON( &lapack_option< UpLo >::value, &n, a, &lda, &anorm, &rcond, + work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pocon( const UpLo, const fortran_int_t n, + const double* a, const fortran_int_t lda, const double anorm, + double& rcond, double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DPOCON( &lapack_option< UpLo >::value, &n, a, &lda, &anorm, &rcond, + work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pocon( const UpLo, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const float anorm, float& rcond, std::complex* work, + float* rwork ) { + fortran_int_t info(0); + LAPACK_CPOCON( &lapack_option< UpLo >::value, &n, a, &lda, &anorm, &rcond, + work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pocon( const UpLo, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const double anorm, double& rcond, std::complex* work, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZPOCON( &lapack_option< UpLo >::value, &n, a, &lda, &anorm, &rcond, + work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pocon. +// +template< typename Value, typename Enable = void > +struct pocon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct pocon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const real_type anorm, + real_type& rcond, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::pocon( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), anorm, + rcond, bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const MatrixA& a, const real_type anorm, + real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( a, anorm, rcond, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const MatrixA& a, const real_type anorm, + real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct pocon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const real_type anorm, + real_type& rcond, detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::pocon( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), anorm, + rcond, bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const MatrixA& a, const real_type anorm, + real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( a, anorm, rcond, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const MatrixA& a, const real_type anorm, + real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pocon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pocon. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +pocon( const MatrixA& a, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type anorm, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& rcond, Workspace work ) { + return pocon_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, anorm, rcond, work ); +} + +// +// Overloaded function for pocon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA > +inline typename boost::disable_if< detail::is_workspace< MatrixA >, + std::ptrdiff_t >::type +pocon( const MatrixA& a, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type anorm, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& rcond ) { + return pocon_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, anorm, rcond, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/poequ.hpp b/sdk/boost/numeric/bindings/lapack/computational/poequ.hpp new file mode 100644 index 0000000..596358d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/poequ.hpp @@ -0,0 +1,203 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_POEQU_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_POEQU_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for poequ is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t poequ( const fortran_int_t n, const float* a, + const fortran_int_t lda, float* s, float& scond, float& amax ) { + fortran_int_t info(0); + LAPACK_SPOEQU( &n, a, &lda, s, &scond, &amax, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t poequ( const fortran_int_t n, const double* a, + const fortran_int_t lda, double* s, double& scond, double& amax ) { + fortran_int_t info(0); + LAPACK_DPOEQU( &n, a, &lda, s, &scond, &amax, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t poequ( const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, float* s, + float& scond, float& amax ) { + fortran_int_t info(0); + LAPACK_CPOEQU( &n, a, &lda, s, &scond, &amax, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t poequ( const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, double* s, + double& scond, double& amax ) { + fortran_int_t info(0); + LAPACK_ZPOEQU( &n, a, &lda, s, &scond, &amax, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to poequ. +// +template< typename Value, typename Enable = void > +struct poequ_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct poequ_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorS > + static std::ptrdiff_t invoke( const MatrixA& a, VectorS& s, + real_type& scond, real_type& amax ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::poequ( bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(s), scond, amax ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct poequ_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorS > + static std::ptrdiff_t invoke( const MatrixA& a, VectorS& s, + real_type& scond, real_type& amax ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::poequ( bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(s), scond, amax ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the poequ_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for poequ. Its overload differs for +// +template< typename MatrixA, typename VectorS > +inline std::ptrdiff_t poequ( const MatrixA& a, VectorS& s, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& scond, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& amax ) { + return poequ_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, s, scond, amax ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/porfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/porfs.hpp new file mode 100644 index 0000000..a6af1ad --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/porfs.hpp @@ -0,0 +1,452 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PORFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PORFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for porfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t porfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const float* a, const fortran_int_t lda, + const float* af, const fortran_int_t ldaf, const float* b, + const fortran_int_t ldb, float* x, const fortran_int_t ldx, + float* ferr, float* berr, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SPORFS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, af, + &ldaf, b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t porfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const double* a, const fortran_int_t lda, + const double* af, const fortran_int_t ldaf, const double* b, + const fortran_int_t ldb, double* x, const fortran_int_t ldx, + double* ferr, double* berr, double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DPORFS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, af, + &ldaf, b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t porfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const std::complex* af, + const fortran_int_t ldaf, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, float* ferr, float* berr, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CPORFS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, af, + &ldaf, b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t porfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const std::complex* af, + const fortran_int_t ldaf, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, double* ferr, double* berr, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZPORFS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, af, + &ldaf, b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to porfs. +// +template< typename Value, typename Enable = void > +struct porfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct porfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::porfs( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( a, af, b, x, ferr, berr, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, af, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct porfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::porfs( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( a, af, b, x, ferr, berr, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, af, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the porfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for porfs. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixAF, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +porfs( const MatrixA& a, const MatrixAF& af, const MatrixB& b, + MatrixX& x, VectorFERR& ferr, VectorBERR& berr, Workspace work ) { + return porfs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, af, b, x, ferr, berr, work ); +} + +// +// Overloaded function for porfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixAF, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +porfs( const MatrixA& a, const MatrixAF& af, const MatrixB& b, + MatrixX& x, VectorFERR& ferr, VectorBERR& berr ) { + return porfs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, af, b, x, ferr, berr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/potrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/potrf.hpp new file mode 100644 index 0000000..f64a511 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/potrf.hpp @@ -0,0 +1,220 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_POTRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_POTRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for potrf is selected by defining a pre-processor +// variable, which can be one of +// * for ATLAS's CLAPACK, define BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// * netlib-compatible LAPACK is the default +// +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrf( Order, const UpLo, const int n, float* a, + const int lda ) { + return clapack_spotrf( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, a, lda ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrf( Order, const UpLo, const int n, double* a, + const int lda ) { + return clapack_dpotrf( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, a, lda ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrf( Order, const UpLo, const int n, + std::complex* a, const int lda ) { + return clapack_cpotrf( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, a, lda ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrf( Order, const UpLo, const int n, + std::complex* a, const int lda ) { + return clapack_zpotrf( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, a, lda ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrf( Order, const UpLo, const fortran_int_t n, + float* a, const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_SPOTRF( &lapack_option< UpLo >::value, &n, a, &lda, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrf( Order, const UpLo, const fortran_int_t n, + double* a, const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_DPOTRF( &lapack_option< UpLo >::value, &n, a, &lda, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrf( Order, const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_CPOTRF( &lapack_option< UpLo >::value, &n, a, &lda, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrf( Order, const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_ZPOTRF( &lapack_option< UpLo >::value, &n, a, &lda, &info ); + return info; +} + +#endif +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to potrf. +// +template< typename Value > +struct potrf_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA > + static std::ptrdiff_t invoke( MatrixA& a ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::potrf( order(), uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the potrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for potrf. Its overload differs for +// +template< typename MatrixA > +inline std::ptrdiff_t potrf( MatrixA& a ) { + return potrf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/potri.hpp b/sdk/boost/numeric/bindings/lapack/computational/potri.hpp new file mode 100644 index 0000000..6abfdcb --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/potri.hpp @@ -0,0 +1,220 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_POTRI_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_POTRI_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for potri is selected by defining a pre-processor +// variable, which can be one of +// * for ATLAS's CLAPACK, define BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// * netlib-compatible LAPACK is the default +// +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potri( Order, const UpLo, const int n, float* a, + const int lda ) { + return clapack_spotri( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, a, lda ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potri( Order, const UpLo, const int n, double* a, + const int lda ) { + return clapack_dpotri( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, a, lda ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potri( Order, const UpLo, const int n, + std::complex* a, const int lda ) { + return clapack_cpotri( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, a, lda ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potri( Order, const UpLo, const int n, + std::complex* a, const int lda ) { + return clapack_zpotri( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, a, lda ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potri( Order, const UpLo, const fortran_int_t n, + float* a, const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_SPOTRI( &lapack_option< UpLo >::value, &n, a, &lda, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potri( Order, const UpLo, const fortran_int_t n, + double* a, const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_DPOTRI( &lapack_option< UpLo >::value, &n, a, &lda, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potri( Order, const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_CPOTRI( &lapack_option< UpLo >::value, &n, a, &lda, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potri( Order, const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_ZPOTRI( &lapack_option< UpLo >::value, &n, a, &lda, &info ); + return info; +} + +#endif +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to potri. +// +template< typename Value > +struct potri_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA > + static std::ptrdiff_t invoke( MatrixA& a ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::potri( order(), uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the potri_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for potri. Its overload differs for +// +template< typename MatrixA > +inline std::ptrdiff_t potri( MatrixA& a ) { + return potri_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/potrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/potrs.hpp new file mode 100644 index 0000000..2587e5d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/potrs.hpp @@ -0,0 +1,245 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_POTRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_POTRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for potrs is selected by defining a pre-processor +// variable, which can be one of +// * for ATLAS's CLAPACK, define BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// * netlib-compatible LAPACK is the default +// +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrs( Order, const UpLo, const int n, const int nrhs, + const float* a, const int lda, float* b, const int ldb ) { + return clapack_spotrs( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, nrhs, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrs( Order, const UpLo, const int n, const int nrhs, + const double* a, const int lda, double* b, const int ldb ) { + return clapack_dpotrs( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, nrhs, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrs( Order, const UpLo, const int n, const int nrhs, + const std::complex* a, const int lda, std::complex* b, + const int ldb ) { + return clapack_cpotrs( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, nrhs, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrs( Order, const UpLo, const int n, const int nrhs, + const std::complex* a, const int lda, std::complex* b, + const int ldb ) { + return clapack_zpotrs( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, nrhs, a, lda, b, ldb ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrs( Order, const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const float* a, const fortran_int_t lda, + float* b, const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_SPOTRS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrs( Order, const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const double* a, const fortran_int_t lda, + double* b, const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_DPOTRS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrs( Order, const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_CPOTRS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t potrs( Order, const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_ZPOTRS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, b, &ldb, + &info ); + return info; +} + +#endif +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to potrs. +// +template< typename Value > +struct potrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB > + static std::ptrdiff_t invoke( const MatrixA& a, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::potrs( order(), uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the potrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for potrs. Its overload differs for +// +template< typename MatrixA, typename MatrixB > +inline std::ptrdiff_t potrs( const MatrixA& a, MatrixB& b ) { + return potrs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ppcon.hpp b/sdk/boost/numeric/bindings/lapack/computational/ppcon.hpp new file mode 100644 index 0000000..30ec573 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ppcon.hpp @@ -0,0 +1,328 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PPCON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PPCON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ppcon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppcon( const UpLo, const fortran_int_t n, + const float* ap, const float anorm, float& rcond, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SPPCON( &lapack_option< UpLo >::value, &n, ap, &anorm, &rcond, + work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppcon( const UpLo, const fortran_int_t n, + const double* ap, const double anorm, double& rcond, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DPPCON( &lapack_option< UpLo >::value, &n, ap, &anorm, &rcond, + work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppcon( const UpLo, const fortran_int_t n, + const std::complex* ap, const float anorm, float& rcond, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CPPCON( &lapack_option< UpLo >::value, &n, ap, &anorm, &rcond, + work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppcon( const UpLo, const fortran_int_t n, + const std::complex* ap, const double anorm, double& rcond, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZPPCON( &lapack_option< UpLo >::value, &n, ap, &anorm, &rcond, + work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ppcon. +// +template< typename Value, typename Enable = void > +struct ppcon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ppcon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const real_type anorm, + real_type& rcond, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::ppcon( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), anorm, rcond, + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const MatrixAP& ap, const real_type anorm, + real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( ap, anorm, rcond, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const MatrixAP& ap, const real_type anorm, + real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ppcon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const real_type anorm, + real_type& rcond, detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::ppcon( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), anorm, rcond, + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const MatrixAP& ap, const real_type anorm, + real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ap) ) ); + return invoke( ap, anorm, rcond, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const MatrixAP& ap, const real_type anorm, + real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ppcon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ppcon. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ppcon( const MatrixAP& ap, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type anorm, + typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type& rcond, Workspace work ) { + return ppcon_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, anorm, rcond, work ); +} + +// +// Overloaded function for ppcon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP > +inline typename boost::disable_if< detail::is_workspace< MatrixAP >, + std::ptrdiff_t >::type +ppcon( const MatrixAP& ap, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type anorm, + typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type& rcond ) { + return ppcon_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, anorm, rcond, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ppequ.hpp b/sdk/boost/numeric/bindings/lapack/computational/ppequ.hpp new file mode 100644 index 0000000..277e904 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ppequ.hpp @@ -0,0 +1,202 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PPEQU_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PPEQU_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ppequ is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppequ( const UpLo, const fortran_int_t n, + const float* ap, float* s, float& scond, float& amax ) { + fortran_int_t info(0); + LAPACK_SPPEQU( &lapack_option< UpLo >::value, &n, ap, s, &scond, &amax, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppequ( const UpLo, const fortran_int_t n, + const double* ap, double* s, double& scond, double& amax ) { + fortran_int_t info(0); + LAPACK_DPPEQU( &lapack_option< UpLo >::value, &n, ap, s, &scond, &amax, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppequ( const UpLo, const fortran_int_t n, + const std::complex* ap, float* s, float& scond, float& amax ) { + fortran_int_t info(0); + LAPACK_CPPEQU( &lapack_option< UpLo >::value, &n, ap, s, &scond, &amax, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppequ( const UpLo, const fortran_int_t n, + const std::complex* ap, double* s, double& scond, + double& amax ) { + fortran_int_t info(0); + LAPACK_ZPPEQU( &lapack_option< UpLo >::value, &n, ap, s, &scond, &amax, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ppequ. +// +template< typename Value, typename Enable = void > +struct ppequ_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ppequ_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorS > + static std::ptrdiff_t invoke( const MatrixAP& ap, VectorS& s, + real_type& scond, real_type& amax ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::ppequ( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(s), scond, + amax ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ppequ_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorS > + static std::ptrdiff_t invoke( const MatrixAP& ap, VectorS& s, + real_type& scond, real_type& amax ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::ppequ( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(s), scond, + amax ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ppequ_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ppequ. Its overload differs for +// +template< typename MatrixAP, typename VectorS > +inline std::ptrdiff_t ppequ( const MatrixAP& ap, VectorS& s, + typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type& scond, typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type& amax ) { + return ppequ_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, s, scond, amax ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pprfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/pprfs.hpp new file mode 100644 index 0000000..3d21837 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pprfs.hpp @@ -0,0 +1,428 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PPRFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PPRFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pprfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pprfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const float* ap, const float* afp, + const float* b, const fortran_int_t ldb, float* x, + const fortran_int_t ldx, float* ferr, float* berr, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SPPRFS( &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, b, &ldb, + x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pprfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const double* ap, const double* afp, + const double* b, const fortran_int_t ldb, double* x, + const fortran_int_t ldx, double* ferr, double* berr, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DPPRFS( &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, b, &ldb, + x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pprfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* ap, + const std::complex* afp, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, float* ferr, float* berr, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CPPRFS( &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, b, &ldb, + x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pprfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* ap, + const std::complex* afp, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, double* ferr, double* berr, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZPPRFS( &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, b, &ldb, + x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pprfs. +// +template< typename Value, typename Enable = void > +struct pprfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct pprfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixAFP, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + return detail::pprfs( uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(afp), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixAFP, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( ap, afp, b, x, ferr, berr, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixAFP, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, afp, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct pprfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixAFP, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + return detail::pprfs( uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(afp), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixAFP, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ap) ) ); + return invoke( ap, afp, b, x, ferr, berr, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixAFP, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, afp, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pprfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pprfs. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename MatrixAFP, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +pprfs( const MatrixAP& ap, const MatrixAFP& afp, const MatrixB& b, + MatrixX& x, VectorFERR& ferr, VectorBERR& berr, Workspace work ) { + return pprfs_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, afp, b, x, ferr, berr, work ); +} + +// +// Overloaded function for pprfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename MatrixAFP, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +pprfs( const MatrixAP& ap, const MatrixAFP& afp, const MatrixB& b, + MatrixX& x, VectorFERR& ferr, VectorBERR& berr ) { + return pprfs_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, afp, b, x, ferr, berr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pptrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/pptrf.hpp new file mode 100644 index 0000000..0913fe9 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pptrf.hpp @@ -0,0 +1,149 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PPTRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PPTRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pptrf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pptrf( const UpLo, const fortran_int_t n, float* ap ) { + fortran_int_t info(0); + LAPACK_SPPTRF( &lapack_option< UpLo >::value, &n, ap, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pptrf( const UpLo, const fortran_int_t n, double* ap ) { + fortran_int_t info(0); + LAPACK_DPPTRF( &lapack_option< UpLo >::value, &n, ap, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pptrf( const UpLo, const fortran_int_t n, + std::complex* ap ) { + fortran_int_t info(0); + LAPACK_CPPTRF( &lapack_option< UpLo >::value, &n, ap, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pptrf( const UpLo, const fortran_int_t n, + std::complex* ap ) { + fortran_int_t info(0); + LAPACK_ZPPTRF( &lapack_option< UpLo >::value, &n, ap, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pptrf. +// +template< typename Value > +struct pptrf_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( MatrixAP& ap ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::pptrf( uplo(), bindings::size_column(ap), + bindings::begin_value(ap) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pptrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pptrf. Its overload differs for +// +template< typename MatrixAP > +inline std::ptrdiff_t pptrf( MatrixAP& ap ) { + return pptrf_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pptri.hpp b/sdk/boost/numeric/bindings/lapack/computational/pptri.hpp new file mode 100644 index 0000000..7aff4a1 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pptri.hpp @@ -0,0 +1,149 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PPTRI_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PPTRI_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pptri is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pptri( const UpLo, const fortran_int_t n, float* ap ) { + fortran_int_t info(0); + LAPACK_SPPTRI( &lapack_option< UpLo >::value, &n, ap, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pptri( const UpLo, const fortran_int_t n, double* ap ) { + fortran_int_t info(0); + LAPACK_DPPTRI( &lapack_option< UpLo >::value, &n, ap, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pptri( const UpLo, const fortran_int_t n, + std::complex* ap ) { + fortran_int_t info(0); + LAPACK_CPPTRI( &lapack_option< UpLo >::value, &n, ap, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pptri( const UpLo, const fortran_int_t n, + std::complex* ap ) { + fortran_int_t info(0); + LAPACK_ZPPTRI( &lapack_option< UpLo >::value, &n, ap, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pptri. +// +template< typename Value > +struct pptri_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( MatrixAP& ap ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::pptri( uplo(), bindings::size_column(ap), + bindings::begin_value(ap) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pptri_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pptri. Its overload differs for +// +template< typename MatrixAP > +inline std::ptrdiff_t pptri( MatrixAP& ap ) { + return pptri_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pptrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/pptrs.hpp new file mode 100644 index 0000000..e47e1ff --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pptrs.hpp @@ -0,0 +1,171 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PPTRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PPTRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pptrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pptrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const float* ap, float* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SPPTRS( &lapack_option< UpLo >::value, &n, &nrhs, ap, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pptrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const double* ap, double* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DPPTRS( &lapack_option< UpLo >::value, &n, &nrhs, ap, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pptrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* ap, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CPPTRS( &lapack_option< UpLo >::value, &n, &nrhs, ap, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pptrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* ap, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZPPTRS( &lapack_option< UpLo >::value, &n, &nrhs, ap, b, &ldb, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pptrs. +// +template< typename Value > +struct pptrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixB > + static std::ptrdiff_t invoke( const MatrixAP& ap, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + return detail::pptrs( uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pptrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pptrs. Its overload differs for +// +template< typename MatrixAP, typename MatrixB > +inline std::ptrdiff_t pptrs( const MatrixAP& ap, MatrixB& b ) { + return pptrs_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pstrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/pstrf.hpp new file mode 100644 index 0000000..5933686 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pstrf.hpp @@ -0,0 +1,234 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PSTRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PSTRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pstrf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pstrf( const UpLo, const fortran_int_t n, float* a, + const fortran_int_t lda, fortran_int_t* piv, fortran_int_t& rank, + const float tol, float* work ) { + fortran_int_t info(0); + LAPACK_SPSTRF( &lapack_option< UpLo >::value, &n, a, &lda, piv, &rank, + &tol, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pstrf( const UpLo, const fortran_int_t n, double* a, + const fortran_int_t lda, fortran_int_t* piv, fortran_int_t& rank, + const double tol, double* work ) { + fortran_int_t info(0); + LAPACK_DPSTRF( &lapack_option< UpLo >::value, &n, a, &lda, piv, &rank, + &tol, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pstrf( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, fortran_int_t* piv, + fortran_int_t& rank, const float tol, float* work ) { + fortran_int_t info(0); + LAPACK_CPSTRF( &lapack_option< UpLo >::value, &n, a, &lda, piv, &rank, + &tol, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pstrf( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, fortran_int_t* piv, + fortran_int_t& rank, const double tol, double* work ) { + fortran_int_t info(0); + LAPACK_ZPSTRF( &lapack_option< UpLo >::value, &n, a, &lda, piv, &rank, + &tol, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pstrf. +// +template< typename Value > +struct pstrf_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorPIV& piv, + fortran_int_t& rank, const real_type tol, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorPIV >::value) ); + BOOST_ASSERT( bindings::size(piv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::pstrf( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(piv), rank, tol, + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorPIV > + static std::ptrdiff_t invoke( MatrixA& a, VectorPIV& piv, + fortran_int_t& rank, const real_type tol, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, piv, rank, tol, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorPIV > + static std::ptrdiff_t invoke( MatrixA& a, VectorPIV& piv, + fortran_int_t& rank, const real_type tol, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, piv, rank, tol, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pstrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pstrf. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorPIV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +pstrf( MatrixA& a, VectorPIV& piv, fortran_int_t& rank, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type tol, Workspace work ) { + return pstrf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, piv, rank, tol, work ); +} + +// +// Overloaded function for pstrf. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorPIV > +inline typename boost::disable_if< detail::is_workspace< VectorPIV >, + std::ptrdiff_t >::type +pstrf( MatrixA& a, VectorPIV& piv, fortran_int_t& rank, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type tol ) { + return pstrf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, piv, rank, tol, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ptcon.hpp b/sdk/boost/numeric/bindings/lapack/computational/ptcon.hpp new file mode 100644 index 0000000..b7f458b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ptcon.hpp @@ -0,0 +1,296 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PTCON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PTCON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ptcon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ptcon( const fortran_int_t n, const float* d, + const float* e, const float anorm, float& rcond, float* work ) { + fortran_int_t info(0); + LAPACK_SPTCON( &n, d, e, &anorm, &rcond, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ptcon( const fortran_int_t n, const double* d, + const double* e, const double anorm, double& rcond, double* work ) { + fortran_int_t info(0); + LAPACK_DPTCON( &n, d, e, &anorm, &rcond, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ptcon( const fortran_int_t n, const float* d, + const std::complex* e, const float anorm, float& rcond, + float* rwork ) { + fortran_int_t info(0); + LAPACK_CPTCON( &n, d, e, &anorm, &rcond, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ptcon( const fortran_int_t n, const double* d, + const std::complex* e, const double anorm, double& rcond, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZPTCON( &n, d, e, &anorm, &rcond, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ptcon. +// +template< typename Value, typename Enable = void > +struct ptcon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ptcon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename WORK > + static std::ptrdiff_t invoke( const VectorD& d, const VectorE& e, + const real_type anorm, real_type& rcond, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size(d) )); + return detail::ptcon( bindings::size(d), bindings::begin_value(d), + bindings::begin_value(e), anorm, rcond, + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE > + static std::ptrdiff_t invoke( const VectorD& d, const VectorE& e, + const real_type anorm, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size(d) ) ); + return invoke( d, e, anorm, rcond, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE > + static std::ptrdiff_t invoke( const VectorD& d, const VectorE& e, + const real_type anorm, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( d, e, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ptcon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename RWORK > + static std::ptrdiff_t invoke( const VectorD& d, const VectorE& e, + const real_type anorm, real_type& rcond, detail::workspace1< + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size(d) )); + return detail::ptcon( bindings::size(d), bindings::begin_value(d), + bindings::begin_value(e), anorm, rcond, + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE > + static std::ptrdiff_t invoke( const VectorD& d, const VectorE& e, + const real_type anorm, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size(d) ) ); + return invoke( d, e, anorm, rcond, workspace( tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE > + static std::ptrdiff_t invoke( const VectorD& d, const VectorE& e, + const real_type anorm, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( d, e, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ptcon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ptcon. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ptcon( const VectorD& d, const VectorE& e, + const typename remove_imaginary< typename bindings::value_type< + VectorE >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< VectorE >::type >::type& rcond, + Workspace work ) { + return ptcon_impl< typename bindings::value_type< + VectorE >::type >::invoke( d, e, anorm, rcond, work ); +} + +// +// Overloaded function for ptcon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE > +inline typename boost::disable_if< detail::is_workspace< VectorE >, + std::ptrdiff_t >::type +ptcon( const VectorD& d, const VectorE& e, + const typename remove_imaginary< typename bindings::value_type< + VectorE >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< VectorE >::type >::type& rcond ) { + return ptcon_impl< typename bindings::value_type< + VectorE >::type >::invoke( d, e, anorm, rcond, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pteqr.hpp b/sdk/boost/numeric/bindings/lapack/computational/pteqr.hpp new file mode 100644 index 0000000..860e8f3 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pteqr.hpp @@ -0,0 +1,316 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PTEQR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PTEQR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pteqr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t pteqr( const char compz, const fortran_int_t n, float* d, + float* e, float* z, const fortran_int_t ldz, float* work ) { + fortran_int_t info(0); + LAPACK_SPTEQR( &compz, &n, d, e, z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t pteqr( const char compz, const fortran_int_t n, + double* d, double* e, double* z, const fortran_int_t ldz, + double* work ) { + fortran_int_t info(0); + LAPACK_DPTEQR( &compz, &n, d, e, z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t pteqr( const char compz, const fortran_int_t n, float* d, + float* e, std::complex* z, const fortran_int_t ldz, + float* work ) { + fortran_int_t info(0); + LAPACK_CPTEQR( &compz, &n, d, e, z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t pteqr( const char compz, const fortran_int_t n, + double* d, double* e, std::complex* z, + const fortran_int_t ldz, double* work ) { + fortran_int_t info(0); + LAPACK_ZPTEQR( &compz, &n, d, e, z, &ldz, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pteqr. +// +template< typename Value, typename Enable = void > +struct pteqr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct pteqr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixZ, + typename WORK > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size(d) )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( compz == 'N' || compz == 'V' || compz == 'I' ); + return detail::pteqr( compz, bindings::size(d), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size(d) ) ); + return invoke( compz, d, e, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( compz, d, e, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 4*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct pteqr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixZ, + typename WORK > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size(d) )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( compz == 'N' || compz == 'V' || compz == 'I' ); + return detail::pteqr( compz, bindings::size(d), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size(d) ) ); + return invoke( compz, d, e, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( compz, d, e, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 4*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pteqr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pteqr. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +pteqr( const char compz, VectorD& d, VectorE& e, MatrixZ& z, + Workspace work ) { + return pteqr_impl< typename bindings::value_type< + MatrixZ >::type >::invoke( compz, d, e, z, work ); +} + +// +// Overloaded function for pteqr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +pteqr( const char compz, VectorD& d, VectorE& e, MatrixZ& z ) { + return pteqr_impl< typename bindings::value_type< + MatrixZ >::type >::invoke( compz, d, e, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ptrfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/ptrfs.hpp new file mode 100644 index 0000000..c9af937 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ptrfs.hpp @@ -0,0 +1,478 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PTRFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PTRFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ptrfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ptrfs( const fortran_int_t n, const fortran_int_t nrhs, + const float* d, const float* e, const float* df, const float* ef, + const float* b, const fortran_int_t ldb, float* x, + const fortran_int_t ldx, float* ferr, float* berr, float* work ) { + fortran_int_t info(0); + LAPACK_SPTRFS( &n, &nrhs, d, e, df, ef, b, &ldb, x, &ldx, ferr, berr, + work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ptrfs( const fortran_int_t n, const fortran_int_t nrhs, + const double* d, const double* e, const double* df, const double* ef, + const double* b, const fortran_int_t ldb, double* x, + const fortran_int_t ldx, double* ferr, double* berr, double* work ) { + fortran_int_t info(0); + LAPACK_DPTRFS( &n, &nrhs, d, e, df, ef, b, &ldb, x, &ldx, ferr, berr, + work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ptrfs( const char uplo, const fortran_int_t n, + const fortran_int_t nrhs, const float* d, + const std::complex* e, const float* df, + const std::complex* ef, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, float* ferr, float* berr, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CPTRFS( &uplo, &n, &nrhs, d, e, df, ef, b, &ldb, x, &ldx, ferr, + berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ptrfs( const char uplo, const fortran_int_t n, + const fortran_int_t nrhs, const double* d, + const std::complex* e, const double* df, + const std::complex* ef, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, double* ferr, double* berr, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZPTRFS( &uplo, &n, &nrhs, d, e, df, ef, b, &ldb, x, &ldx, ferr, + berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ptrfs. +// +template< typename Value, typename Enable = void > +struct ptrfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ptrfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename WORK > + static std::ptrdiff_t invoke( const VectorD& d, const VectorE& e, + const VectorDF& df, const VectorEF& ef, const MatrixB& b, + MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorEF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(df) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(ef) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size(d) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size(d)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size(d)) ); + return detail::ptrfs( bindings::size(d), bindings::size_column(b), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(df), bindings::begin_value(ef), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const VectorD& d, const VectorE& e, + const VectorDF& df, const VectorEF& ef, const MatrixB& b, + MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size(d) ) ); + return invoke( d, e, df, ef, b, x, ferr, berr, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const VectorD& d, const VectorE& e, + const VectorDF& df, const VectorEF& ef, const MatrixB& b, + MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( d, e, df, ef, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ptrfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename WORK, + typename RWORK > + static std::ptrdiff_t invoke( const char uplo, const VectorD& d, + const VectorE& e, const VectorDF& df, const VectorEF& ef, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorE >::type >::type, + typename remove_const< typename bindings::value_type< + VectorEF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorE >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorE >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(df) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(ef) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size(d) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size(d) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size(d)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size(d)) ); + return detail::ptrfs( uplo, bindings::size(d), + bindings::size_column(b), bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(df), + bindings::begin_value(ef), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char uplo, const VectorD& d, + const VectorE& e, const VectorDF& df, const VectorEF& ef, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size(d) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size(d) ) ); + return invoke( uplo, d, e, df, ef, b, x, ferr, berr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char uplo, const VectorD& d, + const VectorE& e, const VectorDF& df, const VectorEF& ef, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( uplo, d, e, df, ef, b, x, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ptrfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ptrfs. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ptrfs( const VectorD& d, const VectorE& e, const VectorDF& df, + const VectorEF& ef, const MatrixB& b, MatrixX& x, VectorFERR& ferr, + VectorBERR& berr, Workspace work ) { + return ptrfs_impl< typename bindings::value_type< + VectorE >::type >::invoke( d, e, df, ef, b, x, ferr, berr, work ); +} + +// +// Overloaded function for ptrfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +ptrfs( const VectorD& d, const VectorE& e, const VectorDF& df, + const VectorEF& ef, const MatrixB& b, MatrixX& x, VectorFERR& ferr, + VectorBERR& berr ) { + return ptrfs_impl< typename bindings::value_type< + VectorE >::type >::invoke( d, e, df, ef, b, x, ferr, berr, + optimal_workspace() ); +} + +// +// Overloaded function for ptrfs. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ptrfs( const char uplo, const VectorD& d, const VectorE& e, + const VectorDF& df, const VectorEF& ef, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, Workspace work ) { + return ptrfs_impl< typename bindings::value_type< + VectorE >::type >::invoke( uplo, d, e, df, ef, b, x, ferr, berr, + work ); +} + +// +// Overloaded function for ptrfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +ptrfs( const char uplo, const VectorD& d, const VectorE& e, + const VectorDF& df, const VectorEF& ef, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr ) { + return ptrfs_impl< typename bindings::value_type< + VectorE >::type >::invoke( uplo, d, e, df, ef, b, x, ferr, berr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pttrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/pttrf.hpp new file mode 100644 index 0000000..731d7bf --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pttrf.hpp @@ -0,0 +1,187 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PTTRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PTTRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pttrf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t pttrf( const fortran_int_t n, float* d, float* e ) { + fortran_int_t info(0); + LAPACK_SPTTRF( &n, d, e, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t pttrf( const fortran_int_t n, double* d, double* e ) { + fortran_int_t info(0); + LAPACK_DPTTRF( &n, d, e, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t pttrf( const fortran_int_t n, float* d, + std::complex* e ) { + fortran_int_t info(0); + LAPACK_CPTTRF( &n, d, e, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t pttrf( const fortran_int_t n, double* d, + std::complex* e ) { + fortran_int_t info(0); + LAPACK_ZPTTRF( &n, d, e, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pttrf. +// +template< typename Value, typename Enable = void > +struct pttrf_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct pttrf_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE > + static std::ptrdiff_t invoke( VectorD& d, VectorE& e ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + return detail::pttrf( bindings::size(d), bindings::begin_value(d), + bindings::begin_value(e) ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct pttrf_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE > + static std::ptrdiff_t invoke( VectorD& d, VectorE& e ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + return detail::pttrf( bindings::size(d), bindings::begin_value(d), + bindings::begin_value(e) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pttrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pttrf. Its overload differs for +// +template< typename VectorD, typename VectorE > +inline std::ptrdiff_t pttrf( VectorD& d, VectorE& e ) { + return pttrf_impl< typename bindings::value_type< + VectorE >::type >::invoke( d, e ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/pttrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/pttrs.hpp new file mode 100644 index 0000000..7cf377b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/pttrs.hpp @@ -0,0 +1,229 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PTTRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_PTTRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pttrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t pttrs( const fortran_int_t n, const fortran_int_t nrhs, + const float* d, const float* e, float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SPTTRS( &n, &nrhs, d, e, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t pttrs( const fortran_int_t n, const fortran_int_t nrhs, + const double* d, const double* e, double* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DPTTRS( &n, &nrhs, d, e, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t pttrs( const char uplo, const fortran_int_t n, + const fortran_int_t nrhs, const float* d, + const std::complex* e, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CPTTRS( &uplo, &n, &nrhs, d, e, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t pttrs( const char uplo, const fortran_int_t n, + const fortran_int_t nrhs, const double* d, + const std::complex* e, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZPTTRS( &uplo, &n, &nrhs, d, e, b, &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pttrs. +// +template< typename Value, typename Enable = void > +struct pttrs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct pttrs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixB > + static std::ptrdiff_t invoke( const VectorD& d, const VectorE& e, + MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size(d)) ); + return detail::pttrs( bindings::size(d), bindings::size_column(b), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct pttrs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixB > + static std::ptrdiff_t invoke( const char uplo, const VectorD& d, + const VectorE& e, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorE >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size(d)) ); + return detail::pttrs( uplo, bindings::size(d), + bindings::size_column(b), bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(b), + bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pttrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pttrs. Its overload differs for +// +template< typename VectorD, typename VectorE, typename MatrixB > +inline std::ptrdiff_t pttrs( const VectorD& d, const VectorE& e, + MatrixB& b ) { + return pttrs_impl< typename bindings::value_type< + VectorE >::type >::invoke( d, e, b ); +} + +// +// Overloaded function for pttrs. Its overload differs for +// +template< typename VectorD, typename VectorE, typename MatrixB > +inline std::ptrdiff_t pttrs( const char uplo, const VectorD& d, + const VectorE& e, MatrixB& b ) { + return pttrs_impl< typename bindings::value_type< + VectorE >::type >::invoke( uplo, d, e, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sbgst.hpp b/sdk/boost/numeric/bindings/lapack/computational/sbgst.hpp new file mode 100644 index 0000000..687a6f8 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sbgst.hpp @@ -0,0 +1,226 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SBGST_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SBGST_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sbgst is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbgst( const char vect, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + float* ab, const fortran_int_t ldab, const float* bb, + const fortran_int_t ldbb, float* x, const fortran_int_t ldx, + float* work ) { + fortran_int_t info(0); + LAPACK_SSBGST( &vect, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, x, &ldx, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbgst( const char vect, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + double* ab, const fortran_int_t ldab, const double* bb, + const fortran_int_t ldbb, double* x, const fortran_int_t ldx, + double* work ) { + fortran_int_t info(0); + LAPACK_DSBGST( &vect, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, x, &ldx, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sbgst. +// +template< typename Value > +struct sbgst_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixBB, typename MatrixX, + typename WORK > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, + const MatrixBB& bb, MatrixX& x, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(bb) == 1 || + bindings::stride_minor(bb) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(bb) >= bindings::bandwidth(bb, + uplo())+1 ); + BOOST_ASSERT( vect == 'N' || vect == 'V' ); + return detail::sbgst( vect, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(x), + bindings::stride_major(x), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixBB, typename MatrixX > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, + const MatrixBB& bb, MatrixX& x, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + return invoke( vect, ab, bb, x, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixBB, typename MatrixX > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, + const MatrixBB& bb, MatrixX& x, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( vect, ab, bb, x, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sbgst_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sbgst. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixBB, typename MatrixX, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sbgst( const char vect, MatrixAB& ab, const MatrixBB& bb, MatrixX& x, + Workspace work ) { + return sbgst_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( vect, ab, bb, x, work ); +} + +// +// Overloaded function for sbgst. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixBB, typename MatrixX > +inline typename boost::disable_if< detail::is_workspace< MatrixX >, + std::ptrdiff_t >::type +sbgst( const char vect, MatrixAB& ab, const MatrixBB& bb, MatrixX& x ) { + return sbgst_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( vect, ab, bb, x, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sbtrd.hpp b/sdk/boost/numeric/bindings/lapack/computational/sbtrd.hpp new file mode 100644 index 0000000..de7f151 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sbtrd.hpp @@ -0,0 +1,230 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SBTRD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SBTRD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sbtrd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbtrd( const char vect, const UpLo, + const fortran_int_t n, const fortran_int_t kd, float* ab, + const fortran_int_t ldab, float* d, float* e, float* q, + const fortran_int_t ldq, float* work ) { + fortran_int_t info(0); + LAPACK_SSBTRD( &vect, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, + d, e, q, &ldq, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbtrd( const char vect, const UpLo, + const fortran_int_t n, const fortran_int_t kd, double* ab, + const fortran_int_t ldab, double* d, double* e, double* q, + const fortran_int_t ldq, double* work ) { + fortran_int_t info(0); + LAPACK_DSBTRD( &vect, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, + d, e, q, &ldq, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sbtrd. +// +template< typename Value > +struct sbtrd_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ, typename WORK > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column(ab) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( vect == 'N' || vect == 'V' || vect == 'U' ); + return detail::sbtrd( vect, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(q), + bindings::stride_major(q), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + return invoke( vect, ab, d, e, q, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ > + static std::ptrdiff_t invoke( const char vect, MatrixAB& ab, VectorD& d, + VectorE& e, MatrixQ& q, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( vect, ab, d, e, q, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sbtrd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sbtrd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sbtrd( const char vect, MatrixAB& ab, VectorD& d, VectorE& e, MatrixQ& q, + Workspace work ) { + return sbtrd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( vect, ab, d, e, q, work ); +} + +// +// Overloaded function for sbtrd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename VectorD, typename VectorE, + typename MatrixQ > +inline typename boost::disable_if< detail::is_workspace< MatrixQ >, + std::ptrdiff_t >::type +sbtrd( const char vect, MatrixAB& ab, VectorD& d, VectorE& e, + MatrixQ& q ) { + return sbtrd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( vect, ab, d, e, q, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/spcon.hpp b/sdk/boost/numeric/bindings/lapack/computational/spcon.hpp new file mode 100644 index 0000000..cea240c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/spcon.hpp @@ -0,0 +1,322 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SPCON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SPCON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for spcon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spcon( const UpLo, const fortran_int_t n, + const float* ap, const fortran_int_t* ipiv, const float anorm, + float& rcond, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SSPCON( &lapack_option< UpLo >::value, &n, ap, ipiv, &anorm, + &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spcon( const UpLo, const fortran_int_t n, + const double* ap, const fortran_int_t* ipiv, const double anorm, + double& rcond, double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DSPCON( &lapack_option< UpLo >::value, &n, ap, ipiv, &anorm, + &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spcon( const UpLo, const fortran_int_t n, + const std::complex* ap, const fortran_int_t* ipiv, + const float anorm, float& rcond, std::complex* work ) { + fortran_int_t info(0); + LAPACK_CSPCON( &lapack_option< UpLo >::value, &n, ap, ipiv, &anorm, + &rcond, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spcon( const UpLo, const fortran_int_t n, + const std::complex* ap, const fortran_int_t* ipiv, + const double anorm, double& rcond, std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZSPCON( &lapack_option< UpLo >::value, &n, ap, ipiv, &anorm, + &rcond, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to spcon. +// +template< typename Value, typename Enable = void > +struct spcon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct spcon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::spcon( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(ipiv), anorm, + rcond, bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( ap, ipiv, anorm, rcond, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, ipiv, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct spcon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::spcon( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(ipiv), anorm, + rcond, bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + return invoke( ap, ipiv, anorm, rcond, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, ipiv, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the spcon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for spcon. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename VectorIPIV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +spcon( const MatrixAP& ap, const VectorIPIV& ipiv, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type& rcond, + Workspace work ) { + return spcon_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv, anorm, rcond, work ); +} + +// +// Overloaded function for spcon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename VectorIPIV > +inline typename boost::disable_if< detail::is_workspace< VectorIPIV >, + std::ptrdiff_t >::type +spcon( const MatrixAP& ap, const VectorIPIV& ipiv, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type& rcond ) { + return spcon_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv, anorm, rcond, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sprfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/sprfs.hpp new file mode 100644 index 0000000..96a0821 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sprfs.hpp @@ -0,0 +1,439 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SPRFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SPRFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sprfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sprfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const float* ap, const float* afp, + const fortran_int_t* ipiv, const float* b, const fortran_int_t ldb, + float* x, const fortran_int_t ldx, float* ferr, float* berr, + float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SSPRFS( &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, ipiv, b, + &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sprfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const double* ap, const double* afp, + const fortran_int_t* ipiv, const double* b, const fortran_int_t ldb, + double* x, const fortran_int_t ldx, double* ferr, double* berr, + double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DSPRFS( &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, ipiv, b, + &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sprfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* ap, + const std::complex* afp, const fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float* ferr, + float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CSPRFS( &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, ipiv, b, + &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sprfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* ap, + const std::complex* afp, const fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, double* ferr, + double* berr, std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZSPRFS( &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, ipiv, b, + &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sprfs. +// +template< typename Value, typename Enable = void > +struct sprfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct sprfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + return detail::sprfs( uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(afp), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( ap, afp, ipiv, b, x, ferr, berr, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, afp, ipiv, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct sprfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + return detail::sprfs( uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(afp), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ap) ) ); + return invoke( ap, afp, ipiv, b, x, ferr, berr, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixAFP& afp, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, afp, ipiv, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sprfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sprfs. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sprfs( const MatrixAP& ap, const MatrixAFP& afp, const VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + Workspace work ) { + return sprfs_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, afp, ipiv, b, x, ferr, berr, + work ); +} + +// +// Overloaded function for sprfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +sprfs( const MatrixAP& ap, const MatrixAFP& afp, const VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr ) { + return sprfs_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, afp, ipiv, b, x, ferr, berr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sptrd.hpp b/sdk/boost/numeric/bindings/lapack/computational/sptrd.hpp new file mode 100644 index 0000000..ed6d85b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sptrd.hpp @@ -0,0 +1,147 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SPTRD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SPTRD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sptrd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptrd( const UpLo, const fortran_int_t n, float* ap, + float* d, float* e, float* tau ) { + fortran_int_t info(0); + LAPACK_SSPTRD( &lapack_option< UpLo >::value, &n, ap, d, e, tau, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptrd( const UpLo, const fortran_int_t n, double* ap, + double* d, double* e, double* tau ) { + fortran_int_t info(0); + LAPACK_DSPTRD( &lapack_option< UpLo >::value, &n, ap, d, e, tau, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sptrd. +// +template< typename Value > +struct sptrd_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorD, typename VectorE, + typename VectorTAU > + static std::ptrdiff_t invoke( MatrixAP& ap, VectorD& d, VectorE& e, + VectorTAU& tau ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_column(ap)-1 ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::sptrd( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(tau) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sptrd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sptrd. Its overload differs for +// +template< typename MatrixAP, typename VectorD, typename VectorE, + typename VectorTAU > +inline std::ptrdiff_t sptrd( MatrixAP& ap, VectorD& d, VectorE& e, + VectorTAU& tau ) { + return sptrd_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, d, e, tau ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sptrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/sptrf.hpp new file mode 100644 index 0000000..ce4487f --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sptrf.hpp @@ -0,0 +1,152 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SPTRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SPTRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sptrf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptrf( const UpLo, const fortran_int_t n, float* ap, + fortran_int_t* ipiv ) { + fortran_int_t info(0); + LAPACK_SSPTRF( &lapack_option< UpLo >::value, &n, ap, ipiv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptrf( const UpLo, const fortran_int_t n, double* ap, + fortran_int_t* ipiv ) { + fortran_int_t info(0); + LAPACK_DSPTRF( &lapack_option< UpLo >::value, &n, ap, ipiv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptrf( const UpLo, const fortran_int_t n, + std::complex* ap, fortran_int_t* ipiv ) { + fortran_int_t info(0); + LAPACK_CSPTRF( &lapack_option< UpLo >::value, &n, ap, ipiv, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptrf( const UpLo, const fortran_int_t n, + std::complex* ap, fortran_int_t* ipiv ) { + fortran_int_t info(0); + LAPACK_ZSPTRF( &lapack_option< UpLo >::value, &n, ap, ipiv, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sptrf. +// +template< typename Value > +struct sptrf_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixAP& ap, VectorIPIV& ipiv ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::sptrf( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(ipiv) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sptrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sptrf. Its overload differs for +// +template< typename MatrixAP, typename VectorIPIV > +inline std::ptrdiff_t sptrf( MatrixAP& ap, VectorIPIV& ipiv ) { + return sptrf_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sptri.hpp b/sdk/boost/numeric/bindings/lapack/computational/sptri.hpp new file mode 100644 index 0000000..bdb86ea --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sptri.hpp @@ -0,0 +1,293 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SPTRI_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SPTRI_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sptri is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptri( const UpLo, const fortran_int_t n, float* ap, + const fortran_int_t* ipiv, float* work ) { + fortran_int_t info(0); + LAPACK_SSPTRI( &lapack_option< UpLo >::value, &n, ap, ipiv, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptri( const UpLo, const fortran_int_t n, double* ap, + const fortran_int_t* ipiv, double* work ) { + fortran_int_t info(0); + LAPACK_DSPTRI( &lapack_option< UpLo >::value, &n, ap, ipiv, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptri( const UpLo, const fortran_int_t n, + std::complex* ap, const fortran_int_t* ipiv, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_CSPTRI( &lapack_option< UpLo >::value, &n, ap, ipiv, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptri( const UpLo, const fortran_int_t n, + std::complex* ap, const fortran_int_t* ipiv, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZSPTRI( &lapack_option< UpLo >::value, &n, ap, ipiv, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sptri. +// +template< typename Value, typename Enable = void > +struct sptri_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct sptri_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixAP& ap, const VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::sptri( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(ipiv), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixAP& ap, const VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + return invoke( ap, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixAP& ap, const VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, ipiv, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct sptri_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixAP& ap, const VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::sptri( uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(ipiv), + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixAP& ap, const VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + return invoke( ap, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixAP& ap, const VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( ap, ipiv, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sptri_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sptri. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename VectorIPIV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sptri( MatrixAP& ap, const VectorIPIV& ipiv, Workspace work ) { + return sptri_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv, work ); +} + +// +// Overloaded function for sptri. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename VectorIPIV > +inline typename boost::disable_if< detail::is_workspace< VectorIPIV >, + std::ptrdiff_t >::type +sptri( MatrixAP& ap, const VectorIPIV& ipiv ) { + return sptri_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sptrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/sptrs.hpp new file mode 100644 index 0000000..3da99e6 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sptrs.hpp @@ -0,0 +1,177 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SPTRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SPTRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sptrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const float* ap, const fortran_int_t* ipiv, + float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SSPTRS( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const double* ap, const fortran_int_t* ipiv, + double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DSPTRS( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* ap, + const fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CSPTRS( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sptrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* ap, + const fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZSPTRS( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, + &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sptrs. +// +template< typename Value > +struct sptrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( const MatrixAP& ap, const VectorIPIV& ipiv, + MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + return detail::sptrs( uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(ipiv), bindings::begin_value(b), + bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sptrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sptrs. Its overload differs for +// +template< typename MatrixAP, typename VectorIPIV, typename MatrixB > +inline std::ptrdiff_t sptrs( const MatrixAP& ap, const VectorIPIV& ipiv, + MatrixB& b ) { + return sptrs_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/stebz.hpp b/sdk/boost/numeric/bindings/lapack/computational/stebz.hpp new file mode 100644 index 0000000..843cc77 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/stebz.hpp @@ -0,0 +1,262 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STEBZ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STEBZ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for stebz is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t stebz( const char range, const char order, + const fortran_int_t n, const float vl, const float vu, + const fortran_int_t il, const fortran_int_t iu, const float abstol, + const float* d, const float* e, fortran_int_t& m, + fortran_int_t& nsplit, float* w, fortran_int_t* iblock, + fortran_int_t* isplit, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SSTEBZ( &range, &order, &n, &vl, &vu, &il, &iu, &abstol, d, e, &m, + &nsplit, w, iblock, isplit, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t stebz( const char range, const char order, + const fortran_int_t n, const double vl, const double vu, + const fortran_int_t il, const fortran_int_t iu, const double abstol, + const double* d, const double* e, fortran_int_t& m, + fortran_int_t& nsplit, double* w, fortran_int_t* iblock, + fortran_int_t* isplit, double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DSTEBZ( &range, &order, &n, &vl, &vu, &il, &iu, &abstol, d, e, &m, + &nsplit, w, iblock, isplit, work, iwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to stebz. +// +template< typename Value > +struct stebz_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorW, + typename VectorIBLOCK, typename VectorISPLIT, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const char range, const char order, + const fortran_int_t n, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, const VectorD& d, const VectorE& e, + fortran_int_t& m, fortran_int_t& nsplit, VectorW& w, + VectorIBLOCK& iblock, VectorISPLIT& isplit, detail::workspace2< + WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorIBLOCK >::type >::type, + typename remove_const< typename bindings::value_type< + VectorISPLIT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIBLOCK >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorISPLIT >::value) ); + BOOST_ASSERT( bindings::size(d) >= n ); + BOOST_ASSERT( bindings::size(e) >= n-1 ); + BOOST_ASSERT( bindings::size(isplit) >= n ); + BOOST_ASSERT( bindings::size(w) >= n ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n )); + BOOST_ASSERT( n >= 0 ); + BOOST_ASSERT( order == 'B' || order == 'E' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::stebz( range, order, n, vl, vu, il, iu, abstol, + bindings::begin_value(d), bindings::begin_value(e), m, nsplit, + bindings::begin_value(w), bindings::begin_value(iblock), + bindings::begin_value(isplit), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename VectorIBLOCK, typename VectorISPLIT > + static std::ptrdiff_t invoke( const char range, const char order, + const fortran_int_t n, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, const VectorD& d, const VectorE& e, + fortran_int_t& m, fortran_int_t& nsplit, VectorW& w, + VectorIBLOCK& iblock, VectorISPLIT& isplit, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( n ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n ) ); + return invoke( range, order, n, vl, vu, il, iu, abstol, d, e, m, + nsplit, w, iblock, isplit, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename VectorIBLOCK, typename VectorISPLIT > + static std::ptrdiff_t invoke( const char range, const char order, + const fortran_int_t n, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, const VectorD& d, const VectorE& e, + fortran_int_t& m, fortran_int_t& nsplit, VectorW& w, + VectorIBLOCK& iblock, VectorISPLIT& isplit, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( range, order, n, vl, vu, il, iu, abstol, d, e, m, + nsplit, w, iblock, isplit, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 4*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 3*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the stebz_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for stebz. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename VectorW, + typename VectorIBLOCK, typename VectorISPLIT, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +stebz( const char range, const char order, const fortran_int_t n, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type abstol, const VectorD& d, const VectorE& e, + fortran_int_t& m, fortran_int_t& nsplit, VectorW& w, + VectorIBLOCK& iblock, VectorISPLIT& isplit, Workspace work ) { + return stebz_impl< typename bindings::value_type< + VectorD >::type >::invoke( range, order, n, vl, vu, il, iu, + abstol, d, e, m, nsplit, w, iblock, isplit, work ); +} + +// +// Overloaded function for stebz. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename VectorW, + typename VectorIBLOCK, typename VectorISPLIT > +inline typename boost::disable_if< detail::is_workspace< VectorISPLIT >, + std::ptrdiff_t >::type +stebz( const char range, const char order, const fortran_int_t n, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type abstol, const VectorD& d, const VectorE& e, + fortran_int_t& m, fortran_int_t& nsplit, VectorW& w, + VectorIBLOCK& iblock, VectorISPLIT& isplit ) { + return stebz_impl< typename bindings::value_type< + VectorD >::type >::invoke( range, order, n, vl, vu, il, iu, + abstol, d, e, m, nsplit, w, iblock, isplit, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/stedc.hpp b/sdk/boost/numeric/bindings/lapack/computational/stedc.hpp new file mode 100644 index 0000000..3c3975b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/stedc.hpp @@ -0,0 +1,432 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STEDC_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STEDC_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for stedc is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t stedc( const char compz, const fortran_int_t n, float* d, + float* e, float* z, const fortran_int_t ldz, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSTEDC( &compz, &n, d, e, z, &ldz, work, &lwork, iwork, &liwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t stedc( const char compz, const fortran_int_t n, + double* d, double* e, double* z, const fortran_int_t ldz, + double* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSTEDC( &compz, &n, d, e, z, &ldz, work, &lwork, iwork, &liwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t stedc( const char compz, const fortran_int_t n, float* d, + float* e, std::complex* z, const fortran_int_t ldz, + std::complex* work, const fortran_int_t lwork, float* rwork, + const fortran_int_t lrwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_CSTEDC( &compz, &n, d, e, z, &ldz, work, &lwork, rwork, &lrwork, + iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t stedc( const char compz, const fortran_int_t n, + double* d, double* e, std::complex* z, + const fortran_int_t ldz, std::complex* work, + const fortran_int_t lwork, double* rwork, const fortran_int_t lrwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_ZSTEDC( &compz, &n, d, e, z, &ldz, work, &lwork, rwork, &lrwork, + iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to stedc. +// +template< typename Value, typename Enable = void > +struct stedc_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct stedc_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixZ, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( compz, bindings::size(d) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( compz, bindings::size(d) )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( compz == 'N' || compz == 'I' || compz == 'V' ); + return detail::stedc( compz, bindings::size(d), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( compz, + bindings::size(d) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( compz, bindings::size(d) ) ); + return invoke( compz, d, e, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::stedc( compz, bindings::size(d), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( compz, d, e, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char compz, + const std::ptrdiff_t n ) { + if ( compz == 'N' || n <= 1 ) { + return 1; + } else if ( compz == 'V' ) { + return 1 + 3*n + 2*n*static_cast(std::ceil(std::log( + n)/std::log(2))) + 3*n*n; + } else { // compz == 'I' + return 1 + 4*n + n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char compz, + const std::ptrdiff_t n ) { + if ( compz == 'N' || n <= 1 ) { + return 1; + } else if ( compz == 'V' ) { + return 6 + 6*n + 5*n*static_cast(std::ceil(std::log( + n)/std::log(2))); + } else { // compz == 'I' + return 3 + 5*n; + } + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct stedc_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixZ, + typename WORK, typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, detail::workspace3< WORK, RWORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( compz, bindings::size(d) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( compz, bindings::size(d) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( compz, bindings::size(d) )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( compz == 'N' || compz == 'I' || compz == 'V' ); + return detail::stedc( compz, bindings::size(d), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( compz, + bindings::size(d) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( compz, + bindings::size(d) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( compz, bindings::size(d) ) ); + return invoke( compz, d, e, z, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + real_type opt_size_rwork; + fortran_int_t opt_size_iwork; + detail::stedc( compz, bindings::size(d), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, &opt_size_rwork, -1, &opt_size_iwork, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< real_type > tmp_rwork( + traits::detail::to_int( opt_size_rwork ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( compz, d, e, z, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char compz, + const std::ptrdiff_t n ) { + if ( compz == 'N' || compz == 'I' || n <= 1 ) { + return 1; + } else { // compz == 'V' + return n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const char compz, + const std::ptrdiff_t n ) { + if ( compz == 'N' || n <= 1 ) { + return 1; + } else if ( compz == 'V' ) { + return 1 + 3*n + 2*n*static_cast(std::ceil(std::log( + n)/std::log(2))) + 3*n*n; + } else { // compz == 'I' + return 1 + 4*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char compz, + const std::ptrdiff_t n ) { + if ( compz == 'N' || n <= 1 ) { + return 1; + } else if ( compz == 'V' ) { + return 6 + 6*n + 5*n*static_cast(std::ceil(std::log( + n)/std::log(2))); + } else { // compz == 'I' + return 3 + 5*n; + } + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the stedc_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for stedc. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +stedc( const char compz, VectorD& d, VectorE& e, MatrixZ& z, + Workspace work ) { + return stedc_impl< typename bindings::value_type< + MatrixZ >::type >::invoke( compz, d, e, z, work ); +} + +// +// Overloaded function for stedc. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +stedc( const char compz, VectorD& d, VectorE& e, MatrixZ& z ) { + return stedc_impl< typename bindings::value_type< + MatrixZ >::type >::invoke( compz, d, e, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/stegr.hpp b/sdk/boost/numeric/bindings/lapack/computational/stegr.hpp new file mode 100644 index 0000000..fbb194f --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/stegr.hpp @@ -0,0 +1,481 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STEGR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STEGR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for stegr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t stegr( const char jobz, const char range, + const fortran_int_t n, float* d, float* e, const float vl, + const float vu, const fortran_int_t il, const fortran_int_t iu, + const float abstol, fortran_int_t& m, float* w, float* z, + const fortran_int_t ldz, fortran_int_t* isuppz, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSTEGR( &jobz, &range, &n, d, e, &vl, &vu, &il, &iu, &abstol, &m, + w, z, &ldz, isuppz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t stegr( const char jobz, const char range, + const fortran_int_t n, double* d, double* e, const double vl, + const double vu, const fortran_int_t il, const fortran_int_t iu, + const double abstol, fortran_int_t& m, double* w, double* z, + const fortran_int_t ldz, fortran_int_t* isuppz, double* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSTEGR( &jobz, &range, &n, d, e, &vl, &vu, &il, &iu, &abstol, &m, + w, z, &ldz, isuppz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t stegr( const char jobz, const char range, + const fortran_int_t n, float* d, float* e, const float vl, + const float vu, const fortran_int_t il, const fortran_int_t iu, + const float abstol, fortran_int_t& m, float* w, + std::complex* z, const fortran_int_t ldz, + fortran_int_t* isuppz, float* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_CSTEGR( &jobz, &range, &n, d, e, &vl, &vu, &il, &iu, &abstol, &m, + w, z, &ldz, isuppz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t stegr( const char jobz, const char range, + const fortran_int_t n, double* d, double* e, const double vl, + const double vu, const fortran_int_t il, const fortran_int_t iu, + const double abstol, fortran_int_t& m, double* w, + std::complex* z, const fortran_int_t ldz, + fortran_int_t* isuppz, double* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_ZSTEGR( &jobz, &range, &n, d, e, &vl, &vu, &il, &iu, &abstol, &m, + w, z, &ldz, isuppz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to stegr. +// +template< typename Value, typename Enable = void > +struct stegr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct stegr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorISUPPZ >::value) ); + BOOST_ASSERT( bindings::size(d) >= n ); + BOOST_ASSERT( bindings::size(e) >= n ); + BOOST_ASSERT( bindings::size(w) >= n ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n, jobz )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n, jobz )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( n >= 0 ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::stegr( jobz, range, n, bindings::begin_value(d), + bindings::begin_value(e), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), bindings::begin_value(isuppz), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( n, + jobz ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n, jobz ) ); + return invoke( jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z, + isuppz, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::stegr( jobz, range, n, bindings::begin_value(d), + bindings::begin_value(e), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), bindings::begin_value(isuppz), + &opt_size_work, -1, &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z, + isuppz, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const char jobz ) { + if ( jobz == 'V' ) { + return std::max< std::ptrdiff_t >( 1, 18*n ); + } else { + return std::max< std::ptrdiff_t >( 1, 12*n ); + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n, + const char jobz ) { + if ( jobz == 'V' ) { + return std::max< std::ptrdiff_t >( 1, 10*n ); + } else { + return std::max< std::ptrdiff_t >( 1, 8*n ); + } + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct stegr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorISUPPZ >::value) ); + BOOST_ASSERT( bindings::size(d) >= n ); + BOOST_ASSERT( bindings::size(e) >= n ); + BOOST_ASSERT( bindings::size(w) >= n ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n, jobz )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n, jobz )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( n >= 0 ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::stegr( jobz, range, n, bindings::begin_value(d), + bindings::begin_value(e), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), bindings::begin_value(isuppz), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( n, + jobz ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n, jobz ) ); + return invoke( jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z, + isuppz, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::stegr( jobz, range, n, bindings::begin_value(d), + bindings::begin_value(e), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), bindings::begin_value(isuppz), + &opt_size_work, -1, &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z, + isuppz, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const char jobz ) { + if ( jobz == 'V' ) { + return std::max< std::ptrdiff_t >( 1, 18*n ); + } else { + return std::max< std::ptrdiff_t >( 1, 12*n ); + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n, + const char jobz ) { + if ( jobz == 'V' ) { + return std::max< std::ptrdiff_t >( 1, 10*n ); + } else { + return std::max< std::ptrdiff_t >( 1, 8*n ); + } + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the stegr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for stegr. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +stegr( const char jobz, const char range, const fortran_int_t n, + VectorD& d, VectorE& e, const typename remove_imaginary< + typename bindings::value_type< MatrixZ >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixZ >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixZ >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorISUPPZ& isuppz, + Workspace work ) { + return stegr_impl< typename bindings::value_type< + MatrixZ >::type >::invoke( jobz, range, n, d, e, vl, vu, il, iu, + abstol, m, w, z, isuppz, work ); +} + +// +// Overloaded function for stegr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ > +inline typename boost::disable_if< detail::is_workspace< VectorISUPPZ >, + std::ptrdiff_t >::type +stegr( const char jobz, const char range, const fortran_int_t n, + VectorD& d, VectorE& e, const typename remove_imaginary< + typename bindings::value_type< MatrixZ >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixZ >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixZ >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorISUPPZ& isuppz ) { + return stegr_impl< typename bindings::value_type< + MatrixZ >::type >::invoke( jobz, range, n, d, e, vl, vu, il, iu, + abstol, m, w, z, isuppz, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/stein.hpp b/sdk/boost/numeric/bindings/lapack/computational/stein.hpp new file mode 100644 index 0000000..ea45c81 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/stein.hpp @@ -0,0 +1,423 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STEIN_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STEIN_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for stein is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t stein( const fortran_int_t n, const float* d, + const float* e, const fortran_int_t m, const float* w, + const fortran_int_t* iblock, const fortran_int_t* isplit, float* z, + const fortran_int_t ldz, float* work, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSTEIN( &n, d, e, &m, w, iblock, isplit, z, &ldz, work, iwork, + ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t stein( const fortran_int_t n, const double* d, + const double* e, const fortran_int_t m, const double* w, + const fortran_int_t* iblock, const fortran_int_t* isplit, double* z, + const fortran_int_t ldz, double* work, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSTEIN( &n, d, e, &m, w, iblock, isplit, z, &ldz, work, iwork, + ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t stein( const fortran_int_t n, const float* d, + const float* e, const fortran_int_t m, const float* w, + const fortran_int_t* iblock, const fortran_int_t* isplit, + std::complex* z, const fortran_int_t ldz, float* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_CSTEIN( &n, d, e, &m, w, iblock, isplit, z, &ldz, work, iwork, + ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t stein( const fortran_int_t n, const double* d, + const double* e, const fortran_int_t m, const double* w, + const fortran_int_t* iblock, const fortran_int_t* isplit, + std::complex* z, const fortran_int_t ldz, double* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_ZSTEIN( &n, d, e, &m, w, iblock, isplit, z, &ldz, work, iwork, + ifail, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to stein. +// +template< typename Value, typename Enable = void > +struct stein_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct stein_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorW, + typename VectorIBLOCK, typename VectorISPLIT, typename MatrixZ, + typename VectorIFAIL, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t n, const VectorD& d, + const VectorE& e, const fortran_int_t m, const VectorW& w, + const VectorIBLOCK& iblock, const VectorISPLIT& isplit, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorIBLOCK >::type >::type, + typename remove_const< typename bindings::value_type< + VectorISPLIT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorIBLOCK >::type >::type, + typename remove_const< typename bindings::value_type< + VectorIFAIL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(d) >= n ); + BOOST_ASSERT( bindings::size(e) >= n-1 ); + BOOST_ASSERT( bindings::size(isplit) >= n ); + BOOST_ASSERT( bindings::size(w) >= n ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(z) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( n >= 0 ); + return detail::stein( n, bindings::begin_value(d), + bindings::begin_value(e), m, bindings::begin_value(w), + bindings::begin_value(iblock), bindings::begin_value(isplit), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename VectorIBLOCK, typename VectorISPLIT, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t n, const VectorD& d, + const VectorE& e, const fortran_int_t m, const VectorW& w, + const VectorIBLOCK& iblock, const VectorISPLIT& isplit, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( n ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n ) ); + return invoke( n, d, e, m, w, iblock, isplit, z, ifail, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename VectorIBLOCK, typename VectorISPLIT, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t n, const VectorD& d, + const VectorE& e, const fortran_int_t m, const VectorW& w, + const VectorIBLOCK& iblock, const VectorISPLIT& isplit, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( n, d, e, m, w, iblock, isplit, z, ifail, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 5*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct stein_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorW, + typename VectorIBLOCK, typename VectorISPLIT, typename MatrixZ, + typename VectorIFAIL, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t n, const VectorD& d, + const VectorE& e, const fortran_int_t m, const VectorW& w, + const VectorIBLOCK& iblock, const VectorISPLIT& isplit, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorIBLOCK >::type >::type, + typename remove_const< typename bindings::value_type< + VectorISPLIT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorIBLOCK >::type >::type, + typename remove_const< typename bindings::value_type< + VectorIFAIL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(d) >= n ); + BOOST_ASSERT( bindings::size(e) >= n-1 ); + BOOST_ASSERT( bindings::size(isplit) >= n ); + BOOST_ASSERT( bindings::size(w) >= n ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(z) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( n >= 0 ); + return detail::stein( n, bindings::begin_value(d), + bindings::begin_value(e), m, bindings::begin_value(w), + bindings::begin_value(iblock), bindings::begin_value(isplit), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename VectorIBLOCK, typename VectorISPLIT, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t n, const VectorD& d, + const VectorE& e, const fortran_int_t m, const VectorW& w, + const VectorIBLOCK& iblock, const VectorISPLIT& isplit, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( n ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n ) ); + return invoke( n, d, e, m, w, iblock, isplit, z, ifail, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename VectorIBLOCK, typename VectorISPLIT, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t n, const VectorD& d, + const VectorE& e, const fortran_int_t m, const VectorW& w, + const VectorIBLOCK& iblock, const VectorISPLIT& isplit, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( n, d, e, m, w, iblock, isplit, z, ifail, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 5*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the stein_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for stein. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename VectorW, + typename VectorIBLOCK, typename VectorISPLIT, typename MatrixZ, + typename VectorIFAIL, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +stein( const fortran_int_t n, const VectorD& d, const VectorE& e, + const fortran_int_t m, const VectorW& w, + const VectorIBLOCK& iblock, const VectorISPLIT& isplit, MatrixZ& z, + VectorIFAIL& ifail, Workspace work ) { + return stein_impl< typename bindings::value_type< + MatrixZ >::type >::invoke( n, d, e, m, w, iblock, isplit, z, + ifail, work ); +} + +// +// Overloaded function for stein. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename VectorW, + typename VectorIBLOCK, typename VectorISPLIT, typename MatrixZ, + typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +stein( const fortran_int_t n, const VectorD& d, const VectorE& e, + const fortran_int_t m, const VectorW& w, + const VectorIBLOCK& iblock, const VectorISPLIT& isplit, MatrixZ& z, + VectorIFAIL& ifail ) { + return stein_impl< typename bindings::value_type< + MatrixZ >::type >::invoke( n, d, e, m, w, iblock, isplit, z, + ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/stemr.hpp b/sdk/boost/numeric/bindings/lapack/computational/stemr.hpp new file mode 100644 index 0000000..c941bd6 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/stemr.hpp @@ -0,0 +1,486 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STEMR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STEMR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for stemr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t stemr( const char jobz, const char range, + const fortran_int_t n, float* d, float* e, const float vl, + const float vu, const fortran_int_t il, const fortran_int_t iu, + fortran_int_t& m, float* w, float* z, const fortran_int_t ldz, + const fortran_int_t nzc, fortran_int_t* isuppz, + fortran_bool_t& tryrac, float* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSTEMR( &jobz, &range, &n, d, e, &vl, &vu, &il, &iu, &m, w, z, + &ldz, &nzc, isuppz, &tryrac, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t stemr( const char jobz, const char range, + const fortran_int_t n, double* d, double* e, const double vl, + const double vu, const fortran_int_t il, const fortran_int_t iu, + fortran_int_t& m, double* w, double* z, const fortran_int_t ldz, + const fortran_int_t nzc, fortran_int_t* isuppz, + fortran_bool_t& tryrac, double* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSTEMR( &jobz, &range, &n, d, e, &vl, &vu, &il, &iu, &m, w, z, + &ldz, &nzc, isuppz, &tryrac, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t stemr( const char jobz, const char range, + const fortran_int_t n, float* d, float* e, const float vl, + const float vu, const fortran_int_t il, const fortran_int_t iu, + fortran_int_t& m, float* w, std::complex* z, + const fortran_int_t ldz, const fortran_int_t nzc, + fortran_int_t* isuppz, fortran_bool_t& tryrac, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_CSTEMR( &jobz, &range, &n, d, e, &vl, &vu, &il, &iu, &m, w, z, + &ldz, &nzc, isuppz, &tryrac, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t stemr( const char jobz, const char range, + const fortran_int_t n, double* d, double* e, const double vl, + const double vu, const fortran_int_t il, const fortran_int_t iu, + fortran_int_t& m, double* w, std::complex* z, + const fortran_int_t ldz, const fortran_int_t nzc, + fortran_int_t* isuppz, fortran_bool_t& tryrac, double* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_ZSTEMR( &jobz, &range, &n, d, e, &vl, &vu, &il, &iu, &m, w, z, + &ldz, &nzc, isuppz, &tryrac, work, &lwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to stemr. +// +template< typename Value, typename Enable = void > +struct stemr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct stemr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + fortran_int_t& m, VectorW& w, MatrixZ& z, + const fortran_int_t nzc, VectorISUPPZ& isuppz, + fortran_bool_t& tryrac, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorISUPPZ >::value) ); + BOOST_ASSERT( bindings::size(d) >= n ); + BOOST_ASSERT( bindings::size(e) >= n ); + BOOST_ASSERT( bindings::size(w) >= n ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n, jobz )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n, jobz )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( n >= 0 ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::stemr( jobz, range, n, bindings::begin_value(d), + bindings::begin_value(e), vl, vu, il, iu, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), nzc, bindings::begin_value(isuppz), + tryrac, bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + fortran_int_t& m, VectorW& w, MatrixZ& z, + const fortran_int_t nzc, VectorISUPPZ& isuppz, + fortran_bool_t& tryrac, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( n, + jobz ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n, jobz ) ); + return invoke( jobz, range, n, d, e, vl, vu, il, iu, m, w, z, nzc, + isuppz, tryrac, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + fortran_int_t& m, VectorW& w, MatrixZ& z, + const fortran_int_t nzc, VectorISUPPZ& isuppz, + fortran_bool_t& tryrac, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::stemr( jobz, range, n, bindings::begin_value(d), + bindings::begin_value(e), vl, vu, il, iu, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), nzc, bindings::begin_value(isuppz), + tryrac, &opt_size_work, -1, &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, range, n, d, e, vl, vu, il, iu, m, w, z, nzc, + isuppz, tryrac, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const char jobz ) { + if ( jobz == 'V' ) { + return std::max< std::ptrdiff_t >( 1, 18*n ); + } else { + return std::max< std::ptrdiff_t >( 1, 12*n ); + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n, + const char jobz ) { + if ( jobz == 'V' ) { + return std::max< std::ptrdiff_t >( 1, 10*n ); + } else { + return std::max< std::ptrdiff_t >( 1, 8*n ); + } + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct stemr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + fortran_int_t& m, VectorW& w, MatrixZ& z, + const fortran_int_t nzc, VectorISUPPZ& isuppz, + fortran_bool_t& tryrac, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorISUPPZ >::value) ); + BOOST_ASSERT( bindings::size(d) >= n ); + BOOST_ASSERT( bindings::size(e) >= n ); + BOOST_ASSERT( bindings::size(w) >= n ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n, jobz )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n, jobz )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( n >= 0 ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::stemr( jobz, range, n, bindings::begin_value(d), + bindings::begin_value(e), vl, vu, il, iu, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), nzc, bindings::begin_value(isuppz), + tryrac, bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + fortran_int_t& m, VectorW& w, MatrixZ& z, + const fortran_int_t nzc, VectorISUPPZ& isuppz, + fortran_bool_t& tryrac, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( n, + jobz ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n, jobz ) ); + return invoke( jobz, range, n, d, e, vl, vu, il, iu, m, w, z, nzc, + isuppz, tryrac, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + fortran_int_t& m, VectorW& w, MatrixZ& z, + const fortran_int_t nzc, VectorISUPPZ& isuppz, + fortran_bool_t& tryrac, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::stemr( jobz, range, n, bindings::begin_value(d), + bindings::begin_value(e), vl, vu, il, iu, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), nzc, bindings::begin_value(isuppz), + tryrac, &opt_size_work, -1, &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, range, n, d, e, vl, vu, il, iu, m, w, z, nzc, + isuppz, tryrac, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const char jobz ) { + if ( jobz == 'V' ) { + return std::max< std::ptrdiff_t >( 1, 18*n ); + } else { + return std::max< std::ptrdiff_t >( 1, 12*n ); + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n, + const char jobz ) { + if ( jobz == 'V' ) { + return std::max< std::ptrdiff_t >( 1, 10*n ); + } else { + return std::max< std::ptrdiff_t >( 1, 8*n ); + } + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the stemr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for stemr. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +stemr( const char jobz, const char range, const fortran_int_t n, + VectorD& d, VectorE& e, const typename remove_imaginary< + typename bindings::value_type< MatrixZ >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixZ >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, fortran_int_t& m, VectorW& w, + MatrixZ& z, const fortran_int_t nzc, VectorISUPPZ& isuppz, + fortran_bool_t& tryrac, Workspace work ) { + return stemr_impl< typename bindings::value_type< + MatrixZ >::type >::invoke( jobz, range, n, d, e, vl, vu, il, iu, + m, w, z, nzc, isuppz, tryrac, work ); +} + +// +// Overloaded function for stemr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ > +inline typename boost::disable_if< detail::is_workspace< VectorISUPPZ >, + std::ptrdiff_t >::type +stemr( const char jobz, const char range, const fortran_int_t n, + VectorD& d, VectorE& e, const typename remove_imaginary< + typename bindings::value_type< MatrixZ >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixZ >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, fortran_int_t& m, VectorW& w, + MatrixZ& z, const fortran_int_t nzc, VectorISUPPZ& isuppz, + fortran_bool_t& tryrac ) { + return stemr_impl< typename bindings::value_type< + MatrixZ >::type >::invoke( jobz, range, n, d, e, vl, vu, il, iu, + m, w, z, nzc, isuppz, tryrac, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/steqr.hpp b/sdk/boost/numeric/bindings/lapack/computational/steqr.hpp new file mode 100644 index 0000000..94be533 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/steqr.hpp @@ -0,0 +1,324 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STEQR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STEQR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for steqr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t steqr( const char compz, const fortran_int_t n, float* d, + float* e, float* z, const fortran_int_t ldz, float* work ) { + fortran_int_t info(0); + LAPACK_SSTEQR( &compz, &n, d, e, z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t steqr( const char compz, const fortran_int_t n, + double* d, double* e, double* z, const fortran_int_t ldz, + double* work ) { + fortran_int_t info(0); + LAPACK_DSTEQR( &compz, &n, d, e, z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t steqr( const char compz, const fortran_int_t n, float* d, + float* e, std::complex* z, const fortran_int_t ldz, + float* work ) { + fortran_int_t info(0); + LAPACK_CSTEQR( &compz, &n, d, e, z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t steqr( const char compz, const fortran_int_t n, + double* d, double* e, std::complex* z, + const fortran_int_t ldz, double* work ) { + fortran_int_t info(0); + LAPACK_ZSTEQR( &compz, &n, d, e, z, &ldz, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to steqr. +// +template< typename Value, typename Enable = void > +struct steqr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct steqr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixZ, + typename WORK > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size(d), compz )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( compz == 'N' || compz == 'V' || compz == 'I' ); + return detail::steqr( compz, bindings::size(d), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size(d), compz ) ); + return invoke( compz, d, e, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( compz, d, e, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const char compz ) { + if ( compz == 'N' ) { + return 1; + } else { + return std::max< std::ptrdiff_t >( 1, 2*n-2 ); + } + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct steqr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixZ, + typename WORK > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size(d), compz )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( compz == 'N' || compz == 'V' || compz == 'I' ); + return detail::steqr( compz, bindings::size(d), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size(d), compz ) ); + return invoke( compz, d, e, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char compz, VectorD& d, VectorE& e, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( compz, d, e, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const char compz ) { + if ( compz == 'N' ) { + return 1; + } else { + return std::max< std::ptrdiff_t >( 1, 2*n-2 ); + } + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the steqr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for steqr. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +steqr( const char compz, VectorD& d, VectorE& e, MatrixZ& z, + Workspace work ) { + return steqr_impl< typename bindings::value_type< + MatrixZ >::type >::invoke( compz, d, e, z, work ); +} + +// +// Overloaded function for steqr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +steqr( const char compz, VectorD& d, VectorE& e, MatrixZ& z ) { + return steqr_impl< typename bindings::value_type< + MatrixZ >::type >::invoke( compz, d, e, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sterf.hpp b/sdk/boost/numeric/bindings/lapack/computational/sterf.hpp new file mode 100644 index 0000000..8ee0070 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sterf.hpp @@ -0,0 +1,127 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STERF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_STERF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sterf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t sterf( const fortran_int_t n, float* d, float* e ) { + fortran_int_t info(0); + LAPACK_SSTERF( &n, d, e, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t sterf( const fortran_int_t n, double* d, double* e ) { + fortran_int_t info(0); + LAPACK_DSTERF( &n, d, e, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sterf. +// +template< typename Value > +struct sterf_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE > + static std::ptrdiff_t invoke( const fortran_int_t n, VectorD& d, + VectorE& e ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_ASSERT( bindings::size(e) >= n-1 ); + BOOST_ASSERT( n >= 0 ); + return detail::sterf( n, bindings::begin_value(d), + bindings::begin_value(e) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sterf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sterf. Its overload differs for +// +template< typename VectorD, typename VectorE > +inline std::ptrdiff_t sterf( const fortran_int_t n, VectorD& d, + VectorE& e ) { + return sterf_impl< typename bindings::value_type< + VectorD >::type >::invoke( n, d, e ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sycon.hpp b/sdk/boost/numeric/bindings/lapack/computational/sycon.hpp new file mode 100644 index 0000000..40963a4 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sycon.hpp @@ -0,0 +1,338 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYCON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYCON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sycon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sycon( const UpLo, const fortran_int_t n, const float* a, + const fortran_int_t lda, const fortran_int_t* ipiv, const float anorm, + float& rcond, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SSYCON( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, &anorm, + &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sycon( const UpLo, const fortran_int_t n, + const double* a, const fortran_int_t lda, const fortran_int_t* ipiv, + const double anorm, double& rcond, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DSYCON( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, &anorm, + &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sycon( const UpLo, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const fortran_int_t* ipiv, const float anorm, float& rcond, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_CSYCON( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, &anorm, + &rcond, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sycon( const UpLo, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const fortran_int_t* ipiv, const double anorm, double& rcond, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZSYCON( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, &anorm, + &rcond, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sycon. +// +template< typename Value, typename Enable = void > +struct sycon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct sycon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::sycon( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), anorm, rcond, + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( a, ipiv, anorm, rcond, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, ipiv, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct sycon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::sycon( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), anorm, rcond, + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, ipiv, anorm, rcond, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + const real_type anorm, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, ipiv, anorm, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sycon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sycon. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorIPIV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sycon( const MatrixA& a, const VectorIPIV& ipiv, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond, + Workspace work ) { + return sycon_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, anorm, rcond, work ); +} + +// +// Overloaded function for sycon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorIPIV > +inline typename boost::disable_if< detail::is_workspace< VectorIPIV >, + std::ptrdiff_t >::type +sycon( const MatrixA& a, const VectorIPIV& ipiv, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type anorm, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond ) { + return sycon_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, anorm, rcond, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sygst.hpp b/sdk/boost/numeric/bindings/lapack/computational/sygst.hpp new file mode 100644 index 0000000..18dcf45 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sygst.hpp @@ -0,0 +1,147 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYGST_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYGST_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sygst is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sygst( const fortran_int_t itype, const UpLo, + const fortran_int_t n, float* a, const fortran_int_t lda, + const float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SSYGST( &itype, &lapack_option< UpLo >::value, &n, a, &lda, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sygst( const fortran_int_t itype, const UpLo, + const fortran_int_t n, double* a, const fortran_int_t lda, + const double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DSYGST( &itype, &lapack_option< UpLo >::value, &n, a, &lda, b, + &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sygst. +// +template< typename Value > +struct sygst_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB > + static std::ptrdiff_t invoke( const fortran_int_t itype, MatrixA& a, + const MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::sygst( itype, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sygst_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sygst. Its overload differs for +// +template< typename MatrixA, typename MatrixB > +inline std::ptrdiff_t sygst( const fortran_int_t itype, MatrixA& a, + const MatrixB& b ) { + return sygst_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, a, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/syrfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/syrfs.hpp new file mode 100644 index 0000000..4b92f0b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/syrfs.hpp @@ -0,0 +1,464 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYRFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYRFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for syrfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t syrfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const float* a, const fortran_int_t lda, + const float* af, const fortran_int_t ldaf, const fortran_int_t* ipiv, + const float* b, const fortran_int_t ldb, float* x, + const fortran_int_t ldx, float* ferr, float* berr, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SSYRFS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, af, + &ldaf, ipiv, b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t syrfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const double* a, const fortran_int_t lda, + const double* af, const fortran_int_t ldaf, const fortran_int_t* ipiv, + const double* b, const fortran_int_t ldb, double* x, + const fortran_int_t ldx, double* ferr, double* berr, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DSYRFS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, af, + &ldaf, ipiv, b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t syrfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const std::complex* af, + const fortran_int_t ldaf, const fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float* ferr, + float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CSYRFS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, af, + &ldaf, ipiv, b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t syrfs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const std::complex* af, + const fortran_int_t ldaf, const fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, double* ferr, + double* berr, std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZSYRFS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, af, + &ldaf, ipiv, b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to syrfs. +// +template< typename Value, typename Enable = void > +struct syrfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct syrfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::syrfs( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( a, af, ipiv, b, x, ferr, berr, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, af, ipiv, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct syrfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::syrfs( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( a, af, ipiv, b, x, ferr, berr, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixAF& af, + const VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, af, ipiv, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the syrfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for syrfs. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +syrfs( const MatrixA& a, const MatrixAF& af, const VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + Workspace work ) { + return syrfs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, af, ipiv, b, x, ferr, berr, work ); +} + +// +// Overloaded function for syrfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +syrfs( const MatrixA& a, const MatrixAF& af, const VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, VectorFERR& ferr, VectorBERR& berr ) { + return syrfs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, af, ipiv, b, x, ferr, berr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sytrd.hpp b/sdk/boost/numeric/bindings/lapack/computational/sytrd.hpp new file mode 100644 index 0000000..b6788b1 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sytrd.hpp @@ -0,0 +1,228 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYTRD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYTRD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sytrd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytrd( const UpLo, const fortran_int_t n, float* a, + const fortran_int_t lda, float* d, float* e, float* tau, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SSYTRD( &lapack_option< UpLo >::value, &n, a, &lda, d, e, tau, + work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytrd( const UpLo, const fortran_int_t n, double* a, + const fortran_int_t lda, double* d, double* e, double* tau, + double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DSYTRD( &lapack_option< UpLo >::value, &n, a, &lda, d, e, tau, + work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sytrd. +// +template< typename Value > +struct sytrd_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAU& tau, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_column(a)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work()); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::sytrd( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAU& tau, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work() ); + return invoke( a, d, e, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorD& d, VectorE& e, + VectorTAU& tau, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + detail::sytrd( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, d, e, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work() { + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sytrd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sytrd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sytrd( MatrixA& a, VectorD& d, VectorE& e, VectorTAU& tau, + Workspace work ) { + return sytrd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, d, e, tau, work ); +} + +// +// Overloaded function for sytrd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorD, typename VectorE, + typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +sytrd( MatrixA& a, VectorD& d, VectorE& e, VectorTAU& tau ) { + return sytrd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, d, e, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sytrf.hpp b/sdk/boost/numeric/bindings/lapack/computational/sytrf.hpp new file mode 100644 index 0000000..3b33986 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sytrf.hpp @@ -0,0 +1,325 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYTRF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYTRF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sytrf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytrf( const UpLo, const fortran_int_t n, float* a, + const fortran_int_t lda, fortran_int_t* ipiv, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SSYTRF( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytrf( const UpLo, const fortran_int_t n, double* a, + const fortran_int_t lda, fortran_int_t* ipiv, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DSYTRF( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytrf( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, fortran_int_t* ipiv, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CSYTRF( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytrf( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, fortran_int_t* ipiv, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZSYTRF( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sytrf. +// +template< typename Value, typename Enable = void > +struct sytrf_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct sytrf_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work()); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::sytrf( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work() ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + detail::sytrf( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work() { + return 1; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct sytrf_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work()); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::sytrf( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work() ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + detail::sytrf( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work() { + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sytrf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sytrf. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorIPIV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sytrf( MatrixA& a, VectorIPIV& ipiv, Workspace work ) { + return sytrf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, work ); +} + +// +// Overloaded function for sytrf. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorIPIV > +inline typename boost::disable_if< detail::is_workspace< VectorIPIV >, + std::ptrdiff_t >::type +sytrf( MatrixA& a, VectorIPIV& ipiv ) { + return sytrf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sytri.hpp b/sdk/boost/numeric/bindings/lapack/computational/sytri.hpp new file mode 100644 index 0000000..1ff2087 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sytri.hpp @@ -0,0 +1,310 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYTRI_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYTRI_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sytri is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytri( const UpLo, const fortran_int_t n, float* a, + const fortran_int_t lda, const fortran_int_t* ipiv, float* work ) { + fortran_int_t info(0); + LAPACK_SSYTRI( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytri( const UpLo, const fortran_int_t n, double* a, + const fortran_int_t lda, const fortran_int_t* ipiv, double* work ) { + fortran_int_t info(0); + LAPACK_DSYTRI( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytri( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + const fortran_int_t* ipiv, std::complex* work ) { + fortran_int_t info(0); + LAPACK_CSYTRI( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytri( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + const fortran_int_t* ipiv, std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZSYTRI( &lapack_option< UpLo >::value, &n, a, &lda, ipiv, work, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sytri. +// +template< typename Value, typename Enable = void > +struct sytri_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct sytri_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::sytri( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, ipiv, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct sytri_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::sytri( uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(ipiv), + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, ipiv, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV > + static std::ptrdiff_t invoke( MatrixA& a, const VectorIPIV& ipiv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, ipiv, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sytri_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sytri. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorIPIV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sytri( MatrixA& a, const VectorIPIV& ipiv, Workspace work ) { + return sytri_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, work ); +} + +// +// Overloaded function for sytri. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorIPIV > +inline typename boost::disable_if< detail::is_workspace< VectorIPIV >, + std::ptrdiff_t >::type +sytri( MatrixA& a, const VectorIPIV& ipiv ) { + return sytri_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/sytrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/sytrs.hpp new file mode 100644 index 0000000..765005c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/sytrs.hpp @@ -0,0 +1,182 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYTRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_SYTRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sytrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const float* a, const fortran_int_t lda, + const fortran_int_t* ipiv, float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SSYTRS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const double* a, const fortran_int_t lda, + const fortran_int_t* ipiv, double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DSYTRS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const fortran_int_t* ipiv, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CSYTRS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sytrs( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, const fortran_int_t* ipiv, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZSYTRS( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sytrs. +// +template< typename Value > +struct sytrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( const MatrixA& a, const VectorIPIV& ipiv, + MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::sytrs( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sytrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sytrs. Its overload differs for +// +template< typename MatrixA, typename VectorIPIV, typename MatrixB > +inline std::ptrdiff_t sytrs( const MatrixA& a, const VectorIPIV& ipiv, + MatrixB& b ) { + return sytrs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tbcon.hpp b/sdk/boost/numeric/bindings/lapack/computational/tbcon.hpp new file mode 100644 index 0000000..fdb6ef2 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tbcon.hpp @@ -0,0 +1,353 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TBCON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TBCON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tbcon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t tbcon( const char norm, const UpLo, const Diag, + const fortran_int_t n, const fortran_int_t kd, const float* ab, + const fortran_int_t ldab, float& rcond, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_STBCON( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, &kd, ab, &ldab, &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t tbcon( const char norm, const UpLo, const Diag, + const fortran_int_t n, const fortran_int_t kd, const double* ab, + const fortran_int_t ldab, double& rcond, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DTBCON( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, &kd, ab, &ldab, &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t tbcon( const char norm, const UpLo, const Diag, + const fortran_int_t n, const fortran_int_t kd, + const std::complex* ab, const fortran_int_t ldab, float& rcond, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CTBCON( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, &kd, ab, &ldab, &rcond, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t tbcon( const char norm, const UpLo, const Diag, + const fortran_int_t n, const fortran_int_t kd, + const std::complex* ab, const fortran_int_t ldab, + double& rcond, std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZTBCON( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, &kd, ab, &ldab, &rcond, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tbcon. +// +template< typename Value, typename Enable = void > +struct tbcon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct tbcon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char norm, const fortran_int_t kd, + const MatrixAB& ab, real_type& rcond, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= kd+1 ); + BOOST_ASSERT( kd >= 0 ); + BOOST_ASSERT( norm == '1' || norm == 'O' || norm == 'I' ); + return detail::tbcon( norm, uplo(), diag(), bindings::size_column(ab), + kd, bindings::begin_value(ab), bindings::stride_major(ab), + rcond, bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const char norm, const fortran_int_t kd, + const MatrixAB& ab, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ab) ) ); + return invoke( norm, kd, ab, rcond, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const char norm, const fortran_int_t kd, + const MatrixAB& ab, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + return invoke( norm, kd, ab, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct tbcon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char norm, const fortran_int_t kd, + const MatrixAB& ab, real_type& rcond, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= kd+1 ); + BOOST_ASSERT( kd >= 0 ); + BOOST_ASSERT( norm == '1' || norm == 'O' || norm == 'I' ); + return detail::tbcon( norm, uplo(), diag(), bindings::size_column(ab), + kd, bindings::begin_value(ab), bindings::stride_major(ab), + rcond, bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const char norm, const fortran_int_t kd, + const MatrixAB& ab, real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ab) ) ); + return invoke( norm, kd, ab, rcond, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB > + static std::ptrdiff_t invoke( const char norm, const fortran_int_t kd, + const MatrixAB& ab, real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + return invoke( norm, kd, ab, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tbcon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tbcon. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +tbcon( const char norm, const fortran_int_t kd, const MatrixAB& ab, + typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type& rcond, Workspace work ) { + return tbcon_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( norm, kd, ab, rcond, work ); +} + +// +// Overloaded function for tbcon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB > +inline typename boost::disable_if< detail::is_workspace< MatrixAB >, + std::ptrdiff_t >::type +tbcon( const char norm, const fortran_int_t kd, const MatrixAB& ab, + typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type& rcond ) { + return tbcon_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( norm, kd, ab, rcond, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tbrfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/tbrfs.hpp new file mode 100644 index 0000000..bff1a6c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tbrfs.hpp @@ -0,0 +1,458 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TBRFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TBRFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tbrfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tbrfs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t kd, + const fortran_int_t nrhs, const float* ab, const fortran_int_t ldab, + const float* b, const fortran_int_t ldb, const float* x, + const fortran_int_t ldx, float* ferr, float* berr, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_STBRFS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &kd, &nrhs, ab, + &ldab, b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tbrfs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t kd, + const fortran_int_t nrhs, const double* ab, const fortran_int_t ldab, + const double* b, const fortran_int_t ldb, const double* x, + const fortran_int_t ldx, double* ferr, double* berr, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DTBRFS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &kd, &nrhs, ab, + &ldab, b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tbrfs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t kd, + const fortran_int_t nrhs, const std::complex* ab, + const fortran_int_t ldab, const std::complex* b, + const fortran_int_t ldb, const std::complex* x, + const fortran_int_t ldx, float* ferr, float* berr, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CTBRFS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &kd, &nrhs, ab, + &ldab, b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tbrfs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t kd, + const fortran_int_t nrhs, const std::complex* ab, + const fortran_int_t ldab, const std::complex* b, + const fortran_int_t ldb, const std::complex* x, + const fortran_int_t ldx, double* ferr, double* berr, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZTBRFS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &kd, &nrhs, ab, + &ldab, b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tbrfs. +// +template< typename Value, typename Enable = void > +struct tbrfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct tbrfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t kd, + const MatrixAB& ab, const MatrixB& b, const MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAB, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column_op(ab, trans()) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column_op(ab, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(ab, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= kd+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( kd >= 0 ); + return detail::tbrfs( uplo(), trans(), diag(), + bindings::size_column_op(ab, trans()), kd, + bindings::size_column(b), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const fortran_int_t kd, + const MatrixAB& ab, const MatrixB& b, const MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAB, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column_op(ab, trans()) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column_op(ab, trans()) ) ); + return invoke( kd, ab, b, x, ferr, berr, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const fortran_int_t kd, + const MatrixAB& ab, const MatrixB& b, const MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAB, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + return invoke( kd, ab, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct tbrfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename WORK, + typename RWORK > + static std::ptrdiff_t invoke( const fortran_int_t kd, + const MatrixAB& ab, const MatrixB& b, const MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAB, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column_op(ab, trans()) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column_op(ab, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(ab, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= kd+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( kd >= 0 ); + return detail::tbrfs( uplo(), trans(), diag(), + bindings::size_column_op(ab, trans()), kd, + bindings::size_column(b), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const fortran_int_t kd, + const MatrixAB& ab, const MatrixB& b, const MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAB, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column_op(ab, trans()) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column_op(ab, trans()) ) ); + return invoke( kd, ab, b, x, ferr, berr, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const fortran_int_t kd, + const MatrixAB& ab, const MatrixB& b, const MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAB, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + return invoke( kd, ab, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tbrfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tbrfs. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +tbrfs( const fortran_int_t kd, const MatrixAB& ab, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + Workspace work ) { + return tbrfs_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( kd, ab, b, x, ferr, berr, work ); +} + +// +// Overloaded function for tbrfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +tbrfs( const fortran_int_t kd, const MatrixAB& ab, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr ) { + return tbrfs_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( kd, ab, b, x, ferr, berr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tbtrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/tbtrs.hpp new file mode 100644 index 0000000..a7e56b1 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tbtrs.hpp @@ -0,0 +1,194 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TBTRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TBTRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tbtrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tbtrs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t kd, + const fortran_int_t nrhs, const float* ab, const fortran_int_t ldab, + float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_STBTRS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &kd, &nrhs, ab, + &ldab, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tbtrs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t kd, + const fortran_int_t nrhs, const double* ab, const fortran_int_t ldab, + double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DTBTRS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &kd, &nrhs, ab, + &ldab, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tbtrs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t kd, + const fortran_int_t nrhs, const std::complex* ab, + const fortran_int_t ldab, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CTBTRS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &kd, &nrhs, ab, + &ldab, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tbtrs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t kd, + const fortran_int_t nrhs, const std::complex* ab, + const fortran_int_t ldab, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZTBTRS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &kd, &nrhs, ab, + &ldab, b, &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tbtrs. +// +template< typename Value > +struct tbtrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixB > + static std::ptrdiff_t invoke( const fortran_int_t kd, + const MatrixAB& ab, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAB, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAB >::type diag; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(ab, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= kd+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( kd >= 0 ); + return detail::tbtrs( uplo(), trans(), diag(), + bindings::size_column_op(ab, trans()), kd, + bindings::size_column(b), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(b), + bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tbtrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tbtrs. Its overload differs for +// +template< typename MatrixAB, typename MatrixB > +inline std::ptrdiff_t tbtrs( const fortran_int_t kd, + const MatrixAB& ab, MatrixB& b ) { + return tbtrs_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( kd, ab, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tftri.hpp b/sdk/boost/numeric/bindings/lapack/computational/tftri.hpp new file mode 100644 index 0000000..0bcaf73 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tftri.hpp @@ -0,0 +1,162 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TFTRI_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TFTRI_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tftri is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename TransR, typename UpLo, typename Diag > +inline std::ptrdiff_t tftri( const TransR, const UpLo, const Diag, + const fortran_int_t n, float* a ) { + fortran_int_t info(0); + LAPACK_STFTRI( &lapack_option< TransR >::value, &lapack_option< + UpLo >::value, &lapack_option< Diag >::value, &n, a, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename TransR, typename UpLo, typename Diag > +inline std::ptrdiff_t tftri( const TransR, const UpLo, const Diag, + const fortran_int_t n, double* a ) { + fortran_int_t info(0); + LAPACK_DTFTRI( &lapack_option< TransR >::value, &lapack_option< + UpLo >::value, &lapack_option< Diag >::value, &n, a, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename TransR, typename UpLo, typename Diag > +inline std::ptrdiff_t tftri( const TransR, const UpLo, const Diag, + const fortran_int_t n, std::complex* a ) { + fortran_int_t info(0); + LAPACK_CTFTRI( &lapack_option< TransR >::value, &lapack_option< + UpLo >::value, &lapack_option< Diag >::value, &n, a, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename TransR, typename UpLo, typename Diag > +inline std::ptrdiff_t tftri( const TransR, const UpLo, const Diag, + const fortran_int_t n, std::complex* a ) { + fortran_int_t info(0); + LAPACK_ZTFTRI( &lapack_option< TransR >::value, &lapack_option< + UpLo >::value, &lapack_option< Diag >::value, &n, a, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tftri. +// +template< typename Value > +struct tftri_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA > + static std::ptrdiff_t invoke( MatrixA& a ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename blas::detail::default_order< MatrixA >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type transr; + typedef typename result_of::uplo_tag< MatrixA, transr >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_column_op(a, transr()) >= 0 ); + return detail::tftri( transr(), uplo(), diag(), + bindings::size_column_op(a, transr()), + bindings::begin_value(a) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tftri_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tftri. Its overload differs for +// +template< typename MatrixA > +inline std::ptrdiff_t tftri( MatrixA& a ) { + return tftri_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tgevc.hpp b/sdk/boost/numeric/bindings/lapack/computational/tgevc.hpp new file mode 100644 index 0000000..be91db2 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tgevc.hpp @@ -0,0 +1,421 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGEVC_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGEVC_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tgevc is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side > +inline std::ptrdiff_t tgevc( const Side, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, const float* s, + const fortran_int_t lds, const float* p, const fortran_int_t ldp, + float* vl, const fortran_int_t ldvl, float* vr, + const fortran_int_t ldvr, const fortran_int_t mm, fortran_int_t& m, + float* work ) { + fortran_int_t info(0); + LAPACK_STGEVC( &lapack_option< Side >::value, &howmny, select, &n, s, + &lds, p, &ldp, vl, &ldvl, vr, &ldvr, &mm, &m, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side > +inline std::ptrdiff_t tgevc( const Side, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, const double* s, + const fortran_int_t lds, const double* p, const fortran_int_t ldp, + double* vl, const fortran_int_t ldvl, double* vr, + const fortran_int_t ldvr, const fortran_int_t mm, fortran_int_t& m, + double* work ) { + fortran_int_t info(0); + LAPACK_DTGEVC( &lapack_option< Side >::value, &howmny, select, &n, s, + &lds, p, &ldp, vl, &ldvl, vr, &ldvr, &mm, &m, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t tgevc( const Side, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, + const std::complex* s, const fortran_int_t lds, + const std::complex* p, const fortran_int_t ldp, + std::complex* vl, const fortran_int_t ldvl, + std::complex* vr, const fortran_int_t ldvr, + const fortran_int_t mm, fortran_int_t& m, std::complex* work, + float* rwork ) { + fortran_int_t info(0); + LAPACK_CTGEVC( &lapack_option< Side >::value, &howmny, select, &n, s, + &lds, p, &ldp, vl, &ldvl, vr, &ldvr, &mm, &m, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t tgevc( const Side, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, + const std::complex* s, const fortran_int_t lds, + const std::complex* p, const fortran_int_t ldp, + std::complex* vl, const fortran_int_t ldvl, + std::complex* vr, const fortran_int_t ldvr, + const fortran_int_t mm, fortran_int_t& m, std::complex* work, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZTGEVC( &lapack_option< Side >::value, &howmny, select, &n, s, + &lds, p, &ldp, vl, &ldvl, vr, &ldvr, &mm, &m, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tgevc. +// +template< typename Value, typename Enable = void > +struct tgevc_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct tgevc_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorSELECT, typename MatrixS, + typename MatrixP, typename MatrixVL, typename MatrixVR, + typename WORK > + static std::ptrdiff_t invoke( const Side side, const char howmny, + const VectorSELECT& select, const MatrixS& s, const MatrixP& p, + MatrixVL& vl, MatrixVR& vr, const fortran_int_t mm, + fortran_int_t& m, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixS >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixS >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixS >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(s) )); + BOOST_ASSERT( bindings::size_column(s) >= 0 ); + BOOST_ASSERT( bindings::size_minor(p) == 1 || + bindings::stride_minor(p) == 1 ); + BOOST_ASSERT( bindings::size_minor(s) == 1 || + bindings::stride_minor(s) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(p) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(s)) ); + BOOST_ASSERT( bindings::stride_major(s) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(s)) ); + BOOST_ASSERT( howmny == 'A' || howmny == 'B' || howmny == 'S' ); + return detail::tgevc( side, howmny, bindings::begin_value(select), + bindings::size_column(s), bindings::begin_value(s), + bindings::stride_major(s), bindings::begin_value(p), + bindings::stride_major(p), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), mm, m, + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorSELECT, typename MatrixS, + typename MatrixP, typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const Side side, const char howmny, + const VectorSELECT& select, const MatrixS& s, const MatrixP& p, + MatrixVL& vl, MatrixVR& vr, const fortran_int_t mm, + fortran_int_t& m, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(s) ) ); + return invoke( side, howmny, select, s, p, vl, vr, mm, m, + workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorSELECT, typename MatrixS, + typename MatrixP, typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const Side side, const char howmny, + const VectorSELECT& select, const MatrixS& s, const MatrixP& p, + MatrixVL& vl, MatrixVR& vr, const fortran_int_t mm, + fortran_int_t& m, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( side, howmny, select, s, p, vl, vr, mm, m, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 6*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct tgevc_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorSELECT, typename MatrixS, + typename MatrixP, typename MatrixVL, typename MatrixVR, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const Side side, const char howmny, + const VectorSELECT& select, const MatrixS& s, const MatrixP& p, + MatrixVL& vl, MatrixVR& vr, const fortran_int_t mm, + fortran_int_t& m, detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixS >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixS >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixS >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(s) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(s) )); + BOOST_ASSERT( bindings::size_column(s) >= 0 ); + BOOST_ASSERT( bindings::size_minor(p) == 1 || + bindings::stride_minor(p) == 1 ); + BOOST_ASSERT( bindings::size_minor(s) == 1 || + bindings::stride_minor(s) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(p) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(s)) ); + BOOST_ASSERT( bindings::stride_major(s) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(s)) ); + BOOST_ASSERT( howmny == 'A' || howmny == 'B' || howmny == 'S' ); + return detail::tgevc( side, howmny, bindings::begin_value(select), + bindings::size_column(s), bindings::begin_value(s), + bindings::stride_major(s), bindings::begin_value(p), + bindings::stride_major(p), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), mm, m, + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorSELECT, typename MatrixS, + typename MatrixP, typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const Side side, const char howmny, + const VectorSELECT& select, const MatrixS& s, const MatrixP& p, + MatrixVL& vl, MatrixVR& vr, const fortran_int_t mm, + fortran_int_t& m, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(s) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(s) ) ); + return invoke( side, howmny, select, s, p, vl, vr, mm, m, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorSELECT, typename MatrixS, + typename MatrixP, typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const Side side, const char howmny, + const VectorSELECT& select, const MatrixS& s, const MatrixP& p, + MatrixVL& vl, MatrixVR& vr, const fortran_int_t mm, + fortran_int_t& m, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( side, howmny, select, s, p, vl, vr, mm, m, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tgevc_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tgevc. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename VectorSELECT, typename MatrixS, + typename MatrixP, typename MatrixVL, typename MatrixVR, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +tgevc( const Side side, const char howmny, const VectorSELECT& select, + const MatrixS& s, const MatrixP& p, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m, Workspace work ) { + return tgevc_impl< typename bindings::value_type< + MatrixS >::type >::invoke( side, howmny, select, s, p, vl, vr, mm, + m, work ); +} + +// +// Overloaded function for tgevc. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorSELECT, typename MatrixS, + typename MatrixP, typename MatrixVL, typename MatrixVR > +inline typename boost::disable_if< detail::is_workspace< MatrixVR >, + std::ptrdiff_t >::type +tgevc( const Side side, const char howmny, const VectorSELECT& select, + const MatrixS& s, const MatrixP& p, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m ) { + return tgevc_impl< typename bindings::value_type< + MatrixS >::type >::invoke( side, howmny, select, s, p, vl, vr, mm, + m, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tgexc.hpp b/sdk/boost/numeric/bindings/lapack/computational/tgexc.hpp new file mode 100644 index 0000000..8f5eeba --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tgexc.hpp @@ -0,0 +1,378 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGEXC_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGEXC_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tgexc is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t tgexc( const fortran_bool_t wantq, + const fortran_bool_t wantz, const fortran_int_t n, float* a, + const fortran_int_t lda, float* b, const fortran_int_t ldb, float* q, + const fortran_int_t ldq, float* z, const fortran_int_t ldz, + fortran_int_t& ifst, fortran_int_t& ilst, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_STGEXC( &wantq, &wantz, &n, a, &lda, b, &ldb, q, &ldq, z, &ldz, + &ifst, &ilst, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t tgexc( const fortran_bool_t wantq, + const fortran_bool_t wantz, const fortran_int_t n, double* a, + const fortran_int_t lda, double* b, const fortran_int_t ldb, + double* q, const fortran_int_t ldq, double* z, + const fortran_int_t ldz, fortran_int_t& ifst, fortran_int_t& ilst, + double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DTGEXC( &wantq, &wantz, &n, a, &lda, b, &ldb, q, &ldq, z, &ldz, + &ifst, &ilst, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t tgexc( const fortran_bool_t wantq, + const fortran_bool_t wantz, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, + std::complex* q, const fortran_int_t ldq, + std::complex* z, const fortran_int_t ldz, + const fortran_int_t ifst, fortran_int_t& ilst ) { + fortran_int_t info(0); + LAPACK_CTGEXC( &wantq, &wantz, &n, a, &lda, b, &ldb, q, &ldq, z, &ldz, + &ifst, &ilst, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t tgexc( const fortran_bool_t wantq, + const fortran_bool_t wantz, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, + std::complex* q, const fortran_int_t ldq, + std::complex* z, const fortran_int_t ldz, + const fortran_int_t ifst, fortran_int_t& ilst ) { + fortran_int_t info(0); + LAPACK_ZTGEXC( &wantq, &wantz, &n, a, &lda, b, &ldb, q, &ldq, z, &ldz, + &ifst, &ilst, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tgexc. +// +template< typename Value, typename Enable = void > +struct tgexc_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct tgexc_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixQ, + typename MatrixZ, typename WORK > + static std::ptrdiff_t invoke( const fortran_bool_t wantq, + const fortran_bool_t wantz, MatrixA& a, MatrixB& b, MatrixQ& q, + MatrixZ& z, fortran_int_t& ifst, fortran_int_t& ilst, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::tgexc( wantq, wantz, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(z), bindings::stride_major(z), ifst, + ilst, bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename MatrixQ, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_bool_t wantq, + const fortran_bool_t wantz, MatrixA& a, MatrixB& b, MatrixQ& q, + MatrixZ& z, fortran_int_t& ifst, fortran_int_t& ilst, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( wantq, wantz, a, b, q, z, ifst, ilst, + workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename MatrixQ, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_bool_t wantq, + const fortran_bool_t wantz, MatrixA& a, MatrixB& b, MatrixQ& q, + MatrixZ& z, fortran_int_t& ifst, fortran_int_t& ilst, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::tgexc( wantq, wantz, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(z), bindings::stride_major(z), ifst, + ilst, &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( wantq, wantz, a, b, q, z, ifst, ilst, + workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + if (n <= 1) + return 1; + else + return 4*n + 16; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct tgexc_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixQ, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_bool_t wantq, + const fortran_bool_t wantz, MatrixA& a, MatrixB& b, MatrixQ& q, + MatrixZ& z, const fortran_int_t ifst, + fortran_int_t& ilst ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::tgexc( wantq, wantz, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(z), bindings::stride_major(z), ifst, + ilst ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tgexc_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tgexc. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename MatrixQ, + typename MatrixZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +tgexc( const fortran_bool_t wantq, const fortran_bool_t wantz, + MatrixA& a, MatrixB& b, MatrixQ& q, MatrixZ& z, + fortran_int_t& ifst, fortran_int_t& ilst, Workspace work ) { + return tgexc_impl< typename bindings::value_type< + MatrixA >::type >::invoke( wantq, wantz, a, b, q, z, ifst, ilst, + work ); +} + +// +// Overloaded function for tgexc. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename MatrixQ, + typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +tgexc( const fortran_bool_t wantq, const fortran_bool_t wantz, + MatrixA& a, MatrixB& b, MatrixQ& q, MatrixZ& z, + fortran_int_t& ifst, fortran_int_t& ilst ) { + return tgexc_impl< typename bindings::value_type< + MatrixA >::type >::invoke( wantq, wantz, a, b, q, z, ifst, ilst, + optimal_workspace() ); +} + +// +// Overloaded function for tgexc. Its overload differs for +// +template< typename MatrixA, typename MatrixB, typename MatrixQ, + typename MatrixZ > +inline std::ptrdiff_t tgexc( const fortran_bool_t wantq, + const fortran_bool_t wantz, MatrixA& a, MatrixB& b, MatrixQ& q, + MatrixZ& z, const fortran_int_t ifst, fortran_int_t& ilst ) { + return tgexc_impl< typename bindings::value_type< + MatrixA >::type >::invoke( wantq, wantz, a, b, q, z, ifst, ilst ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tgsen.hpp b/sdk/boost/numeric/bindings/lapack/computational/tgsen.hpp new file mode 100644 index 0000000..16d5c9a --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tgsen.hpp @@ -0,0 +1,621 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGSEN_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGSEN_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tgsen is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t tgsen( const fortran_int_t ijob, + const fortran_bool_t wantq, const fortran_bool_t wantz, + const fortran_bool_t* select, const fortran_int_t n, float* a, + const fortran_int_t lda, float* b, const fortran_int_t ldb, + float* alphar, float* alphai, float* beta, float* q, + const fortran_int_t ldq, float* z, const fortran_int_t ldz, + fortran_int_t& m, float& pl, float& pr, float* dif, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_STGSEN( &ijob, &wantq, &wantz, select, &n, a, &lda, b, &ldb, + alphar, alphai, beta, q, &ldq, z, &ldz, &m, &pl, &pr, dif, work, + &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t tgsen( const fortran_int_t ijob, + const fortran_bool_t wantq, const fortran_bool_t wantz, + const fortran_bool_t* select, const fortran_int_t n, double* a, + const fortran_int_t lda, double* b, const fortran_int_t ldb, + double* alphar, double* alphai, double* beta, double* q, + const fortran_int_t ldq, double* z, const fortran_int_t ldz, + fortran_int_t& m, double& pl, double& pr, double* dif, double* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DTGSEN( &ijob, &wantq, &wantz, select, &n, a, &lda, b, &ldb, + alphar, alphai, beta, q, &ldq, z, &ldz, &m, &pl, &pr, dif, work, + &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t tgsen( const fortran_int_t ijob, + const fortran_bool_t wantq, const fortran_bool_t wantz, + const fortran_bool_t* select, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, + std::complex* alpha, std::complex* beta, + std::complex* q, const fortran_int_t ldq, + std::complex* z, const fortran_int_t ldz, fortran_int_t& m, + float& pl, float& pr, float* dif, std::complex* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_CTGSEN( &ijob, &wantq, &wantz, select, &n, a, &lda, b, &ldb, alpha, + beta, q, &ldq, z, &ldz, &m, &pl, &pr, dif, work, &lwork, iwork, + &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t tgsen( const fortran_int_t ijob, + const fortran_bool_t wantq, const fortran_bool_t wantz, + const fortran_bool_t* select, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, + std::complex* alpha, std::complex* beta, + std::complex* q, const fortran_int_t ldq, + std::complex* z, const fortran_int_t ldz, fortran_int_t& m, + double& pl, double& pr, double* dif, std::complex* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_ZTGSEN( &ijob, &wantq, &wantz, select, &n, a, &lda, b, &ldb, alpha, + beta, q, &ldq, z, &ldz, &m, &pl, &pr, dif, work, &lwork, iwork, + &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tgsen. +// +template< typename Value, typename Enable = void > +struct tgsen_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct tgsen_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename VectorALPHAR, typename VectorALPHAI, typename VectorBETA, + typename MatrixQ, typename MatrixZ, typename VectorDIF, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const fortran_bool_t wantq, const fortran_bool_t wantz, + const VectorSELECT& select, MatrixA& a, MatrixB& b, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixQ& q, MatrixZ& z, fortran_int_t& m, real_type& pl, + real_type& pr, VectorDIF& dif, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAI >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDIF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAI >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDIF >::value) ); + BOOST_ASSERT( bindings::size(alphai) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(alphar) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(select) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( ijob, bindings::size_column(a), m )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( ijob, bindings::size_column(a), m )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::tgsen( ijob, wantq, wantz, + bindings::begin_value(select), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(alphar), bindings::begin_value(alphai), + bindings::begin_value(beta), bindings::begin_value(q), + bindings::stride_major(q), bindings::begin_value(z), + bindings::stride_major(z), m, pl, pr, + bindings::begin_value(dif), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename VectorALPHAR, typename VectorALPHAI, typename VectorBETA, + typename MatrixQ, typename MatrixZ, typename VectorDIF > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const fortran_bool_t wantq, const fortran_bool_t wantz, + const VectorSELECT& select, MatrixA& a, MatrixB& b, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixQ& q, MatrixZ& z, fortran_int_t& m, real_type& pl, + real_type& pr, VectorDIF& dif, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( ijob, + bindings::size_column(a), m ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( ijob, bindings::size_column(a), m ) ); + return invoke( ijob, wantq, wantz, select, a, b, alphar, alphai, beta, + q, z, m, pl, pr, dif, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename VectorALPHAR, typename VectorALPHAI, typename VectorBETA, + typename MatrixQ, typename MatrixZ, typename VectorDIF > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const fortran_bool_t wantq, const fortran_bool_t wantz, + const VectorSELECT& select, MatrixA& a, MatrixB& b, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixQ& q, MatrixZ& z, fortran_int_t& m, real_type& pl, + real_type& pr, VectorDIF& dif, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::tgsen( ijob, wantq, wantz, bindings::begin_value(select), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(alphar), + bindings::begin_value(alphai), bindings::begin_value(beta), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(z), bindings::stride_major(z), m, pl, + pr, bindings::begin_value(dif), &opt_size_work, -1, + &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( ijob, wantq, wantz, select, a, b, alphar, alphai, beta, + q, z, m, pl, pr, dif, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t ijob, + const std::ptrdiff_t n, fortran_int_t& m ) { + if ( ijob == 1 || ijob == 2 || ijob == 4 ) + return std::max< std::ptrdiff_t >(4*n+16, 2*m*(n-m)); + else if ( ijob == 3 || ijob == 5 ) + return std::max< std::ptrdiff_t >(4*n+16, 4*m*(n-m)); + else // ijob == 0 + return std::max< std::ptrdiff_t >(1, 4*n+16); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t ijob, + const std::ptrdiff_t n, fortran_int_t& m ) { + if ( ijob == 1 || ijob == 2 || ijob == 4 ) + return std::max< std::ptrdiff_t >(1, n+6); + else if ( ijob == 3 || ijob == 5 ) + return std::max< std::ptrdiff_t >(2*m*(n-m), n+6); + else // ijob == 0 + return 1; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct tgsen_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename VectorALPHA, typename VectorBETA, typename MatrixQ, + typename MatrixZ, typename VectorDIF, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const fortran_bool_t wantq, const fortran_bool_t wantz, + const VectorSELECT& select, MatrixA& a, MatrixB& b, + VectorALPHA& alpha, VectorBETA& beta, MatrixQ& q, MatrixZ& z, + fortran_int_t& m, real_type& pl, real_type& pr, + VectorDIF& dif, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDIF >::value) ); + BOOST_ASSERT( bindings::size(alpha) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(select) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( ijob, bindings::size_column(a), m )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( ijob, bindings::size_column(a), m )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::tgsen( ijob, wantq, wantz, + bindings::begin_value(select), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(alpha), bindings::begin_value(beta), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(z), bindings::stride_major(z), m, pl, + pr, bindings::begin_value(dif), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename VectorALPHA, typename VectorBETA, typename MatrixQ, + typename MatrixZ, typename VectorDIF > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const fortran_bool_t wantq, const fortran_bool_t wantz, + const VectorSELECT& select, MatrixA& a, MatrixB& b, + VectorALPHA& alpha, VectorBETA& beta, MatrixQ& q, MatrixZ& z, + fortran_int_t& m, real_type& pl, real_type& pr, + VectorDIF& dif, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( ijob, + bindings::size_column(a), m ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( ijob, bindings::size_column(a), m ) ); + return invoke( ijob, wantq, wantz, select, a, b, alpha, beta, q, z, m, + pl, pr, dif, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename VectorALPHA, typename VectorBETA, typename MatrixQ, + typename MatrixZ, typename VectorDIF > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const fortran_bool_t wantq, const fortran_bool_t wantz, + const VectorSELECT& select, MatrixA& a, MatrixB& b, + VectorALPHA& alpha, VectorBETA& beta, MatrixQ& q, MatrixZ& z, + fortran_int_t& m, real_type& pl, real_type& pr, + VectorDIF& dif, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::tgsen( ijob, wantq, wantz, bindings::begin_value(select), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(alpha), + bindings::begin_value(beta), bindings::begin_value(q), + bindings::stride_major(q), bindings::begin_value(z), + bindings::stride_major(z), m, pl, pr, + bindings::begin_value(dif), &opt_size_work, -1, + &opt_size_iwork, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( ijob, wantq, wantz, select, a, b, alpha, beta, q, z, m, + pl, pr, dif, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t ijob, + const std::ptrdiff_t n, fortran_int_t& m ) { + if ( ijob == 1 || ijob == 2 || ijob == 4 ) + return std::max< std::ptrdiff_t >(1, 2*m*(n-m)); + else if ( ijob == 3 || ijob == 5 ) + return std::max< std::ptrdiff_t >(1, 4*m*(n-m)); + else // ijob == 0 + return 1; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t ijob, + const std::ptrdiff_t n, fortran_int_t& m ) { + if ( ijob == 1 || ijob == 2 || ijob == 4 ) + return std::max< std::ptrdiff_t >(1, n+2); + else if ( ijob == 3 || ijob == 5 ) + return std::max< std::ptrdiff_t >(2*m*(n-m), n+2); + else // ijob == 0 + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tgsen_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tgsen. Its overload differs for +// * User-defined workspace +// +template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename VectorALPHAR, typename VectorALPHAI, typename VectorBETA, + typename MatrixQ, typename MatrixZ, typename VectorDIF, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +tgsen( const fortran_int_t ijob, const fortran_bool_t wantq, + const fortran_bool_t wantz, const VectorSELECT& select, MatrixA& a, + MatrixB& b, VectorALPHAR& alphar, VectorALPHAI& alphai, + VectorBETA& beta, MatrixQ& q, MatrixZ& z, fortran_int_t& m, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& pl, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& pr, + VectorDIF& dif, Workspace work ) { + return tgsen_impl< typename bindings::value_type< + MatrixA >::type >::invoke( ijob, wantq, wantz, select, a, b, + alphar, alphai, beta, q, z, m, pl, pr, dif, work ); +} + +// +// Overloaded function for tgsen. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename VectorALPHAR, typename VectorALPHAI, typename VectorBETA, + typename MatrixQ, typename MatrixZ, typename VectorDIF > +inline typename boost::disable_if< detail::is_workspace< VectorDIF >, + std::ptrdiff_t >::type +tgsen( const fortran_int_t ijob, const fortran_bool_t wantq, + const fortran_bool_t wantz, const VectorSELECT& select, MatrixA& a, + MatrixB& b, VectorALPHAR& alphar, VectorALPHAI& alphai, + VectorBETA& beta, MatrixQ& q, MatrixZ& z, fortran_int_t& m, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& pl, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& pr, + VectorDIF& dif ) { + return tgsen_impl< typename bindings::value_type< + MatrixA >::type >::invoke( ijob, wantq, wantz, select, a, b, + alphar, alphai, beta, q, z, m, pl, pr, dif, optimal_workspace() ); +} + +// +// Overloaded function for tgsen. Its overload differs for +// * User-defined workspace +// +template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename VectorALPHA, typename VectorBETA, typename MatrixQ, + typename MatrixZ, typename VectorDIF, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +tgsen( const fortran_int_t ijob, const fortran_bool_t wantq, + const fortran_bool_t wantz, const VectorSELECT& select, MatrixA& a, + MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, MatrixQ& q, + MatrixZ& z, fortran_int_t& m, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& pl, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& pr, VectorDIF& dif, Workspace work ) { + return tgsen_impl< typename bindings::value_type< + MatrixA >::type >::invoke( ijob, wantq, wantz, select, a, b, + alpha, beta, q, z, m, pl, pr, dif, work ); +} + +// +// Overloaded function for tgsen. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename VectorALPHA, typename VectorBETA, typename MatrixQ, + typename MatrixZ, typename VectorDIF > +inline typename boost::disable_if< detail::is_workspace< VectorDIF >, + std::ptrdiff_t >::type +tgsen( const fortran_int_t ijob, const fortran_bool_t wantq, + const fortran_bool_t wantz, const VectorSELECT& select, MatrixA& a, + MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, MatrixQ& q, + MatrixZ& z, fortran_int_t& m, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& pl, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& pr, VectorDIF& dif ) { + return tgsen_impl< typename bindings::value_type< + MatrixA >::type >::invoke( ijob, wantq, wantz, select, a, b, + alpha, beta, q, z, m, pl, pr, dif, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tgsja.hpp b/sdk/boost/numeric/bindings/lapack/computational/tgsja.hpp new file mode 100644 index 0000000..dd2d423 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tgsja.hpp @@ -0,0 +1,494 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGSJA_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGSJA_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tgsja is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t tgsja( const char jobu, const char jobv, const char jobq, + const fortran_int_t m, const fortran_int_t p, const fortran_int_t n, + const fortran_int_t k, const fortran_int_t l, float* a, + const fortran_int_t lda, float* b, const fortran_int_t ldb, + const float tola, const float tolb, float* alpha, float* beta, + float* u, const fortran_int_t ldu, float* v, const fortran_int_t ldv, + float* q, const fortran_int_t ldq, float* work, + fortran_int_t& ncycle ) { + fortran_int_t info(0); + LAPACK_STGSJA( &jobu, &jobv, &jobq, &m, &p, &n, &k, &l, a, &lda, b, &ldb, + &tola, &tolb, alpha, beta, u, &ldu, v, &ldv, q, &ldq, work, + &ncycle, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t tgsja( const char jobu, const char jobv, const char jobq, + const fortran_int_t m, const fortran_int_t p, const fortran_int_t n, + const fortran_int_t k, const fortran_int_t l, double* a, + const fortran_int_t lda, double* b, const fortran_int_t ldb, + const double tola, const double tolb, double* alpha, double* beta, + double* u, const fortran_int_t ldu, double* v, + const fortran_int_t ldv, double* q, const fortran_int_t ldq, + double* work, fortran_int_t& ncycle ) { + fortran_int_t info(0); + LAPACK_DTGSJA( &jobu, &jobv, &jobq, &m, &p, &n, &k, &l, a, &lda, b, &ldb, + &tola, &tolb, alpha, beta, u, &ldu, v, &ldv, q, &ldq, work, + &ncycle, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t tgsja( const char jobu, const char jobv, const char jobq, + const fortran_int_t m, const fortran_int_t p, const fortran_int_t n, + const fortran_int_t k, const fortran_int_t l, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, const float tola, const float tolb, + float* alpha, float* beta, std::complex* u, + const fortran_int_t ldu, std::complex* v, + const fortran_int_t ldv, std::complex* q, + const fortran_int_t ldq, std::complex* work, + fortran_int_t& ncycle ) { + fortran_int_t info(0); + LAPACK_CTGSJA( &jobu, &jobv, &jobq, &m, &p, &n, &k, &l, a, &lda, b, &ldb, + &tola, &tolb, alpha, beta, u, &ldu, v, &ldv, q, &ldq, work, + &ncycle, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t tgsja( const char jobu, const char jobv, const char jobq, + const fortran_int_t m, const fortran_int_t p, const fortran_int_t n, + const fortran_int_t k, const fortran_int_t l, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, const double tola, const double tolb, + double* alpha, double* beta, std::complex* u, + const fortran_int_t ldu, std::complex* v, + const fortran_int_t ldv, std::complex* q, + const fortran_int_t ldq, std::complex* work, + fortran_int_t& ncycle ) { + fortran_int_t info(0); + LAPACK_ZTGSJA( &jobu, &jobv, &jobq, &m, &p, &n, &k, &l, a, &lda, b, &ldb, + &tola, &tolb, alpha, beta, u, &ldu, v, &ldv, q, &ldq, work, + &ncycle, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tgsja. +// +template< typename Value, typename Enable = void > +struct tgsja_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct tgsja_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ, typename WORK > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, const fortran_int_t k, + const fortran_int_t l, MatrixA& a, MatrixB& b, + const real_type tola, const real_type tolb, VectorALPHA& alpha, + VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q, + fortran_int_t& ncycle, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::size(alpha) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::size_row(b) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(b)) ); + BOOST_ASSERT( jobq == 'Q' || jobq == 'I' || jobq == 'N' ); + BOOST_ASSERT( jobu == 'U' || jobu == 'I' || jobu == 'N' ); + BOOST_ASSERT( jobv == 'V' || jobv == 'I' || jobv == 'N' ); + return detail::tgsja( jobu, jobv, jobq, bindings::size_row(a), + bindings::size_row(b), bindings::size_column(a), k, l, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), tola, + tolb, bindings::begin_value(alpha), + bindings::begin_value(beta), bindings::begin_value(u), + bindings::stride_major(u), bindings::begin_value(v), + bindings::stride_major(v), bindings::begin_value(q), + bindings::stride_major(q), + bindings::begin_value(work.select(real_type())), ncycle ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, const fortran_int_t k, + const fortran_int_t l, MatrixA& a, MatrixB& b, + const real_type tola, const real_type tolb, VectorALPHA& alpha, + VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q, + fortran_int_t& ncycle, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( jobu, jobv, jobq, k, l, a, b, tola, tolb, alpha, beta, + u, v, q, ncycle, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, const fortran_int_t k, + const fortran_int_t l, MatrixA& a, MatrixB& b, + const real_type tola, const real_type tolb, VectorALPHA& alpha, + VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q, + fortran_int_t& ncycle, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( jobu, jobv, jobq, k, l, a, b, tola, tolb, alpha, beta, + u, v, q, ncycle, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct tgsja_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ, typename WORK > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, const fortran_int_t k, + const fortran_int_t l, MatrixA& a, MatrixB& b, + const real_type tola, const real_type tolb, VectorALPHA& alpha, + VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q, + fortran_int_t& ncycle, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorALPHA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::size(alpha) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::size_row(b) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(b)) ); + BOOST_ASSERT( jobq == 'Q' || jobq == 'I' || jobq == 'N' ); + BOOST_ASSERT( jobu == 'U' || jobu == 'I' || jobu == 'N' ); + BOOST_ASSERT( jobv == 'V' || jobv == 'I' || jobv == 'N' ); + return detail::tgsja( jobu, jobv, jobq, bindings::size_row(a), + bindings::size_row(b), bindings::size_column(a), k, l, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), tola, + tolb, bindings::begin_value(alpha), + bindings::begin_value(beta), bindings::begin_value(u), + bindings::stride_major(u), bindings::begin_value(v), + bindings::stride_major(v), bindings::begin_value(q), + bindings::stride_major(q), + bindings::begin_value(work.select(value_type())), ncycle ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, const fortran_int_t k, + const fortran_int_t l, MatrixA& a, MatrixB& b, + const real_type tola, const real_type tolb, VectorALPHA& alpha, + VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q, + fortran_int_t& ncycle, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( jobu, jobv, jobq, k, l, a, b, tola, tolb, alpha, beta, + u, v, q, ncycle, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, const fortran_int_t k, + const fortran_int_t l, MatrixA& a, MatrixB& b, + const real_type tola, const real_type tolb, VectorALPHA& alpha, + VectorBETA& beta, MatrixU& u, MatrixV& v, MatrixQ& q, + fortran_int_t& ncycle, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( jobu, jobv, jobq, k, l, a, b, tola, tolb, alpha, beta, + u, v, q, ncycle, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tgsja_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tgsja. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +tgsja( const char jobu, const char jobv, const char jobq, + const fortran_int_t k, const fortran_int_t l, MatrixA& a, + MatrixB& b, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type tola, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type tolb, VectorALPHA& alpha, VectorBETA& beta, + MatrixU& u, MatrixV& v, MatrixQ& q, fortran_int_t& ncycle, + Workspace work ) { + return tgsja_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobu, jobv, jobq, k, l, a, b, tola, + tolb, alpha, beta, u, v, q, ncycle, work ); +} + +// +// Overloaded function for tgsja. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ > +inline typename boost::disable_if< detail::is_workspace< MatrixQ >, + std::ptrdiff_t >::type +tgsja( const char jobu, const char jobv, const char jobq, + const fortran_int_t k, const fortran_int_t l, MatrixA& a, + MatrixB& b, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type tola, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type tolb, VectorALPHA& alpha, VectorBETA& beta, + MatrixU& u, MatrixV& v, MatrixQ& q, fortran_int_t& ncycle ) { + return tgsja_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobu, jobv, jobq, k, l, a, b, tola, + tolb, alpha, beta, u, v, q, ncycle, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tgsna.hpp b/sdk/boost/numeric/bindings/lapack/computational/tgsna.hpp new file mode 100644 index 0000000..8ad6de1 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tgsna.hpp @@ -0,0 +1,498 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGSNA_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGSNA_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tgsna is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t tgsna( const char job, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, const float* a, + const fortran_int_t lda, const float* b, const fortran_int_t ldb, + const float* vl, const fortran_int_t ldvl, const float* vr, + const fortran_int_t ldvr, float* s, float* dif, + const fortran_int_t mm, fortran_int_t& m, float* work, + const fortran_int_t lwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_STGSNA( &job, &howmny, select, &n, a, &lda, b, &ldb, vl, &ldvl, vr, + &ldvr, s, dif, &mm, &m, work, &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t tgsna( const char job, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, const double* a, + const fortran_int_t lda, const double* b, const fortran_int_t ldb, + const double* vl, const fortran_int_t ldvl, const double* vr, + const fortran_int_t ldvr, double* s, double* dif, + const fortran_int_t mm, fortran_int_t& m, double* work, + const fortran_int_t lwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DTGSNA( &job, &howmny, select, &n, a, &lda, b, &ldb, vl, &ldvl, vr, + &ldvr, s, dif, &mm, &m, work, &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t tgsna( const char job, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const std::complex* b, const fortran_int_t ldb, + const std::complex* vl, const fortran_int_t ldvl, + const std::complex* vr, const fortran_int_t ldvr, float* s, + float* dif, const fortran_int_t mm, fortran_int_t& m, + std::complex* work, const fortran_int_t lwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_CTGSNA( &job, &howmny, select, &n, a, &lda, b, &ldb, vl, &ldvl, vr, + &ldvr, s, dif, &mm, &m, work, &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t tgsna( const char job, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const std::complex* b, const fortran_int_t ldb, + const std::complex* vl, const fortran_int_t ldvl, + const std::complex* vr, const fortran_int_t ldvr, double* s, + double* dif, const fortran_int_t mm, fortran_int_t& m, + std::complex* work, const fortran_int_t lwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_ZTGSNA( &job, &howmny, select, &n, a, &lda, b, &ldb, vl, &ldvl, vr, + &ldvr, s, dif, &mm, &m, work, &lwork, iwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tgsna. +// +template< typename Value, typename Enable = void > +struct tgsna_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct tgsna_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename MatrixVL, typename MatrixVR, typename VectorS, + typename VectorDIF, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char job, const char howmny, + const VectorSELECT& select, const fortran_int_t n, + const MatrixA& a, const MatrixB& b, const MatrixVL& vl, + const MatrixVR& vr, VectorS& s, VectorDIF& dif, + const fortran_int_t mm, fortran_int_t& m, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDIF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDIF >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( job, n )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( job, n )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( howmny == 'A' || howmny == 'S' ); + BOOST_ASSERT( job == 'E' || job == 'V' || job == 'B' ); + BOOST_ASSERT( n >= 0 ); + return detail::tgsna( job, howmny, bindings::begin_value(select), n, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), + bindings::begin_value(s), bindings::begin_value(dif), mm, m, + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename MatrixVL, typename MatrixVR, typename VectorS, + typename VectorDIF > + static std::ptrdiff_t invoke( const char job, const char howmny, + const VectorSELECT& select, const fortran_int_t n, + const MatrixA& a, const MatrixB& b, const MatrixVL& vl, + const MatrixVR& vr, VectorS& s, VectorDIF& dif, + const fortran_int_t mm, fortran_int_t& m, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( job, + n ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( job, n ) ); + return invoke( job, howmny, select, n, a, b, vl, vr, s, dif, mm, m, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename MatrixVL, typename MatrixVR, typename VectorS, + typename VectorDIF > + static std::ptrdiff_t invoke( const char job, const char howmny, + const VectorSELECT& select, const fortran_int_t n, + const MatrixA& a, const MatrixB& b, const MatrixVL& vl, + const MatrixVR& vr, VectorS& s, VectorDIF& dif, + const fortran_int_t mm, fortran_int_t& m, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( job, n ) ); + detail::tgsna( job, howmny, bindings::begin_value(select), n, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), + bindings::begin_value(s), bindings::begin_value(dif), mm, m, + &opt_size_work, -1, bindings::begin_value(tmp_iwork) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( job, howmny, select, n, a, b, vl, vr, s, dif, mm, m, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char job, + const std::ptrdiff_t n ) { + if ( job == 'V' || job == 'B' ) + return std::max< std::ptrdiff_t >(1, 2*n*(n+2)+16); + else + return std::max< std::ptrdiff_t >(1, n); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char job, + const std::ptrdiff_t n ) { + if ( job == 'E') + return 1; + else + return n+6; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct tgsna_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename MatrixVL, typename MatrixVR, typename VectorS, + typename VectorDIF, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char job, const char howmny, + const VectorSELECT& select, const fortran_int_t n, + const MatrixA& a, const MatrixB& b, const MatrixVL& vl, + const MatrixVR& vr, VectorS& s, VectorDIF& dif, + const fortran_int_t mm, fortran_int_t& m, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorS >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDIF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDIF >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( job, n )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( job, n )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( howmny == 'A' || howmny == 'S' ); + BOOST_ASSERT( job == 'E' || job == 'V' || job == 'B' ); + BOOST_ASSERT( n >= 0 ); + return detail::tgsna( job, howmny, bindings::begin_value(select), n, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), + bindings::begin_value(s), bindings::begin_value(dif), mm, m, + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename MatrixVL, typename MatrixVR, typename VectorS, + typename VectorDIF > + static std::ptrdiff_t invoke( const char job, const char howmny, + const VectorSELECT& select, const fortran_int_t n, + const MatrixA& a, const MatrixB& b, const MatrixVL& vl, + const MatrixVR& vr, VectorS& s, VectorDIF& dif, + const fortran_int_t mm, fortran_int_t& m, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( job, + n ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( job, n ) ); + return invoke( job, howmny, select, n, a, b, vl, vr, s, dif, mm, m, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename MatrixVL, typename MatrixVR, typename VectorS, + typename VectorDIF > + static std::ptrdiff_t invoke( const char job, const char howmny, + const VectorSELECT& select, const fortran_int_t n, + const MatrixA& a, const MatrixB& b, const MatrixVL& vl, + const MatrixVR& vr, VectorS& s, VectorDIF& dif, + const fortran_int_t mm, fortran_int_t& m, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( job, howmny, select, n, a, b, vl, vr, s, dif, mm, m, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char job, + const std::ptrdiff_t n ) { + if ( job == 'V' || job == 'B' ) + return std::max< std::ptrdiff_t >(1, 2*n*n); + else + return std::max< std::ptrdiff_t >(1, n); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char job, + const std::ptrdiff_t n ) { + if ( job == 'E') + return 1; + else + return n+2; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tgsna_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tgsna. Its overload differs for +// * User-defined workspace +// +template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename MatrixVL, typename MatrixVR, typename VectorS, + typename VectorDIF, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +tgsna( const char job, const char howmny, const VectorSELECT& select, + const fortran_int_t n, const MatrixA& a, const MatrixB& b, + const MatrixVL& vl, const MatrixVR& vr, VectorS& s, VectorDIF& dif, + const fortran_int_t mm, fortran_int_t& m, Workspace work ) { + return tgsna_impl< typename bindings::value_type< + MatrixA >::type >::invoke( job, howmny, select, n, a, b, vl, vr, + s, dif, mm, m, work ); +} + +// +// Overloaded function for tgsna. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorSELECT, typename MatrixA, typename MatrixB, + typename MatrixVL, typename MatrixVR, typename VectorS, + typename VectorDIF > +inline typename boost::disable_if< detail::is_workspace< VectorDIF >, + std::ptrdiff_t >::type +tgsna( const char job, const char howmny, const VectorSELECT& select, + const fortran_int_t n, const MatrixA& a, const MatrixB& b, + const MatrixVL& vl, const MatrixVR& vr, VectorS& s, VectorDIF& dif, + const fortran_int_t mm, fortran_int_t& m ) { + return tgsna_impl< typename bindings::value_type< + MatrixA >::type >::invoke( job, howmny, select, n, a, b, vl, vr, + s, dif, mm, m, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tgsyl.hpp b/sdk/boost/numeric/bindings/lapack/computational/tgsyl.hpp new file mode 100644 index 0000000..dc338e0 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tgsyl.hpp @@ -0,0 +1,548 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGSYL_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TGSYL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tgsyl is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Trans > +inline std::ptrdiff_t tgsyl( const Trans, const fortran_int_t ijob, + const fortran_int_t m, const fortran_int_t n, const float* a, + const fortran_int_t lda, const float* b, const fortran_int_t ldb, + float* c, const fortran_int_t ldc, const float* d, + const fortran_int_t ldd, const float* e, const fortran_int_t lde, + float* f, const fortran_int_t ldf, float& scale, float& dif, + float* work, const fortran_int_t lwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_STGSYL( &lapack_option< Trans >::value, &ijob, &m, &n, a, &lda, b, + &ldb, c, &ldc, d, &ldd, e, &lde, f, &ldf, &scale, &dif, work, + &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Trans > +inline std::ptrdiff_t tgsyl( const Trans, const fortran_int_t ijob, + const fortran_int_t m, const fortran_int_t n, const double* a, + const fortran_int_t lda, const double* b, const fortran_int_t ldb, + double* c, const fortran_int_t ldc, const double* d, + const fortran_int_t ldd, const double* e, const fortran_int_t lde, + double* f, const fortran_int_t ldf, double& scale, double& dif, + double* work, const fortran_int_t lwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DTGSYL( &lapack_option< Trans >::value, &ijob, &m, &n, a, &lda, b, + &ldb, c, &ldc, d, &ldd, e, &lde, f, &ldf, &scale, &dif, work, + &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t tgsyl( const Trans, const fortran_int_t ijob, + const fortran_int_t m, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const std::complex* b, const fortran_int_t ldb, + std::complex* c, const fortran_int_t ldc, + const std::complex* d, const fortran_int_t ldd, + const std::complex* e, const fortran_int_t lde, + std::complex* f, const fortran_int_t ldf, float& scale, + float& dif, std::complex* work, const fortran_int_t lwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_CTGSYL( &lapack_option< Trans >::value, &ijob, &m, &n, a, &lda, b, + &ldb, c, &ldc, d, &ldd, e, &lde, f, &ldf, &scale, &dif, work, + &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t tgsyl( const Trans, const fortran_int_t ijob, + const fortran_int_t m, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const std::complex* b, const fortran_int_t ldb, + std::complex* c, const fortran_int_t ldc, + const std::complex* d, const fortran_int_t ldd, + const std::complex* e, const fortran_int_t lde, + std::complex* f, const fortran_int_t ldf, double& scale, + double& dif, std::complex* work, const fortran_int_t lwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_ZTGSYL( &lapack_option< Trans >::value, &ijob, &m, &n, a, &lda, b, + &ldb, c, &ldc, d, &ldd, e, &lde, f, &ldf, &scale, &dif, work, + &lwork, iwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tgsyl. +// +template< typename Value, typename Enable = void > +struct tgsyl_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct tgsyl_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixC, + typename MatrixD, typename MatrixE, typename MatrixF, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const MatrixA& a, const MatrixB& b, MatrixC& c, const MatrixD& d, + const MatrixE& e, MatrixF& f, real_type& scale, real_type& dif, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixF >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixF >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column_op(a, trans()), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column_op(a, trans()), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_minor(d) == 1 || + bindings::stride_minor(d) == 1 ); + BOOST_ASSERT( bindings::size_minor(e) == 1 || + bindings::stride_minor(e) == 1 ); + BOOST_ASSERT( bindings::size_minor(f) == 1 || + bindings::stride_minor(f) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(b)) ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(d) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(e) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(b)) ); + BOOST_ASSERT( bindings::stride_major(f) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + return detail::tgsyl( trans(), ijob, bindings::size_column_op(a, + trans()), bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(c), + bindings::stride_major(c), bindings::begin_value(d), + bindings::stride_major(d), bindings::begin_value(e), + bindings::stride_major(e), bindings::begin_value(f), + bindings::stride_major(f), scale, dif, + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename MatrixC, + typename MatrixD, typename MatrixE, typename MatrixF > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const MatrixA& a, const MatrixB& b, MatrixC& c, const MatrixD& d, + const MatrixE& e, MatrixF& f, real_type& scale, real_type& dif, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column_op(a, trans()), + bindings::size_column(b) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column_op(a, trans()), + bindings::size_column(b) ) ); + return invoke( ijob, a, b, c, d, e, f, scale, dif, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename MatrixC, + typename MatrixD, typename MatrixE, typename MatrixF > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const MatrixA& a, const MatrixB& b, MatrixC& c, const MatrixD& d, + const MatrixE& e, MatrixF& f, real_type& scale, real_type& dif, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column_op(a, trans()), + bindings::size_column(b) ) ); + detail::tgsyl( trans(), ijob, bindings::size_column_op(a, + trans()), bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(c), + bindings::stride_major(c), bindings::begin_value(d), + bindings::stride_major(d), bindings::begin_value(e), + bindings::stride_major(e), bindings::begin_value(f), + bindings::stride_major(f), scale, dif, &opt_size_work, -1, + bindings::begin_value(tmp_iwork) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( ijob, a, b, c, d, e, f, scale, dif, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,2*m*n); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t m, + const std::ptrdiff_t n ) { + return m+n+6; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct tgsyl_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixC, + typename MatrixD, typename MatrixE, typename MatrixF, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const MatrixA& a, const MatrixB& b, MatrixC& c, const MatrixD& d, + const MatrixE& e, MatrixF& f, real_type& scale, real_type& dif, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixF >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixF >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column_op(a, trans()), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column_op(a, trans()), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_minor(d) == 1 || + bindings::stride_minor(d) == 1 ); + BOOST_ASSERT( bindings::size_minor(e) == 1 || + bindings::stride_minor(e) == 1 ); + BOOST_ASSERT( bindings::size_minor(f) == 1 || + bindings::stride_minor(f) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(b)) ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(d) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(e) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(b)) ); + BOOST_ASSERT( bindings::stride_major(f) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + return detail::tgsyl( trans(), ijob, bindings::size_column_op(a, + trans()), bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(c), + bindings::stride_major(c), bindings::begin_value(d), + bindings::stride_major(d), bindings::begin_value(e), + bindings::stride_major(e), bindings::begin_value(f), + bindings::stride_major(f), scale, dif, + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename MatrixC, + typename MatrixD, typename MatrixE, typename MatrixF > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const MatrixA& a, const MatrixB& b, MatrixC& c, const MatrixD& d, + const MatrixE& e, MatrixF& f, real_type& scale, real_type& dif, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column_op(a, trans()), + bindings::size_column(b) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column_op(a, trans()), + bindings::size_column(b) ) ); + return invoke( ijob, a, b, c, d, e, f, scale, dif, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename MatrixC, + typename MatrixD, typename MatrixE, typename MatrixF > + static std::ptrdiff_t invoke( const fortran_int_t ijob, + const MatrixA& a, const MatrixB& b, MatrixC& c, const MatrixD& d, + const MatrixE& e, MatrixF& f, real_type& scale, real_type& dif, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + value_type opt_size_work; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column_op(a, trans()), + bindings::size_column(b) ) ); + detail::tgsyl( trans(), ijob, bindings::size_column_op(a, + trans()), bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(c), + bindings::stride_major(c), bindings::begin_value(d), + bindings::stride_major(d), bindings::begin_value(e), + bindings::stride_major(e), bindings::begin_value(f), + bindings::stride_major(f), scale, dif, &opt_size_work, -1, + bindings::begin_value(tmp_iwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( ijob, a, b, c, d, e, f, scale, dif, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,2*m*n); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t m, + const std::ptrdiff_t n ) { + return m+n+2; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tgsyl_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tgsyl. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename MatrixC, + typename MatrixD, typename MatrixE, typename MatrixF, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +tgsyl( const fortran_int_t ijob, const MatrixA& a, const MatrixB& b, + MatrixC& c, const MatrixD& d, const MatrixE& e, MatrixF& f, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& scale, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& dif, + Workspace work ) { + return tgsyl_impl< typename bindings::value_type< + MatrixA >::type >::invoke( ijob, a, b, c, d, e, f, scale, dif, + work ); +} + +// +// Overloaded function for tgsyl. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename MatrixC, + typename MatrixD, typename MatrixE, typename MatrixF > +inline typename boost::disable_if< detail::is_workspace< MatrixF >, + std::ptrdiff_t >::type +tgsyl( const fortran_int_t ijob, const MatrixA& a, const MatrixB& b, + MatrixC& c, const MatrixD& d, const MatrixE& e, MatrixF& f, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& scale, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& dif ) { + return tgsyl_impl< typename bindings::value_type< + MatrixA >::type >::invoke( ijob, a, b, c, d, e, f, scale, dif, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tpcon.hpp b/sdk/boost/numeric/bindings/lapack/computational/tpcon.hpp new file mode 100644 index 0000000..693c58f --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tpcon.hpp @@ -0,0 +1,333 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TPCON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TPCON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tpcon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t tpcon( const char norm, const UpLo, const Diag, + const fortran_int_t n, const float* ap, float& rcond, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_STPCON( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, ap, &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t tpcon( const char norm, const UpLo, const Diag, + const fortran_int_t n, const double* ap, double& rcond, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DTPCON( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, ap, &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t tpcon( const char norm, const UpLo, const Diag, + const fortran_int_t n, const std::complex* ap, float& rcond, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CTPCON( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, ap, &rcond, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t tpcon( const char norm, const UpLo, const Diag, + const fortran_int_t n, const std::complex* ap, double& rcond, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZTPCON( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, ap, &rcond, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tpcon. +// +template< typename Value, typename Enable = void > +struct tpcon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct tpcon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char norm, const MatrixAP& ap, + real_type& rcond, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( norm == '1' || norm == 'O' || norm == 'I' ); + return detail::tpcon( norm, uplo(), diag(), bindings::size_column(ap), + bindings::begin_value(ap), rcond, + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const char norm, const MatrixAP& ap, + real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( norm, ap, rcond, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const char norm, const MatrixAP& ap, + real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + return invoke( norm, ap, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct tpcon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char norm, const MatrixAP& ap, + real_type& rcond, detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( norm == '1' || norm == 'O' || norm == 'I' ); + return detail::tpcon( norm, uplo(), diag(), bindings::size_column(ap), + bindings::begin_value(ap), rcond, + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const char norm, const MatrixAP& ap, + real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ap) ) ); + return invoke( norm, ap, rcond, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( const char norm, const MatrixAP& ap, + real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + return invoke( norm, ap, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tpcon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tpcon. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +tpcon( const char norm, const MatrixAP& ap, typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type& rcond, + Workspace work ) { + return tpcon_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( norm, ap, rcond, work ); +} + +// +// Overloaded function for tpcon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP > +inline typename boost::disable_if< detail::is_workspace< MatrixAP >, + std::ptrdiff_t >::type +tpcon( const char norm, const MatrixAP& ap, typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type& rcond ) { + return tpcon_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( norm, ap, rcond, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tprfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/tprfs.hpp new file mode 100644 index 0000000..95b8d67 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tprfs.hpp @@ -0,0 +1,440 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TPRFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TPRFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tprfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tprfs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, const float* ap, + const float* b, const fortran_int_t ldb, const float* x, + const fortran_int_t ldx, float* ferr, float* berr, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_STPRFS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, ap, b, + &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tprfs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, const double* ap, + const double* b, const fortran_int_t ldb, const double* x, + const fortran_int_t ldx, double* ferr, double* berr, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DTPRFS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, ap, b, + &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tprfs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* ap, const std::complex* b, + const fortran_int_t ldb, const std::complex* x, + const fortran_int_t ldx, float* ferr, float* berr, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CTPRFS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, ap, b, + &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tprfs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* ap, const std::complex* b, + const fortran_int_t ldb, const std::complex* x, + const fortran_int_t ldx, double* ferr, double* berr, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZTPRFS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, ap, b, + &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tprfs. +// +template< typename Value, typename Enable = void > +struct tprfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct tprfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAP, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAP, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column_op(ap, trans()) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column_op(ap, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(ap, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ap, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ap, trans())) ); + return detail::tprfs( uplo(), trans(), diag(), + bindings::size_column_op(ap, trans()), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAP, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAP, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column_op(ap, trans()) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column_op(ap, trans()) ) ); + return invoke( ap, b, x, ferr, berr, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAP, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAP, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + return invoke( ap, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct tprfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename WORK, + typename RWORK > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAP, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAP, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column_op(ap, trans()) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column_op(ap, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(ap, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ap, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ap, trans())) ); + return detail::tprfs( uplo(), trans(), diag(), + bindings::size_column_op(ap, trans()), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAP, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAP, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column_op(ap, trans()) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column_op(ap, trans()) ) ); + return invoke( ap, b, x, ferr, berr, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixAP& ap, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAP, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAP, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + return invoke( ap, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tprfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tprfs. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +tprfs( const MatrixAP& ap, const MatrixB& b, const MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, Workspace work ) { + return tprfs_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, b, x, ferr, berr, work ); +} + +// +// Overloaded function for tprfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +tprfs( const MatrixAP& ap, const MatrixB& b, const MatrixX& x, + VectorFERR& ferr, VectorBERR& berr ) { + return tprfs_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, b, x, ferr, berr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tptri.hpp b/sdk/boost/numeric/bindings/lapack/computational/tptri.hpp new file mode 100644 index 0000000..4fa7f2f --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tptri.hpp @@ -0,0 +1,157 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TPTRI_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TPTRI_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tptri is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t tptri( const UpLo, const Diag, const fortran_int_t n, + float* ap ) { + fortran_int_t info(0); + LAPACK_STPTRI( &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, ap, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t tptri( const UpLo, const Diag, const fortran_int_t n, + double* ap ) { + fortran_int_t info(0); + LAPACK_DTPTRI( &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, ap, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t tptri( const UpLo, const Diag, const fortran_int_t n, + std::complex* ap ) { + fortran_int_t info(0); + LAPACK_CTPTRI( &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, ap, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t tptri( const UpLo, const Diag, const fortran_int_t n, + std::complex* ap ) { + fortran_int_t info(0); + LAPACK_ZTPTRI( &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, ap, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tptri. +// +template< typename Value > +struct tptri_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP > + static std::ptrdiff_t invoke( MatrixAP& ap ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + return detail::tptri( uplo(), diag(), bindings::size_column(ap), + bindings::begin_value(ap) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tptri_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tptri. Its overload differs for +// +template< typename MatrixAP > +inline std::ptrdiff_t tptri( MatrixAP& ap ) { + return tptri_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tptrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/tptrs.hpp new file mode 100644 index 0000000..b0df245 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tptrs.hpp @@ -0,0 +1,182 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TPTRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TPTRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tptrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tptrs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, const float* ap, + float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_STPTRS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, ap, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tptrs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, const double* ap, + double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DTPTRS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, ap, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tptrs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* ap, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CTPTRS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, ap, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t tptrs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* ap, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZTPTRS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, ap, b, + &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tptrs. +// +template< typename Value > +struct tptrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixB > + static std::ptrdiff_t invoke( const MatrixAP& ap, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixAP, order >::type trans; + typedef typename result_of::uplo_tag< MatrixAP, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixAP >::type diag; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(ap, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ap, trans())) ); + return detail::tptrs( uplo(), trans(), diag(), + bindings::size_column_op(ap, trans()), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tptrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tptrs. Its overload differs for +// +template< typename MatrixAP, typename MatrixB > +inline std::ptrdiff_t tptrs( const MatrixAP& ap, MatrixB& b ) { + return tptrs_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/trcon.hpp b/sdk/boost/numeric/bindings/lapack/computational/trcon.hpp new file mode 100644 index 0000000..4a72885 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/trcon.hpp @@ -0,0 +1,346 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRCON_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRCON_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for trcon is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t trcon( const char norm, const UpLo, const Diag, + const fortran_int_t n, const float* a, const fortran_int_t lda, + float& rcond, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_STRCON( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, a, &lda, &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t trcon( const char norm, const UpLo, const Diag, + const fortran_int_t n, const double* a, const fortran_int_t lda, + double& rcond, double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DTRCON( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, a, &lda, &rcond, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t trcon( const char norm, const UpLo, const Diag, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, float& rcond, std::complex* work, + float* rwork ) { + fortran_int_t info(0); + LAPACK_CTRCON( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, a, &lda, &rcond, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Diag > +inline std::ptrdiff_t trcon( const char norm, const UpLo, const Diag, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, double& rcond, std::complex* work, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZTRCON( &norm, &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, a, &lda, &rcond, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to trcon. +// +template< typename Value, typename Enable = void > +struct trcon_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct trcon_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + real_type& rcond, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( norm == '1' || norm == 'O' || norm == 'I' ); + return detail::trcon( norm, uplo(), diag(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), rcond, + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( norm, a, rcond, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + return invoke( norm, a, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct trcon_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + real_type& rcond, detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( norm == '1' || norm == 'O' || norm == 'I' ); + return detail::trcon( norm, uplo(), diag(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), rcond, + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + real_type& rcond, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( norm, a, rcond, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA > + static std::ptrdiff_t invoke( const char norm, const MatrixA& a, + real_type& rcond, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + return invoke( norm, a, rcond, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the trcon_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for trcon. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +trcon( const char norm, const MatrixA& a, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond, + Workspace work ) { + return trcon_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, rcond, work ); +} + +// +// Overloaded function for trcon. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA > +inline typename boost::disable_if< detail::is_workspace< MatrixA >, + std::ptrdiff_t >::type +trcon( const char norm, const MatrixA& a, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond ) { + return trcon_impl< typename bindings::value_type< + MatrixA >::type >::invoke( norm, a, rcond, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/trevc.hpp b/sdk/boost/numeric/bindings/lapack/computational/trevc.hpp new file mode 100644 index 0000000..79452e9 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/trevc.hpp @@ -0,0 +1,509 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TREVC_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TREVC_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for trevc is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side > +inline std::ptrdiff_t trevc( const Side, const char howmny, + fortran_bool_t* select, const fortran_int_t n, const float* t, + const fortran_int_t ldt, float* vl, const fortran_int_t ldvl, + float* vr, const fortran_int_t ldvr, const fortran_int_t mm, + fortran_int_t& m, float* work ) { + fortran_int_t info(0); + LAPACK_STREVC( &lapack_option< Side >::value, &howmny, select, &n, t, + &ldt, vl, &ldvl, vr, &ldvr, &mm, &m, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side > +inline std::ptrdiff_t trevc( const Side, const char howmny, + fortran_bool_t* select, const fortran_int_t n, const double* t, + const fortran_int_t ldt, double* vl, const fortran_int_t ldvl, + double* vr, const fortran_int_t ldvr, const fortran_int_t mm, + fortran_int_t& m, double* work ) { + fortran_int_t info(0); + LAPACK_DTREVC( &lapack_option< Side >::value, &howmny, select, &n, t, + &ldt, vl, &ldvl, vr, &ldvr, &mm, &m, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t trevc( const Side, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, + std::complex* t, const fortran_int_t ldt, + std::complex* vl, const fortran_int_t ldvl, + std::complex* vr, const fortran_int_t ldvr, + const fortran_int_t mm, fortran_int_t& m, std::complex* work, + float* rwork ) { + fortran_int_t info(0); + LAPACK_CTREVC( &lapack_option< Side >::value, &howmny, select, &n, t, + &ldt, vl, &ldvl, vr, &ldvr, &mm, &m, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side > +inline std::ptrdiff_t trevc( const Side, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, + std::complex* t, const fortran_int_t ldt, + std::complex* vl, const fortran_int_t ldvl, + std::complex* vr, const fortran_int_t ldvr, + const fortran_int_t mm, fortran_int_t& m, std::complex* work, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZTREVC( &lapack_option< Side >::value, &howmny, select, &n, t, + &ldt, vl, &ldvl, vr, &ldvr, &mm, &m, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to trevc. +// +template< typename Value, typename Enable = void > +struct trevc_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct trevc_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR, typename WORK > + static std::ptrdiff_t invoke( const Side side, const char howmny, + VectorSELECT& select, const MatrixT& t, MatrixVL& vl, + MatrixVR& vr, const fortran_int_t mm, fortran_int_t& m, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorSELECT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(t) )); + BOOST_ASSERT( bindings::size_column(t) >= 0 ); + BOOST_ASSERT( bindings::size_minor(t) == 1 || + bindings::stride_minor(t) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(t) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(t)) ); + BOOST_ASSERT( howmny == 'A' || howmny == 'B' || howmny == 'S' ); + return detail::trevc( side, howmny, bindings::begin_value(select), + bindings::size_column(t), bindings::begin_value(t), + bindings::stride_major(t), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), mm, m, + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const Side side, const char howmny, + VectorSELECT& select, const MatrixT& t, MatrixVL& vl, + MatrixVR& vr, const fortran_int_t mm, fortran_int_t& m, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(t) ) ); + return invoke( side, howmny, select, t, vl, vr, mm, m, + workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const Side side, const char howmny, + VectorSELECT& select, const MatrixT& t, MatrixVL& vl, + MatrixVR& vr, const fortran_int_t mm, fortran_int_t& m, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( side, howmny, select, t, vl, vr, mm, m, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct trevc_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR, typename WORK, + typename RWORK > + static std::ptrdiff_t invoke( const Side side, const char howmny, + const VectorSELECT& select, MatrixT& t, MatrixVL& vl, + MatrixVR& vr, const fortran_int_t mm, fortran_int_t& m, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(t) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(t) )); + BOOST_ASSERT( bindings::size_column(t) >= 0 ); + BOOST_ASSERT( bindings::size_minor(t) == 1 || + bindings::stride_minor(t) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(t) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(t)) ); + BOOST_ASSERT( howmny == 'A' || howmny == 'B' || howmny == 'S' ); + return detail::trevc( side, howmny, bindings::begin_value(select), + bindings::size_column(t), bindings::begin_value(t), + bindings::stride_major(t), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), mm, m, + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const Side side, const char howmny, + const VectorSELECT& select, MatrixT& t, MatrixVL& vl, + MatrixVR& vr, const fortran_int_t mm, fortran_int_t& m, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(t) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(t) ) ); + return invoke( side, howmny, select, t, vl, vr, mm, m, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const Side side, const char howmny, + const VectorSELECT& select, MatrixT& t, MatrixVL& vl, + MatrixVR& vr, const fortran_int_t mm, fortran_int_t& m, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( side, howmny, select, t, vl, vr, mm, m, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the trevc_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for trevc. Its overload differs for +// * VectorSELECT& +// * MatrixT& +// * User-defined workspace +// +template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +trevc( const Side side, const char howmny, VectorSELECT& select, + MatrixT& t, MatrixVL& vl, MatrixVR& vr, const fortran_int_t mm, + fortran_int_t& m, Workspace work ) { + return trevc_impl< typename bindings::value_type< + MatrixT >::type >::invoke( side, howmny, select, t, vl, vr, mm, m, + work ); +} + +// +// Overloaded function for trevc. Its overload differs for +// * VectorSELECT& +// * MatrixT& +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR > +inline typename boost::disable_if< detail::is_workspace< MatrixVR >, + std::ptrdiff_t >::type +trevc( const Side side, const char howmny, VectorSELECT& select, + MatrixT& t, MatrixVL& vl, MatrixVR& vr, const fortran_int_t mm, + fortran_int_t& m ) { + return trevc_impl< typename bindings::value_type< + MatrixT >::type >::invoke( side, howmny, select, t, vl, vr, mm, m, + optimal_workspace() ); +} + +// +// Overloaded function for trevc. Its overload differs for +// * const VectorSELECT& +// * MatrixT& +// * User-defined workspace +// +template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +trevc( const Side side, const char howmny, const VectorSELECT& select, + MatrixT& t, MatrixVL& vl, MatrixVR& vr, const fortran_int_t mm, + fortran_int_t& m, Workspace work ) { + return trevc_impl< typename bindings::value_type< + MatrixT >::type >::invoke( side, howmny, select, t, vl, vr, mm, m, + work ); +} + +// +// Overloaded function for trevc. Its overload differs for +// * const VectorSELECT& +// * MatrixT& +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR > +inline typename boost::disable_if< detail::is_workspace< MatrixVR >, + std::ptrdiff_t >::type +trevc( const Side side, const char howmny, const VectorSELECT& select, + MatrixT& t, MatrixVL& vl, MatrixVR& vr, const fortran_int_t mm, + fortran_int_t& m ) { + return trevc_impl< typename bindings::value_type< + MatrixT >::type >::invoke( side, howmny, select, t, vl, vr, mm, m, + optimal_workspace() ); +} + +// +// Overloaded function for trevc. Its overload differs for +// * VectorSELECT& +// * const MatrixT& +// * User-defined workspace +// +template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +trevc( const Side side, const char howmny, VectorSELECT& select, + const MatrixT& t, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m, Workspace work ) { + return trevc_impl< typename bindings::value_type< + MatrixT >::type >::invoke( side, howmny, select, t, vl, vr, mm, m, + work ); +} + +// +// Overloaded function for trevc. Its overload differs for +// * VectorSELECT& +// * const MatrixT& +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR > +inline typename boost::disable_if< detail::is_workspace< MatrixVR >, + std::ptrdiff_t >::type +trevc( const Side side, const char howmny, VectorSELECT& select, + const MatrixT& t, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m ) { + return trevc_impl< typename bindings::value_type< + MatrixT >::type >::invoke( side, howmny, select, t, vl, vr, mm, m, + optimal_workspace() ); +} + +// +// Overloaded function for trevc. Its overload differs for +// * const VectorSELECT& +// * const MatrixT& +// * User-defined workspace +// +template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +trevc( const Side side, const char howmny, const VectorSELECT& select, + const MatrixT& t, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m, Workspace work ) { + return trevc_impl< typename bindings::value_type< + MatrixT >::type >::invoke( side, howmny, select, t, vl, vr, mm, m, + work ); +} + +// +// Overloaded function for trevc. Its overload differs for +// * const VectorSELECT& +// * const MatrixT& +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorSELECT, typename MatrixT, + typename MatrixVL, typename MatrixVR > +inline typename boost::disable_if< detail::is_workspace< MatrixVR >, + std::ptrdiff_t >::type +trevc( const Side side, const char howmny, const VectorSELECT& select, + const MatrixT& t, MatrixVL& vl, MatrixVR& vr, + const fortran_int_t mm, fortran_int_t& m ) { + return trevc_impl< typename bindings::value_type< + MatrixT >::type >::invoke( side, howmny, select, t, vl, vr, mm, m, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/trexc.hpp b/sdk/boost/numeric/bindings/lapack/computational/trexc.hpp new file mode 100644 index 0000000..1c3655e --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/trexc.hpp @@ -0,0 +1,297 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TREXC_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TREXC_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for trexc is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t trexc( const char compq, const fortran_int_t n, float* t, + const fortran_int_t ldt, float* q, const fortran_int_t ldq, + fortran_int_t& ifst, fortran_int_t& ilst, float* work ) { + fortran_int_t info(0); + LAPACK_STREXC( &compq, &n, t, &ldt, q, &ldq, &ifst, &ilst, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t trexc( const char compq, const fortran_int_t n, + double* t, const fortran_int_t ldt, double* q, + const fortran_int_t ldq, fortran_int_t& ifst, fortran_int_t& ilst, + double* work ) { + fortran_int_t info(0); + LAPACK_DTREXC( &compq, &n, t, &ldt, q, &ldq, &ifst, &ilst, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t trexc( const char compq, const fortran_int_t n, + std::complex* t, const fortran_int_t ldt, + std::complex* q, const fortran_int_t ldq, + const fortran_int_t ifst, const fortran_int_t ilst ) { + fortran_int_t info(0); + LAPACK_CTREXC( &compq, &n, t, &ldt, q, &ldq, &ifst, &ilst, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t trexc( const char compq, const fortran_int_t n, + std::complex* t, const fortran_int_t ldt, + std::complex* q, const fortran_int_t ldq, + const fortran_int_t ifst, const fortran_int_t ilst ) { + fortran_int_t info(0); + LAPACK_ZTREXC( &compq, &n, t, &ldt, q, &ldq, &ifst, &ilst, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to trexc. +// +template< typename Value, typename Enable = void > +struct trexc_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct trexc_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixT, typename MatrixQ, typename WORK > + static std::ptrdiff_t invoke( const char compq, MatrixT& t, MatrixQ& q, + fortran_int_t& ifst, fortran_int_t& ilst, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(t) )); + BOOST_ASSERT( bindings::size_column(t) >= 0 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(t) == 1 || + bindings::stride_minor(t) == 1 ); + BOOST_ASSERT( bindings::stride_major(q) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(t)) ); + BOOST_ASSERT( bindings::stride_major(t) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(t)) ); + BOOST_ASSERT( compq == 'V' || compq == 'N' ); + return detail::trexc( compq, bindings::size_column(t), + bindings::begin_value(t), bindings::stride_major(t), + bindings::begin_value(q), bindings::stride_major(q), ifst, + ilst, bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixT, typename MatrixQ > + static std::ptrdiff_t invoke( const char compq, MatrixT& t, MatrixQ& q, + fortran_int_t& ifst, fortran_int_t& ilst, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(t) ) ); + return invoke( compq, t, q, ifst, ilst, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixT, typename MatrixQ > + static std::ptrdiff_t invoke( const char compq, MatrixT& t, MatrixQ& q, + fortran_int_t& ifst, fortran_int_t& ilst, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( compq, t, q, ifst, ilst, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct trexc_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixT, typename MatrixQ > + static std::ptrdiff_t invoke( const char compq, MatrixT& t, MatrixQ& q, + const fortran_int_t ifst, const fortran_int_t ilst ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::size_column(t) >= 0 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(t) == 1 || + bindings::stride_minor(t) == 1 ); + BOOST_ASSERT( bindings::stride_major(q) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(t)) ); + BOOST_ASSERT( bindings::stride_major(t) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(t)) ); + BOOST_ASSERT( compq == 'V' || compq == 'N' ); + return detail::trexc( compq, bindings::size_column(t), + bindings::begin_value(t), bindings::stride_major(t), + bindings::begin_value(q), bindings::stride_major(q), ifst, + ilst ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the trexc_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for trexc. Its overload differs for +// * User-defined workspace +// +template< typename MatrixT, typename MatrixQ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +trexc( const char compq, MatrixT& t, MatrixQ& q, fortran_int_t& ifst, + fortran_int_t& ilst, Workspace work ) { + return trexc_impl< typename bindings::value_type< + MatrixT >::type >::invoke( compq, t, q, ifst, ilst, work ); +} + +// +// Overloaded function for trexc. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixT, typename MatrixQ > +inline typename boost::disable_if< detail::is_workspace< MatrixQ >, + std::ptrdiff_t >::type +trexc( const char compq, MatrixT& t, MatrixQ& q, fortran_int_t& ifst, + fortran_int_t& ilst ) { + return trexc_impl< typename bindings::value_type< + MatrixT >::type >::invoke( compq, t, q, ifst, ilst, + optimal_workspace() ); +} + +// +// Overloaded function for trexc. Its overload differs for +// +template< typename MatrixT, typename MatrixQ > +inline std::ptrdiff_t trexc( const char compq, MatrixT& t, MatrixQ& q, + const fortran_int_t ifst, const fortran_int_t ilst ) { + return trexc_impl< typename bindings::value_type< + MatrixT >::type >::invoke( compq, t, q, ifst, ilst ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/trrfs.hpp b/sdk/boost/numeric/bindings/lapack/computational/trrfs.hpp new file mode 100644 index 0000000..eb5f586 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/trrfs.hpp @@ -0,0 +1,448 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRRFS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRRFS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for trrfs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t trrfs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, const float* a, + const fortran_int_t lda, const float* b, const fortran_int_t ldb, + const float* x, const fortran_int_t ldx, float* ferr, float* berr, + float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_STRRFS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, a, &lda, + b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t trrfs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, const double* a, + const fortran_int_t lda, const double* b, const fortran_int_t ldb, + const double* x, const fortran_int_t ldx, double* ferr, double* berr, + double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DTRRFS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, a, &lda, + b, &ldb, x, &ldx, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t trrfs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* a, const fortran_int_t lda, + const std::complex* b, const fortran_int_t ldb, + const std::complex* x, const fortran_int_t ldx, float* ferr, + float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CTRRFS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, a, &lda, + b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t trrfs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* a, const fortran_int_t lda, + const std::complex* b, const fortran_int_t ldb, + const std::complex* x, const fortran_int_t ldx, double* ferr, + double* berr, std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZTRRFS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, a, &lda, + b, &ldb, x, &ldx, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to trrfs. +// +template< typename Value, typename Enable = void > +struct trrfs_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct trrfs_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column_op(a, trans()) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column_op(a, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + return detail::trrfs( uplo(), trans(), diag(), + bindings::size_column_op(a, trans()), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column_op(a, trans()) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column_op(a, trans()) ) ); + return invoke( a, b, x, ferr, berr, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + return invoke( a, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct trrfs_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename WORK, + typename RWORK > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column_op(a, trans()) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column_op(a, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + return detail::trrfs( uplo(), trans(), diag(), + bindings::size_column_op(a, trans()), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column_op(a, trans()) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column_op(a, trans()) ) ); + return invoke( a, b, x, ferr, berr, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const MatrixA& a, const MatrixB& b, + const MatrixX& x, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + return invoke( a, b, x, ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the trrfs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for trrfs. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +trrfs( const MatrixA& a, const MatrixB& b, const MatrixX& x, + VectorFERR& ferr, VectorBERR& berr, Workspace work ) { + return trrfs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, x, ferr, berr, work ); +} + +// +// Overloaded function for trrfs. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +trrfs( const MatrixA& a, const MatrixB& b, const MatrixX& x, + VectorFERR& ferr, VectorBERR& berr ) { + return trrfs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, x, ferr, berr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/trsen.hpp b/sdk/boost/numeric/bindings/lapack/computational/trsen.hpp new file mode 100644 index 0000000..6ee54a9 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/trsen.hpp @@ -0,0 +1,254 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRSEN_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRSEN_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for trsen is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t trsen( const char job, const char compq, + const fortran_bool_t* select, const fortran_int_t n, + std::complex* t, const fortran_int_t ldt, + std::complex* q, const fortran_int_t ldq, + std::complex* w, fortran_int_t& m, float& s, float& sep, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CTRSEN( &job, &compq, select, &n, t, &ldt, q, &ldq, w, &m, &s, + &sep, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t trsen( const char job, const char compq, + const fortran_bool_t* select, const fortran_int_t n, + std::complex* t, const fortran_int_t ldt, + std::complex* q, const fortran_int_t ldq, + std::complex* w, fortran_int_t& m, double& s, double& sep, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZTRSEN( &job, &compq, select, &n, t, &ldt, q, &ldq, w, &m, &s, + &sep, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to trsen. +// +template< typename Value > +struct trsen_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorSELECT, typename MatrixT, typename MatrixQ, + typename VectorW, typename WORK > + static std::ptrdiff_t invoke( const char job, const char compq, + const VectorSELECT& select, MatrixT& t, MatrixQ& q, VectorW& w, + fortran_int_t& m, real_type& s, real_type& sep, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_ASSERT( bindings::size(select) >= bindings::size_column(t) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(t) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( job, bindings::size_column(t), m )); + BOOST_ASSERT( bindings::size_column(t) >= 0 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(t) == 1 || + bindings::stride_minor(t) == 1 ); + BOOST_ASSERT( bindings::stride_major(t) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(t)) ); + BOOST_ASSERT( compq == 'V' || compq == 'N' ); + BOOST_ASSERT( job == 'N' || job == 'E' || job == 'V' || job == 'B' ); + return detail::trsen( job, compq, bindings::begin_value(select), + bindings::size_column(t), bindings::begin_value(t), + bindings::stride_major(t), bindings::begin_value(q), + bindings::stride_major(q), bindings::begin_value(w), m, s, + sep, bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorSELECT, typename MatrixT, typename MatrixQ, + typename VectorW > + static std::ptrdiff_t invoke( const char job, const char compq, + const VectorSELECT& select, MatrixT& t, MatrixQ& q, VectorW& w, + fortran_int_t& m, real_type& s, real_type& sep, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( job, + bindings::size_column(t), m ) ); + return invoke( job, compq, select, t, q, w, m, s, sep, + workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorSELECT, typename MatrixT, typename MatrixQ, + typename VectorW > + static std::ptrdiff_t invoke( const char job, const char compq, + const VectorSELECT& select, MatrixT& t, MatrixQ& q, VectorW& w, + fortran_int_t& m, real_type& s, real_type& sep, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::trsen( job, compq, bindings::begin_value(select), + bindings::size_column(t), bindings::begin_value(t), + bindings::stride_major(t), bindings::begin_value(q), + bindings::stride_major(q), bindings::begin_value(w), m, s, + sep, &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( job, compq, select, t, q, w, m, s, sep, + workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char job, const std::ptrdiff_t n, + fortran_int_t& m ) { + if ( job == 'N' ) + return 1; + else if ( job == 'E' ) + return std::max< std::ptrdiff_t >(1, m*(n-m)); + else // if ( job == 'V' || job == 'B' ) + return std::max< std::ptrdiff_t >(1, 2*m*(n-m)); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the trsen_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for trsen. Its overload differs for +// * User-defined workspace +// +template< typename VectorSELECT, typename MatrixT, typename MatrixQ, + typename VectorW, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +trsen( const char job, const char compq, const VectorSELECT& select, + MatrixT& t, MatrixQ& q, VectorW& w, fortran_int_t& m, + typename remove_imaginary< typename bindings::value_type< + VectorSELECT >::type >::type& s, typename remove_imaginary< + typename bindings::value_type< VectorSELECT >::type >::type& sep, + Workspace work ) { + return trsen_impl< typename bindings::value_type< + VectorSELECT >::type >::invoke( job, compq, select, t, q, w, m, s, + sep, work ); +} + +// +// Overloaded function for trsen. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorSELECT, typename MatrixT, typename MatrixQ, + typename VectorW > +inline typename boost::disable_if< detail::is_workspace< VectorW >, + std::ptrdiff_t >::type +trsen( const char job, const char compq, const VectorSELECT& select, + MatrixT& t, MatrixQ& q, VectorW& w, fortran_int_t& m, + typename remove_imaginary< typename bindings::value_type< + VectorSELECT >::type >::type& s, typename remove_imaginary< + typename bindings::value_type< VectorSELECT >::type >::type& sep ) { + return trsen_impl< typename bindings::value_type< + VectorSELECT >::type >::invoke( job, compq, select, t, q, w, m, s, + sep, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/trsna.hpp b/sdk/boost/numeric/bindings/lapack/computational/trsna.hpp new file mode 100644 index 0000000..f57a044 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/trsna.hpp @@ -0,0 +1,439 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRSNA_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRSNA_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for trsna is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t trsna( const char job, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, const float* t, + const fortran_int_t ldt, const float* vl, const fortran_int_t ldvl, + const float* vr, const fortran_int_t ldvr, float* s, float* sep, + const fortran_int_t mm, fortran_int_t& m, float* work, + const fortran_int_t ldwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_STRSNA( &job, &howmny, select, &n, t, &ldt, vl, &ldvl, vr, &ldvr, + s, sep, &mm, &m, work, &ldwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t trsna( const char job, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, const double* t, + const fortran_int_t ldt, const double* vl, const fortran_int_t ldvl, + const double* vr, const fortran_int_t ldvr, double* s, double* sep, + const fortran_int_t mm, fortran_int_t& m, double* work, + const fortran_int_t ldwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DTRSNA( &job, &howmny, select, &n, t, &ldt, vl, &ldvl, vr, &ldvr, + s, sep, &mm, &m, work, &ldwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t trsna( const char job, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, + const std::complex* t, const fortran_int_t ldt, + const std::complex* vl, const fortran_int_t ldvl, + const std::complex* vr, const fortran_int_t ldvr, float* s, + float* sep, const fortran_int_t mm, fortran_int_t& m, + std::complex* work, const fortran_int_t ldwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CTRSNA( &job, &howmny, select, &n, t, &ldt, vl, &ldvl, vr, &ldvr, + s, sep, &mm, &m, work, &ldwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t trsna( const char job, const char howmny, + const fortran_bool_t* select, const fortran_int_t n, + const std::complex* t, const fortran_int_t ldt, + const std::complex* vl, const fortran_int_t ldvl, + const std::complex* vr, const fortran_int_t ldvr, double* s, + double* sep, const fortran_int_t mm, fortran_int_t& m, + std::complex* work, const fortran_int_t ldwork, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZTRSNA( &job, &howmny, select, &n, t, &ldt, vl, &ldvl, vr, &ldvr, + s, sep, &mm, &m, work, &ldwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to trsna. +// +template< typename Value, typename Enable = void > +struct trsna_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct trsna_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorSELECT, typename MatrixT, typename MatrixVL, + typename MatrixVR, typename VectorS, typename VectorSEP, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char job, const char howmny, + const VectorSELECT& select, const MatrixT& t, const MatrixVL& vl, + const MatrixVR& vr, VectorS& s, VectorSEP& sep, + const fortran_int_t mm, fortran_int_t& m, + const fortran_int_t ldwork, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + VectorS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + VectorSEP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorSEP >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( job, bindings::size_column(t) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( job, ldwork, bindings::size_column(t) )); + BOOST_ASSERT( bindings::size_column(t) >= 0 ); + BOOST_ASSERT( bindings::size_minor(t) == 1 || + bindings::stride_minor(t) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(t) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(t)) ); + BOOST_ASSERT( howmny == 'A' || howmny == 'S' ); + BOOST_ASSERT( job == 'E' || job == 'V' || job == 'B' ); + return detail::trsna( job, howmny, bindings::begin_value(select), + bindings::size_column(t), bindings::begin_value(t), + bindings::stride_major(t), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), bindings::begin_value(s), + bindings::begin_value(sep), mm, m, + bindings::begin_value(work.select(real_type())), ldwork, + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorSELECT, typename MatrixT, typename MatrixVL, + typename MatrixVR, typename VectorS, typename VectorSEP > + static std::ptrdiff_t invoke( const char job, const char howmny, + const VectorSELECT& select, const MatrixT& t, const MatrixVL& vl, + const MatrixVR& vr, VectorS& s, VectorSEP& sep, + const fortran_int_t mm, fortran_int_t& m, + const fortran_int_t ldwork, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( job, + ldwork, bindings::size_column(t) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( job, bindings::size_column(t) ) ); + return invoke( job, howmny, select, t, vl, vr, s, sep, mm, m, ldwork, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorSELECT, typename MatrixT, typename MatrixVL, + typename MatrixVR, typename VectorS, typename VectorSEP > + static std::ptrdiff_t invoke( const char job, const char howmny, + const VectorSELECT& select, const MatrixT& t, const MatrixVL& vl, + const MatrixVR& vr, VectorS& s, VectorSEP& sep, + const fortran_int_t mm, fortran_int_t& m, + const fortran_int_t ldwork, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( job, howmny, select, t, vl, vr, s, sep, mm, m, ldwork, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char job, + const std::ptrdiff_t ldwork, const std::ptrdiff_t n ) { + return job == 'E' ? 1 : ldwork * (n+6); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char job, + const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, job == 'E' ? 1 : 2 * (n-1)); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct trsna_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorSELECT, typename MatrixT, typename MatrixVL, + typename MatrixVR, typename VectorS, typename VectorSEP, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char job, const char howmny, + const VectorSELECT& select, const MatrixT& t, const MatrixVL& vl, + const MatrixVR& vr, VectorS& s, VectorSEP& sep, + const fortran_int_t mm, fortran_int_t& m, + const fortran_int_t ldwork, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixT >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorS >::type >::type, + typename remove_const< typename bindings::value_type< + VectorSEP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixT >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorSEP >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( job, bindings::size_column(t) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( job, ldwork, bindings::size_column(t) )); + BOOST_ASSERT( bindings::size_column(t) >= 0 ); + BOOST_ASSERT( bindings::size_minor(t) == 1 || + bindings::stride_minor(t) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(t) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(t)) ); + BOOST_ASSERT( howmny == 'A' || howmny == 'S' ); + BOOST_ASSERT( job == 'E' || job == 'V' || job == 'B' ); + return detail::trsna( job, howmny, bindings::begin_value(select), + bindings::size_column(t), bindings::begin_value(t), + bindings::stride_major(t), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), bindings::begin_value(s), + bindings::begin_value(sep), mm, m, + bindings::begin_value(work.select(value_type())), ldwork, + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorSELECT, typename MatrixT, typename MatrixVL, + typename MatrixVR, typename VectorS, typename VectorSEP > + static std::ptrdiff_t invoke( const char job, const char howmny, + const VectorSELECT& select, const MatrixT& t, const MatrixVL& vl, + const MatrixVR& vr, VectorS& s, VectorSEP& sep, + const fortran_int_t mm, fortran_int_t& m, + const fortran_int_t ldwork, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( job, + ldwork, bindings::size_column(t) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( job, + bindings::size_column(t) ) ); + return invoke( job, howmny, select, t, vl, vr, s, sep, mm, m, ldwork, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorSELECT, typename MatrixT, typename MatrixVL, + typename MatrixVR, typename VectorS, typename VectorSEP > + static std::ptrdiff_t invoke( const char job, const char howmny, + const VectorSELECT& select, const MatrixT& t, const MatrixVL& vl, + const MatrixVR& vr, VectorS& s, VectorSEP& sep, + const fortran_int_t mm, fortran_int_t& m, + const fortran_int_t ldwork, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( job, howmny, select, t, vl, vr, s, sep, mm, m, ldwork, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char job, + const std::ptrdiff_t ldwork, const std::ptrdiff_t n ) { + return job == 'E' ? 1 : ldwork * (n+6); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const char job, + const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, job == 'E' ? 1 : n); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the trsna_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for trsna. Its overload differs for +// * User-defined workspace +// +template< typename VectorSELECT, typename MatrixT, typename MatrixVL, + typename MatrixVR, typename VectorS, typename VectorSEP, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +trsna( const char job, const char howmny, const VectorSELECT& select, + const MatrixT& t, const MatrixVL& vl, const MatrixVR& vr, VectorS& s, + VectorSEP& sep, const fortran_int_t mm, fortran_int_t& m, + const fortran_int_t ldwork, Workspace work ) { + return trsna_impl< typename bindings::value_type< + MatrixT >::type >::invoke( job, howmny, select, t, vl, vr, s, sep, + mm, m, ldwork, work ); +} + +// +// Overloaded function for trsna. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorSELECT, typename MatrixT, typename MatrixVL, + typename MatrixVR, typename VectorS, typename VectorSEP > +inline typename boost::disable_if< detail::is_workspace< VectorSEP >, + std::ptrdiff_t >::type +trsna( const char job, const char howmny, const VectorSELECT& select, + const MatrixT& t, const MatrixVL& vl, const MatrixVR& vr, VectorS& s, + VectorSEP& sep, const fortran_int_t mm, fortran_int_t& m, + const fortran_int_t ldwork ) { + return trsna_impl< typename bindings::value_type< + MatrixT >::type >::invoke( job, howmny, select, t, vl, vr, s, sep, + mm, m, ldwork, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/trsyl.hpp b/sdk/boost/numeric/bindings/lapack/computational/trsyl.hpp new file mode 100644 index 0000000..90c28d9 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/trsyl.hpp @@ -0,0 +1,265 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRSYL_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRSYL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for trsyl is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t trsyl( const char trana, const char tranb, + const fortran_int_t isgn, const fortran_int_t m, + const fortran_int_t n, const float* a, const fortran_int_t lda, + const float* b, const fortran_int_t ldb, float* c, + const fortran_int_t ldc, float& scale ) { + fortran_int_t info(0); + LAPACK_STRSYL( &trana, &tranb, &isgn, &m, &n, a, &lda, b, &ldb, c, &ldc, + &scale, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t trsyl( const char trana, const char tranb, + const fortran_int_t isgn, const fortran_int_t m, + const fortran_int_t n, const double* a, const fortran_int_t lda, + const double* b, const fortran_int_t ldb, double* c, + const fortran_int_t ldc, double& scale ) { + fortran_int_t info(0); + LAPACK_DTRSYL( &trana, &tranb, &isgn, &m, &n, a, &lda, b, &ldb, c, &ldc, + &scale, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t trsyl( const char trana, const char tranb, + const fortran_int_t isgn, const fortran_int_t m, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, const std::complex* b, + const fortran_int_t ldb, std::complex* c, + const fortran_int_t ldc, float& scale ) { + fortran_int_t info(0); + LAPACK_CTRSYL( &trana, &tranb, &isgn, &m, &n, a, &lda, b, &ldb, c, &ldc, + &scale, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t trsyl( const char trana, const char tranb, + const fortran_int_t isgn, const fortran_int_t m, + const fortran_int_t n, const std::complex* a, + const fortran_int_t lda, const std::complex* b, + const fortran_int_t ldb, std::complex* c, + const fortran_int_t ldc, double& scale ) { + fortran_int_t info(0); + LAPACK_ZTRSYL( &trana, &tranb, &isgn, &m, &n, a, &lda, b, &ldb, c, &ldc, + &scale, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to trsyl. +// +template< typename Value, typename Enable = void > +struct trsyl_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct trsyl_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixC > + static std::ptrdiff_t invoke( const char trana, const char tranb, + const fortran_int_t isgn, const fortran_int_t m, + const fortran_int_t n, const MatrixA& a, const MatrixB& b, + MatrixC& c, real_type& scale ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + m) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + m) ); + BOOST_ASSERT( m >= 0 ); + BOOST_ASSERT( n >= 0 ); + BOOST_ASSERT( trana == 'N' || trana == 'T' || trana == 'C' ); + BOOST_ASSERT( tranb == 'N' || tranb == 'T' || tranb == 'C' ); + return detail::trsyl( trana, tranb, isgn, m, n, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(c), bindings::stride_major(c), scale ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct trsyl_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixC > + static std::ptrdiff_t invoke( const char trana, const char tranb, + const fortran_int_t isgn, const fortran_int_t m, + const fortran_int_t n, const MatrixA& a, const MatrixB& b, + MatrixC& c, real_type& scale ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + m) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + m) ); + BOOST_ASSERT( m >= 0 ); + BOOST_ASSERT( n >= 0 ); + BOOST_ASSERT( trana == 'N' || trana == 'C' ); + BOOST_ASSERT( tranb == 'N' || tranb == 'C' ); + return detail::trsyl( trana, tranb, isgn, m, n, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(c), bindings::stride_major(c), scale ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the trsyl_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for trsyl. Its overload differs for +// +template< typename MatrixA, typename MatrixB, typename MatrixC > +inline std::ptrdiff_t trsyl( const char trana, const char tranb, + const fortran_int_t isgn, const fortran_int_t m, + const fortran_int_t n, const MatrixA& a, const MatrixB& b, + MatrixC& c, typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& scale ) { + return trsyl_impl< typename bindings::value_type< + MatrixA >::type >::invoke( trana, tranb, isgn, m, n, a, b, c, + scale ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/trtri.hpp b/sdk/boost/numeric/bindings/lapack/computational/trtri.hpp new file mode 100644 index 0000000..65c3281 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/trtri.hpp @@ -0,0 +1,229 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRTRI_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRTRI_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for trtri is selected by defining a pre-processor +// variable, which can be one of +// * for ATLAS's CLAPACK, define BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// * netlib-compatible LAPACK is the default +// +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * float value-type. +// +template< typename Order, typename UpLo, typename Diag > +inline std::ptrdiff_t trtri( Order, const UpLo, const Diag, const int n, + float* a, const int lda ) { + return clapack_strtri( clapack_option< Order >::value, clapack_option< + UpLo >::value, clapack_option< Diag >::value, n, a, lda ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * double value-type. +// +template< typename Order, typename UpLo, typename Diag > +inline std::ptrdiff_t trtri( Order, const UpLo, const Diag, const int n, + double* a, const int lda ) { + return clapack_dtrtri( clapack_option< Order >::value, clapack_option< + UpLo >::value, clapack_option< Diag >::value, n, a, lda ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Diag > +inline std::ptrdiff_t trtri( Order, const UpLo, const Diag, const int n, + std::complex* a, const int lda ) { + return clapack_ctrtri( clapack_option< Order >::value, clapack_option< + UpLo >::value, clapack_option< Diag >::value, n, a, lda ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Diag > +inline std::ptrdiff_t trtri( Order, const UpLo, const Diag, const int n, + std::complex* a, const int lda ) { + return clapack_ztrtri( clapack_option< Order >::value, clapack_option< + UpLo >::value, clapack_option< Diag >::value, n, a, lda ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo, typename Diag > +inline std::ptrdiff_t trtri( Order, const UpLo, const Diag, + const fortran_int_t n, float* a, const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_STRTRI( &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, a, &lda, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo, typename Diag > +inline std::ptrdiff_t trtri( Order, const UpLo, const Diag, + const fortran_int_t n, double* a, const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_DTRTRI( &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, a, &lda, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Diag > +inline std::ptrdiff_t trtri( Order, const UpLo, const Diag, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_CTRTRI( &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, a, &lda, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo, typename Diag > +inline std::ptrdiff_t trtri( Order, const UpLo, const Diag, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_ZTRTRI( &lapack_option< UpLo >::value, &lapack_option< + Diag >::value, &n, a, &lda, &info ); + return info; +} + +#endif +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to trtri. +// +template< typename Value > +struct trtri_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA > + static std::ptrdiff_t invoke( MatrixA& a ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::trtri( order(), uplo(), diag(), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the trtri_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for trtri. Its overload differs for +// +template< typename MatrixA > +inline std::ptrdiff_t trtri( MatrixA& a ) { + return trtri_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/trtrs.hpp b/sdk/boost/numeric/bindings/lapack/computational/trtrs.hpp new file mode 100644 index 0000000..9b74784 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/trtrs.hpp @@ -0,0 +1,187 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRTRS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TRTRS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for trtrs is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t trtrs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, const float* a, + const fortran_int_t lda, float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_STRTRS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, a, &lda, + b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t trtrs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, const double* a, + const fortran_int_t lda, double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DTRTRS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, a, &lda, + b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t trtrs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CTRTRS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, a, &lda, + b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo, typename Trans, typename Diag > +inline std::ptrdiff_t trtrs( const UpLo, const Trans, const Diag, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZTRTRS( &lapack_option< UpLo >::value, &lapack_option< + Trans >::value, &lapack_option< Diag >::value, &n, &nrhs, a, &lda, + b, &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to trtrs. +// +template< typename Value > +struct trtrs_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB > + static std::ptrdiff_t invoke( const MatrixA& a, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + typedef typename result_of::diag_tag< MatrixA >::type diag; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + return detail::trtrs( uplo(), trans(), diag(), + bindings::size_column_op(a, trans()), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the trtrs_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for trtrs. Its overload differs for +// +template< typename MatrixA, typename MatrixB > +inline std::ptrdiff_t trtrs( const MatrixA& a, MatrixB& b ) { + return trtrs_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/tzrzf.hpp b/sdk/boost/numeric/bindings/lapack/computational/tzrzf.hpp new file mode 100644 index 0000000..9ce0e0f --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/tzrzf.hpp @@ -0,0 +1,326 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TZRZF_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_TZRZF_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for tzrzf is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t tzrzf( const fortran_int_t m, const fortran_int_t n, + float* a, const fortran_int_t lda, float* tau, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_STZRZF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t tzrzf( const fortran_int_t m, const fortran_int_t n, + double* a, const fortran_int_t lda, double* tau, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DTZRZF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t tzrzf( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CTZRZF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t tzrzf( const fortran_int_t m, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZTZRZF( &m, &n, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to tzrzf. +// +template< typename Value, typename Enable = void > +struct tzrzf_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct tzrzf_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::tzrzf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::tzrzf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return std::max< std::ptrdiff_t >(1,m); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct tzrzf_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorTAU >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::tzrzf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::tzrzf( bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return std::max< std::ptrdiff_t >(1,m); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the tzrzf_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for tzrzf. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +tzrzf( MatrixA& a, VectorTAU& tau, Workspace work ) { + return tzrzf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for tzrzf. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +tzrzf( MatrixA& a, VectorTAU& tau ) { + return tzrzf_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ungbr.hpp b/sdk/boost/numeric/bindings/lapack/computational/ungbr.hpp new file mode 100644 index 0000000..24906e0 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ungbr.hpp @@ -0,0 +1,337 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGBR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGBR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ungbr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ungbr( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, float* a, + const fortran_int_t lda, const float* tau, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGBR( &vect, &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ungbr( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, double* a, + const fortran_int_t lda, const double* tau, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGBR( &vect, &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ungbr( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNGBR( &vect, &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ungbr( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNGBR( &vect, &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ungbr. +// +template< typename Value, typename Enable = void > +struct ungbr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ungbr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, MatrixA& a, + const VectorTAU& tau, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( m, n )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + m) ); + BOOST_ASSERT( k >= 0 ); + BOOST_ASSERT( m >= 0 ); + BOOST_ASSERT( vect == 'Q' || vect == 'P' ); + return detail::ungbr( vect, m, n, k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, MatrixA& a, + const VectorTAU& tau, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( m, n ) ); + return invoke( vect, m, n, k, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, MatrixA& a, + const VectorTAU& tau, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::ungbr( vect, m, n, k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( vect, m, n, k, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, std::min< std::ptrdiff_t >( m, + n ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ungbr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, MatrixA& a, + const VectorTAU& tau, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( m, n )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= m ); + BOOST_ASSERT( k >= 0 ); + BOOST_ASSERT( m >= 0 ); + BOOST_ASSERT( vect == 'Q' || vect == 'P' ); + return detail::ungbr( vect, m, n, k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, MatrixA& a, + const VectorTAU& tau, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( m, + n ) ); + return invoke( vect, m, n, k, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, MatrixA& a, + const VectorTAU& tau, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::ungbr( vect, m, n, k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( vect, m, n, k, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, std::min< std::ptrdiff_t >( m, + n ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ungbr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ungbr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ungbr( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, MatrixA& a, + const VectorTAU& tau, Workspace work ) { + return ungbr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( vect, m, n, k, a, tau, work ); +} + +// +// Overloaded function for ungbr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +ungbr( const char vect, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, MatrixA& a, + const VectorTAU& tau ) { + return ungbr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( vect, m, n, k, a, tau, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/unghr.hpp b/sdk/boost/numeric/bindings/lapack/computational/unghr.hpp new file mode 100644 index 0000000..6f4ab61 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/unghr.hpp @@ -0,0 +1,334 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGHR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGHR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for unghr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t unghr( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, float* a, const fortran_int_t lda, + const float* tau, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGHR( &n, &ilo, &ihi, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t unghr( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, double* a, const fortran_int_t lda, + const double* tau, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGHR( &n, &ilo, &ihi, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t unghr( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNGHR( &n, &ilo, &ihi, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t unghr( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNGHR( &n, &ilo, &ihi, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to unghr. +// +template< typename Value, typename Enable = void > +struct unghr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct unghr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixA& a, const VectorTAU& tau, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= n-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( ihi, ilo )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( n >= 0 ); + return detail::unghr( n, ilo, ihi, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixA& a, const VectorTAU& tau, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( ihi, + ilo ) ); + return invoke( n, ilo, ihi, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixA& a, const VectorTAU& tau, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::unghr( n, ilo, ihi, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( n, ilo, ihi, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t ihi, + const std::ptrdiff_t ilo ) { + return ihi-ilo; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct unghr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixA& a, const VectorTAU& tau, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= n-1 ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( ihi, ilo )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( n >= 0 ); + return detail::unghr( n, ilo, ihi, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixA& a, const VectorTAU& tau, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( ihi, + ilo ) ); + return invoke( n, ilo, ihi, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t n, + const fortran_int_t ilo, const fortran_int_t ihi, + MatrixA& a, const VectorTAU& tau, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::unghr( n, ilo, ihi, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( n, ilo, ihi, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t ihi, + const std::ptrdiff_t ilo ) { + return ihi-ilo; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the unghr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for unghr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unghr( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, MatrixA& a, const VectorTAU& tau, + Workspace work ) { + return unghr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( n, ilo, ihi, a, tau, work ); +} + +// +// Overloaded function for unghr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +unghr( const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, MatrixA& a, const VectorTAU& tau ) { + return unghr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( n, ilo, ihi, a, tau, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/unglq.hpp b/sdk/boost/numeric/bindings/lapack/computational/unglq.hpp new file mode 100644 index 0000000..edc643a --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/unglq.hpp @@ -0,0 +1,326 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGLQ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGLQ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for unglq is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t unglq( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, float* a, const fortran_int_t lda, + const float* tau, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGLQ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t unglq( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, double* a, const fortran_int_t lda, + const double* tau, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGLQ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t unglq( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNGLQ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t unglq( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNGLQ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to unglq. +// +template< typename Value, typename Enable = void > +struct unglq_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct unglq_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::unglq( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::unglq( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return std::max< std::ptrdiff_t >( 1, m ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct unglq_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::unglq( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::unglq( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return std::max< std::ptrdiff_t >( 1, m ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the unglq_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for unglq. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unglq( MatrixA& a, const VectorTAU& tau, Workspace work ) { + return unglq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for unglq. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +unglq( MatrixA& a, const VectorTAU& tau ) { + return unglq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ungql.hpp b/sdk/boost/numeric/bindings/lapack/computational/ungql.hpp new file mode 100644 index 0000000..3b6979e --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ungql.hpp @@ -0,0 +1,324 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGQL_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGQL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ungql is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ungql( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, float* a, const fortran_int_t lda, + const float* tau, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGQL( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ungql( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, double* a, const fortran_int_t lda, + const double* tau, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGQL( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ungql( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNGQL( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ungql( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNGQL( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ungql. +// +template< typename Value, typename Enable = void > +struct ungql_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ungql_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::ungql( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::ungql( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, n ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ungql_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::ungql( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::ungql( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, n ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ungql_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ungql. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ungql( MatrixA& a, const VectorTAU& tau, Workspace work ) { + return ungql_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for ungql. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +ungql( MatrixA& a, const VectorTAU& tau ) { + return ungql_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ungqr.hpp b/sdk/boost/numeric/bindings/lapack/computational/ungqr.hpp new file mode 100644 index 0000000..5215ef4 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ungqr.hpp @@ -0,0 +1,324 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGQR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGQR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ungqr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ungqr( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, float* a, const fortran_int_t lda, + const float* tau, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGQR( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ungqr( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, double* a, const fortran_int_t lda, + const double* tau, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGQR( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ungqr( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNGQR( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ungqr( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNGQR( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ungqr. +// +template< typename Value, typename Enable = void > +struct ungqr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ungqr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::ungqr( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::ungqr( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, n ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ungqr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::ungqr( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::ungqr( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, n ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ungqr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ungqr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ungqr( MatrixA& a, const VectorTAU& tau, Workspace work ) { + return ungqr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for ungqr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +ungqr( MatrixA& a, const VectorTAU& tau ) { + return ungqr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ungrq.hpp b/sdk/boost/numeric/bindings/lapack/computational/ungrq.hpp new file mode 100644 index 0000000..65eb49f --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ungrq.hpp @@ -0,0 +1,326 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGRQ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGRQ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ungrq is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ungrq( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, float* a, const fortran_int_t lda, + const float* tau, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGRQ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ungrq( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, double* a, const fortran_int_t lda, + const double* tau, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGRQ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ungrq( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNGRQ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ungrq( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t k, std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNGRQ( &m, &n, &k, a, &lda, tau, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ungrq. +// +template< typename Value, typename Enable = void > +struct ungrq_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ungrq_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::ungrq( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::ungrq( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return std::max< std::ptrdiff_t >( 1, m ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ungrq_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(a) )); + BOOST_ASSERT( bindings::size_column(a) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::ungrq( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(a) ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( MatrixA& a, const VectorTAU& tau, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::ungrq( bindings::size_row(a), bindings::size_column(a), + bindings::size(tau), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m ) { + return std::max< std::ptrdiff_t >( 1, m ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ungrq_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ungrq. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ungrq( MatrixA& a, const VectorTAU& tau, Workspace work ) { + return ungrq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, work ); +} + +// +// Overloaded function for ungrq. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +ungrq( MatrixA& a, const VectorTAU& tau ) { + return ungrq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/ungtr.hpp b/sdk/boost/numeric/bindings/lapack/computational/ungtr.hpp new file mode 100644 index 0000000..cae0e1c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/ungtr.hpp @@ -0,0 +1,333 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGTR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNGTR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ungtr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ungtr( const UpLo, const fortran_int_t n, float* a, + const fortran_int_t lda, const float* tau, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORGTR( &lapack_option< UpLo >::value, &n, a, &lda, tau, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ungtr( const UpLo, const fortran_int_t n, double* a, + const fortran_int_t lda, const double* tau, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORGTR( &lapack_option< UpLo >::value, &n, a, &lda, tau, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ungtr( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNGTR( &lapack_option< UpLo >::value, &n, a, &lda, tau, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ungtr( const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNGTR( &lapack_option< UpLo >::value, &n, a, &lda, tau, work, + &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ungtr. +// +template< typename Value, typename Enable = void > +struct ungtr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ungtr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( const fortran_int_t n, MatrixA& a, + const VectorTAU& tau, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= n-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( n >= 0 ); + return detail::ungtr( uplo(), n, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t n, MatrixA& a, + const VectorTAU& tau, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( n ) ); + return invoke( n, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t n, MatrixA& a, + const VectorTAU& tau, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + detail::ungtr( uplo(), n, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( n, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,n-1); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ungtr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorTAU, typename WORK > + static std::ptrdiff_t invoke( const fortran_int_t n, MatrixA& a, + const VectorTAU& tau, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_ASSERT( bindings::size(tau) >= n-1 ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( n )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= n ); + BOOST_ASSERT( n >= 0 ); + return detail::ungtr( uplo(), n, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t n, MatrixA& a, + const VectorTAU& tau, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( n ) ); + return invoke( n, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorTAU > + static std::ptrdiff_t invoke( const fortran_int_t n, MatrixA& a, + const VectorTAU& tau, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + detail::ungtr( uplo(), n, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( n, a, tau, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n-1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ungtr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ungtr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorTAU, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ungtr( const fortran_int_t n, MatrixA& a, const VectorTAU& tau, + Workspace work ) { + return ungtr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( n, a, tau, work ); +} + +// +// Overloaded function for ungtr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorTAU > +inline typename boost::disable_if< detail::is_workspace< VectorTAU >, + std::ptrdiff_t >::type +ungtr( const fortran_int_t n, MatrixA& a, const VectorTAU& tau ) { + return ungtr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( n, a, tau, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/unmbr.hpp b/sdk/boost/numeric/bindings/lapack/computational/unmbr.hpp new file mode 100644 index 0000000..fbdb9a9 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/unmbr.hpp @@ -0,0 +1,430 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMBR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMBR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for unmbr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmbr( const char vect, const Side, const Trans, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t k, + const float* a, const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMBR( &vect, &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmbr( const char vect, const Side, const Trans, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t k, + const double* a, const fortran_int_t lda, const double* tau, + double* c, const fortran_int_t ldc, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMBR( &vect, &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmbr( const char vect, const Side, const Trans, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNMBR( &vect, &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmbr( const char vect, const Side, const Trans, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNMBR( &vect, &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to unmbr. +// +template< typename Value, typename Enable = void > +struct unmbr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct unmbr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const char vect, const Side side, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + BOOST_ASSERT( vect == 'Q' || vect == 'P' ); + return detail::unmbr( vect, side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const char vect, const Side side, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( vect, side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const char vect, const Side side, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::unmbr( vect, side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( vect, side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct unmbr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const char vect, const Side side, + const fortran_int_t k, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + BOOST_ASSERT( k >= 0 ); + BOOST_ASSERT( vect == 'Q' || vect == 'P' ); + return detail::unmbr( vect, side, trans(), bindings::size_row(c), + bindings::size_column(c), k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const char vect, const Side side, + const fortran_int_t k, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( vect, side, k, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const char vect, const Side side, + const fortran_int_t k, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + value_type opt_size_work; + detail::unmbr( vect, side, trans(), bindings::size_row(c), + bindings::size_column(c), k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( vect, side, k, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the unmbr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for unmbr. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unmbr( const char vect, const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, Workspace work ) { + return unmbr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( vect, side, a, tau, c, work ); +} + +// +// Overloaded function for unmbr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +unmbr( const char vect, const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c ) { + return unmbr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( vect, side, a, tau, c, + optimal_workspace() ); +} + +// +// Overloaded function for unmbr. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unmbr( const char vect, const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, Workspace work ) { + return unmbr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( vect, side, k, a, tau, c, work ); +} + +// +// Overloaded function for unmbr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +unmbr( const char vect, const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c ) { + return unmbr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( vect, side, k, a, tau, c, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/unmhr.hpp b/sdk/boost/numeric/bindings/lapack/computational/unmhr.hpp new file mode 100644 index 0000000..d1a05f5 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/unmhr.hpp @@ -0,0 +1,401 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMHR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMHR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for unmhr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmhr( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, const float* a, const fortran_int_t lda, + const float* tau, float* c, const fortran_int_t ldc, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMHR( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &ilo, &ihi, a, &lda, tau, c, &ldc, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmhr( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, const double* a, const fortran_int_t lda, + const double* tau, double* c, const fortran_int_t ldc, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMHR( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &ilo, &ihi, a, &lda, tau, c, &ldc, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmhr( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, const std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* c, const fortran_int_t ldc, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNMHR( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &ilo, &ihi, a, &lda, tau, c, &ldc, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmhr( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t ilo, + const fortran_int_t ihi, const std::complex* a, + const fortran_int_t lda, const std::complex* tau, + std::complex* c, const fortran_int_t ldc, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNMHR( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &ilo, &ihi, a, &lda, tau, c, &ldc, work, + &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to unmhr. +// +template< typename Value, typename Enable = void > +struct unmhr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct unmhr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t ilo, + const fortran_int_t ihi, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmhr( side, trans(), bindings::size_row(c), + bindings::size_column(c), ilo, ihi, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t ilo, + const fortran_int_t ihi, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, ilo, ihi, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t ilo, + const fortran_int_t ihi, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::unmhr( side, trans(), bindings::size_row(c), + bindings::size_column(c), ilo, ihi, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, ilo, ihi, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct unmhr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t ilo, + const fortran_int_t ihi, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmhr( side, trans(), bindings::size_row(c), + bindings::size_column(c), ilo, ihi, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t ilo, + const fortran_int_t ihi, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, ilo, ihi, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t ilo, + const fortran_int_t ihi, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + value_type opt_size_work; + detail::unmhr( side, trans(), bindings::size_row(c), + bindings::size_column(c), ilo, ihi, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, ilo, ihi, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the unmhr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for unmhr. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unmhr( const Side side, const fortran_int_t ilo, + const fortran_int_t ihi, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, Workspace work ) { + return unmhr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, ilo, ihi, a, tau, c, work ); +} + +// +// Overloaded function for unmhr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +unmhr( const Side side, const fortran_int_t ilo, + const fortran_int_t ihi, const MatrixA& a, const VectorTAU& tau, + MatrixC& c ) { + return unmhr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, ilo, ihi, a, tau, c, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/unmlq.hpp b/sdk/boost/numeric/bindings/lapack/computational/unmlq.hpp new file mode 100644 index 0000000..d7cda78 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/unmlq.hpp @@ -0,0 +1,428 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMLQ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMLQ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for unmlq is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmlq( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const float* a, + const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMLQ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmlq( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const double* a, + const fortran_int_t lda, const double* tau, double* c, + const fortran_int_t ldc, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMLQ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmlq( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNMLQ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmlq( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNMLQ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to unmlq. +// +template< typename Value, typename Enable = void > +struct unmlq_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct unmlq_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size(tau)) ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmlq( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::unmlq( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct unmlq_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= k ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + k) ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmlq( side, trans(), bindings::size_row(c), + bindings::size_column(c), k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, k, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + value_type opt_size_work; + detail::unmlq( side, trans(), bindings::size_row(c), + bindings::size_column(c), k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, k, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the unmlq_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for unmlq. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unmlq( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, Workspace work ) { + return unmlq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, work ); +} + +// +// Overloaded function for unmlq. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +unmlq( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c ) { + return unmlq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, optimal_workspace() ); +} + +// +// Overloaded function for unmlq. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unmlq( const Side side, const fortran_int_t k, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, Workspace work ) { + return unmlq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, k, a, tau, c, work ); +} + +// +// Overloaded function for unmlq. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +unmlq( const Side side, const fortran_int_t k, const MatrixA& a, + const VectorTAU& tau, MatrixC& c ) { + return unmlq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, k, a, tau, c, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/unmql.hpp b/sdk/boost/numeric/bindings/lapack/computational/unmql.hpp new file mode 100644 index 0000000..6040ea8 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/unmql.hpp @@ -0,0 +1,424 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMQL_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMQL_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for unmql is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmql( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, float* a, + const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMQL( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmql( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, double* a, + const fortran_int_t lda, const double* tau, double* c, + const fortran_int_t ldc, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMQL( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmql( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNMQL( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmql( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNMQL( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to unmql. +// +template< typename Value, typename Enable = void > +struct unmql_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct unmql_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmql( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::unmql( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct unmql_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= k ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmql( side, trans(), bindings::size_row(c), + bindings::size_column(c), k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, k, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + value_type opt_size_work; + detail::unmql( side, trans(), bindings::size_row(c), + bindings::size_column(c), k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, k, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the unmql_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for unmql. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unmql( const Side side, MatrixA& a, const VectorTAU& tau, MatrixC& c, + Workspace work ) { + return unmql_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, work ); +} + +// +// Overloaded function for unmql. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +unmql( const Side side, MatrixA& a, const VectorTAU& tau, MatrixC& c ) { + return unmql_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, optimal_workspace() ); +} + +// +// Overloaded function for unmql. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unmql( const Side side, const fortran_int_t k, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, Workspace work ) { + return unmql_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, k, a, tau, c, work ); +} + +// +// Overloaded function for unmql. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +unmql( const Side side, const fortran_int_t k, const MatrixA& a, + const VectorTAU& tau, MatrixC& c ) { + return unmql_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, k, a, tau, c, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/unmqr.hpp b/sdk/boost/numeric/bindings/lapack/computational/unmqr.hpp new file mode 100644 index 0000000..41b683d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/unmqr.hpp @@ -0,0 +1,394 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMQR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMQR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for unmqr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmqr( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const float* a, + const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMQR( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmqr( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const double* a, + const fortran_int_t lda, const double* tau, double* c, + const fortran_int_t ldc, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMQR( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmqr( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNMQR( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmqr( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNMQR( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to unmqr. +// +template< typename Value, typename Enable = void > +struct unmqr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct unmqr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmqr( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::unmqr( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct unmqr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmqr( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + value_type opt_size_work; + detail::unmqr( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the unmqr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for unmqr. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unmqr( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, Workspace work ) { + return unmqr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, work ); +} + +// +// Overloaded function for unmqr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +unmqr( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c ) { + return unmqr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/unmrq.hpp b/sdk/boost/numeric/bindings/lapack/computational/unmrq.hpp new file mode 100644 index 0000000..fe8ec0d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/unmrq.hpp @@ -0,0 +1,428 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMRQ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMRQ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for unmrq is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmrq( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const float* a, + const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMRQ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmrq( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const double* a, + const fortran_int_t lda, const double* tau, double* c, + const fortran_int_t ldc, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMRQ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmrq( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNMRQ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmrq( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNMRQ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, a, &lda, tau, c, &ldc, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to unmrq. +// +template< typename Value, typename Enable = void > +struct unmrq_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct unmrq_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size(tau)) ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmrq( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::unmrq( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct unmrq_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= k ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + k) ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmrq( side, trans(), bindings::size_row(c), + bindings::size_column(c), k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, k, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + value_type opt_size_work; + detail::unmrq( side, trans(), bindings::size_row(c), + bindings::size_column(c), k, bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, k, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the unmrq_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for unmrq. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unmrq( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, Workspace work ) { + return unmrq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, work ); +} + +// +// Overloaded function for unmrq. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +unmrq( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c ) { + return unmrq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, optimal_workspace() ); +} + +// +// Overloaded function for unmrq. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unmrq( const Side side, const fortran_int_t k, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, Workspace work ) { + return unmrq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, k, a, tau, c, work ); +} + +// +// Overloaded function for unmrq. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +unmrq( const Side side, const fortran_int_t k, const MatrixA& a, + const VectorTAU& tau, MatrixC& c ) { + return unmrq_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, k, a, tau, c, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/unmrz.hpp b/sdk/boost/numeric/bindings/lapack/computational/unmrz.hpp new file mode 100644 index 0000000..1ce2c4c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/unmrz.hpp @@ -0,0 +1,432 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMRZ_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMRZ_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for unmrz is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmrz( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const fortran_int_t l, + const float* a, const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMRZ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, &l, a, &lda, tau, c, &ldc, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmrz( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const fortran_int_t l, + const double* a, const fortran_int_t lda, const double* tau, + double* c, const fortran_int_t ldc, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMRZ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, &l, a, &lda, tau, c, &ldc, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmrz( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const fortran_int_t l, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNMRZ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, &l, a, &lda, tau, c, &ldc, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t unmrz( const Side, const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t k, const fortran_int_t l, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNMRZ( &lapack_option< Side >::value, &lapack_option< + Trans >::value, &m, &n, &k, &l, a, &lda, tau, c, &ldc, work, + &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to unmrz. +// +template< typename Value, typename Enable = void > +struct unmrz_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct unmrz_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size(tau) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size(tau)) ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmrz( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::size_column_op(a, trans()), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::unmrz( side, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::size(tau), + bindings::size_column_op(a, trans()), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct unmrz_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(tau) >= k ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + k) ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmrz( side, trans(), bindings::size_row(c), + bindings::size_column(c), k, bindings::size_column_op(a, + trans()), bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, k, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const fortran_int_t k, + const MatrixA& a, const VectorTAU& tau, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + value_type opt_size_work; + detail::unmrz( side, trans(), bindings::size_row(c), + bindings::size_column(c), k, bindings::size_column_op(a, + trans()), bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, k, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the unmrz_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for unmrz. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unmrz( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, Workspace work ) { + return unmrz_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, work ); +} + +// +// Overloaded function for unmrz. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +unmrz( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c ) { + return unmrz_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, optimal_workspace() ); +} + +// +// Overloaded function for unmrz. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unmrz( const Side side, const fortran_int_t k, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, Workspace work ) { + return unmrz_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, k, a, tau, c, work ); +} + +// +// Overloaded function for unmrz. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +unmrz( const Side side, const fortran_int_t k, const MatrixA& a, + const VectorTAU& tau, MatrixC& c ) { + return unmrz_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, k, a, tau, c, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/unmtr.hpp b/sdk/boost/numeric/bindings/lapack/computational/unmtr.hpp new file mode 100644 index 0000000..e8886bb --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/unmtr.hpp @@ -0,0 +1,397 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMTR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UNMTR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for unmtr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename UpLo, typename Trans > +inline std::ptrdiff_t unmtr( const Side, const UpLo, const Trans, + const fortran_int_t m, const fortran_int_t n, const float* a, + const fortran_int_t lda, const float* tau, float* c, + const fortran_int_t ldc, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SORMTR( &lapack_option< Side >::value, &lapack_option< + UpLo >::value, &lapack_option< Trans >::value, &m, &n, a, &lda, + tau, c, &ldc, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename UpLo, typename Trans > +inline std::ptrdiff_t unmtr( const Side, const UpLo, const Trans, + const fortran_int_t m, const fortran_int_t n, const double* a, + const fortran_int_t lda, const double* tau, double* c, + const fortran_int_t ldc, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DORMTR( &lapack_option< Side >::value, &lapack_option< + UpLo >::value, &lapack_option< Trans >::value, &m, &n, a, &lda, + tau, c, &ldc, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename UpLo, typename Trans > +inline std::ptrdiff_t unmtr( const Side, const UpLo, const Trans, + const fortran_int_t m, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CUNMTR( &lapack_option< Side >::value, &lapack_option< + UpLo >::value, &lapack_option< Trans >::value, &m, &n, a, &lda, + tau, c, &ldc, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename UpLo, typename Trans > +inline std::ptrdiff_t unmtr( const Side, const UpLo, const Trans, + const fortran_int_t m, const fortran_int_t n, + const std::complex* a, const fortran_int_t lda, + const std::complex* tau, std::complex* c, + const fortran_int_t ldc, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZUNMTR( &lapack_option< Side >::value, &lapack_option< + UpLo >::value, &lapack_option< Trans >::value, &m, &n, a, &lda, + tau, c, &ldc, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to unmtr. +// +template< typename Value, typename Enable = void > +struct unmtr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct unmtr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmtr( side, uplo(), trans(), bindings::size_row(c), + bindings::size_column(c), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + real_type opt_size_work; + detail::unmtr( side, uplo(), trans(), bindings::size_row(c), + bindings::size_column(c), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct unmtr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::unmtr( side, uplo(), trans(), bindings::size_row(c), + bindings::size_column(c), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const MatrixA& a, + const VectorTAU& tau, MatrixC& c, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixC >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + typedef typename result_of::uplo_tag< MatrixA, trans >::type uplo; + value_type opt_size_work; + detail::unmtr( side, uplo(), trans(), bindings::size_row(c), + bindings::size_column(c), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(tau), + bindings::begin_value(c), bindings::stride_major(c), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( side, a, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the unmtr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for unmtr. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +unmtr( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c, Workspace work ) { + return unmtr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, work ); +} + +// +// Overloaded function for unmtr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename MatrixA, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +unmtr( const Side side, const MatrixA& a, const VectorTAU& tau, + MatrixC& c ) { + return unmtr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( side, a, tau, c, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/upgtr.hpp b/sdk/boost/numeric/bindings/lapack/computational/upgtr.hpp new file mode 100644 index 0000000..499589b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/upgtr.hpp @@ -0,0 +1,328 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UPGTR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UPGTR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for upgtr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t upgtr( const char uplo, const fortran_int_t n, + const float* ap, const float* tau, float* q, const fortran_int_t ldq, + float* work ) { + fortran_int_t info(0); + LAPACK_SOPGTR( &uplo, &n, ap, tau, q, &ldq, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t upgtr( const char uplo, const fortran_int_t n, + const double* ap, const double* tau, double* q, + const fortran_int_t ldq, double* work ) { + fortran_int_t info(0); + LAPACK_DOPGTR( &uplo, &n, ap, tau, q, &ldq, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t upgtr( const char uplo, const fortran_int_t n, + const std::complex* ap, const std::complex* tau, + std::complex* q, const fortran_int_t ldq, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_CUPGTR( &uplo, &n, ap, tau, q, &ldq, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t upgtr( const char uplo, const fortran_int_t n, + const std::complex* ap, const std::complex* tau, + std::complex* q, const fortran_int_t ldq, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZUPGTR( &uplo, &n, ap, tau, q, &ldq, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to upgtr. +// +template< typename Value, typename Enable = void > +struct upgtr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct upgtr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorAP, typename VectorTAU, typename MatrixQ, + typename WORK > + static std::ptrdiff_t invoke( const char uplo, const VectorAP& ap, + const VectorTAU& tau, MatrixQ& q, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::size(ap) >= + bindings::size_column(q)*(bindings::size_column(q)+1)/2 ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_column(q)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(q) )); + BOOST_ASSERT( bindings::size_column(q) >= 0 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::stride_major(q) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(q)) ); + return detail::upgtr( uplo, bindings::size_column(q), + bindings::begin_value(ap), bindings::begin_value(tau), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorAP, typename VectorTAU, typename MatrixQ > + static std::ptrdiff_t invoke( const char uplo, const VectorAP& ap, + const VectorTAU& tau, MatrixQ& q, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(q) ) ); + return invoke( uplo, ap, tau, q, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorAP, typename VectorTAU, typename MatrixQ > + static std::ptrdiff_t invoke( const char uplo, const VectorAP& ap, + const VectorTAU& tau, MatrixQ& q, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( uplo, ap, tau, q, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n-1; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct upgtr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorAP, typename VectorTAU, typename MatrixQ, + typename WORK > + static std::ptrdiff_t invoke( const char uplo, const VectorAP& ap, + const VectorTAU& tau, MatrixQ& q, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::size(ap) >= + bindings::size_column(q)*(bindings::size_column(q)+1)/2 ); + BOOST_ASSERT( bindings::size(tau) >= bindings::size_column(q)-1 ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(q) )); + BOOST_ASSERT( bindings::size_column(q) >= 0 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::stride_major(q) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(q)) ); + return detail::upgtr( uplo, bindings::size_column(q), + bindings::begin_value(ap), bindings::begin_value(tau), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorAP, typename VectorTAU, typename MatrixQ > + static std::ptrdiff_t invoke( const char uplo, const VectorAP& ap, + const VectorTAU& tau, MatrixQ& q, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(q) ) ); + return invoke( uplo, ap, tau, q, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorAP, typename VectorTAU, typename MatrixQ > + static std::ptrdiff_t invoke( const char uplo, const VectorAP& ap, + const VectorTAU& tau, MatrixQ& q, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( uplo, ap, tau, q, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n-1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the upgtr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for upgtr. Its overload differs for +// * User-defined workspace +// +template< typename VectorAP, typename VectorTAU, typename MatrixQ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +upgtr( const char uplo, const VectorAP& ap, const VectorTAU& tau, + MatrixQ& q, Workspace work ) { + return upgtr_impl< typename bindings::value_type< + VectorAP >::type >::invoke( uplo, ap, tau, q, work ); +} + +// +// Overloaded function for upgtr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorAP, typename VectorTAU, typename MatrixQ > +inline typename boost::disable_if< detail::is_workspace< MatrixQ >, + std::ptrdiff_t >::type +upgtr( const char uplo, const VectorAP& ap, const VectorTAU& tau, + MatrixQ& q ) { + return upgtr_impl< typename bindings::value_type< + VectorAP >::type >::invoke( uplo, ap, tau, q, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/computational/upmtr.hpp b/sdk/boost/numeric/bindings/lapack/computational/upmtr.hpp new file mode 100644 index 0000000..70b6188 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/computational/upmtr.hpp @@ -0,0 +1,366 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UPMTR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_COMPUTATIONAL_UPMTR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for upmtr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t upmtr( const Side, const char uplo, const Trans, + const fortran_int_t m, const fortran_int_t n, const float* ap, + const float* tau, float* c, const fortran_int_t ldc, float* work ) { + fortran_int_t info(0); + LAPACK_SOPMTR( &lapack_option< Side >::value, &uplo, &lapack_option< + Trans >::value, &m, &n, ap, tau, c, &ldc, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t upmtr( const Side, const char uplo, const Trans, + const fortran_int_t m, const fortran_int_t n, const double* ap, + const double* tau, double* c, const fortran_int_t ldc, double* work ) { + fortran_int_t info(0); + LAPACK_DOPMTR( &lapack_option< Side >::value, &uplo, &lapack_option< + Trans >::value, &m, &n, ap, tau, c, &ldc, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t upmtr( const Side, const char uplo, const Trans, + const fortran_int_t m, const fortran_int_t n, + const std::complex* ap, const std::complex* tau, + std::complex* c, const fortran_int_t ldc, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_CUPMTR( &lapack_option< Side >::value, &uplo, &lapack_option< + Trans >::value, &m, &n, ap, tau, c, &ldc, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Side, typename Trans > +inline std::ptrdiff_t upmtr( const Side, const char uplo, const Trans, + const fortran_int_t m, const fortran_int_t n, + const std::complex* ap, const std::complex* tau, + std::complex* c, const fortran_int_t ldc, + std::complex* work ) { + fortran_int_t info(0); + LAPACK_ZUPMTR( &lapack_option< Side >::value, &uplo, &lapack_option< + Trans >::value, &m, &n, ap, tau, c, &ldc, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to upmtr. +// +template< typename Value, typename Enable = void > +struct upmtr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct upmtr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorAP, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const char uplo, + const VectorAP& ap, const VectorTAU& tau, MatrixC& c, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorAP, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::upmtr( side, uplo, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::begin_value(ap), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorAP, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const char uplo, + const VectorAP& ap, const VectorTAU& tau, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorAP, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, uplo, ap, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorAP, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const char uplo, + const VectorAP& ap, const VectorTAU& tau, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorAP, order >::type trans; + return invoke( side, uplo, ap, tau, c, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct upmtr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename Side, typename VectorAP, typename VectorTAU, + typename MatrixC, typename WORK > + static std::ptrdiff_t invoke( const Side side, const char uplo, + const VectorAP& ap, const VectorTAU& tau, MatrixC& c, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorAP, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixC >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorTAU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixC >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( side, bindings::size_row(c), + bindings::size_column(c) )); + BOOST_ASSERT( bindings::size_column(c) >= 0 ); + BOOST_ASSERT( bindings::size_minor(c) == 1 || + bindings::stride_minor(c) == 1 ); + BOOST_ASSERT( bindings::size_row(c) >= 0 ); + BOOST_ASSERT( bindings::stride_major(c) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(c)) ); + return detail::upmtr( side, uplo, trans(), bindings::size_row(c), + bindings::size_column(c), bindings::begin_value(ap), + bindings::begin_value(tau), bindings::begin_value(c), + bindings::stride_major(c), + bindings::begin_value(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename Side, typename VectorAP, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const char uplo, + const VectorAP& ap, const VectorTAU& tau, MatrixC& c, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorAP, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( side, + bindings::size_row(c), bindings::size_column(c) ) ); + return invoke( side, uplo, ap, tau, c, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename Side, typename VectorAP, typename VectorTAU, + typename MatrixC > + static std::ptrdiff_t invoke( const Side side, const char uplo, + const VectorAP& ap, const VectorTAU& tau, MatrixC& c, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorAP, order >::type trans; + return invoke( side, uplo, ap, tau, c, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + template< typename Side > + static std::ptrdiff_t min_size_work( const Side side, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, bindings::detail::if_left( side, + n, m ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the upmtr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for upmtr. Its overload differs for +// * User-defined workspace +// +template< typename Side, typename VectorAP, typename VectorTAU, + typename MatrixC, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +upmtr( const Side side, const char uplo, const VectorAP& ap, + const VectorTAU& tau, MatrixC& c, Workspace work ) { + return upmtr_impl< typename bindings::value_type< + VectorAP >::type >::invoke( side, uplo, ap, tau, c, work ); +} + +// +// Overloaded function for upmtr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename Side, typename VectorAP, typename VectorTAU, + typename MatrixC > +inline typename boost::disable_if< detail::is_workspace< MatrixC >, + std::ptrdiff_t >::type +upmtr( const Side side, const char uplo, const VectorAP& ap, + const VectorTAU& tau, MatrixC& c ) { + return upmtr_impl< typename bindings::value_type< + VectorAP >::type >::invoke( side, uplo, ap, tau, c, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/detail/clapack.h b/sdk/boost/numeric/bindings/lapack/detail/clapack.h new file mode 100644 index 0000000..cd29dca --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/detail/clapack.h @@ -0,0 +1,18 @@ +// +// Copyright (c) 2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DETAIL_CLAPACK_H +#define BOOST_NUMERIC_BINDINGS_LAPACK_DETAIL_CLAPACK_H + +extern "C" { +#include +} + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/detail/clapack_option.hpp b/sdk/boost/numeric/bindings/lapack/detail/clapack_option.hpp new file mode 100644 index 0000000..0106f6c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/detail/clapack_option.hpp @@ -0,0 +1,29 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DETAIL_CLAPACK_OPTION_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DETAIL_CLAPACK_OPTION_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { +namespace detail { + +template< typename Tag > +struct clapack_option: blas::detail::cblas_option< Tag > {}; + +} // namespace detail +} // namespace blas +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/detail/lapack.h b/sdk/boost/numeric/bindings/lapack/detail/lapack.h new file mode 100644 index 0000000..010c035 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/detail/lapack.h @@ -0,0 +1,4380 @@ +// +// Copyright (c) 2003--2009 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DETAIL_LAPACK_H +#define BOOST_NUMERIC_BINDINGS_LAPACK_DETAIL_LAPACK_H + +#include + +extern "C" { + +// +// LAPACK computational routines +// + +// Value-type variants of hbgst +void LAPACK_CHBGST( const char* vect, const char* uplo, + const fortran_int_t* n, const fortran_int_t* ka, + const fortran_int_t* kb, void* ab, const fortran_int_t* ldab, + const void* bb, const fortran_int_t* ldbb, void* x, + const fortran_int_t* ldx, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZHBGST( const char* vect, const char* uplo, + const fortran_int_t* n, const fortran_int_t* ka, + const fortran_int_t* kb, void* ab, const fortran_int_t* ldab, + const void* bb, const fortran_int_t* ldbb, void* x, + const fortran_int_t* ldx, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of hegst +void LAPACK_CHEGST( const fortran_int_t* itype, const char* uplo, + const fortran_int_t* n, void* a, const fortran_int_t* lda, + const void* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZHEGST( const fortran_int_t* itype, const char* uplo, + const fortran_int_t* n, void* a, const fortran_int_t* lda, + const void* b, const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of pbstf +void LAPACK_SPBSTF( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, float* ab, const fortran_int_t* ldab, + fortran_int_t* info ); +void LAPACK_DPBSTF( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, double* ab, const fortran_int_t* ldab, + fortran_int_t* info ); +void LAPACK_CPBSTF( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, void* ab, const fortran_int_t* ldab, + fortran_int_t* info ); +void LAPACK_ZPBSTF( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, void* ab, const fortran_int_t* ldab, + fortran_int_t* info ); + +// Value-type variants of sbgst +void LAPACK_SSBGST( const char* vect, const char* uplo, + const fortran_int_t* n, const fortran_int_t* ka, + const fortran_int_t* kb, float* ab, const fortran_int_t* ldab, + const float* bb, const fortran_int_t* ldbb, float* x, + const fortran_int_t* ldx, float* work, fortran_int_t* info ); +void LAPACK_DSBGST( const char* vect, const char* uplo, + const fortran_int_t* n, const fortran_int_t* ka, + const fortran_int_t* kb, double* ab, const fortran_int_t* ldab, + const double* bb, const fortran_int_t* ldbb, double* x, + const fortran_int_t* ldx, double* work, fortran_int_t* info ); + +// Value-type variants of sygst +void LAPACK_SSYGST( const fortran_int_t* itype, const char* uplo, + const fortran_int_t* n, float* a, const fortran_int_t* lda, + const float* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_DSYGST( const fortran_int_t* itype, const char* uplo, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + const double* b, const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of ggqrf +void LAPACK_SGGQRF( const fortran_int_t* n, const fortran_int_t* m, + const fortran_int_t* p, float* a, const fortran_int_t* lda, + float* taua, float* b, const fortran_int_t* ldb, float* taub, + float* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DGGQRF( const fortran_int_t* n, const fortran_int_t* m, + const fortran_int_t* p, double* a, const fortran_int_t* lda, + double* taua, double* b, const fortran_int_t* ldb, double* taub, + double* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGGQRF( const fortran_int_t* n, const fortran_int_t* m, + const fortran_int_t* p, void* a, const fortran_int_t* lda, void* taua, + void* b, const fortran_int_t* ldb, void* taub, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZGGQRF( const fortran_int_t* n, const fortran_int_t* m, + const fortran_int_t* p, void* a, const fortran_int_t* lda, void* taua, + void* b, const fortran_int_t* ldb, void* taub, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of ggrqf +void LAPACK_SGGRQF( const fortran_int_t* m, const fortran_int_t* p, + const fortran_int_t* n, float* a, const fortran_int_t* lda, + float* taua, float* b, const fortran_int_t* ldb, float* taub, + float* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DGGRQF( const fortran_int_t* m, const fortran_int_t* p, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + double* taua, double* b, const fortran_int_t* ldb, double* taub, + double* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGGRQF( const fortran_int_t* m, const fortran_int_t* p, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* taua, + void* b, const fortran_int_t* ldb, void* taub, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZGGRQF( const fortran_int_t* m, const fortran_int_t* p, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* taua, + void* b, const fortran_int_t* ldb, void* taub, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of gelqf +void LAPACK_SGELQF( const fortran_int_t* m, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* tau, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DGELQF( const fortran_int_t* m, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* tau, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGELQF( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZGELQF( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of geqlf +void LAPACK_SGEQLF( const fortran_int_t* m, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* tau, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DGEQLF( const fortran_int_t* m, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* tau, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGEQLF( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZGEQLF( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of geqp3 +void LAPACK_SGEQP3( const fortran_int_t* m, const fortran_int_t* n, float* a, + const fortran_int_t* lda, fortran_int_t* jpvt, float* tau, + float* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DGEQP3( const fortran_int_t* m, const fortran_int_t* n, double* a, + const fortran_int_t* lda, fortran_int_t* jpvt, double* tau, + double* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGEQP3( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* jpvt, void* tau, void* work, + const fortran_int_t* lwork, float* rwork, fortran_int_t* info ); +void LAPACK_ZGEQP3( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* jpvt, void* tau, void* work, + const fortran_int_t* lwork, double* rwork, fortran_int_t* info ); + +// Value-type variants of geqrf +void LAPACK_SGEQRF( const fortran_int_t* m, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* tau, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DGEQRF( const fortran_int_t* m, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* tau, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGEQRF( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZGEQRF( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of gerqf +void LAPACK_SGERQF( const fortran_int_t* m, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* tau, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DGERQF( const fortran_int_t* m, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* tau, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGERQF( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZGERQF( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of orglq +void LAPACK_SORGLQ( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, float* a, const fortran_int_t* lda, + const float* tau, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DORGLQ( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, double* a, const fortran_int_t* lda, + const double* tau, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of orgql +void LAPACK_SORGQL( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, float* a, const fortran_int_t* lda, + const float* tau, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DORGQL( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, double* a, const fortran_int_t* lda, + const double* tau, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of orgqr +void LAPACK_SORGQR( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, float* a, const fortran_int_t* lda, + const float* tau, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DORGQR( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, double* a, const fortran_int_t* lda, + const double* tau, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of orgrq +void LAPACK_SORGRQ( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, float* a, const fortran_int_t* lda, + const float* tau, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DORGRQ( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, double* a, const fortran_int_t* lda, + const double* tau, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of ormlq +void LAPACK_SORMLQ( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const float* a, const fortran_int_t* lda, + const float* tau, float* c, const fortran_int_t* ldc, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DORMLQ( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const double* a, const fortran_int_t* lda, + const double* tau, double* c, const fortran_int_t* ldc, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of ormql +void LAPACK_SORMQL( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, float* a, const fortran_int_t* lda, + const float* tau, float* c, const fortran_int_t* ldc, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DORMQL( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, double* a, const fortran_int_t* lda, + const double* tau, double* c, const fortran_int_t* ldc, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of ormqr +void LAPACK_SORMQR( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const float* a, const fortran_int_t* lda, + const float* tau, float* c, const fortran_int_t* ldc, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DORMQR( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const double* a, const fortran_int_t* lda, + const double* tau, double* c, const fortran_int_t* ldc, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of ormrq +void LAPACK_SORMRQ( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const float* a, const fortran_int_t* lda, + const float* tau, float* c, const fortran_int_t* ldc, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DORMRQ( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const double* a, const fortran_int_t* lda, + const double* tau, double* c, const fortran_int_t* ldc, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of ormrz +void LAPACK_SORMRZ( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const fortran_int_t* l, const float* a, + const fortran_int_t* lda, const float* tau, float* c, + const fortran_int_t* ldc, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DORMRZ( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const fortran_int_t* l, const double* a, + const fortran_int_t* lda, const double* tau, double* c, + const fortran_int_t* ldc, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of tzrzf +void LAPACK_STZRZF( const fortran_int_t* m, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* tau, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DTZRZF( const fortran_int_t* m, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* tau, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CTZRZF( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZTZRZF( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of unglq +void LAPACK_CUNGLQ( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, void* a, const fortran_int_t* lda, + const void* tau, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_ZUNGLQ( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, void* a, const fortran_int_t* lda, + const void* tau, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of ungql +void LAPACK_CUNGQL( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, void* a, const fortran_int_t* lda, + const void* tau, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_ZUNGQL( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, void* a, const fortran_int_t* lda, + const void* tau, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of ungqr +void LAPACK_CUNGQR( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, void* a, const fortran_int_t* lda, + const void* tau, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_ZUNGQR( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, void* a, const fortran_int_t* lda, + const void* tau, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of ungrq +void LAPACK_CUNGRQ( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, void* a, const fortran_int_t* lda, + const void* tau, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_ZUNGRQ( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, void* a, const fortran_int_t* lda, + const void* tau, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of unmlq +void LAPACK_CUNMLQ( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* a, const fortran_int_t* lda, + const void* tau, void* c, const fortran_int_t* ldc, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZUNMLQ( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* a, const fortran_int_t* lda, + const void* tau, void* c, const fortran_int_t* ldc, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of unmql +void LAPACK_CUNMQL( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* a, const fortran_int_t* lda, + const void* tau, void* c, const fortran_int_t* ldc, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZUNMQL( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* a, const fortran_int_t* lda, + const void* tau, void* c, const fortran_int_t* ldc, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of unmqr +void LAPACK_CUNMQR( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* a, const fortran_int_t* lda, + const void* tau, void* c, const fortran_int_t* ldc, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZUNMQR( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* a, const fortran_int_t* lda, + const void* tau, void* c, const fortran_int_t* ldc, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of unmrq +void LAPACK_CUNMRQ( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* a, const fortran_int_t* lda, + const void* tau, void* c, const fortran_int_t* ldc, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZUNMRQ( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* a, const fortran_int_t* lda, + const void* tau, void* c, const fortran_int_t* ldc, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of unmrz +void LAPACK_CUNMRZ( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const fortran_int_t* l, const void* a, + const fortran_int_t* lda, const void* tau, void* c, + const fortran_int_t* ldc, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_ZUNMRZ( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const fortran_int_t* l, const void* a, + const fortran_int_t* lda, const void* tau, void* c, + const fortran_int_t* ldc, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of bdsdc +void LAPACK_SBDSDC( const char* uplo, const char* compq, + const fortran_int_t* n, float* d, float* e, float* u, + const fortran_int_t* ldu, float* vt, const fortran_int_t* ldvt, + float* q, fortran_int_t* iq, float* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DBDSDC( const char* uplo, const char* compq, + const fortran_int_t* n, double* d, double* e, double* u, + const fortran_int_t* ldu, double* vt, const fortran_int_t* ldvt, + double* q, fortran_int_t* iq, double* work, fortran_int_t* iwork, + fortran_int_t* info ); + +// Value-type variants of bdsqr +void LAPACK_SBDSQR( const char* uplo, const fortran_int_t* n, + const fortran_int_t* ncvt, const fortran_int_t* nru, + const fortran_int_t* ncc, float* d, float* e, float* vt, + const fortran_int_t* ldvt, float* u, const fortran_int_t* ldu, + float* c, const fortran_int_t* ldc, float* work, fortran_int_t* info ); +void LAPACK_DBDSQR( const char* uplo, const fortran_int_t* n, + const fortran_int_t* ncvt, const fortran_int_t* nru, + const fortran_int_t* ncc, double* d, double* e, double* vt, + const fortran_int_t* ldvt, double* u, const fortran_int_t* ldu, + double* c, const fortran_int_t* ldc, double* work, + fortran_int_t* info ); +void LAPACK_CBDSQR( const char* uplo, const fortran_int_t* n, + const fortran_int_t* ncvt, const fortran_int_t* nru, + const fortran_int_t* ncc, float* d, float* e, void* vt, + const fortran_int_t* ldvt, void* u, const fortran_int_t* ldu, void* c, + const fortran_int_t* ldc, float* rwork, fortran_int_t* info ); +void LAPACK_ZBDSQR( const char* uplo, const fortran_int_t* n, + const fortran_int_t* ncvt, const fortran_int_t* nru, + const fortran_int_t* ncc, double* d, double* e, void* vt, + const fortran_int_t* ldvt, void* u, const fortran_int_t* ldu, void* c, + const fortran_int_t* ldc, double* rwork, fortran_int_t* info ); + +// Value-type variants of gbbrd +void LAPACK_SGBBRD( const char* vect, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* ncc, + const fortran_int_t* kl, const fortran_int_t* ku, float* ab, + const fortran_int_t* ldab, float* d, float* e, float* q, + const fortran_int_t* ldq, float* pt, const fortran_int_t* ldpt, + float* c, const fortran_int_t* ldc, float* work, fortran_int_t* info ); +void LAPACK_DGBBRD( const char* vect, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* ncc, + const fortran_int_t* kl, const fortran_int_t* ku, double* ab, + const fortran_int_t* ldab, double* d, double* e, double* q, + const fortran_int_t* ldq, double* pt, const fortran_int_t* ldpt, + double* c, const fortran_int_t* ldc, double* work, + fortran_int_t* info ); +void LAPACK_CGBBRD( const char* vect, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* ncc, + const fortran_int_t* kl, const fortran_int_t* ku, void* ab, + const fortran_int_t* ldab, float* d, float* e, void* q, + const fortran_int_t* ldq, void* pt, const fortran_int_t* ldpt, + void* c, const fortran_int_t* ldc, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZGBBRD( const char* vect, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* ncc, + const fortran_int_t* kl, const fortran_int_t* ku, void* ab, + const fortran_int_t* ldab, double* d, double* e, void* q, + const fortran_int_t* ldq, void* pt, const fortran_int_t* ldpt, + void* c, const fortran_int_t* ldc, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of gebrd +void LAPACK_SGEBRD( const fortran_int_t* m, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* d, float* e, float* tauq, + float* taup, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DGEBRD( const fortran_int_t* m, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* d, double* e, double* tauq, + double* taup, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_CGEBRD( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, float* d, float* e, void* tauq, void* taup, + void* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZGEBRD( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, double* d, double* e, void* tauq, + void* taup, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of orgbr +void LAPACK_SORGBR( const char* vect, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* k, float* a, + const fortran_int_t* lda, const float* tau, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DORGBR( const char* vect, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* k, double* a, + const fortran_int_t* lda, const double* tau, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of ormbr +void LAPACK_SORMBR( const char* vect, const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const float* a, const fortran_int_t* lda, + const float* tau, float* c, const fortran_int_t* ldc, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DORMBR( const char* vect, const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const double* a, const fortran_int_t* lda, + const double* tau, double* c, const fortran_int_t* ldc, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of ungbr +void LAPACK_CUNGBR( const char* vect, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* k, void* a, + const fortran_int_t* lda, const void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZUNGBR( const char* vect, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* k, void* a, + const fortran_int_t* lda, const void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of unmbr +void LAPACK_CUNMBR( const char* vect, const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* a, const fortran_int_t* lda, + const void* tau, void* c, const fortran_int_t* ldc, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZUNMBR( const char* vect, const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* a, const fortran_int_t* lda, + const void* tau, void* c, const fortran_int_t* ldc, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of gebak +void LAPACK_SGEBAK( const char* job, const char* side, const fortran_int_t* n, + const fortran_int_t* ilo, const fortran_int_t* ihi, + const float* scale, const fortran_int_t* m, float* v, + const fortran_int_t* ldv, fortran_int_t* info ); +void LAPACK_DGEBAK( const char* job, const char* side, const fortran_int_t* n, + const fortran_int_t* ilo, const fortran_int_t* ihi, + const double* scale, const fortran_int_t* m, double* v, + const fortran_int_t* ldv, fortran_int_t* info ); +void LAPACK_CGEBAK( const char* job, const char* side, const fortran_int_t* n, + const fortran_int_t* ilo, const fortran_int_t* ihi, + const float* scale, const fortran_int_t* m, void* v, + const fortran_int_t* ldv, fortran_int_t* info ); +void LAPACK_ZGEBAK( const char* job, const char* side, const fortran_int_t* n, + const fortran_int_t* ilo, const fortran_int_t* ihi, + const double* scale, const fortran_int_t* m, void* v, + const fortran_int_t* ldv, fortran_int_t* info ); + +// Value-type variants of gebal +void LAPACK_SGEBAL( const char* job, const fortran_int_t* n, float* a, + const fortran_int_t* lda, fortran_int_t* ilo, fortran_int_t* ihi, + float* scale, fortran_int_t* info ); +void LAPACK_DGEBAL( const char* job, const fortran_int_t* n, double* a, + const fortran_int_t* lda, fortran_int_t* ilo, fortran_int_t* ihi, + double* scale, fortran_int_t* info ); +void LAPACK_CGEBAL( const char* job, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* ilo, fortran_int_t* ihi, + float* scale, fortran_int_t* info ); +void LAPACK_ZGEBAL( const char* job, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* ilo, fortran_int_t* ihi, + double* scale, fortran_int_t* info ); + +// Value-type variants of gehrd +void LAPACK_SGEHRD( const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, float* a, const fortran_int_t* lda, + float* tau, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DGEHRD( const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, double* a, const fortran_int_t* lda, + double* tau, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_CGEHRD( const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, void* a, const fortran_int_t* lda, + void* tau, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_ZGEHRD( const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, void* a, const fortran_int_t* lda, + void* tau, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of hsein +void LAPACK_SHSEIN( const char* side, const char* eigsrc, const char* initv, + fortran_bool_t* select, const fortran_int_t* n, const float* h, + const fortran_int_t* ldh, float* wr, const float* wi, float* vl, + const fortran_int_t* ldvl, float* vr, const fortran_int_t* ldvr, + const fortran_int_t* mm, fortran_int_t* m, float* work, + fortran_int_t* ifaill, fortran_int_t* ifailr, fortran_int_t* info ); +void LAPACK_DHSEIN( const char* side, const char* eigsrc, const char* initv, + fortran_bool_t* select, const fortran_int_t* n, const double* h, + const fortran_int_t* ldh, double* wr, const double* wi, double* vl, + const fortran_int_t* ldvl, double* vr, const fortran_int_t* ldvr, + const fortran_int_t* mm, fortran_int_t* m, double* work, + fortran_int_t* ifaill, fortran_int_t* ifailr, fortran_int_t* info ); +void LAPACK_CHSEIN( const char* side, const char* eigsrc, const char* initv, + const fortran_bool_t* select, const fortran_int_t* n, const void* h, + const fortran_int_t* ldh, void* w, void* vl, + const fortran_int_t* ldvl, void* vr, const fortran_int_t* ldvr, + const fortran_int_t* mm, fortran_int_t* m, void* work, float* rwork, + fortran_int_t* ifaill, fortran_int_t* ifailr, fortran_int_t* info ); +void LAPACK_ZHSEIN( const char* side, const char* eigsrc, const char* initv, + const fortran_bool_t* select, const fortran_int_t* n, const void* h, + const fortran_int_t* ldh, void* w, void* vl, + const fortran_int_t* ldvl, void* vr, const fortran_int_t* ldvr, + const fortran_int_t* mm, fortran_int_t* m, void* work, double* rwork, + fortran_int_t* ifaill, fortran_int_t* ifailr, fortran_int_t* info ); + +// Value-type variants of hseqr +void LAPACK_SHSEQR( const char* job, const char* compz, + const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, float* h, const fortran_int_t* ldh, + float* wr, float* wi, float* z, const fortran_int_t* ldz, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DHSEQR( const char* job, const char* compz, + const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, double* h, const fortran_int_t* ldh, + double* wr, double* wi, double* z, const fortran_int_t* ldz, + double* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CHSEQR( const char* job, const char* compz, + const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, void* h, const fortran_int_t* ldh, void* w, + void* z, const fortran_int_t* ldz, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZHSEQR( const char* job, const char* compz, + const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, void* h, const fortran_int_t* ldh, void* w, + void* z, const fortran_int_t* ldz, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of orghr +void LAPACK_SORGHR( const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, float* a, const fortran_int_t* lda, + const float* tau, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DORGHR( const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, double* a, const fortran_int_t* lda, + const double* tau, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of ormhr +void LAPACK_SORMHR( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* ilo, const fortran_int_t* ihi, const float* a, + const fortran_int_t* lda, const float* tau, float* c, + const fortran_int_t* ldc, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DORMHR( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* ilo, const fortran_int_t* ihi, const double* a, + const fortran_int_t* lda, const double* tau, double* c, + const fortran_int_t* ldc, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of trevc +void LAPACK_STREVC( const char* side, const char* howmny, + fortran_bool_t* select, const fortran_int_t* n, const float* t, + const fortran_int_t* ldt, float* vl, const fortran_int_t* ldvl, + float* vr, const fortran_int_t* ldvr, const fortran_int_t* mm, + fortran_int_t* m, float* work, fortran_int_t* info ); +void LAPACK_DTREVC( const char* side, const char* howmny, + fortran_bool_t* select, const fortran_int_t* n, const double* t, + const fortran_int_t* ldt, double* vl, const fortran_int_t* ldvl, + double* vr, const fortran_int_t* ldvr, const fortran_int_t* mm, + fortran_int_t* m, double* work, fortran_int_t* info ); +void LAPACK_CTREVC( const char* side, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, void* t, + const fortran_int_t* ldt, void* vl, const fortran_int_t* ldvl, + void* vr, const fortran_int_t* ldvr, const fortran_int_t* mm, + fortran_int_t* m, void* work, float* rwork, fortran_int_t* info ); +void LAPACK_ZTREVC( const char* side, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, void* t, + const fortran_int_t* ldt, void* vl, const fortran_int_t* ldvl, + void* vr, const fortran_int_t* ldvr, const fortran_int_t* mm, + fortran_int_t* m, void* work, double* rwork, fortran_int_t* info ); + +// Value-type variants of trexc +void LAPACK_STREXC( const char* compq, const fortran_int_t* n, float* t, + const fortran_int_t* ldt, float* q, const fortran_int_t* ldq, + fortran_int_t* ifst, fortran_int_t* ilst, float* work, + fortran_int_t* info ); +void LAPACK_DTREXC( const char* compq, const fortran_int_t* n, double* t, + const fortran_int_t* ldt, double* q, const fortran_int_t* ldq, + fortran_int_t* ifst, fortran_int_t* ilst, double* work, + fortran_int_t* info ); +void LAPACK_CTREXC( const char* compq, const fortran_int_t* n, void* t, + const fortran_int_t* ldt, void* q, const fortran_int_t* ldq, + const fortran_int_t* ifst, const fortran_int_t* ilst, + fortran_int_t* info ); +void LAPACK_ZTREXC( const char* compq, const fortran_int_t* n, void* t, + const fortran_int_t* ldt, void* q, const fortran_int_t* ldq, + const fortran_int_t* ifst, const fortran_int_t* ilst, + fortran_int_t* info ); + +// Value-type variants of trsen +void LAPACK_CTRSEN( const char* job, const char* compq, + const fortran_bool_t* select, const fortran_int_t* n, void* t, + const fortran_int_t* ldt, void* q, const fortran_int_t* ldq, void* w, + fortran_int_t* m, float* s, float* sep, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZTRSEN( const char* job, const char* compq, + const fortran_bool_t* select, const fortran_int_t* n, void* t, + const fortran_int_t* ldt, void* q, const fortran_int_t* ldq, void* w, + fortran_int_t* m, double* s, double* sep, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of trsna +void LAPACK_STRSNA( const char* job, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, const float* t, + const fortran_int_t* ldt, const float* vl, const fortran_int_t* ldvl, + const float* vr, const fortran_int_t* ldvr, float* s, float* sep, + const fortran_int_t* mm, fortran_int_t* m, float* work, + const fortran_int_t* ldwork, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DTRSNA( const char* job, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, const double* t, + const fortran_int_t* ldt, const double* vl, const fortran_int_t* ldvl, + const double* vr, const fortran_int_t* ldvr, double* s, double* sep, + const fortran_int_t* mm, fortran_int_t* m, double* work, + const fortran_int_t* ldwork, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_CTRSNA( const char* job, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, const void* t, + const fortran_int_t* ldt, const void* vl, const fortran_int_t* ldvl, + const void* vr, const fortran_int_t* ldvr, float* s, float* sep, + const fortran_int_t* mm, fortran_int_t* m, void* work, + const fortran_int_t* ldwork, float* rwork, fortran_int_t* info ); +void LAPACK_ZTRSNA( const char* job, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, const void* t, + const fortran_int_t* ldt, const void* vl, const fortran_int_t* ldvl, + const void* vr, const fortran_int_t* ldvr, double* s, double* sep, + const fortran_int_t* mm, fortran_int_t* m, void* work, + const fortran_int_t* ldwork, double* rwork, fortran_int_t* info ); + +// Value-type variants of trsyl +void LAPACK_STRSYL( const char* trana, const char* tranb, + const fortran_int_t* isgn, const fortran_int_t* m, + const fortran_int_t* n, const float* a, const fortran_int_t* lda, + const float* b, const fortran_int_t* ldb, float* c, + const fortran_int_t* ldc, float* scale, fortran_int_t* info ); +void LAPACK_DTRSYL( const char* trana, const char* tranb, + const fortran_int_t* isgn, const fortran_int_t* m, + const fortran_int_t* n, const double* a, const fortran_int_t* lda, + const double* b, const fortran_int_t* ldb, double* c, + const fortran_int_t* ldc, double* scale, fortran_int_t* info ); +void LAPACK_CTRSYL( const char* trana, const char* tranb, + const fortran_int_t* isgn, const fortran_int_t* m, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + const void* b, const fortran_int_t* ldb, void* c, + const fortran_int_t* ldc, float* scale, fortran_int_t* info ); +void LAPACK_ZTRSYL( const char* trana, const char* tranb, + const fortran_int_t* isgn, const fortran_int_t* m, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + const void* b, const fortran_int_t* ldb, void* c, + const fortran_int_t* ldc, double* scale, fortran_int_t* info ); + +// Value-type variants of unghr +void LAPACK_CUNGHR( const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, void* a, const fortran_int_t* lda, + const void* tau, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_ZUNGHR( const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, void* a, const fortran_int_t* lda, + const void* tau, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of unmhr +void LAPACK_CUNMHR( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* ilo, const fortran_int_t* ihi, const void* a, + const fortran_int_t* lda, const void* tau, void* c, + const fortran_int_t* ldc, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_ZUNMHR( const char* side, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* ilo, const fortran_int_t* ihi, const void* a, + const fortran_int_t* lda, const void* tau, void* c, + const fortran_int_t* ldc, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of gbcon +void LAPACK_SGBCON( const char* norm, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, const float* ab, + const fortran_int_t* ldab, const fortran_int_t* ipiv, + const float* anorm, float* rcond, float* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DGBCON( const char* norm, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, const double* ab, + const fortran_int_t* ldab, const fortran_int_t* ipiv, + const double* anorm, double* rcond, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CGBCON( const char* norm, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, const void* ab, + const fortran_int_t* ldab, const fortran_int_t* ipiv, + const float* anorm, float* rcond, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZGBCON( const char* norm, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, const void* ab, + const fortran_int_t* ldab, const fortran_int_t* ipiv, + const double* anorm, double* rcond, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of gbequ +void LAPACK_SGBEQU( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, const float* ab, + const fortran_int_t* ldab, float* r, float* c, float* rowcnd, + float* colcnd, float* amax, fortran_int_t* info ); +void LAPACK_DGBEQU( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, const double* ab, + const fortran_int_t* ldab, double* r, double* c, double* rowcnd, + double* colcnd, double* amax, fortran_int_t* info ); +void LAPACK_CGBEQU( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, const void* ab, + const fortran_int_t* ldab, float* r, float* c, float* rowcnd, + float* colcnd, float* amax, fortran_int_t* info ); +void LAPACK_ZGBEQU( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, const void* ab, + const fortran_int_t* ldab, double* r, double* c, double* rowcnd, + double* colcnd, double* amax, fortran_int_t* info ); + +// Value-type variants of gbrfs +void LAPACK_SGBRFS( const char* trans, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, + const fortran_int_t* nrhs, const float* ab, const fortran_int_t* ldab, + const float* afb, const fortran_int_t* ldafb, + const fortran_int_t* ipiv, const float* b, const fortran_int_t* ldb, + float* x, const fortran_int_t* ldx, float* ferr, float* berr, + float* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DGBRFS( const char* trans, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, + const fortran_int_t* nrhs, const double* ab, + const fortran_int_t* ldab, const double* afb, + const fortran_int_t* ldafb, const fortran_int_t* ipiv, + const double* b, const fortran_int_t* ldb, double* x, + const fortran_int_t* ldx, double* ferr, double* berr, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CGBRFS( const char* trans, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, + const fortran_int_t* nrhs, const void* ab, const fortran_int_t* ldab, + const void* afb, const fortran_int_t* ldafb, + const fortran_int_t* ipiv, const void* b, const fortran_int_t* ldb, + void* x, const fortran_int_t* ldx, float* ferr, float* berr, + void* work, float* rwork, fortran_int_t* info ); +void LAPACK_ZGBRFS( const char* trans, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, + const fortran_int_t* nrhs, const void* ab, const fortran_int_t* ldab, + const void* afb, const fortran_int_t* ldafb, + const fortran_int_t* ipiv, const void* b, const fortran_int_t* ldb, + void* x, const fortran_int_t* ldx, double* ferr, double* berr, + void* work, double* rwork, fortran_int_t* info ); + +// Value-type variants of gbtrf +void LAPACK_SGBTRF( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, float* ab, + const fortran_int_t* ldab, fortran_int_t* ipiv, fortran_int_t* info ); +void LAPACK_DGBTRF( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, double* ab, + const fortran_int_t* ldab, fortran_int_t* ipiv, fortran_int_t* info ); +void LAPACK_CGBTRF( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, void* ab, + const fortran_int_t* ldab, fortran_int_t* ipiv, fortran_int_t* info ); +void LAPACK_ZGBTRF( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, void* ab, + const fortran_int_t* ldab, fortran_int_t* ipiv, fortran_int_t* info ); + +// Value-type variants of gbtrs +void LAPACK_SGBTRS( const char* trans, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, + const fortran_int_t* nrhs, const float* ab, const fortran_int_t* ldab, + const fortran_int_t* ipiv, float* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_DGBTRS( const char* trans, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, + const fortran_int_t* nrhs, const double* ab, + const fortran_int_t* ldab, const fortran_int_t* ipiv, double* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_CGBTRS( const char* trans, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, + const fortran_int_t* nrhs, const void* ab, const fortran_int_t* ldab, + const fortran_int_t* ipiv, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_ZGBTRS( const char* trans, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, + const fortran_int_t* nrhs, const void* ab, const fortran_int_t* ldab, + const fortran_int_t* ipiv, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); + +// Value-type variants of gecon +void LAPACK_SGECON( const char* norm, const fortran_int_t* n, const float* a, + const fortran_int_t* lda, const float* anorm, float* rcond, + float* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DGECON( const char* norm, const fortran_int_t* n, const double* a, + const fortran_int_t* lda, const double* anorm, double* rcond, + double* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CGECON( const char* norm, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const float* anorm, float* rcond, + void* work, float* rwork, fortran_int_t* info ); +void LAPACK_ZGECON( const char* norm, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const double* anorm, double* rcond, + void* work, double* rwork, fortran_int_t* info ); + +// Value-type variants of geequ +void LAPACK_SGEEQU( const fortran_int_t* m, const fortran_int_t* n, + const float* a, const fortran_int_t* lda, float* r, float* c, + float* rowcnd, float* colcnd, float* amax, fortran_int_t* info ); +void LAPACK_DGEEQU( const fortran_int_t* m, const fortran_int_t* n, + const double* a, const fortran_int_t* lda, double* r, double* c, + double* rowcnd, double* colcnd, double* amax, fortran_int_t* info ); +void LAPACK_CGEEQU( const fortran_int_t* m, const fortran_int_t* n, + const void* a, const fortran_int_t* lda, float* r, float* c, + float* rowcnd, float* colcnd, float* amax, fortran_int_t* info ); +void LAPACK_ZGEEQU( const fortran_int_t* m, const fortran_int_t* n, + const void* a, const fortran_int_t* lda, double* r, double* c, + double* rowcnd, double* colcnd, double* amax, fortran_int_t* info ); + +// Value-type variants of gerfs +void LAPACK_SGERFS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* a, const fortran_int_t* lda, + const float* af, const fortran_int_t* ldaf, const fortran_int_t* ipiv, + const float* b, const fortran_int_t* ldb, float* x, + const fortran_int_t* ldx, float* ferr, float* berr, float* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DGERFS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* a, const fortran_int_t* lda, + const double* af, const fortran_int_t* ldaf, + const fortran_int_t* ipiv, const double* b, const fortran_int_t* ldb, + double* x, const fortran_int_t* ldx, double* ferr, double* berr, + double* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CGERFS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const void* af, const fortran_int_t* ldaf, const fortran_int_t* ipiv, + const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, float* ferr, float* berr, void* work, + float* rwork, fortran_int_t* info ); +void LAPACK_ZGERFS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const void* af, const fortran_int_t* ldaf, const fortran_int_t* ipiv, + const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, double* ferr, double* berr, void* work, + double* rwork, fortran_int_t* info ); + +// Value-type variants of getrf +void LAPACK_SGETRF( const fortran_int_t* m, const fortran_int_t* n, float* a, + const fortran_int_t* lda, fortran_int_t* ipiv, fortran_int_t* info ); +void LAPACK_DGETRF( const fortran_int_t* m, const fortran_int_t* n, double* a, + const fortran_int_t* lda, fortran_int_t* ipiv, fortran_int_t* info ); +void LAPACK_CGETRF( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* ipiv, fortran_int_t* info ); +void LAPACK_ZGETRF( const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* ipiv, fortran_int_t* info ); + +// Value-type variants of getri +void LAPACK_SGETRI( const fortran_int_t* n, float* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DGETRI( const fortran_int_t* n, double* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGETRI( const fortran_int_t* n, void* a, const fortran_int_t* lda, + const fortran_int_t* ipiv, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_ZGETRI( const fortran_int_t* n, void* a, const fortran_int_t* lda, + const fortran_int_t* ipiv, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of getrs +void LAPACK_SGETRS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* a, const fortran_int_t* lda, + const fortran_int_t* ipiv, float* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_DGETRS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* a, const fortran_int_t* lda, + const fortran_int_t* ipiv, double* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_CGETRS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const fortran_int_t* ipiv, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_ZGETRS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const fortran_int_t* ipiv, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); + +// Value-type variants of gtrfs +void LAPACK_SGTRFS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* dl, const float* d, + const float* du, const float* dlf, const float* df, const float* duf, + const float* du2, const fortran_int_t* ipiv, const float* b, + const fortran_int_t* ldb, float* x, const fortran_int_t* ldx, + float* ferr, float* berr, float* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DGTRFS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* dl, const double* d, + const double* du, const double* dlf, const double* df, + const double* duf, const double* du2, const fortran_int_t* ipiv, + const double* b, const fortran_int_t* ldb, double* x, + const fortran_int_t* ldx, double* ferr, double* berr, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CGTRFS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* dl, const void* d, + const void* du, const void* dlf, const void* df, const void* duf, + const void* du2, const fortran_int_t* ipiv, const void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + float* ferr, float* berr, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZGTRFS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* dl, const void* d, + const void* du, const void* dlf, const void* df, const void* duf, + const void* du2, const fortran_int_t* ipiv, const void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + double* ferr, double* berr, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of gttrs +void LAPACK_SGTTRS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* dl, const float* d, + const float* du, const float* du2, const fortran_int_t* ipiv, + float* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_DGTTRS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* dl, const double* d, + const double* du, const double* du2, const fortran_int_t* ipiv, + double* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_CGTTRS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* dl, const void* d, + const void* du, const void* du2, const fortran_int_t* ipiv, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZGTTRS( const char* trans, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* dl, const void* d, + const void* du, const void* du2, const fortran_int_t* ipiv, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of hecon +void LAPACK_CHECON( const char* uplo, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, + const float* anorm, float* rcond, void* work, fortran_int_t* info ); +void LAPACK_ZHECON( const char* uplo, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, + const double* anorm, double* rcond, void* work, fortran_int_t* info ); + +// Value-type variants of herfs +void LAPACK_CHERFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const void* af, const fortran_int_t* ldaf, const fortran_int_t* ipiv, + const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, float* ferr, float* berr, void* work, + float* rwork, fortran_int_t* info ); +void LAPACK_ZHERFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const void* af, const fortran_int_t* ldaf, const fortran_int_t* ipiv, + const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, double* ferr, double* berr, void* work, + double* rwork, fortran_int_t* info ); + +// Value-type variants of hetrf +void LAPACK_CHETRF( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* ipiv, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZHETRF( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* ipiv, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of hetri +void LAPACK_CHETRI( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, void* work, + fortran_int_t* info ); +void LAPACK_ZHETRI( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, void* work, + fortran_int_t* info ); + +// Value-type variants of hetrs +void LAPACK_CHETRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const fortran_int_t* ipiv, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_ZHETRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const fortran_int_t* ipiv, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); + +// Value-type variants of hpcon +void LAPACK_CHPCON( const char* uplo, const fortran_int_t* n, const void* ap, + const fortran_int_t* ipiv, const float* anorm, float* rcond, + void* work, fortran_int_t* info ); +void LAPACK_ZHPCON( const char* uplo, const fortran_int_t* n, const void* ap, + const fortran_int_t* ipiv, const double* anorm, double* rcond, + void* work, fortran_int_t* info ); + +// Value-type variants of hprfs +void LAPACK_CHPRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* ap, const void* afp, + const fortran_int_t* ipiv, const void* b, const fortran_int_t* ldb, + void* x, const fortran_int_t* ldx, float* ferr, float* berr, + void* work, float* rwork, fortran_int_t* info ); +void LAPACK_ZHPRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* ap, const void* afp, + const fortran_int_t* ipiv, const void* b, const fortran_int_t* ldb, + void* x, const fortran_int_t* ldx, double* ferr, double* berr, + void* work, double* rwork, fortran_int_t* info ); + +// Value-type variants of hptrf +void LAPACK_CHPTRF( const char* uplo, const fortran_int_t* n, void* ap, + fortran_int_t* ipiv, fortran_int_t* info ); +void LAPACK_ZHPTRF( const char* uplo, const fortran_int_t* n, void* ap, + fortran_int_t* ipiv, fortran_int_t* info ); + +// Value-type variants of hptri +void LAPACK_CHPTRI( const char* uplo, const fortran_int_t* n, void* ap, + const fortran_int_t* ipiv, void* work, fortran_int_t* info ); +void LAPACK_ZHPTRI( const char* uplo, const fortran_int_t* n, void* ap, + const fortran_int_t* ipiv, void* work, fortran_int_t* info ); + +// Value-type variants of hptrs +void LAPACK_CHPTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* ap, const fortran_int_t* ipiv, + void* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZHPTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* ap, const fortran_int_t* ipiv, + void* b, const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of pbcon +void LAPACK_SPBCON( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const float* ab, const fortran_int_t* ldab, + const float* anorm, float* rcond, float* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DPBCON( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const double* ab, const fortran_int_t* ldab, + const double* anorm, double* rcond, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CPBCON( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const void* ab, const fortran_int_t* ldab, + const float* anorm, float* rcond, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZPBCON( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const void* ab, const fortran_int_t* ldab, + const double* anorm, double* rcond, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of pbequ +void LAPACK_SPBEQU( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const float* ab, const fortran_int_t* ldab, + float* s, float* scond, float* amax, fortran_int_t* info ); +void LAPACK_DPBEQU( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const double* ab, const fortran_int_t* ldab, + double* s, double* scond, double* amax, fortran_int_t* info ); +void LAPACK_CPBEQU( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const void* ab, const fortran_int_t* ldab, + float* s, float* scond, float* amax, fortran_int_t* info ); +void LAPACK_ZPBEQU( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const void* ab, const fortran_int_t* ldab, + double* s, double* scond, double* amax, fortran_int_t* info ); + +// Value-type variants of pbrfs +void LAPACK_SPBRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const fortran_int_t* nrhs, const float* ab, + const fortran_int_t* ldab, const float* afb, + const fortran_int_t* ldafb, const float* b, const fortran_int_t* ldb, + float* x, const fortran_int_t* ldx, float* ferr, float* berr, + float* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DPBRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const fortran_int_t* nrhs, const double* ab, + const fortran_int_t* ldab, const double* afb, + const fortran_int_t* ldafb, const double* b, const fortran_int_t* ldb, + double* x, const fortran_int_t* ldx, double* ferr, double* berr, + double* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CPBRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const fortran_int_t* nrhs, const void* ab, + const fortran_int_t* ldab, const void* afb, + const fortran_int_t* ldafb, const void* b, const fortran_int_t* ldb, + void* x, const fortran_int_t* ldx, float* ferr, float* berr, + void* work, float* rwork, fortran_int_t* info ); +void LAPACK_ZPBRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const fortran_int_t* nrhs, const void* ab, + const fortran_int_t* ldab, const void* afb, + const fortran_int_t* ldafb, const void* b, const fortran_int_t* ldb, + void* x, const fortran_int_t* ldx, double* ferr, double* berr, + void* work, double* rwork, fortran_int_t* info ); + +// Value-type variants of pbtrf +void LAPACK_SPBTRF( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, float* ab, const fortran_int_t* ldab, + fortran_int_t* info ); +void LAPACK_DPBTRF( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, double* ab, const fortran_int_t* ldab, + fortran_int_t* info ); +void LAPACK_CPBTRF( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, void* ab, const fortran_int_t* ldab, + fortran_int_t* info ); +void LAPACK_ZPBTRF( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, void* ab, const fortran_int_t* ldab, + fortran_int_t* info ); + +// Value-type variants of pbtrs +void LAPACK_SPBTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const fortran_int_t* nrhs, const float* ab, + const fortran_int_t* ldab, float* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_DPBTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const fortran_int_t* nrhs, const double* ab, + const fortran_int_t* ldab, double* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_CPBTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const fortran_int_t* nrhs, const void* ab, + const fortran_int_t* ldab, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_ZPBTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const fortran_int_t* nrhs, const void* ab, + const fortran_int_t* ldab, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); + +// Value-type variants of pftrf +void LAPACK_SPFTRF( const char* transr, const char* uplo, + const fortran_int_t* n, float* a, fortran_int_t* info ); +void LAPACK_DPFTRF( const char* transr, const char* uplo, + const fortran_int_t* n, double* a, fortran_int_t* info ); +void LAPACK_CPFTRF( const char* transr, const char* uplo, + const fortran_int_t* n, void* a, fortran_int_t* info ); +void LAPACK_ZPFTRF( const char* transr, const char* uplo, + const fortran_int_t* n, void* a, fortran_int_t* info ); + +// Value-type variants of pftri +void LAPACK_SPFTRI( const char* transr, const char* uplo, + const fortran_int_t* n, float* a, fortran_int_t* info ); +void LAPACK_DPFTRI( const char* transr, const char* uplo, + const fortran_int_t* n, double* a, fortran_int_t* info ); +void LAPACK_CPFTRI( const char* transr, const char* uplo, + const fortran_int_t* n, void* a, fortran_int_t* info ); +void LAPACK_ZPFTRI( const char* transr, const char* uplo, + const fortran_int_t* n, void* a, fortran_int_t* info ); + +// Value-type variants of pftrs +void LAPACK_SPFTRS( const char* transr, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const float* a, + float* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_DPFTRS( const char* transr, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const double* a, + double* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_CPFTRS( const char* transr, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* a, + void* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZPFTRS( const char* transr, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* a, + void* b, const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of pocon +void LAPACK_SPOCON( const char* uplo, const fortran_int_t* n, const float* a, + const fortran_int_t* lda, const float* anorm, float* rcond, + float* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DPOCON( const char* uplo, const fortran_int_t* n, const double* a, + const fortran_int_t* lda, const double* anorm, double* rcond, + double* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CPOCON( const char* uplo, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const float* anorm, float* rcond, + void* work, float* rwork, fortran_int_t* info ); +void LAPACK_ZPOCON( const char* uplo, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const double* anorm, double* rcond, + void* work, double* rwork, fortran_int_t* info ); + +// Value-type variants of poequ +void LAPACK_SPOEQU( const fortran_int_t* n, const float* a, + const fortran_int_t* lda, float* s, float* scond, float* amax, + fortran_int_t* info ); +void LAPACK_DPOEQU( const fortran_int_t* n, const double* a, + const fortran_int_t* lda, double* s, double* scond, double* amax, + fortran_int_t* info ); +void LAPACK_CPOEQU( const fortran_int_t* n, const void* a, + const fortran_int_t* lda, float* s, float* scond, float* amax, + fortran_int_t* info ); +void LAPACK_ZPOEQU( const fortran_int_t* n, const void* a, + const fortran_int_t* lda, double* s, double* scond, double* amax, + fortran_int_t* info ); + +// Value-type variants of porfs +void LAPACK_SPORFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* a, const fortran_int_t* lda, + const float* af, const fortran_int_t* ldaf, const float* b, + const fortran_int_t* ldb, float* x, const fortran_int_t* ldx, + float* ferr, float* berr, float* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DPORFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* a, const fortran_int_t* lda, + const double* af, const fortran_int_t* ldaf, const double* b, + const fortran_int_t* ldb, double* x, const fortran_int_t* ldx, + double* ferr, double* berr, double* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_CPORFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const void* af, const fortran_int_t* ldaf, const void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + float* ferr, float* berr, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZPORFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const void* af, const fortran_int_t* ldaf, const void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + double* ferr, double* berr, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of potrf +void LAPACK_SPOTRF( const char* uplo, const fortran_int_t* n, float* a, + const fortran_int_t* lda, fortran_int_t* info ); +void LAPACK_DPOTRF( const char* uplo, const fortran_int_t* n, double* a, + const fortran_int_t* lda, fortran_int_t* info ); +void LAPACK_CPOTRF( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* info ); +void LAPACK_ZPOTRF( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* info ); + +// Value-type variants of potri +void LAPACK_SPOTRI( const char* uplo, const fortran_int_t* n, float* a, + const fortran_int_t* lda, fortran_int_t* info ); +void LAPACK_DPOTRI( const char* uplo, const fortran_int_t* n, double* a, + const fortran_int_t* lda, fortran_int_t* info ); +void LAPACK_CPOTRI( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* info ); +void LAPACK_ZPOTRI( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* info ); + +// Value-type variants of potrs +void LAPACK_SPOTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* a, const fortran_int_t* lda, + float* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_DPOTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_CPOTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + void* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZPOTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + void* b, const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of ppcon +void LAPACK_SPPCON( const char* uplo, const fortran_int_t* n, const float* ap, + const float* anorm, float* rcond, float* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DPPCON( const char* uplo, const fortran_int_t* n, + const double* ap, const double* anorm, double* rcond, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CPPCON( const char* uplo, const fortran_int_t* n, const void* ap, + const float* anorm, float* rcond, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZPPCON( const char* uplo, const fortran_int_t* n, const void* ap, + const double* anorm, double* rcond, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of ppequ +void LAPACK_SPPEQU( const char* uplo, const fortran_int_t* n, const float* ap, + float* s, float* scond, float* amax, fortran_int_t* info ); +void LAPACK_DPPEQU( const char* uplo, const fortran_int_t* n, + const double* ap, double* s, double* scond, double* amax, + fortran_int_t* info ); +void LAPACK_CPPEQU( const char* uplo, const fortran_int_t* n, const void* ap, + float* s, float* scond, float* amax, fortran_int_t* info ); +void LAPACK_ZPPEQU( const char* uplo, const fortran_int_t* n, const void* ap, + double* s, double* scond, double* amax, fortran_int_t* info ); + +// Value-type variants of pprfs +void LAPACK_SPPRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* ap, const float* afp, + const float* b, const fortran_int_t* ldb, float* x, + const fortran_int_t* ldx, float* ferr, float* berr, float* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DPPRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* ap, const double* afp, + const double* b, const fortran_int_t* ldb, double* x, + const fortran_int_t* ldx, double* ferr, double* berr, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CPPRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* ap, const void* afp, + const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, float* ferr, float* berr, void* work, + float* rwork, fortran_int_t* info ); +void LAPACK_ZPPRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* ap, const void* afp, + const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, double* ferr, double* berr, void* work, + double* rwork, fortran_int_t* info ); + +// Value-type variants of pptrf +void LAPACK_SPPTRF( const char* uplo, const fortran_int_t* n, float* ap, + fortran_int_t* info ); +void LAPACK_DPPTRF( const char* uplo, const fortran_int_t* n, double* ap, + fortran_int_t* info ); +void LAPACK_CPPTRF( const char* uplo, const fortran_int_t* n, void* ap, + fortran_int_t* info ); +void LAPACK_ZPPTRF( const char* uplo, const fortran_int_t* n, void* ap, + fortran_int_t* info ); + +// Value-type variants of pptri +void LAPACK_SPPTRI( const char* uplo, const fortran_int_t* n, float* ap, + fortran_int_t* info ); +void LAPACK_DPPTRI( const char* uplo, const fortran_int_t* n, double* ap, + fortran_int_t* info ); +void LAPACK_CPPTRI( const char* uplo, const fortran_int_t* n, void* ap, + fortran_int_t* info ); +void LAPACK_ZPPTRI( const char* uplo, const fortran_int_t* n, void* ap, + fortran_int_t* info ); + +// Value-type variants of pptrs +void LAPACK_SPPTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* ap, float* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_DPPTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* ap, double* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_CPPTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* ap, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZPPTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* ap, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of pstrf +void LAPACK_SPSTRF( const char* uplo, const fortran_int_t* n, float* a, + const fortran_int_t* lda, fortran_int_t* piv, fortran_int_t* rank, + const float* tol, float* work, fortran_int_t* info ); +void LAPACK_DPSTRF( const char* uplo, const fortran_int_t* n, double* a, + const fortran_int_t* lda, fortran_int_t* piv, fortran_int_t* rank, + const double* tol, double* work, fortran_int_t* info ); +void LAPACK_CPSTRF( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* piv, fortran_int_t* rank, + const float* tol, float* work, fortran_int_t* info ); +void LAPACK_ZPSTRF( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* piv, fortran_int_t* rank, + const double* tol, double* work, fortran_int_t* info ); + +// Value-type variants of ptcon +void LAPACK_SPTCON( const fortran_int_t* n, const float* d, const float* e, + const float* anorm, float* rcond, float* work, fortran_int_t* info ); +void LAPACK_DPTCON( const fortran_int_t* n, const double* d, const double* e, + const double* anorm, double* rcond, double* work, + fortran_int_t* info ); +void LAPACK_CPTCON( const fortran_int_t* n, const float* d, const void* e, + const float* anorm, float* rcond, float* rwork, fortran_int_t* info ); +void LAPACK_ZPTCON( const fortran_int_t* n, const double* d, const void* e, + const double* anorm, double* rcond, double* rwork, + fortran_int_t* info ); + +// Value-type variants of ptrfs +void LAPACK_SPTRFS( const fortran_int_t* n, const fortran_int_t* nrhs, + const float* d, const float* e, const float* df, const float* ef, + const float* b, const fortran_int_t* ldb, float* x, + const fortran_int_t* ldx, float* ferr, float* berr, float* work, + fortran_int_t* info ); +void LAPACK_DPTRFS( const fortran_int_t* n, const fortran_int_t* nrhs, + const double* d, const double* e, const double* df, const double* ef, + const double* b, const fortran_int_t* ldb, double* x, + const fortran_int_t* ldx, double* ferr, double* berr, double* work, + fortran_int_t* info ); +void LAPACK_CPTRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* d, const void* e, + const float* df, const void* ef, const void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + float* ferr, float* berr, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZPTRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* d, const void* e, + const double* df, const void* ef, const void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + double* ferr, double* berr, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of pttrf +void LAPACK_SPTTRF( const fortran_int_t* n, float* d, float* e, + fortran_int_t* info ); +void LAPACK_DPTTRF( const fortran_int_t* n, double* d, double* e, + fortran_int_t* info ); +void LAPACK_CPTTRF( const fortran_int_t* n, float* d, void* e, + fortran_int_t* info ); +void LAPACK_ZPTTRF( const fortran_int_t* n, double* d, void* e, + fortran_int_t* info ); + +// Value-type variants of pttrs +void LAPACK_SPTTRS( const fortran_int_t* n, const fortran_int_t* nrhs, + const float* d, const float* e, float* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_DPTTRS( const fortran_int_t* n, const fortran_int_t* nrhs, + const double* d, const double* e, double* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_CPTTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* d, const void* e, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZPTTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* d, const void* e, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of spcon +void LAPACK_SSPCON( const char* uplo, const fortran_int_t* n, const float* ap, + const fortran_int_t* ipiv, const float* anorm, float* rcond, + float* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DSPCON( const char* uplo, const fortran_int_t* n, + const double* ap, const fortran_int_t* ipiv, const double* anorm, + double* rcond, double* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_CSPCON( const char* uplo, const fortran_int_t* n, const void* ap, + const fortran_int_t* ipiv, const float* anorm, float* rcond, + void* work, fortran_int_t* info ); +void LAPACK_ZSPCON( const char* uplo, const fortran_int_t* n, const void* ap, + const fortran_int_t* ipiv, const double* anorm, double* rcond, + void* work, fortran_int_t* info ); + +// Value-type variants of sprfs +void LAPACK_SSPRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* ap, const float* afp, + const fortran_int_t* ipiv, const float* b, const fortran_int_t* ldb, + float* x, const fortran_int_t* ldx, float* ferr, float* berr, + float* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DSPRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* ap, const double* afp, + const fortran_int_t* ipiv, const double* b, const fortran_int_t* ldb, + double* x, const fortran_int_t* ldx, double* ferr, double* berr, + double* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CSPRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* ap, const void* afp, + const fortran_int_t* ipiv, const void* b, const fortran_int_t* ldb, + void* x, const fortran_int_t* ldx, float* ferr, float* berr, + void* work, float* rwork, fortran_int_t* info ); +void LAPACK_ZSPRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* ap, const void* afp, + const fortran_int_t* ipiv, const void* b, const fortran_int_t* ldb, + void* x, const fortran_int_t* ldx, double* ferr, double* berr, + void* work, double* rwork, fortran_int_t* info ); + +// Value-type variants of sptrf +void LAPACK_SSPTRF( const char* uplo, const fortran_int_t* n, float* ap, + fortran_int_t* ipiv, fortran_int_t* info ); +void LAPACK_DSPTRF( const char* uplo, const fortran_int_t* n, double* ap, + fortran_int_t* ipiv, fortran_int_t* info ); +void LAPACK_CSPTRF( const char* uplo, const fortran_int_t* n, void* ap, + fortran_int_t* ipiv, fortran_int_t* info ); +void LAPACK_ZSPTRF( const char* uplo, const fortran_int_t* n, void* ap, + fortran_int_t* ipiv, fortran_int_t* info ); + +// Value-type variants of sptri +void LAPACK_SSPTRI( const char* uplo, const fortran_int_t* n, float* ap, + const fortran_int_t* ipiv, float* work, fortran_int_t* info ); +void LAPACK_DSPTRI( const char* uplo, const fortran_int_t* n, double* ap, + const fortran_int_t* ipiv, double* work, fortran_int_t* info ); +void LAPACK_CSPTRI( const char* uplo, const fortran_int_t* n, void* ap, + const fortran_int_t* ipiv, void* work, fortran_int_t* info ); +void LAPACK_ZSPTRI( const char* uplo, const fortran_int_t* n, void* ap, + const fortran_int_t* ipiv, void* work, fortran_int_t* info ); + +// Value-type variants of sptrs +void LAPACK_SSPTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* ap, const fortran_int_t* ipiv, + float* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_DSPTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* ap, + const fortran_int_t* ipiv, double* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_CSPTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* ap, const fortran_int_t* ipiv, + void* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZSPTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* ap, const fortran_int_t* ipiv, + void* b, const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of sycon +void LAPACK_SSYCON( const char* uplo, const fortran_int_t* n, const float* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, + const float* anorm, float* rcond, float* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DSYCON( const char* uplo, const fortran_int_t* n, const double* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, + const double* anorm, double* rcond, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CSYCON( const char* uplo, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, + const float* anorm, float* rcond, void* work, fortran_int_t* info ); +void LAPACK_ZSYCON( const char* uplo, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, + const double* anorm, double* rcond, void* work, fortran_int_t* info ); + +// Value-type variants of syrfs +void LAPACK_SSYRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* a, const fortran_int_t* lda, + const float* af, const fortran_int_t* ldaf, const fortran_int_t* ipiv, + const float* b, const fortran_int_t* ldb, float* x, + const fortran_int_t* ldx, float* ferr, float* berr, float* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DSYRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* a, const fortran_int_t* lda, + const double* af, const fortran_int_t* ldaf, + const fortran_int_t* ipiv, const double* b, const fortran_int_t* ldb, + double* x, const fortran_int_t* ldx, double* ferr, double* berr, + double* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CSYRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const void* af, const fortran_int_t* ldaf, const fortran_int_t* ipiv, + const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, float* ferr, float* berr, void* work, + float* rwork, fortran_int_t* info ); +void LAPACK_ZSYRFS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const void* af, const fortran_int_t* ldaf, const fortran_int_t* ipiv, + const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, double* ferr, double* berr, void* work, + double* rwork, fortran_int_t* info ); + +// Value-type variants of sytrf +void LAPACK_SSYTRF( const char* uplo, const fortran_int_t* n, float* a, + const fortran_int_t* lda, fortran_int_t* ipiv, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DSYTRF( const char* uplo, const fortran_int_t* n, double* a, + const fortran_int_t* lda, fortran_int_t* ipiv, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CSYTRF( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* ipiv, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZSYTRF( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* ipiv, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of sytri +void LAPACK_SSYTRI( const char* uplo, const fortran_int_t* n, float* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, float* work, + fortran_int_t* info ); +void LAPACK_DSYTRI( const char* uplo, const fortran_int_t* n, double* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, double* work, + fortran_int_t* info ); +void LAPACK_CSYTRI( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, void* work, + fortran_int_t* info ); +void LAPACK_ZSYTRI( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, const fortran_int_t* ipiv, void* work, + fortran_int_t* info ); + +// Value-type variants of sytrs +void LAPACK_SSYTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* a, const fortran_int_t* lda, + const fortran_int_t* ipiv, float* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_DSYTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* a, const fortran_int_t* lda, + const fortran_int_t* ipiv, double* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_CSYTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const fortran_int_t* ipiv, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_ZSYTRS( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + const fortran_int_t* ipiv, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); + +// Value-type variants of tbcon +void LAPACK_STBCON( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const fortran_int_t* kd, const float* ab, + const fortran_int_t* ldab, float* rcond, float* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DTBCON( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const fortran_int_t* kd, const double* ab, + const fortran_int_t* ldab, double* rcond, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CTBCON( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const fortran_int_t* kd, const void* ab, + const fortran_int_t* ldab, float* rcond, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZTBCON( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const fortran_int_t* kd, const void* ab, + const fortran_int_t* ldab, double* rcond, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of tbrfs +void LAPACK_STBRFS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* kd, + const fortran_int_t* nrhs, const float* ab, const fortran_int_t* ldab, + const float* b, const fortran_int_t* ldb, const float* x, + const fortran_int_t* ldx, float* ferr, float* berr, float* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DTBRFS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* kd, + const fortran_int_t* nrhs, const double* ab, + const fortran_int_t* ldab, const double* b, const fortran_int_t* ldb, + const double* x, const fortran_int_t* ldx, double* ferr, double* berr, + double* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CTBRFS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* kd, + const fortran_int_t* nrhs, const void* ab, const fortran_int_t* ldab, + const void* b, const fortran_int_t* ldb, const void* x, + const fortran_int_t* ldx, float* ferr, float* berr, void* work, + float* rwork, fortran_int_t* info ); +void LAPACK_ZTBRFS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* kd, + const fortran_int_t* nrhs, const void* ab, const fortran_int_t* ldab, + const void* b, const fortran_int_t* ldb, const void* x, + const fortran_int_t* ldx, double* ferr, double* berr, void* work, + double* rwork, fortran_int_t* info ); + +// Value-type variants of tbtrs +void LAPACK_STBTRS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* kd, + const fortran_int_t* nrhs, const float* ab, const fortran_int_t* ldab, + float* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_DTBTRS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* kd, + const fortran_int_t* nrhs, const double* ab, + const fortran_int_t* ldab, double* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_CTBTRS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* kd, + const fortran_int_t* nrhs, const void* ab, const fortran_int_t* ldab, + void* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZTBTRS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* kd, + const fortran_int_t* nrhs, const void* ab, const fortran_int_t* ldab, + void* b, const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of tftri +void LAPACK_STFTRI( const char* transr, const char* uplo, const char* diag, + const fortran_int_t* n, float* a, fortran_int_t* info ); +void LAPACK_DTFTRI( const char* transr, const char* uplo, const char* diag, + const fortran_int_t* n, double* a, fortran_int_t* info ); +void LAPACK_CTFTRI( const char* transr, const char* uplo, const char* diag, + const fortran_int_t* n, void* a, fortran_int_t* info ); +void LAPACK_ZTFTRI( const char* transr, const char* uplo, const char* diag, + const fortran_int_t* n, void* a, fortran_int_t* info ); + +// Value-type variants of tpcon +void LAPACK_STPCON( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const float* ap, float* rcond, float* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DTPCON( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const double* ap, double* rcond, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CTPCON( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const void* ap, float* rcond, void* work, + float* rwork, fortran_int_t* info ); +void LAPACK_ZTPCON( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const void* ap, double* rcond, void* work, + double* rwork, fortran_int_t* info ); + +// Value-type variants of tprfs +void LAPACK_STPRFS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const float* ap, + const float* b, const fortran_int_t* ldb, const float* x, + const fortran_int_t* ldx, float* ferr, float* berr, float* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DTPRFS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const double* ap, + const double* b, const fortran_int_t* ldb, const double* x, + const fortran_int_t* ldx, double* ferr, double* berr, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CTPRFS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* ap, + const void* b, const fortran_int_t* ldb, const void* x, + const fortran_int_t* ldx, float* ferr, float* berr, void* work, + float* rwork, fortran_int_t* info ); +void LAPACK_ZTPRFS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* ap, + const void* b, const fortran_int_t* ldb, const void* x, + const fortran_int_t* ldx, double* ferr, double* berr, void* work, + double* rwork, fortran_int_t* info ); + +// Value-type variants of tptri +void LAPACK_STPTRI( const char* uplo, const char* diag, + const fortran_int_t* n, float* ap, fortran_int_t* info ); +void LAPACK_DTPTRI( const char* uplo, const char* diag, + const fortran_int_t* n, double* ap, fortran_int_t* info ); +void LAPACK_CTPTRI( const char* uplo, const char* diag, + const fortran_int_t* n, void* ap, fortran_int_t* info ); +void LAPACK_ZTPTRI( const char* uplo, const char* diag, + const fortran_int_t* n, void* ap, fortran_int_t* info ); + +// Value-type variants of tptrs +void LAPACK_STPTRS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const float* ap, + float* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_DTPTRS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const double* ap, + double* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_CTPTRS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* ap, + void* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZTPTRS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* ap, + void* b, const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of trcon +void LAPACK_STRCON( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const float* a, const fortran_int_t* lda, + float* rcond, float* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DTRCON( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const double* a, const fortran_int_t* lda, + double* rcond, double* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_CTRCON( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + float* rcond, void* work, float* rwork, fortran_int_t* info ); +void LAPACK_ZTRCON( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + double* rcond, void* work, double* rwork, fortran_int_t* info ); + +// Value-type variants of trrfs +void LAPACK_STRRFS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const float* a, + const fortran_int_t* lda, const float* b, const fortran_int_t* ldb, + const float* x, const fortran_int_t* ldx, float* ferr, float* berr, + float* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DTRRFS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const double* a, + const fortran_int_t* lda, const double* b, const fortran_int_t* ldb, + const double* x, const fortran_int_t* ldx, double* ferr, double* berr, + double* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CTRRFS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const void* x, const fortran_int_t* ldx, float* ferr, float* berr, + void* work, float* rwork, fortran_int_t* info ); +void LAPACK_ZTRRFS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const void* x, const fortran_int_t* ldx, double* ferr, double* berr, + void* work, double* rwork, fortran_int_t* info ); + +// Value-type variants of trtri +void LAPACK_STRTRI( const char* uplo, const char* diag, + const fortran_int_t* n, float* a, const fortran_int_t* lda, + fortran_int_t* info ); +void LAPACK_DTRTRI( const char* uplo, const char* diag, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + fortran_int_t* info ); +void LAPACK_CTRTRI( const char* uplo, const char* diag, + const fortran_int_t* n, void* a, const fortran_int_t* lda, + fortran_int_t* info ); +void LAPACK_ZTRTRI( const char* uplo, const char* diag, + const fortran_int_t* n, void* a, const fortran_int_t* lda, + fortran_int_t* info ); + +// Value-type variants of trtrs +void LAPACK_STRTRS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const float* a, + const fortran_int_t* lda, float* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_DTRTRS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const double* a, + const fortran_int_t* lda, double* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_CTRTRS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_ZTRTRS( const char* uplo, const char* trans, const char* diag, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); + +// Value-type variants of hbtrd +void LAPACK_CHBTRD( const char* vect, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, void* ab, + const fortran_int_t* ldab, float* d, float* e, void* q, + const fortran_int_t* ldq, void* work, fortran_int_t* info ); +void LAPACK_ZHBTRD( const char* vect, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, void* ab, + const fortran_int_t* ldab, double* d, double* e, void* q, + const fortran_int_t* ldq, void* work, fortran_int_t* info ); + +// Value-type variants of hetrd +void LAPACK_CHETRD( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, float* d, float* e, void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZHETRD( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, double* d, double* e, void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of hptrd +void LAPACK_CHPTRD( const char* uplo, const fortran_int_t* n, void* ap, + float* d, float* e, void* tau, fortran_int_t* info ); +void LAPACK_ZHPTRD( const char* uplo, const fortran_int_t* n, void* ap, + double* d, double* e, void* tau, fortran_int_t* info ); + +// Value-type variants of opgtr +void LAPACK_SOPGTR( const char* uplo, const fortran_int_t* n, const float* ap, + const float* tau, float* q, const fortran_int_t* ldq, float* work, + fortran_int_t* info ); +void LAPACK_DOPGTR( const char* uplo, const fortran_int_t* n, + const double* ap, const double* tau, double* q, + const fortran_int_t* ldq, double* work, fortran_int_t* info ); + +// Value-type variants of opmtr +void LAPACK_SOPMTR( const char* side, const char* uplo, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, const float* ap, + const float* tau, float* c, const fortran_int_t* ldc, float* work, + fortran_int_t* info ); +void LAPACK_DOPMTR( const char* side, const char* uplo, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, const double* ap, + const double* tau, double* c, const fortran_int_t* ldc, double* work, + fortran_int_t* info ); + +// Value-type variants of orgtr +void LAPACK_SORGTR( const char* uplo, const fortran_int_t* n, float* a, + const fortran_int_t* lda, const float* tau, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DORGTR( const char* uplo, const fortran_int_t* n, double* a, + const fortran_int_t* lda, const double* tau, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of ormtr +void LAPACK_SORMTR( const char* side, const char* uplo, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, const float* a, + const fortran_int_t* lda, const float* tau, float* c, + const fortran_int_t* ldc, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DORMTR( const char* side, const char* uplo, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, const double* a, + const fortran_int_t* lda, const double* tau, double* c, + const fortran_int_t* ldc, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of pteqr +void LAPACK_SPTEQR( const char* compz, const fortran_int_t* n, float* d, + float* e, float* z, const fortran_int_t* ldz, float* work, + fortran_int_t* info ); +void LAPACK_DPTEQR( const char* compz, const fortran_int_t* n, double* d, + double* e, double* z, const fortran_int_t* ldz, double* work, + fortran_int_t* info ); +void LAPACK_CPTEQR( const char* compz, const fortran_int_t* n, float* d, + float* e, void* z, const fortran_int_t* ldz, float* work, + fortran_int_t* info ); +void LAPACK_ZPTEQR( const char* compz, const fortran_int_t* n, double* d, + double* e, void* z, const fortran_int_t* ldz, double* work, + fortran_int_t* info ); + +// Value-type variants of sbtrd +void LAPACK_SSBTRD( const char* vect, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, float* ab, + const fortran_int_t* ldab, float* d, float* e, float* q, + const fortran_int_t* ldq, float* work, fortran_int_t* info ); +void LAPACK_DSBTRD( const char* vect, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, double* ab, + const fortran_int_t* ldab, double* d, double* e, double* q, + const fortran_int_t* ldq, double* work, fortran_int_t* info ); + +// Value-type variants of sptrd +void LAPACK_SSPTRD( const char* uplo, const fortran_int_t* n, float* ap, + float* d, float* e, float* tau, fortran_int_t* info ); +void LAPACK_DSPTRD( const char* uplo, const fortran_int_t* n, double* ap, + double* d, double* e, double* tau, fortran_int_t* info ); + +// Value-type variants of stebz +void LAPACK_SSTEBZ( const char* range, const char* order, + const fortran_int_t* n, const float* vl, const float* vu, + const fortran_int_t* il, const fortran_int_t* iu, const float* abstol, + const float* d, const float* e, fortran_int_t* m, + fortran_int_t* nsplit, float* w, fortran_int_t* iblock, + fortran_int_t* isplit, float* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DSTEBZ( const char* range, const char* order, + const fortran_int_t* n, const double* vl, const double* vu, + const fortran_int_t* il, const fortran_int_t* iu, + const double* abstol, const double* d, const double* e, + fortran_int_t* m, fortran_int_t* nsplit, double* w, + fortran_int_t* iblock, fortran_int_t* isplit, double* work, + fortran_int_t* iwork, fortran_int_t* info ); + +// Value-type variants of stedc +void LAPACK_SSTEDC( const char* compz, const fortran_int_t* n, float* d, + float* e, float* z, const fortran_int_t* ldz, float* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_DSTEDC( const char* compz, const fortran_int_t* n, double* d, + double* e, double* z, const fortran_int_t* ldz, double* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_CSTEDC( const char* compz, const fortran_int_t* n, float* d, + float* e, void* z, const fortran_int_t* ldz, void* work, + const fortran_int_t* lwork, float* rwork, const fortran_int_t* lrwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); +void LAPACK_ZSTEDC( const char* compz, const fortran_int_t* n, double* d, + double* e, void* z, const fortran_int_t* ldz, void* work, + const fortran_int_t* lwork, double* rwork, + const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of stegr +void LAPACK_SSTEGR( const char* jobz, const char* range, + const fortran_int_t* n, float* d, float* e, const float* vl, + const float* vu, const fortran_int_t* il, const fortran_int_t* iu, + const float* abstol, fortran_int_t* m, float* w, float* z, + const fortran_int_t* ldz, fortran_int_t* isuppz, float* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_DSTEGR( const char* jobz, const char* range, + const fortran_int_t* n, double* d, double* e, const double* vl, + const double* vu, const fortran_int_t* il, const fortran_int_t* iu, + const double* abstol, fortran_int_t* m, double* w, double* z, + const fortran_int_t* ldz, fortran_int_t* isuppz, double* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_CSTEGR( const char* jobz, const char* range, + const fortran_int_t* n, float* d, float* e, const float* vl, + const float* vu, const fortran_int_t* il, const fortran_int_t* iu, + const float* abstol, fortran_int_t* m, float* w, void* z, + const fortran_int_t* ldz, fortran_int_t* isuppz, float* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_ZSTEGR( const char* jobz, const char* range, + const fortran_int_t* n, double* d, double* e, const double* vl, + const double* vu, const fortran_int_t* il, const fortran_int_t* iu, + const double* abstol, fortran_int_t* m, double* w, void* z, + const fortran_int_t* ldz, fortran_int_t* isuppz, double* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of stein +void LAPACK_SSTEIN( const fortran_int_t* n, const float* d, const float* e, + const fortran_int_t* m, const float* w, const fortran_int_t* iblock, + const fortran_int_t* isplit, float* z, const fortran_int_t* ldz, + float* work, fortran_int_t* iwork, fortran_int_t* ifail, + fortran_int_t* info ); +void LAPACK_DSTEIN( const fortran_int_t* n, const double* d, const double* e, + const fortran_int_t* m, const double* w, const fortran_int_t* iblock, + const fortran_int_t* isplit, double* z, const fortran_int_t* ldz, + double* work, fortran_int_t* iwork, fortran_int_t* ifail, + fortran_int_t* info ); +void LAPACK_CSTEIN( const fortran_int_t* n, const float* d, const float* e, + const fortran_int_t* m, const float* w, const fortran_int_t* iblock, + const fortran_int_t* isplit, void* z, const fortran_int_t* ldz, + float* work, fortran_int_t* iwork, fortran_int_t* ifail, + fortran_int_t* info ); +void LAPACK_ZSTEIN( const fortran_int_t* n, const double* d, const double* e, + const fortran_int_t* m, const double* w, const fortran_int_t* iblock, + const fortran_int_t* isplit, void* z, const fortran_int_t* ldz, + double* work, fortran_int_t* iwork, fortran_int_t* ifail, + fortran_int_t* info ); + +// Value-type variants of stemr +void LAPACK_SSTEMR( const char* jobz, const char* range, + const fortran_int_t* n, float* d, float* e, const float* vl, + const float* vu, const fortran_int_t* il, const fortran_int_t* iu, + fortran_int_t* m, float* w, float* z, const fortran_int_t* ldz, + const fortran_int_t* nzc, fortran_int_t* isuppz, + fortran_bool_t* tryrac, float* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); +void LAPACK_DSTEMR( const char* jobz, const char* range, + const fortran_int_t* n, double* d, double* e, const double* vl, + const double* vu, const fortran_int_t* il, const fortran_int_t* iu, + fortran_int_t* m, double* w, double* z, const fortran_int_t* ldz, + const fortran_int_t* nzc, fortran_int_t* isuppz, + fortran_bool_t* tryrac, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); +void LAPACK_CSTEMR( const char* jobz, const char* range, + const fortran_int_t* n, float* d, float* e, const float* vl, + const float* vu, const fortran_int_t* il, const fortran_int_t* iu, + fortran_int_t* m, float* w, void* z, const fortran_int_t* ldz, + const fortran_int_t* nzc, fortran_int_t* isuppz, + fortran_bool_t* tryrac, float* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); +void LAPACK_ZSTEMR( const char* jobz, const char* range, + const fortran_int_t* n, double* d, double* e, const double* vl, + const double* vu, const fortran_int_t* il, const fortran_int_t* iu, + fortran_int_t* m, double* w, void* z, const fortran_int_t* ldz, + const fortran_int_t* nzc, fortran_int_t* isuppz, + fortran_bool_t* tryrac, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); + +// Value-type variants of steqr +void LAPACK_SSTEQR( const char* compz, const fortran_int_t* n, float* d, + float* e, float* z, const fortran_int_t* ldz, float* work, + fortran_int_t* info ); +void LAPACK_DSTEQR( const char* compz, const fortran_int_t* n, double* d, + double* e, double* z, const fortran_int_t* ldz, double* work, + fortran_int_t* info ); +void LAPACK_CSTEQR( const char* compz, const fortran_int_t* n, float* d, + float* e, void* z, const fortran_int_t* ldz, float* work, + fortran_int_t* info ); +void LAPACK_ZSTEQR( const char* compz, const fortran_int_t* n, double* d, + double* e, void* z, const fortran_int_t* ldz, double* work, + fortran_int_t* info ); + +// Value-type variants of sterf +void LAPACK_SSTERF( const fortran_int_t* n, float* d, float* e, + fortran_int_t* info ); +void LAPACK_DSTERF( const fortran_int_t* n, double* d, double* e, + fortran_int_t* info ); + +// Value-type variants of sytrd +void LAPACK_SSYTRD( const char* uplo, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* d, float* e, float* tau, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DSYTRD( const char* uplo, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* d, double* e, double* tau, + double* work, const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of ungtr +void LAPACK_CUNGTR( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, const void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZUNGTR( const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, const void* tau, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of unmtr +void LAPACK_CUNMTR( const char* side, const char* uplo, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const void* tau, void* c, + const fortran_int_t* ldc, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_ZUNMTR( const char* side, const char* uplo, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const void* tau, void* c, + const fortran_int_t* ldc, void* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of upgtr +void LAPACK_CUPGTR( const char* uplo, const fortran_int_t* n, const void* ap, + const void* tau, void* q, const fortran_int_t* ldq, void* work, + fortran_int_t* info ); +void LAPACK_ZUPGTR( const char* uplo, const fortran_int_t* n, const void* ap, + const void* tau, void* q, const fortran_int_t* ldq, void* work, + fortran_int_t* info ); + +// Value-type variants of upmtr +void LAPACK_CUPMTR( const char* side, const char* uplo, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, const void* ap, + const void* tau, void* c, const fortran_int_t* ldc, void* work, + fortran_int_t* info ); +void LAPACK_ZUPMTR( const char* side, const char* uplo, const char* trans, + const fortran_int_t* m, const fortran_int_t* n, const void* ap, + const void* tau, void* c, const fortran_int_t* ldc, void* work, + fortran_int_t* info ); + +// Value-type variants of ggbak +void LAPACK_SGGBAK( const char* job, const char* side, const fortran_int_t* n, + const fortran_int_t* ilo, const fortran_int_t* ihi, + const float* lscale, const float* rscale, const fortran_int_t* m, + float* v, const fortran_int_t* ldv, fortran_int_t* info ); +void LAPACK_DGGBAK( const char* job, const char* side, const fortran_int_t* n, + const fortran_int_t* ilo, const fortran_int_t* ihi, + const double* lscale, const double* rscale, const fortran_int_t* m, + double* v, const fortran_int_t* ldv, fortran_int_t* info ); +void LAPACK_CGGBAK( const char* job, const char* side, const fortran_int_t* n, + const fortran_int_t* ilo, const fortran_int_t* ihi, + const float* lscale, const float* rscale, const fortran_int_t* m, + void* v, const fortran_int_t* ldv, fortran_int_t* info ); +void LAPACK_ZGGBAK( const char* job, const char* side, const fortran_int_t* n, + const fortran_int_t* ilo, const fortran_int_t* ihi, + const double* lscale, const double* rscale, const fortran_int_t* m, + void* v, const fortran_int_t* ldv, fortran_int_t* info ); + +// Value-type variants of ggbal +void LAPACK_SGGBAL( const char* job, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* b, const fortran_int_t* ldb, + fortran_int_t* ilo, fortran_int_t* ihi, float* lscale, float* rscale, + float* work, fortran_int_t* info ); +void LAPACK_DGGBAL( const char* job, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* b, const fortran_int_t* ldb, + fortran_int_t* ilo, fortran_int_t* ihi, double* lscale, + double* rscale, double* work, fortran_int_t* info ); +void LAPACK_CGGBAL( const char* job, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + fortran_int_t* ilo, fortran_int_t* ihi, float* lscale, float* rscale, + float* work, fortran_int_t* info ); +void LAPACK_ZGGBAL( const char* job, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + fortran_int_t* ilo, fortran_int_t* ihi, double* lscale, + double* rscale, double* work, fortran_int_t* info ); + +// Value-type variants of gghrd +void LAPACK_SGGHRD( const char* compq, const char* compz, + const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, float* a, const fortran_int_t* lda, + float* b, const fortran_int_t* ldb, float* q, + const fortran_int_t* ldq, float* z, const fortran_int_t* ldz, + fortran_int_t* info ); +void LAPACK_DGGHRD( const char* compq, const char* compz, + const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, double* q, + const fortran_int_t* ldq, double* z, const fortran_int_t* ldz, + fortran_int_t* info ); +void LAPACK_CGGHRD( const char* compq, const char* compz, + const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* q, const fortran_int_t* ldq, void* z, + const fortran_int_t* ldz, fortran_int_t* info ); +void LAPACK_ZGGHRD( const char* compq, const char* compz, + const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* q, const fortran_int_t* ldq, void* z, + const fortran_int_t* ldz, fortran_int_t* info ); + +// Value-type variants of hgeqz +void LAPACK_SHGEQZ( const char* job, const char* compq, const char* compz, + const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, float* h, const fortran_int_t* ldh, + float* t, const fortran_int_t* ldt, float* alphar, float* alphai, + float* beta, float* q, const fortran_int_t* ldq, float* z, + const fortran_int_t* ldz, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DHGEQZ( const char* job, const char* compq, const char* compz, + const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, double* h, const fortran_int_t* ldh, + double* t, const fortran_int_t* ldt, double* alphar, double* alphai, + double* beta, double* q, const fortran_int_t* ldq, double* z, + const fortran_int_t* ldz, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_CHGEQZ( const char* job, const char* compq, const char* compz, + const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, void* h, const fortran_int_t* ldh, void* t, + const fortran_int_t* ldt, void* alpha, void* beta, void* q, + const fortran_int_t* ldq, void* z, const fortran_int_t* ldz, + void* work, const fortran_int_t* lwork, float* rwork, + fortran_int_t* info ); +void LAPACK_ZHGEQZ( const char* job, const char* compq, const char* compz, + const fortran_int_t* n, const fortran_int_t* ilo, + const fortran_int_t* ihi, void* h, const fortran_int_t* ldh, void* t, + const fortran_int_t* ldt, void* alpha, void* beta, void* q, + const fortran_int_t* ldq, void* z, const fortran_int_t* ldz, + void* work, const fortran_int_t* lwork, double* rwork, + fortran_int_t* info ); + +// Value-type variants of tgevc +void LAPACK_STGEVC( const char* side, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, const float* s, + const fortran_int_t* lds, const float* p, const fortran_int_t* ldp, + float* vl, const fortran_int_t* ldvl, float* vr, + const fortran_int_t* ldvr, const fortran_int_t* mm, fortran_int_t* m, + float* work, fortran_int_t* info ); +void LAPACK_DTGEVC( const char* side, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, const double* s, + const fortran_int_t* lds, const double* p, const fortran_int_t* ldp, + double* vl, const fortran_int_t* ldvl, double* vr, + const fortran_int_t* ldvr, const fortran_int_t* mm, fortran_int_t* m, + double* work, fortran_int_t* info ); +void LAPACK_CTGEVC( const char* side, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, const void* s, + const fortran_int_t* lds, const void* p, const fortran_int_t* ldp, + void* vl, const fortran_int_t* ldvl, void* vr, + const fortran_int_t* ldvr, const fortran_int_t* mm, fortran_int_t* m, + void* work, float* rwork, fortran_int_t* info ); +void LAPACK_ZTGEVC( const char* side, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, const void* s, + const fortran_int_t* lds, const void* p, const fortran_int_t* ldp, + void* vl, const fortran_int_t* ldvl, void* vr, + const fortran_int_t* ldvr, const fortran_int_t* mm, fortran_int_t* m, + void* work, double* rwork, fortran_int_t* info ); + +// Value-type variants of tgexc +void LAPACK_STGEXC( const fortran_bool_t* wantq, const fortran_bool_t* wantz, + const fortran_int_t* n, float* a, const fortran_int_t* lda, float* b, + const fortran_int_t* ldb, float* q, const fortran_int_t* ldq, + float* z, const fortran_int_t* ldz, fortran_int_t* ifst, + fortran_int_t* ilst, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DTGEXC( const fortran_bool_t* wantq, const fortran_bool_t* wantz, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, double* q, + const fortran_int_t* ldq, double* z, const fortran_int_t* ldz, + fortran_int_t* ifst, fortran_int_t* ilst, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CTGEXC( const fortran_bool_t* wantq, const fortran_bool_t* wantz, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* q, const fortran_int_t* ldq, void* z, + const fortran_int_t* ldz, const fortran_int_t* ifst, + fortran_int_t* ilst, fortran_int_t* info ); +void LAPACK_ZTGEXC( const fortran_bool_t* wantq, const fortran_bool_t* wantz, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* q, const fortran_int_t* ldq, void* z, + const fortran_int_t* ldz, const fortran_int_t* ifst, + fortran_int_t* ilst, fortran_int_t* info ); + +// Value-type variants of tgsen +void LAPACK_STGSEN( const fortran_int_t* ijob, const fortran_bool_t* wantq, + const fortran_bool_t* wantz, const fortran_bool_t* select, + const fortran_int_t* n, float* a, const fortran_int_t* lda, float* b, + const fortran_int_t* ldb, float* alphar, float* alphai, float* beta, + float* q, const fortran_int_t* ldq, float* z, + const fortran_int_t* ldz, fortran_int_t* m, float* pl, float* pr, + float* dif, float* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); +void LAPACK_DTGSEN( const fortran_int_t* ijob, const fortran_bool_t* wantq, + const fortran_bool_t* wantz, const fortran_bool_t* select, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, double* alphar, double* alphai, + double* beta, double* q, const fortran_int_t* ldq, double* z, + const fortran_int_t* ldz, fortran_int_t* m, double* pl, double* pr, + double* dif, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); +void LAPACK_CTGSEN( const fortran_int_t* ijob, const fortran_bool_t* wantq, + const fortran_bool_t* wantz, const fortran_bool_t* select, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* alpha, void* beta, void* q, + const fortran_int_t* ldq, void* z, const fortran_int_t* ldz, + fortran_int_t* m, float* pl, float* pr, float* dif, void* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_ZTGSEN( const fortran_int_t* ijob, const fortran_bool_t* wantq, + const fortran_bool_t* wantz, const fortran_bool_t* select, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* alpha, void* beta, void* q, + const fortran_int_t* ldq, void* z, const fortran_int_t* ldz, + fortran_int_t* m, double* pl, double* pr, double* dif, void* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of tgsna +void LAPACK_STGSNA( const char* job, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, const float* a, + const fortran_int_t* lda, const float* b, const fortran_int_t* ldb, + const float* vl, const fortran_int_t* ldvl, const float* vr, + const fortran_int_t* ldvr, float* s, float* dif, + const fortran_int_t* mm, fortran_int_t* m, float* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DTGSNA( const char* job, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, const double* a, + const fortran_int_t* lda, const double* b, const fortran_int_t* ldb, + const double* vl, const fortran_int_t* ldvl, const double* vr, + const fortran_int_t* ldvr, double* s, double* dif, + const fortran_int_t* mm, fortran_int_t* m, double* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_CTGSNA( const char* job, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const void* vl, const fortran_int_t* ldvl, const void* vr, + const fortran_int_t* ldvr, float* s, float* dif, + const fortran_int_t* mm, fortran_int_t* m, void* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_ZTGSNA( const char* job, const char* howmny, + const fortran_bool_t* select, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + const void* vl, const fortran_int_t* ldvl, const void* vr, + const fortran_int_t* ldvr, double* s, double* dif, + const fortran_int_t* mm, fortran_int_t* m, void* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* info ); + +// Value-type variants of tgsyl +void LAPACK_STGSYL( const char* trans, const fortran_int_t* ijob, + const fortran_int_t* m, const fortran_int_t* n, const float* a, + const fortran_int_t* lda, const float* b, const fortran_int_t* ldb, + float* c, const fortran_int_t* ldc, const float* d, + const fortran_int_t* ldd, const float* e, const fortran_int_t* lde, + float* f, const fortran_int_t* ldf, float* scale, float* dif, + float* work, const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DTGSYL( const char* trans, const fortran_int_t* ijob, + const fortran_int_t* m, const fortran_int_t* n, const double* a, + const fortran_int_t* lda, const double* b, const fortran_int_t* ldb, + double* c, const fortran_int_t* ldc, const double* d, + const fortran_int_t* ldd, const double* e, const fortran_int_t* lde, + double* f, const fortran_int_t* ldf, double* scale, double* dif, + double* work, const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_CTGSYL( const char* trans, const fortran_int_t* ijob, + const fortran_int_t* m, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + void* c, const fortran_int_t* ldc, const void* d, + const fortran_int_t* ldd, const void* e, const fortran_int_t* lde, + void* f, const fortran_int_t* ldf, float* scale, float* dif, + void* work, const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_ZTGSYL( const char* trans, const fortran_int_t* ijob, + const fortran_int_t* m, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, const void* b, const fortran_int_t* ldb, + void* c, const fortran_int_t* ldc, const void* d, + const fortran_int_t* ldd, const void* e, const fortran_int_t* lde, + void* f, const fortran_int_t* ldf, double* scale, double* dif, + void* work, const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* info ); + +// Value-type variants of ggsvp +void LAPACK_SGGSVP( const char* jobu, const char* jobv, const char* jobq, + const fortran_int_t* m, const fortran_int_t* p, + const fortran_int_t* n, float* a, const fortran_int_t* lda, float* b, + const fortran_int_t* ldb, const float* tola, const float* tolb, + fortran_int_t* k, fortran_int_t* l, float* u, + const fortran_int_t* ldu, float* v, const fortran_int_t* ldv, + float* q, const fortran_int_t* ldq, fortran_int_t* iwork, float* tau, + float* work, fortran_int_t* info ); +void LAPACK_DGGSVP( const char* jobu, const char* jobv, const char* jobq, + const fortran_int_t* m, const fortran_int_t* p, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, const double* tola, + const double* tolb, fortran_int_t* k, fortran_int_t* l, double* u, + const fortran_int_t* ldu, double* v, const fortran_int_t* ldv, + double* q, const fortran_int_t* ldq, fortran_int_t* iwork, + double* tau, double* work, fortran_int_t* info ); +void LAPACK_CGGSVP( const char* jobu, const char* jobv, const char* jobq, + const fortran_int_t* m, const fortran_int_t* p, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, const float* tola, const float* tolb, + fortran_int_t* k, fortran_int_t* l, void* u, const fortran_int_t* ldu, + void* v, const fortran_int_t* ldv, void* q, const fortran_int_t* ldq, + fortran_int_t* iwork, float* rwork, void* tau, void* work, + fortran_int_t* info ); +void LAPACK_ZGGSVP( const char* jobu, const char* jobv, const char* jobq, + const fortran_int_t* m, const fortran_int_t* p, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, const double* tola, const double* tolb, + fortran_int_t* k, fortran_int_t* l, void* u, const fortran_int_t* ldu, + void* v, const fortran_int_t* ldv, void* q, const fortran_int_t* ldq, + fortran_int_t* iwork, double* rwork, void* tau, void* work, + fortran_int_t* info ); + +// Value-type variants of tgsja +void LAPACK_STGSJA( const char* jobu, const char* jobv, const char* jobq, + const fortran_int_t* m, const fortran_int_t* p, + const fortran_int_t* n, const fortran_int_t* k, + const fortran_int_t* l, float* a, const fortran_int_t* lda, float* b, + const fortran_int_t* ldb, const float* tola, const float* tolb, + float* alpha, float* beta, float* u, const fortran_int_t* ldu, + float* v, const fortran_int_t* ldv, float* q, + const fortran_int_t* ldq, float* work, fortran_int_t* ncycle, + fortran_int_t* info ); +void LAPACK_DTGSJA( const char* jobu, const char* jobv, const char* jobq, + const fortran_int_t* m, const fortran_int_t* p, + const fortran_int_t* n, const fortran_int_t* k, + const fortran_int_t* l, double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, const double* tola, + const double* tolb, double* alpha, double* beta, double* u, + const fortran_int_t* ldu, double* v, const fortran_int_t* ldv, + double* q, const fortran_int_t* ldq, double* work, + fortran_int_t* ncycle, fortran_int_t* info ); +void LAPACK_CTGSJA( const char* jobu, const char* jobv, const char* jobq, + const fortran_int_t* m, const fortran_int_t* p, + const fortran_int_t* n, const fortran_int_t* k, + const fortran_int_t* l, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, const float* tola, const float* tolb, + float* alpha, float* beta, void* u, const fortran_int_t* ldu, void* v, + const fortran_int_t* ldv, void* q, const fortran_int_t* ldq, + void* work, fortran_int_t* ncycle, fortran_int_t* info ); +void LAPACK_ZTGSJA( const char* jobu, const char* jobv, const char* jobq, + const fortran_int_t* m, const fortran_int_t* p, + const fortran_int_t* n, const fortran_int_t* k, + const fortran_int_t* l, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, const double* tola, const double* tolb, + double* alpha, double* beta, void* u, const fortran_int_t* ldu, + void* v, const fortran_int_t* ldv, void* q, const fortran_int_t* ldq, + void* work, fortran_int_t* ncycle, fortran_int_t* info ); + +// +// LAPACK driver routines +// + +// Value-type variants of gegv +void LAPACK_SGEGV( const char* jobvl, const char* jobvr, + const fortran_int_t* n, float* a, const fortran_int_t* lda, float* b, + const fortran_int_t* ldb, float* alphar, float* alphai, float* beta, + float* vl, const fortran_int_t* ldvl, float* vr, + const fortran_int_t* ldvr, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DGEGV( const char* jobvl, const char* jobvr, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, double* alphar, double* alphai, + double* beta, double* vl, const fortran_int_t* ldvl, double* vr, + const fortran_int_t* ldvr, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_CGEGV( const char* jobvl, const char* jobvr, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* alpha, void* beta, void* vl, + const fortran_int_t* ldvl, void* vr, const fortran_int_t* ldvr, + void* work, const fortran_int_t* lwork, float* rwork, + fortran_int_t* info ); +void LAPACK_ZGEGV( const char* jobvl, const char* jobvr, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* alpha, void* beta, void* vl, + const fortran_int_t* ldvl, void* vr, const fortran_int_t* ldvr, + void* work, const fortran_int_t* lwork, double* rwork, + fortran_int_t* info ); + +// Value-type variants of gges +void LAPACK_SGGES( const char* jobvsl, const char* jobvsr, const char* sort, + external_fp selctg, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* b, const fortran_int_t* ldb, + fortran_int_t* sdim, float* alphar, float* alphai, float* beta, + float* vsl, const fortran_int_t* ldvsl, float* vsr, + const fortran_int_t* ldvsr, float* work, const fortran_int_t* lwork, + fortran_bool_t* bwork, fortran_int_t* info ); +void LAPACK_DGGES( const char* jobvsl, const char* jobvsr, const char* sort, + external_fp selctg, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* b, const fortran_int_t* ldb, + fortran_int_t* sdim, double* alphar, double* alphai, double* beta, + double* vsl, const fortran_int_t* ldvsl, double* vsr, + const fortran_int_t* ldvsr, double* work, const fortran_int_t* lwork, + fortran_bool_t* bwork, fortran_int_t* info ); +void LAPACK_CGGES( const char* jobvsl, const char* jobvsr, const char* sort, + external_fp selctg, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + fortran_int_t* sdim, void* alpha, void* beta, void* vsl, + const fortran_int_t* ldvsl, void* vsr, const fortran_int_t* ldvsr, + void* work, const fortran_int_t* lwork, float* rwork, + fortran_bool_t* bwork, fortran_int_t* info ); +void LAPACK_ZGGES( const char* jobvsl, const char* jobvsr, const char* sort, + external_fp selctg, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + fortran_int_t* sdim, void* alpha, void* beta, void* vsl, + const fortran_int_t* ldvsl, void* vsr, const fortran_int_t* ldvsr, + void* work, const fortran_int_t* lwork, double* rwork, + fortran_bool_t* bwork, fortran_int_t* info ); + +// Value-type variants of ggesx +void LAPACK_SGGESX( const char* jobvsl, const char* jobvsr, const char* sort, + external_fp selctg, const char* sense, const fortran_int_t* n, + float* a, const fortran_int_t* lda, float* b, + const fortran_int_t* ldb, fortran_int_t* sdim, float* alphar, + float* alphai, float* beta, float* vsl, const fortran_int_t* ldvsl, + float* vsr, const fortran_int_t* ldvsr, float* rconde, float* rcondv, + float* work, const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_bool_t* bwork, + fortran_int_t* info ); +void LAPACK_DGGESX( const char* jobvsl, const char* jobvsr, const char* sort, + external_fp selctg, const char* sense, const fortran_int_t* n, + double* a, const fortran_int_t* lda, double* b, + const fortran_int_t* ldb, fortran_int_t* sdim, double* alphar, + double* alphai, double* beta, double* vsl, const fortran_int_t* ldvsl, + double* vsr, const fortran_int_t* ldvsr, double* rconde, + double* rcondv, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_bool_t* bwork, fortran_int_t* info ); +void LAPACK_CGGESX( const char* jobvsl, const char* jobvsr, const char* sort, + external_fp selctg, const char* sense, const fortran_int_t* n, + void* a, const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + fortran_int_t* sdim, void* alpha, void* beta, void* vsl, + const fortran_int_t* ldvsl, void* vsr, const fortran_int_t* ldvsr, + float* rconde, float* rcondv, void* work, const fortran_int_t* lwork, + float* rwork, fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_bool_t* bwork, fortran_int_t* info ); +void LAPACK_ZGGESX( const char* jobvsl, const char* jobvsr, const char* sort, + external_fp selctg, const char* sense, const fortran_int_t* n, + void* a, const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + fortran_int_t* sdim, void* alpha, void* beta, void* vsl, + const fortran_int_t* ldvsl, void* vsr, const fortran_int_t* ldvsr, + double* rconde, double* rcondv, void* work, + const fortran_int_t* lwork, double* rwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_bool_t* bwork, + fortran_int_t* info ); + +// Value-type variants of ggev +void LAPACK_SGGEV( const char* jobvl, const char* jobvr, + const fortran_int_t* n, float* a, const fortran_int_t* lda, float* b, + const fortran_int_t* ldb, float* alphar, float* alphai, float* beta, + float* vl, const fortran_int_t* ldvl, float* vr, + const fortran_int_t* ldvr, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DGGEV( const char* jobvl, const char* jobvr, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, double* alphar, double* alphai, + double* beta, double* vl, const fortran_int_t* ldvl, double* vr, + const fortran_int_t* ldvr, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_CGGEV( const char* jobvl, const char* jobvr, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* alpha, void* beta, void* vl, + const fortran_int_t* ldvl, void* vr, const fortran_int_t* ldvr, + void* work, const fortran_int_t* lwork, float* rwork, + fortran_int_t* info ); +void LAPACK_ZGGEV( const char* jobvl, const char* jobvr, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* alpha, void* beta, void* vl, + const fortran_int_t* ldvl, void* vr, const fortran_int_t* ldvr, + void* work, const fortran_int_t* lwork, double* rwork, + fortran_int_t* info ); + +// Value-type variants of ggevx +void LAPACK_SGGEVX( const char* balanc, const char* jobvl, const char* jobvr, + const char* sense, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* b, const fortran_int_t* ldb, + float* alphar, float* alphai, float* beta, float* vl, + const fortran_int_t* ldvl, float* vr, const fortran_int_t* ldvr, + fortran_int_t* ilo, fortran_int_t* ihi, float* lscale, float* rscale, + float* abnrm, float* bbnrm, float* rconde, float* rcondv, float* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_bool_t* bwork, fortran_int_t* info ); +void LAPACK_DGGEVX( const char* balanc, const char* jobvl, const char* jobvr, + const char* sense, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* b, const fortran_int_t* ldb, + double* alphar, double* alphai, double* beta, double* vl, + const fortran_int_t* ldvl, double* vr, const fortran_int_t* ldvr, + fortran_int_t* ilo, fortran_int_t* ihi, double* lscale, + double* rscale, double* abnrm, double* bbnrm, double* rconde, + double* rcondv, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, fortran_bool_t* bwork, fortran_int_t* info ); +void LAPACK_CGGEVX( const char* balanc, const char* jobvl, const char* jobvr, + const char* sense, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + void* alpha, void* beta, void* vl, const fortran_int_t* ldvl, + void* vr, const fortran_int_t* ldvr, fortran_int_t* ilo, + fortran_int_t* ihi, float* lscale, float* rscale, float* abnrm, + float* bbnrm, float* rconde, float* rcondv, void* work, + const fortran_int_t* lwork, float* rwork, fortran_int_t* iwork, + fortran_bool_t* bwork, fortran_int_t* info ); +void LAPACK_ZGGEVX( const char* balanc, const char* jobvl, const char* jobvr, + const char* sense, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + void* alpha, void* beta, void* vl, const fortran_int_t* ldvl, + void* vr, const fortran_int_t* ldvr, fortran_int_t* ilo, + fortran_int_t* ihi, double* lscale, double* rscale, double* abnrm, + double* bbnrm, double* rconde, double* rcondv, void* work, + const fortran_int_t* lwork, double* rwork, fortran_int_t* iwork, + fortran_bool_t* bwork, fortran_int_t* info ); + +// Value-type variants of ggsvd +void LAPACK_SGGSVD( const char* jobu, const char* jobv, const char* jobq, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* p, fortran_int_t* k, fortran_int_t* l, float* a, + const fortran_int_t* lda, float* b, const fortran_int_t* ldb, + float* alpha, float* beta, float* u, const fortran_int_t* ldu, + float* v, const fortran_int_t* ldv, float* q, + const fortran_int_t* ldq, float* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DGGSVD( const char* jobu, const char* jobv, const char* jobq, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* p, fortran_int_t* k, fortran_int_t* l, double* a, + const fortran_int_t* lda, double* b, const fortran_int_t* ldb, + double* alpha, double* beta, double* u, const fortran_int_t* ldu, + double* v, const fortran_int_t* ldv, double* q, + const fortran_int_t* ldq, double* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_CGGSVD( const char* jobu, const char* jobv, const char* jobq, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* p, fortran_int_t* k, fortran_int_t* l, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + float* alpha, float* beta, void* u, const fortran_int_t* ldu, void* v, + const fortran_int_t* ldv, void* q, const fortran_int_t* ldq, + void* work, float* rwork, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_ZGGSVD( const char* jobu, const char* jobv, const char* jobq, + const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* p, fortran_int_t* k, fortran_int_t* l, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + double* alpha, double* beta, void* u, const fortran_int_t* ldu, + void* v, const fortran_int_t* ldv, void* q, const fortran_int_t* ldq, + void* work, double* rwork, fortran_int_t* iwork, fortran_int_t* info ); + +// Value-type variants of hbgv +void LAPACK_CHBGV( const char* jobz, const char* uplo, const fortran_int_t* n, + const fortran_int_t* ka, const fortran_int_t* kb, void* ab, + const fortran_int_t* ldab, void* bb, const fortran_int_t* ldbb, + float* w, void* z, const fortran_int_t* ldz, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZHBGV( const char* jobz, const char* uplo, const fortran_int_t* n, + const fortran_int_t* ka, const fortran_int_t* kb, void* ab, + const fortran_int_t* ldab, void* bb, const fortran_int_t* ldbb, + double* w, void* z, const fortran_int_t* ldz, void* work, + double* rwork, fortran_int_t* info ); + +// Value-type variants of hbgvd +void LAPACK_CHBGVD( const char* jobz, const char* uplo, + const fortran_int_t* n, const fortran_int_t* ka, + const fortran_int_t* kb, void* ab, const fortran_int_t* ldab, + void* bb, const fortran_int_t* ldbb, float* w, void* z, + const fortran_int_t* ldz, void* work, const fortran_int_t* lwork, + float* rwork, const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_ZHBGVD( const char* jobz, const char* uplo, + const fortran_int_t* n, const fortran_int_t* ka, + const fortran_int_t* kb, void* ab, const fortran_int_t* ldab, + void* bb, const fortran_int_t* ldbb, double* w, void* z, + const fortran_int_t* ldz, void* work, const fortran_int_t* lwork, + double* rwork, const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of hbgvx +void LAPACK_CHBGVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, const fortran_int_t* ka, + const fortran_int_t* kb, void* ab, const fortran_int_t* ldab, + void* bb, const fortran_int_t* ldbb, void* q, + const fortran_int_t* ldq, const float* vl, const float* vu, + const fortran_int_t* il, const fortran_int_t* iu, const float* abstol, + fortran_int_t* m, float* w, void* z, const fortran_int_t* ldz, + void* work, float* rwork, fortran_int_t* iwork, fortran_int_t* ifail, + fortran_int_t* info ); +void LAPACK_ZHBGVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, const fortran_int_t* ka, + const fortran_int_t* kb, void* ab, const fortran_int_t* ldab, + void* bb, const fortran_int_t* ldbb, void* q, + const fortran_int_t* ldq, const double* vl, const double* vu, + const fortran_int_t* il, const fortran_int_t* iu, + const double* abstol, fortran_int_t* m, double* w, void* z, + const fortran_int_t* ldz, void* work, double* rwork, + fortran_int_t* iwork, fortran_int_t* ifail, fortran_int_t* info ); + +// Value-type variants of hegv +void LAPACK_CHEGV( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, float* w, + void* work, const fortran_int_t* lwork, float* rwork, + fortran_int_t* info ); +void LAPACK_ZHEGV( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + double* w, void* work, const fortran_int_t* lwork, double* rwork, + fortran_int_t* info ); + +// Value-type variants of hegvd +void LAPACK_CHEGVD( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, float* w, + void* work, const fortran_int_t* lwork, float* rwork, + const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_ZHEGVD( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + double* w, void* work, const fortran_int_t* lwork, double* rwork, + const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of hegvx +void LAPACK_CHEGVX( const fortran_int_t* itype, const char* jobz, + const char* range, const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + const float* vl, const float* vu, const fortran_int_t* il, + const fortran_int_t* iu, const float* abstol, fortran_int_t* m, + float* w, void* z, const fortran_int_t* ldz, void* work, + const fortran_int_t* lwork, float* rwork, fortran_int_t* iwork, + fortran_int_t* ifail, fortran_int_t* info ); +void LAPACK_ZHEGVX( const fortran_int_t* itype, const char* jobz, + const char* range, const char* uplo, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + const double* vl, const double* vu, const fortran_int_t* il, + const fortran_int_t* iu, const double* abstol, fortran_int_t* m, + double* w, void* z, const fortran_int_t* ldz, void* work, + const fortran_int_t* lwork, double* rwork, fortran_int_t* iwork, + fortran_int_t* ifail, fortran_int_t* info ); + +// Value-type variants of hpgv +void LAPACK_CHPGV( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, void* ap, void* bp, + float* w, void* z, const fortran_int_t* ldz, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZHPGV( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, void* ap, void* bp, + double* w, void* z, const fortran_int_t* ldz, void* work, + double* rwork, fortran_int_t* info ); + +// Value-type variants of hpgvd +void LAPACK_CHPGVD( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, void* ap, void* bp, + float* w, void* z, const fortran_int_t* ldz, void* work, + const fortran_int_t* lwork, float* rwork, const fortran_int_t* lrwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); +void LAPACK_ZHPGVD( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, void* ap, void* bp, + double* w, void* z, const fortran_int_t* ldz, void* work, + const fortran_int_t* lwork, double* rwork, + const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of hpgvx +void LAPACK_CHPGVX( const fortran_int_t* itype, const char* jobz, + const char* range, const char* uplo, const fortran_int_t* n, void* ap, + void* bp, const float* vl, const float* vu, const fortran_int_t* il, + const fortran_int_t* iu, const float* abstol, fortran_int_t* m, + float* w, void* z, const fortran_int_t* ldz, void* work, float* rwork, + fortran_int_t* iwork, fortran_int_t* ifail, fortran_int_t* info ); +void LAPACK_ZHPGVX( const fortran_int_t* itype, const char* jobz, + const char* range, const char* uplo, const fortran_int_t* n, void* ap, + void* bp, const double* vl, const double* vu, const fortran_int_t* il, + const fortran_int_t* iu, const double* abstol, fortran_int_t* m, + double* w, void* z, const fortran_int_t* ldz, void* work, + double* rwork, fortran_int_t* iwork, fortran_int_t* ifail, + fortran_int_t* info ); + +// Value-type variants of sbgv +void LAPACK_SSBGV( const char* jobz, const char* uplo, const fortran_int_t* n, + const fortran_int_t* ka, const fortran_int_t* kb, float* ab, + const fortran_int_t* ldab, float* bb, const fortran_int_t* ldbb, + float* w, float* z, const fortran_int_t* ldz, float* work, + fortran_int_t* info ); +void LAPACK_DSBGV( const char* jobz, const char* uplo, const fortran_int_t* n, + const fortran_int_t* ka, const fortran_int_t* kb, double* ab, + const fortran_int_t* ldab, double* bb, const fortran_int_t* ldbb, + double* w, double* z, const fortran_int_t* ldz, double* work, + fortran_int_t* info ); + +// Value-type variants of sbgvd +void LAPACK_SSBGVD( const char* jobz, const char* uplo, + const fortran_int_t* n, const fortran_int_t* ka, + const fortran_int_t* kb, float* ab, const fortran_int_t* ldab, + float* bb, const fortran_int_t* ldbb, float* w, float* z, + const fortran_int_t* ldz, float* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); +void LAPACK_DSBGVD( const char* jobz, const char* uplo, + const fortran_int_t* n, const fortran_int_t* ka, + const fortran_int_t* kb, double* ab, const fortran_int_t* ldab, + double* bb, const fortran_int_t* ldbb, double* w, double* z, + const fortran_int_t* ldz, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); + +// Value-type variants of sbgvx +void LAPACK_SSBGVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, const fortran_int_t* ka, + const fortran_int_t* kb, float* ab, const fortran_int_t* ldab, + float* bb, const fortran_int_t* ldbb, float* q, + const fortran_int_t* ldq, const float* vl, const float* vu, + const fortran_int_t* il, const fortran_int_t* iu, const float* abstol, + fortran_int_t* m, float* w, float* z, const fortran_int_t* ldz, + float* work, fortran_int_t* iwork, fortran_int_t* ifail, + fortran_int_t* info ); +void LAPACK_DSBGVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, const fortran_int_t* ka, + const fortran_int_t* kb, double* ab, const fortran_int_t* ldab, + double* bb, const fortran_int_t* ldbb, double* q, + const fortran_int_t* ldq, const double* vl, const double* vu, + const fortran_int_t* il, const fortran_int_t* iu, + const double* abstol, fortran_int_t* m, double* w, double* z, + const fortran_int_t* ldz, double* work, fortran_int_t* iwork, + fortran_int_t* ifail, fortran_int_t* info ); + +// Value-type variants of spgv +void LAPACK_SSPGV( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, float* ap, float* bp, + float* w, float* z, const fortran_int_t* ldz, float* work, + fortran_int_t* info ); +void LAPACK_DSPGV( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, double* ap, double* bp, + double* w, double* z, const fortran_int_t* ldz, double* work, + fortran_int_t* info ); + +// Value-type variants of spgvd +void LAPACK_SSPGVD( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, float* ap, float* bp, + float* w, float* z, const fortran_int_t* ldz, float* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_DSPGVD( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, double* ap, double* bp, + double* w, double* z, const fortran_int_t* ldz, double* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of spgvx +void LAPACK_SSPGVX( const fortran_int_t* itype, const char* jobz, + const char* range, const char* uplo, const fortran_int_t* n, + float* ap, float* bp, const float* vl, const float* vu, + const fortran_int_t* il, const fortran_int_t* iu, const float* abstol, + fortran_int_t* m, float* w, float* z, const fortran_int_t* ldz, + float* work, fortran_int_t* iwork, fortran_int_t* ifail, + fortran_int_t* info ); +void LAPACK_DSPGVX( const fortran_int_t* itype, const char* jobz, + const char* range, const char* uplo, const fortran_int_t* n, + double* ap, double* bp, const double* vl, const double* vu, + const fortran_int_t* il, const fortran_int_t* iu, + const double* abstol, fortran_int_t* m, double* w, double* z, + const fortran_int_t* ldz, double* work, fortran_int_t* iwork, + fortran_int_t* ifail, fortran_int_t* info ); + +// Value-type variants of sygv +void LAPACK_SSYGV( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* b, const fortran_int_t* ldb, + float* w, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DSYGV( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* b, const fortran_int_t* ldb, + double* w, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); + +// Value-type variants of sygvd +void LAPACK_SSYGVD( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* b, const fortran_int_t* ldb, + float* w, float* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); +void LAPACK_DSYGVD( const fortran_int_t* itype, const char* jobz, + const char* uplo, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* b, const fortran_int_t* ldb, + double* w, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); + +// Value-type variants of sygvx +void LAPACK_SSYGVX( const fortran_int_t* itype, const char* jobz, + const char* range, const char* uplo, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* b, const fortran_int_t* ldb, + const float* vl, const float* vu, const fortran_int_t* il, + const fortran_int_t* iu, const float* abstol, fortran_int_t* m, + float* w, float* z, const fortran_int_t* ldz, float* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* ifail, fortran_int_t* info ); +void LAPACK_DSYGVX( const fortran_int_t* itype, const char* jobz, + const char* range, const char* uplo, const fortran_int_t* n, + double* a, const fortran_int_t* lda, double* b, + const fortran_int_t* ldb, const double* vl, const double* vu, + const fortran_int_t* il, const fortran_int_t* iu, + const double* abstol, fortran_int_t* m, double* w, double* z, + const fortran_int_t* ldz, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, fortran_int_t* ifail, fortran_int_t* info ); + +// Value-type variants of ggglm +void LAPACK_SGGGLM( const fortran_int_t* n, const fortran_int_t* m, + const fortran_int_t* p, float* a, const fortran_int_t* lda, float* b, + const fortran_int_t* ldb, float* d, float* x, float* y, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DGGGLM( const fortran_int_t* n, const fortran_int_t* m, + const fortran_int_t* p, double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, double* d, double* x, double* y, + double* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGGGLM( const fortran_int_t* n, const fortran_int_t* m, + const fortran_int_t* p, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* d, void* x, void* y, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZGGGLM( const fortran_int_t* n, const fortran_int_t* m, + const fortran_int_t* p, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* d, void* x, void* y, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of gglse +void LAPACK_SGGLSE( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* p, float* a, const fortran_int_t* lda, float* b, + const fortran_int_t* ldb, float* c, float* d, float* x, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DGGLSE( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* p, double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, double* c, double* d, double* x, + double* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGGLSE( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* p, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* c, void* d, void* x, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZGGLSE( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* p, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, void* c, void* d, void* x, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of gbsv +void LAPACK_SGBSV( const fortran_int_t* n, const fortran_int_t* kl, + const fortran_int_t* ku, const fortran_int_t* nrhs, float* ab, + const fortran_int_t* ldab, fortran_int_t* ipiv, float* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_DGBSV( const fortran_int_t* n, const fortran_int_t* kl, + const fortran_int_t* ku, const fortran_int_t* nrhs, double* ab, + const fortran_int_t* ldab, fortran_int_t* ipiv, double* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_CGBSV( const fortran_int_t* n, const fortran_int_t* kl, + const fortran_int_t* ku, const fortran_int_t* nrhs, void* ab, + const fortran_int_t* ldab, fortran_int_t* ipiv, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZGBSV( const fortran_int_t* n, const fortran_int_t* kl, + const fortran_int_t* ku, const fortran_int_t* nrhs, void* ab, + const fortran_int_t* ldab, fortran_int_t* ipiv, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of gbsvx +void LAPACK_SGBSVX( const char* fact, const char* trans, + const fortran_int_t* n, const fortran_int_t* kl, + const fortran_int_t* ku, const fortran_int_t* nrhs, float* ab, + const fortran_int_t* ldab, float* afb, const fortran_int_t* ldafb, + fortran_int_t* ipiv, char* equed, float* r, float* c, float* b, + const fortran_int_t* ldb, float* x, const fortran_int_t* ldx, + float* rcond, float* ferr, float* berr, float* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DGBSVX( const char* fact, const char* trans, + const fortran_int_t* n, const fortran_int_t* kl, + const fortran_int_t* ku, const fortran_int_t* nrhs, double* ab, + const fortran_int_t* ldab, double* afb, const fortran_int_t* ldafb, + fortran_int_t* ipiv, char* equed, double* r, double* c, double* b, + const fortran_int_t* ldb, double* x, const fortran_int_t* ldx, + double* rcond, double* ferr, double* berr, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CGBSVX( const char* fact, const char* trans, + const fortran_int_t* n, const fortran_int_t* kl, + const fortran_int_t* ku, const fortran_int_t* nrhs, void* ab, + const fortran_int_t* ldab, void* afb, const fortran_int_t* ldafb, + fortran_int_t* ipiv, char* equed, float* r, float* c, void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + float* rcond, float* ferr, float* berr, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZGBSVX( const char* fact, const char* trans, + const fortran_int_t* n, const fortran_int_t* kl, + const fortran_int_t* ku, const fortran_int_t* nrhs, void* ab, + const fortran_int_t* ldab, void* afb, const fortran_int_t* ldafb, + fortran_int_t* ipiv, char* equed, double* r, double* c, void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + double* rcond, double* ferr, double* berr, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of gejsv +void LAPACK_SGEJSV( const char* joba, const char* jobu, const char* jobv, + const char* jobr, const char* jobt, const char* jobp, + const fortran_int_t* m, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* sva, float* u, + const fortran_int_t* ldu, float* v, const fortran_int_t* ldv, + float* work, const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DGEJSV( const char* joba, const char* jobu, const char* jobv, + const char* jobr, const char* jobt, const char* jobp, + const fortran_int_t* m, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* sva, double* u, + const fortran_int_t* ldu, double* v, const fortran_int_t* ldv, + double* work, const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* info ); + +// Value-type variants of gesv +void LAPACK_SGESV( const fortran_int_t* n, const fortran_int_t* nrhs, + float* a, const fortran_int_t* lda, fortran_int_t* ipiv, float* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_DGESV( const fortran_int_t* n, const fortran_int_t* nrhs, + double* a, const fortran_int_t* lda, fortran_int_t* ipiv, double* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_CGESV( const fortran_int_t* n, const fortran_int_t* nrhs, void* a, + const fortran_int_t* lda, fortran_int_t* ipiv, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZGESV( const fortran_int_t* n, const fortran_int_t* nrhs, void* a, + const fortran_int_t* lda, fortran_int_t* ipiv, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of gesvx +void LAPACK_SGESVX( const char* fact, const char* trans, + const fortran_int_t* n, const fortran_int_t* nrhs, float* a, + const fortran_int_t* lda, float* af, const fortran_int_t* ldaf, + fortran_int_t* ipiv, char* equed, float* r, float* c, float* b, + const fortran_int_t* ldb, float* x, const fortran_int_t* ldx, + float* rcond, float* ferr, float* berr, float* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DGESVX( const char* fact, const char* trans, + const fortran_int_t* n, const fortran_int_t* nrhs, double* a, + const fortran_int_t* lda, double* af, const fortran_int_t* ldaf, + fortran_int_t* ipiv, char* equed, double* r, double* c, double* b, + const fortran_int_t* ldb, double* x, const fortran_int_t* ldx, + double* rcond, double* ferr, double* berr, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CGESVX( const char* fact, const char* trans, + const fortran_int_t* n, const fortran_int_t* nrhs, void* a, + const fortran_int_t* lda, void* af, const fortran_int_t* ldaf, + fortran_int_t* ipiv, char* equed, float* r, float* c, void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + float* rcond, float* ferr, float* berr, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZGESVX( const char* fact, const char* trans, + const fortran_int_t* n, const fortran_int_t* nrhs, void* a, + const fortran_int_t* lda, void* af, const fortran_int_t* ldaf, + fortran_int_t* ipiv, char* equed, double* r, double* c, void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + double* rcond, double* ferr, double* berr, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of gtsv +void LAPACK_SGTSV( const fortran_int_t* n, const fortran_int_t* nrhs, + float* dl, float* d, float* du, float* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_DGTSV( const fortran_int_t* n, const fortran_int_t* nrhs, + double* dl, double* d, double* du, double* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_CGTSV( const fortran_int_t* n, const fortran_int_t* nrhs, + void* dl, void* d, void* du, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_ZGTSV( const fortran_int_t* n, const fortran_int_t* nrhs, + void* dl, void* d, void* du, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); + +// Value-type variants of gtsvx +void LAPACK_SGTSVX( const char* fact, const char* trans, + const fortran_int_t* n, const fortran_int_t* nrhs, const float* dl, + const float* d, const float* du, float* dlf, float* df, float* duf, + float* du2, fortran_int_t* ipiv, const float* b, + const fortran_int_t* ldb, float* x, const fortran_int_t* ldx, + float* rcond, float* ferr, float* berr, float* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DGTSVX( const char* fact, const char* trans, + const fortran_int_t* n, const fortran_int_t* nrhs, const double* dl, + const double* d, const double* du, double* dlf, double* df, + double* duf, double* du2, fortran_int_t* ipiv, const double* b, + const fortran_int_t* ldb, double* x, const fortran_int_t* ldx, + double* rcond, double* ferr, double* berr, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CGTSVX( const char* fact, const char* trans, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* dl, + const void* d, const void* du, void* dlf, void* df, void* duf, + void* du2, fortran_int_t* ipiv, const void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + float* rcond, float* ferr, float* berr, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZGTSVX( const char* fact, const char* trans, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* dl, + const void* d, const void* du, void* dlf, void* df, void* duf, + void* du2, fortran_int_t* ipiv, const void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + double* rcond, double* ferr, double* berr, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of hesv +void LAPACK_CHESV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, void* a, const fortran_int_t* lda, + fortran_int_t* ipiv, void* b, const fortran_int_t* ldb, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZHESV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, void* a, const fortran_int_t* lda, + fortran_int_t* ipiv, void* b, const fortran_int_t* ldb, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of hesvx +void LAPACK_CHESVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* a, + const fortran_int_t* lda, void* af, const fortran_int_t* ldaf, + fortran_int_t* ipiv, const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, float* rcond, float* ferr, float* berr, + void* work, const fortran_int_t* lwork, float* rwork, + fortran_int_t* info ); +void LAPACK_ZHESVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* a, + const fortran_int_t* lda, void* af, const fortran_int_t* ldaf, + fortran_int_t* ipiv, const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, double* rcond, double* ferr, double* berr, + void* work, const fortran_int_t* lwork, double* rwork, + fortran_int_t* info ); + +// Value-type variants of hpsv +void LAPACK_CHPSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, void* ap, fortran_int_t* ipiv, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZHPSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, void* ap, fortran_int_t* ipiv, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of hpsvx +void LAPACK_CHPSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* ap, + void* afp, fortran_int_t* ipiv, const void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + float* rcond, float* ferr, float* berr, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZHPSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* ap, + void* afp, fortran_int_t* ipiv, const void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + double* rcond, double* ferr, double* berr, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of iter_gesv +void LAPACK_DSGESV( const fortran_int_t* n, const fortran_int_t* nrhs, + double* a, const fortran_int_t* lda, fortran_int_t* ipiv, + const double* b, const fortran_int_t* ldb, double* x, + const fortran_int_t* ldx, double* work, float* swork, + fortran_int_t* iter, fortran_int_t* info ); +void LAPACK_ZCGESV( const fortran_int_t* n, const fortran_int_t* nrhs, + void* a, const fortran_int_t* lda, fortran_int_t* ipiv, const void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + void* work, void* swork, double* rwork, fortran_int_t* iter, + fortran_int_t* info ); + +// Value-type variants of iter_posv +void LAPACK_DSPOSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, double* a, const fortran_int_t* lda, + const double* b, const fortran_int_t* ldb, double* x, + const fortran_int_t* ldx, double* work, float* swork, + fortran_int_t* iter, fortran_int_t* info ); +void LAPACK_ZCPOSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, void* a, const fortran_int_t* lda, + const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, void* work, void* swork, double* rwork, + fortran_int_t* iter, fortran_int_t* info ); + +// Value-type variants of pbsv +void LAPACK_SPBSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const fortran_int_t* nrhs, float* ab, + const fortran_int_t* ldab, float* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_DPBSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const fortran_int_t* nrhs, double* ab, + const fortran_int_t* ldab, double* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_CPBSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const fortran_int_t* nrhs, void* ab, + const fortran_int_t* ldab, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_ZPBSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, const fortran_int_t* nrhs, void* ab, + const fortran_int_t* ldab, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); + +// Value-type variants of pbsvx +void LAPACK_SPBSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, + const fortran_int_t* nrhs, float* ab, const fortran_int_t* ldab, + float* afb, const fortran_int_t* ldafb, char* equed, float* s, + float* b, const fortran_int_t* ldb, float* x, + const fortran_int_t* ldx, float* rcond, float* ferr, float* berr, + float* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DPBSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, + const fortran_int_t* nrhs, double* ab, const fortran_int_t* ldab, + double* afb, const fortran_int_t* ldafb, char* equed, double* s, + double* b, const fortran_int_t* ldb, double* x, + const fortran_int_t* ldx, double* rcond, double* ferr, double* berr, + double* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CPBSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, + const fortran_int_t* nrhs, void* ab, const fortran_int_t* ldab, + void* afb, const fortran_int_t* ldafb, char* equed, float* s, void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + float* rcond, float* ferr, float* berr, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZPBSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, + const fortran_int_t* nrhs, void* ab, const fortran_int_t* ldab, + void* afb, const fortran_int_t* ldafb, char* equed, double* s, + void* b, const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + double* rcond, double* ferr, double* berr, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of posv +void LAPACK_SPOSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, float* a, const fortran_int_t* lda, + float* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_DPOSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_CPOSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZPOSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of posvx +void LAPACK_SPOSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, float* a, + const fortran_int_t* lda, float* af, const fortran_int_t* ldaf, + char* equed, float* s, float* b, const fortran_int_t* ldb, float* x, + const fortran_int_t* ldx, float* rcond, float* ferr, float* berr, + float* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DPOSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, double* a, + const fortran_int_t* lda, double* af, const fortran_int_t* ldaf, + char* equed, double* s, double* b, const fortran_int_t* ldb, + double* x, const fortran_int_t* ldx, double* rcond, double* ferr, + double* berr, double* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_CPOSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, void* a, + const fortran_int_t* lda, void* af, const fortran_int_t* ldaf, + char* equed, float* s, void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, float* rcond, float* ferr, float* berr, + void* work, float* rwork, fortran_int_t* info ); +void LAPACK_ZPOSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, void* a, + const fortran_int_t* lda, void* af, const fortran_int_t* ldaf, + char* equed, double* s, void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, double* rcond, double* ferr, double* berr, + void* work, double* rwork, fortran_int_t* info ); + +// Value-type variants of ppsv +void LAPACK_SPPSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, float* ap, float* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_DPPSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, double* ap, double* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_CPPSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, void* ap, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZPPSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, void* ap, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of ppsvx +void LAPACK_SPPSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, float* ap, + float* afp, char* equed, float* s, float* b, const fortran_int_t* ldb, + float* x, const fortran_int_t* ldx, float* rcond, float* ferr, + float* berr, float* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DPPSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, double* ap, + double* afp, char* equed, double* s, double* b, + const fortran_int_t* ldb, double* x, const fortran_int_t* ldx, + double* rcond, double* ferr, double* berr, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CPPSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, void* ap, + void* afp, char* equed, float* s, void* b, const fortran_int_t* ldb, + void* x, const fortran_int_t* ldx, float* rcond, float* ferr, + float* berr, void* work, float* rwork, fortran_int_t* info ); +void LAPACK_ZPPSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, void* ap, + void* afp, char* equed, double* s, void* b, const fortran_int_t* ldb, + void* x, const fortran_int_t* ldx, double* rcond, double* ferr, + double* berr, void* work, double* rwork, fortran_int_t* info ); + +// Value-type variants of ptsv +void LAPACK_SPTSV( const fortran_int_t* n, const fortran_int_t* nrhs, + float* d, float* e, float* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_DPTSV( const fortran_int_t* n, const fortran_int_t* nrhs, + double* d, double* e, double* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_CPTSV( const fortran_int_t* n, const fortran_int_t* nrhs, + float* d, void* e, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); +void LAPACK_ZPTSV( const fortran_int_t* n, const fortran_int_t* nrhs, + double* d, void* e, void* b, const fortran_int_t* ldb, + fortran_int_t* info ); + +// Value-type variants of ptsvx +void LAPACK_SPTSVX( const char* fact, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* d, const float* e, float* df, + float* ef, const float* b, const fortran_int_t* ldb, float* x, + const fortran_int_t* ldx, float* rcond, float* ferr, float* berr, + float* work, fortran_int_t* info ); +void LAPACK_DPTSVX( const char* fact, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* d, const double* e, + double* df, double* ef, const double* b, const fortran_int_t* ldb, + double* x, const fortran_int_t* ldx, double* rcond, double* ferr, + double* berr, double* work, fortran_int_t* info ); +void LAPACK_CPTSVX( const char* fact, const fortran_int_t* n, + const fortran_int_t* nrhs, const float* d, const void* e, float* df, + void* ef, const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, float* rcond, float* ferr, float* berr, + void* work, float* rwork, fortran_int_t* info ); +void LAPACK_ZPTSVX( const char* fact, const fortran_int_t* n, + const fortran_int_t* nrhs, const double* d, const void* e, double* df, + void* ef, const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, double* rcond, double* ferr, double* berr, + void* work, double* rwork, fortran_int_t* info ); + +// Value-type variants of spsv +void LAPACK_SSPSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, float* ap, fortran_int_t* ipiv, float* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_DSPSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, double* ap, fortran_int_t* ipiv, double* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_CSPSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, void* ap, fortran_int_t* ipiv, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); +void LAPACK_ZSPSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, void* ap, fortran_int_t* ipiv, void* b, + const fortran_int_t* ldb, fortran_int_t* info ); + +// Value-type variants of spsvx +void LAPACK_SSPSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const float* ap, + float* afp, fortran_int_t* ipiv, const float* b, + const fortran_int_t* ldb, float* x, const fortran_int_t* ldx, + float* rcond, float* ferr, float* berr, float* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DSPSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const double* ap, + double* afp, fortran_int_t* ipiv, const double* b, + const fortran_int_t* ldb, double* x, const fortran_int_t* ldx, + double* rcond, double* ferr, double* berr, double* work, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CSPSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* ap, + void* afp, fortran_int_t* ipiv, const void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + float* rcond, float* ferr, float* berr, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZSPSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* ap, + void* afp, fortran_int_t* ipiv, const void* b, + const fortran_int_t* ldb, void* x, const fortran_int_t* ldx, + double* rcond, double* ferr, double* berr, void* work, double* rwork, + fortran_int_t* info ); + +// Value-type variants of sysv +void LAPACK_SSYSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, float* a, const fortran_int_t* lda, + fortran_int_t* ipiv, float* b, const fortran_int_t* ldb, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DSYSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, double* a, const fortran_int_t* lda, + fortran_int_t* ipiv, double* b, const fortran_int_t* ldb, + double* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CSYSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, void* a, const fortran_int_t* lda, + fortran_int_t* ipiv, void* b, const fortran_int_t* ldb, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZSYSV( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nrhs, void* a, const fortran_int_t* lda, + fortran_int_t* ipiv, void* b, const fortran_int_t* ldb, void* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of sysvx +void LAPACK_SSYSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const float* a, + const fortran_int_t* lda, float* af, const fortran_int_t* ldaf, + fortran_int_t* ipiv, const float* b, const fortran_int_t* ldb, + float* x, const fortran_int_t* ldx, float* rcond, float* ferr, + float* berr, float* work, const fortran_int_t* lwork, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DSYSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const double* a, + const fortran_int_t* lda, double* af, const fortran_int_t* ldaf, + fortran_int_t* ipiv, const double* b, const fortran_int_t* ldb, + double* x, const fortran_int_t* ldx, double* rcond, double* ferr, + double* berr, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CSYSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* a, + const fortran_int_t* lda, void* af, const fortran_int_t* ldaf, + fortran_int_t* ipiv, const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, float* rcond, float* ferr, float* berr, + void* work, const fortran_int_t* lwork, float* rwork, + fortran_int_t* info ); +void LAPACK_ZSYSVX( const char* fact, const char* uplo, + const fortran_int_t* n, const fortran_int_t* nrhs, const void* a, + const fortran_int_t* lda, void* af, const fortran_int_t* ldaf, + fortran_int_t* ipiv, const void* b, const fortran_int_t* ldb, void* x, + const fortran_int_t* ldx, double* rcond, double* ferr, double* berr, + void* work, const fortran_int_t* lwork, double* rwork, + fortran_int_t* info ); + +// Value-type variants of gees +void LAPACK_SGEES( const char* jobvs, const char* sort, external_fp select, + const fortran_int_t* n, float* a, const fortran_int_t* lda, + fortran_int_t* sdim, float* wr, float* wi, float* vs, + const fortran_int_t* ldvs, float* work, const fortran_int_t* lwork, + fortran_bool_t* bwork, fortran_int_t* info ); +void LAPACK_DGEES( const char* jobvs, const char* sort, external_fp select, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + fortran_int_t* sdim, double* wr, double* wi, double* vs, + const fortran_int_t* ldvs, double* work, const fortran_int_t* lwork, + fortran_bool_t* bwork, fortran_int_t* info ); +void LAPACK_CGEES( const char* jobvs, const char* sort, external_fp select, + const fortran_int_t* n, void* a, const fortran_int_t* lda, + fortran_int_t* sdim, void* w, void* vs, const fortran_int_t* ldvs, + void* work, const fortran_int_t* lwork, float* rwork, + fortran_bool_t* bwork, fortran_int_t* info ); +void LAPACK_ZGEES( const char* jobvs, const char* sort, external_fp select, + const fortran_int_t* n, void* a, const fortran_int_t* lda, + fortran_int_t* sdim, void* w, void* vs, const fortran_int_t* ldvs, + void* work, const fortran_int_t* lwork, double* rwork, + fortran_bool_t* bwork, fortran_int_t* info ); + +// Value-type variants of geesx +void LAPACK_SGEESX( const char* jobvs, const char* sort, external_fp select, + const char* sense, const fortran_int_t* n, float* a, + const fortran_int_t* lda, fortran_int_t* sdim, float* wr, float* wi, + float* vs, const fortran_int_t* ldvs, float* rconde, float* rcondv, + float* work, const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_bool_t* bwork, + fortran_int_t* info ); +void LAPACK_DGEESX( const char* jobvs, const char* sort, external_fp select, + const char* sense, const fortran_int_t* n, double* a, + const fortran_int_t* lda, fortran_int_t* sdim, double* wr, double* wi, + double* vs, const fortran_int_t* ldvs, double* rconde, double* rcondv, + double* work, const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_bool_t* bwork, + fortran_int_t* info ); +void LAPACK_CGEESX( const char* jobvs, const char* sort, external_fp select, + const char* sense, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* sdim, void* w, void* vs, + const fortran_int_t* ldvs, float* rconde, float* rcondv, void* work, + const fortran_int_t* lwork, float* rwork, fortran_bool_t* bwork, + fortran_int_t* info ); +void LAPACK_ZGEESX( const char* jobvs, const char* sort, external_fp select, + const char* sense, const fortran_int_t* n, void* a, + const fortran_int_t* lda, fortran_int_t* sdim, void* w, void* vs, + const fortran_int_t* ldvs, double* rconde, double* rcondv, void* work, + const fortran_int_t* lwork, double* rwork, fortran_bool_t* bwork, + fortran_int_t* info ); + +// Value-type variants of geev +void LAPACK_SGEEV( const char* jobvl, const char* jobvr, + const fortran_int_t* n, float* a, const fortran_int_t* lda, float* wr, + float* wi, float* vl, const fortran_int_t* ldvl, float* vr, + const fortran_int_t* ldvr, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DGEEV( const char* jobvl, const char* jobvr, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + double* wr, double* wi, double* vl, const fortran_int_t* ldvl, + double* vr, const fortran_int_t* ldvr, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGEEV( const char* jobvl, const char* jobvr, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* w, + void* vl, const fortran_int_t* ldvl, void* vr, + const fortran_int_t* ldvr, void* work, const fortran_int_t* lwork, + float* rwork, fortran_int_t* info ); +void LAPACK_ZGEEV( const char* jobvl, const char* jobvr, + const fortran_int_t* n, void* a, const fortran_int_t* lda, void* w, + void* vl, const fortran_int_t* ldvl, void* vr, + const fortran_int_t* ldvr, void* work, const fortran_int_t* lwork, + double* rwork, fortran_int_t* info ); + +// Value-type variants of geevx +void LAPACK_SGEEVX( const char* balanc, const char* jobvl, const char* jobvr, + const char* sense, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* wr, float* wi, float* vl, + const fortran_int_t* ldvl, float* vr, const fortran_int_t* ldvr, + fortran_int_t* ilo, fortran_int_t* ihi, float* scale, float* abnrm, + float* rconde, float* rcondv, float* work, const fortran_int_t* lwork, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DGEEVX( const char* balanc, const char* jobvl, const char* jobvr, + const char* sense, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* wr, double* wi, double* vl, + const fortran_int_t* ldvl, double* vr, const fortran_int_t* ldvr, + fortran_int_t* ilo, fortran_int_t* ihi, double* scale, double* abnrm, + double* rconde, double* rcondv, double* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_CGEEVX( const char* balanc, const char* jobvl, const char* jobvr, + const char* sense, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* w, void* vl, + const fortran_int_t* ldvl, void* vr, const fortran_int_t* ldvr, + fortran_int_t* ilo, fortran_int_t* ihi, float* scale, float* abnrm, + float* rconde, float* rcondv, void* work, const fortran_int_t* lwork, + float* rwork, fortran_int_t* info ); +void LAPACK_ZGEEVX( const char* balanc, const char* jobvl, const char* jobvr, + const char* sense, const fortran_int_t* n, void* a, + const fortran_int_t* lda, void* w, void* vl, + const fortran_int_t* ldvl, void* vr, const fortran_int_t* ldvr, + fortran_int_t* ilo, fortran_int_t* ihi, double* scale, double* abnrm, + double* rconde, double* rcondv, void* work, + const fortran_int_t* lwork, double* rwork, fortran_int_t* info ); + +// Value-type variants of gesdd +void LAPACK_SGESDD( const char* jobz, const fortran_int_t* m, + const fortran_int_t* n, float* a, const fortran_int_t* lda, float* s, + float* u, const fortran_int_t* ldu, float* vt, + const fortran_int_t* ldvt, float* work, const fortran_int_t* lwork, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DGESDD( const char* jobz, const fortran_int_t* m, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + double* s, double* u, const fortran_int_t* ldu, double* vt, + const fortran_int_t* ldvt, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CGESDD( const char* jobz, const fortran_int_t* m, + const fortran_int_t* n, void* a, const fortran_int_t* lda, float* s, + void* u, const fortran_int_t* ldu, void* vt, + const fortran_int_t* ldvt, void* work, const fortran_int_t* lwork, + float* rwork, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_ZGESDD( const char* jobz, const fortran_int_t* m, + const fortran_int_t* n, void* a, const fortran_int_t* lda, double* s, + void* u, const fortran_int_t* ldu, void* vt, + const fortran_int_t* ldvt, void* work, const fortran_int_t* lwork, + double* rwork, fortran_int_t* iwork, fortran_int_t* info ); + +// Value-type variants of gesvd +void LAPACK_SGESVD( const char* jobu, const char* jobvt, + const fortran_int_t* m, const fortran_int_t* n, float* a, + const fortran_int_t* lda, float* s, float* u, + const fortran_int_t* ldu, float* vt, const fortran_int_t* ldvt, + float* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DGESVD( const char* jobu, const char* jobvt, + const fortran_int_t* m, const fortran_int_t* n, double* a, + const fortran_int_t* lda, double* s, double* u, + const fortran_int_t* ldu, double* vt, const fortran_int_t* ldvt, + double* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGESVD( const char* jobu, const char* jobvt, + const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, float* s, void* u, const fortran_int_t* ldu, + void* vt, const fortran_int_t* ldvt, void* work, + const fortran_int_t* lwork, float* rwork, fortran_int_t* info ); +void LAPACK_ZGESVD( const char* jobu, const char* jobvt, + const fortran_int_t* m, const fortran_int_t* n, void* a, + const fortran_int_t* lda, double* s, void* u, + const fortran_int_t* ldu, void* vt, const fortran_int_t* ldvt, + void* work, const fortran_int_t* lwork, double* rwork, + fortran_int_t* info ); + +// Value-type variants of hbev +void LAPACK_CHBEV( const char* jobz, const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, void* ab, const fortran_int_t* ldab, + float* w, void* z, const fortran_int_t* ldz, void* work, float* rwork, + fortran_int_t* info ); +void LAPACK_ZHBEV( const char* jobz, const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, void* ab, const fortran_int_t* ldab, + double* w, void* z, const fortran_int_t* ldz, void* work, + double* rwork, fortran_int_t* info ); + +// Value-type variants of hbevd +void LAPACK_CHBEVD( const char* jobz, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, void* ab, + const fortran_int_t* ldab, float* w, void* z, + const fortran_int_t* ldz, void* work, const fortran_int_t* lwork, + float* rwork, const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_ZHBEVD( const char* jobz, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, void* ab, + const fortran_int_t* ldab, double* w, void* z, + const fortran_int_t* ldz, void* work, const fortran_int_t* lwork, + double* rwork, const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of hbevx +void LAPACK_CHBEVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, void* ab, + const fortran_int_t* ldab, void* q, const fortran_int_t* ldq, + const float* vl, const float* vu, const fortran_int_t* il, + const fortran_int_t* iu, const float* abstol, fortran_int_t* m, + float* w, void* z, const fortran_int_t* ldz, void* work, float* rwork, + fortran_int_t* iwork, fortran_int_t* ifail, fortran_int_t* info ); +void LAPACK_ZHBEVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, void* ab, + const fortran_int_t* ldab, void* q, const fortran_int_t* ldq, + const double* vl, const double* vu, const fortran_int_t* il, + const fortran_int_t* iu, const double* abstol, fortran_int_t* m, + double* w, void* z, const fortran_int_t* ldz, void* work, + double* rwork, fortran_int_t* iwork, fortran_int_t* ifail, + fortran_int_t* info ); + +// Value-type variants of heev +void LAPACK_CHEEV( const char* jobz, const char* uplo, const fortran_int_t* n, + void* a, const fortran_int_t* lda, float* w, void* work, + const fortran_int_t* lwork, float* rwork, fortran_int_t* info ); +void LAPACK_ZHEEV( const char* jobz, const char* uplo, const fortran_int_t* n, + void* a, const fortran_int_t* lda, double* w, void* work, + const fortran_int_t* lwork, double* rwork, fortran_int_t* info ); + +// Value-type variants of heevd +void LAPACK_CHEEVD( const char* jobz, const char* uplo, + const fortran_int_t* n, void* a, const fortran_int_t* lda, float* w, + void* work, const fortran_int_t* lwork, float* rwork, + const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_ZHEEVD( const char* jobz, const char* uplo, + const fortran_int_t* n, void* a, const fortran_int_t* lda, double* w, + void* work, const fortran_int_t* lwork, double* rwork, + const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of heevr +void LAPACK_CHEEVR( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, void* a, const fortran_int_t* lda, + const float* vl, const float* vu, const fortran_int_t* il, + const fortran_int_t* iu, const float* abstol, fortran_int_t* m, + float* w, void* z, const fortran_int_t* ldz, fortran_int_t* isuppz, + void* work, const fortran_int_t* lwork, float* rwork, + const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_ZHEEVR( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, void* a, const fortran_int_t* lda, + const double* vl, const double* vu, const fortran_int_t* il, + const fortran_int_t* iu, const double* abstol, fortran_int_t* m, + double* w, void* z, const fortran_int_t* ldz, fortran_int_t* isuppz, + void* work, const fortran_int_t* lwork, double* rwork, + const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of heevx +void LAPACK_CHEEVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, void* a, const fortran_int_t* lda, + const float* vl, const float* vu, const fortran_int_t* il, + const fortran_int_t* iu, const float* abstol, fortran_int_t* m, + float* w, void* z, const fortran_int_t* ldz, void* work, + const fortran_int_t* lwork, float* rwork, fortran_int_t* iwork, + fortran_int_t* ifail, fortran_int_t* info ); +void LAPACK_ZHEEVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, void* a, const fortran_int_t* lda, + const double* vl, const double* vu, const fortran_int_t* il, + const fortran_int_t* iu, const double* abstol, fortran_int_t* m, + double* w, void* z, const fortran_int_t* ldz, void* work, + const fortran_int_t* lwork, double* rwork, fortran_int_t* iwork, + fortran_int_t* ifail, fortran_int_t* info ); + +// Value-type variants of hpev +void LAPACK_CHPEV( const char* jobz, const char* uplo, const fortran_int_t* n, + void* ap, float* w, void* z, const fortran_int_t* ldz, void* work, + float* rwork, fortran_int_t* info ); +void LAPACK_ZHPEV( const char* jobz, const char* uplo, const fortran_int_t* n, + void* ap, double* w, void* z, const fortran_int_t* ldz, void* work, + double* rwork, fortran_int_t* info ); + +// Value-type variants of hpevd +void LAPACK_CHPEVD( const char* jobz, const char* uplo, + const fortran_int_t* n, void* ap, float* w, void* z, + const fortran_int_t* ldz, void* work, const fortran_int_t* lwork, + float* rwork, const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_ZHPEVD( const char* jobz, const char* uplo, + const fortran_int_t* n, void* ap, double* w, void* z, + const fortran_int_t* ldz, void* work, const fortran_int_t* lwork, + double* rwork, const fortran_int_t* lrwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of hpevx +void LAPACK_CHPEVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, void* ap, const float* vl, const float* vu, + const fortran_int_t* il, const fortran_int_t* iu, const float* abstol, + fortran_int_t* m, float* w, void* z, const fortran_int_t* ldz, + void* work, float* rwork, fortran_int_t* iwork, fortran_int_t* ifail, + fortran_int_t* info ); +void LAPACK_ZHPEVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, void* ap, const double* vl, const double* vu, + const fortran_int_t* il, const fortran_int_t* iu, + const double* abstol, fortran_int_t* m, double* w, void* z, + const fortran_int_t* ldz, void* work, double* rwork, + fortran_int_t* iwork, fortran_int_t* ifail, fortran_int_t* info ); + +// Value-type variants of sbev +void LAPACK_SSBEV( const char* jobz, const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, float* ab, const fortran_int_t* ldab, + float* w, float* z, const fortran_int_t* ldz, float* work, + fortran_int_t* info ); +void LAPACK_DSBEV( const char* jobz, const char* uplo, const fortran_int_t* n, + const fortran_int_t* kd, double* ab, const fortran_int_t* ldab, + double* w, double* z, const fortran_int_t* ldz, double* work, + fortran_int_t* info ); + +// Value-type variants of sbevd +void LAPACK_SSBEVD( const char* jobz, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, float* ab, + const fortran_int_t* ldab, float* w, float* z, + const fortran_int_t* ldz, float* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); +void LAPACK_DSBEVD( const char* jobz, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, double* ab, + const fortran_int_t* ldab, double* w, double* z, + const fortran_int_t* ldz, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); + +// Value-type variants of sbevx +void LAPACK_SSBEVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, float* ab, + const fortran_int_t* ldab, float* q, const fortran_int_t* ldq, + const float* vl, const float* vu, const fortran_int_t* il, + const fortran_int_t* iu, const float* abstol, fortran_int_t* m, + float* w, float* z, const fortran_int_t* ldz, float* work, + fortran_int_t* iwork, fortran_int_t* ifail, fortran_int_t* info ); +void LAPACK_DSBEVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, const fortran_int_t* kd, double* ab, + const fortran_int_t* ldab, double* q, const fortran_int_t* ldq, + const double* vl, const double* vu, const fortran_int_t* il, + const fortran_int_t* iu, const double* abstol, fortran_int_t* m, + double* w, double* z, const fortran_int_t* ldz, double* work, + fortran_int_t* iwork, fortran_int_t* ifail, fortran_int_t* info ); + +// Value-type variants of spev +void LAPACK_SSPEV( const char* jobz, const char* uplo, const fortran_int_t* n, + float* ap, float* w, float* z, const fortran_int_t* ldz, float* work, + fortran_int_t* info ); +void LAPACK_DSPEV( const char* jobz, const char* uplo, const fortran_int_t* n, + double* ap, double* w, double* z, const fortran_int_t* ldz, + double* work, fortran_int_t* info ); + +// Value-type variants of spevd +void LAPACK_SSPEVD( const char* jobz, const char* uplo, + const fortran_int_t* n, float* ap, float* w, float* z, + const fortran_int_t* ldz, float* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); +void LAPACK_DSPEVD( const char* jobz, const char* uplo, + const fortran_int_t* n, double* ap, double* w, double* z, + const fortran_int_t* ldz, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); + +// Value-type variants of spevx +void LAPACK_SSPEVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, float* ap, const float* vl, const float* vu, + const fortran_int_t* il, const fortran_int_t* iu, const float* abstol, + fortran_int_t* m, float* w, float* z, const fortran_int_t* ldz, + float* work, fortran_int_t* iwork, fortran_int_t* ifail, + fortran_int_t* info ); +void LAPACK_DSPEVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, double* ap, const double* vl, + const double* vu, const fortran_int_t* il, const fortran_int_t* iu, + const double* abstol, fortran_int_t* m, double* w, double* z, + const fortran_int_t* ldz, double* work, fortran_int_t* iwork, + fortran_int_t* ifail, fortran_int_t* info ); + +// Value-type variants of stev +void LAPACK_SSTEV( const char* jobz, const fortran_int_t* n, float* d, + float* e, float* z, const fortran_int_t* ldz, float* work, + fortran_int_t* info ); +void LAPACK_DSTEV( const char* jobz, const fortran_int_t* n, double* d, + double* e, double* z, const fortran_int_t* ldz, double* work, + fortran_int_t* info ); + +// Value-type variants of stevd +void LAPACK_SSTEVD( const char* jobz, const fortran_int_t* n, float* d, + float* e, float* z, const fortran_int_t* ldz, float* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_DSTEVD( const char* jobz, const fortran_int_t* n, double* d, + double* e, double* z, const fortran_int_t* ldz, double* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of stevr +void LAPACK_SSTEVR( const char* jobz, const char* range, + const fortran_int_t* n, float* d, float* e, const float* vl, + const float* vu, const fortran_int_t* il, const fortran_int_t* iu, + const float* abstol, fortran_int_t* m, float* w, float* z, + const fortran_int_t* ldz, fortran_int_t* isuppz, float* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_DSTEVR( const char* jobz, const char* range, + const fortran_int_t* n, double* d, double* e, const double* vl, + const double* vu, const fortran_int_t* il, const fortran_int_t* iu, + const double* abstol, fortran_int_t* m, double* w, double* z, + const fortran_int_t* ldz, fortran_int_t* isuppz, double* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of stevx +void LAPACK_SSTEVX( const char* jobz, const char* range, + const fortran_int_t* n, float* d, float* e, const float* vl, + const float* vu, const fortran_int_t* il, const fortran_int_t* iu, + const float* abstol, fortran_int_t* m, float* w, float* z, + const fortran_int_t* ldz, float* work, fortran_int_t* iwork, + fortran_int_t* ifail, fortran_int_t* info ); +void LAPACK_DSTEVX( const char* jobz, const char* range, + const fortran_int_t* n, double* d, double* e, const double* vl, + const double* vu, const fortran_int_t* il, const fortran_int_t* iu, + const double* abstol, fortran_int_t* m, double* w, double* z, + const fortran_int_t* ldz, double* work, fortran_int_t* iwork, + fortran_int_t* ifail, fortran_int_t* info ); + +// Value-type variants of syev +void LAPACK_SSYEV( const char* jobz, const char* uplo, const fortran_int_t* n, + float* a, const fortran_int_t* lda, float* w, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DSYEV( const char* jobz, const char* uplo, const fortran_int_t* n, + double* a, const fortran_int_t* lda, double* w, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of syevd +void LAPACK_SSYEVD( const char* jobz, const char* uplo, + const fortran_int_t* n, float* a, const fortran_int_t* lda, float* w, + float* work, const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_DSYEVD( const char* jobz, const char* uplo, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + double* w, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, const fortran_int_t* liwork, + fortran_int_t* info ); + +// Value-type variants of syevr +void LAPACK_SSYEVR( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, float* a, const fortran_int_t* lda, + const float* vl, const float* vu, const fortran_int_t* il, + const fortran_int_t* iu, const float* abstol, fortran_int_t* m, + float* w, float* z, const fortran_int_t* ldz, fortran_int_t* isuppz, + float* work, const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); +void LAPACK_DSYEVR( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + const double* vl, const double* vu, const fortran_int_t* il, + const fortran_int_t* iu, const double* abstol, fortran_int_t* m, + double* w, double* z, const fortran_int_t* ldz, fortran_int_t* isuppz, + double* work, const fortran_int_t* lwork, fortran_int_t* iwork, + const fortran_int_t* liwork, fortran_int_t* info ); + +// Value-type variants of syevx +void LAPACK_SSYEVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, float* a, const fortran_int_t* lda, + const float* vl, const float* vu, const fortran_int_t* il, + const fortran_int_t* iu, const float* abstol, fortran_int_t* m, + float* w, float* z, const fortran_int_t* ldz, float* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* ifail, fortran_int_t* info ); +void LAPACK_DSYEVX( const char* jobz, const char* range, const char* uplo, + const fortran_int_t* n, double* a, const fortran_int_t* lda, + const double* vl, const double* vu, const fortran_int_t* il, + const fortran_int_t* iu, const double* abstol, fortran_int_t* m, + double* w, double* z, const fortran_int_t* ldz, double* work, + const fortran_int_t* lwork, fortran_int_t* iwork, + fortran_int_t* ifail, fortran_int_t* info ); + +// Value-type variants of gels +void LAPACK_SGELS( const char* trans, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* nrhs, float* a, + const fortran_int_t* lda, float* b, const fortran_int_t* ldb, + float* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DGELS( const char* trans, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* nrhs, double* a, + const fortran_int_t* lda, double* b, const fortran_int_t* ldb, + double* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGELS( const char* trans, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* nrhs, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + void* work, const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_ZGELS( const char* trans, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* nrhs, void* a, + const fortran_int_t* lda, void* b, const fortran_int_t* ldb, + void* work, const fortran_int_t* lwork, fortran_int_t* info ); + +// Value-type variants of gelsd +void LAPACK_SGELSD( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nrhs, float* a, const fortran_int_t* lda, + float* b, const fortran_int_t* ldb, float* s, const float* rcond, + fortran_int_t* rank, float* work, const fortran_int_t* lwork, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DGELSD( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nrhs, double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, double* s, const double* rcond, + fortran_int_t* rank, double* work, const fortran_int_t* lwork, + fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_CGELSD( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nrhs, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, float* s, const float* rcond, + fortran_int_t* rank, void* work, const fortran_int_t* lwork, + float* rwork, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_ZGELSD( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nrhs, const void* a, const fortran_int_t* lda, + void* b, const fortran_int_t* ldb, double* s, const double* rcond, + fortran_int_t* rank, void* work, const fortran_int_t* lwork, + double* rwork, fortran_int_t* iwork, fortran_int_t* info ); + +// Value-type variants of gelss +void LAPACK_SGELSS( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nrhs, float* a, const fortran_int_t* lda, + float* b, const fortran_int_t* ldb, float* s, const float* rcond, + fortran_int_t* rank, float* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_DGELSS( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nrhs, double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, double* s, const double* rcond, + fortran_int_t* rank, double* work, const fortran_int_t* lwork, + fortran_int_t* info ); +void LAPACK_CGELSS( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nrhs, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, float* s, const float* rcond, + fortran_int_t* rank, void* work, const fortran_int_t* lwork, + float* rwork, fortran_int_t* info ); +void LAPACK_ZGELSS( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nrhs, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, double* s, const double* rcond, + fortran_int_t* rank, void* work, const fortran_int_t* lwork, + double* rwork, fortran_int_t* info ); + +// Value-type variants of gelsy +void LAPACK_SGELSY( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nrhs, float* a, const fortran_int_t* lda, + float* b, const fortran_int_t* ldb, fortran_int_t* jpvt, + const float* rcond, fortran_int_t* rank, float* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_DGELSY( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nrhs, double* a, const fortran_int_t* lda, + double* b, const fortran_int_t* ldb, fortran_int_t* jpvt, + const double* rcond, fortran_int_t* rank, double* work, + const fortran_int_t* lwork, fortran_int_t* info ); +void LAPACK_CGELSY( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nrhs, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, fortran_int_t* jpvt, const float* rcond, + fortran_int_t* rank, void* work, const fortran_int_t* lwork, + float* rwork, fortran_int_t* info ); +void LAPACK_ZGELSY( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nrhs, void* a, const fortran_int_t* lda, void* b, + const fortran_int_t* ldb, fortran_int_t* jpvt, const double* rcond, + fortran_int_t* rank, void* work, const fortran_int_t* lwork, + double* rwork, fortran_int_t* info ); + +// +// LAPACK auxiliary routines +// + +// Value-type variants of larf +void LAPACK_SLARF( const char* side, const fortran_int_t* m, + const fortran_int_t* n, const float* v, const fortran_int_t* incv, + const float* tau, float* c, const fortran_int_t* ldc, float* work ); +void LAPACK_DLARF( const char* side, const fortran_int_t* m, + const fortran_int_t* n, const double* v, const fortran_int_t* incv, + const double* tau, double* c, const fortran_int_t* ldc, double* work ); +void LAPACK_CLARF( const char* side, const fortran_int_t* m, + const fortran_int_t* n, const void* v, const fortran_int_t* incv, + const void* tau, void* c, const fortran_int_t* ldc, void* work ); +void LAPACK_ZLARF( const char* side, const fortran_int_t* m, + const fortran_int_t* n, const void* v, const fortran_int_t* incv, + const void* tau, void* c, const fortran_int_t* ldc, void* work ); + +// Value-type variants of larfb +void LAPACK_SLARFB( const char* side, const char* trans, const char* direct, + const char* storev, const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const float* v, const fortran_int_t* ldv, + const float* t, const fortran_int_t* ldt, float* c, + const fortran_int_t* ldc, float* work, const fortran_int_t* ldwork ); +void LAPACK_DLARFB( const char* side, const char* trans, const char* direct, + const char* storev, const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const double* v, const fortran_int_t* ldv, + const double* t, const fortran_int_t* ldt, double* c, + const fortran_int_t* ldc, double* work, const fortran_int_t* ldwork ); +void LAPACK_CLARFB( const char* side, const char* trans, const char* direct, + const char* storev, const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* v, const fortran_int_t* ldv, + const void* t, const fortran_int_t* ldt, void* c, + const fortran_int_t* ldc, void* work, const fortran_int_t* ldwork ); +void LAPACK_ZLARFB( const char* side, const char* trans, const char* direct, + const char* storev, const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* k, const void* v, const fortran_int_t* ldv, + const void* t, const fortran_int_t* ldt, void* c, + const fortran_int_t* ldc, void* work, const fortran_int_t* ldwork ); + +// Value-type variants of larfg +void LAPACK_SLARFG( const fortran_int_t* n, float* alpha, float* x, + const fortran_int_t* incx, float* tau ); +void LAPACK_DLARFG( const fortran_int_t* n, double* alpha, double* x, + const fortran_int_t* incx, double* tau ); +void LAPACK_CLARFG( const fortran_int_t* n, void* alpha, void* x, + const fortran_int_t* incx, void* tau ); +void LAPACK_ZLARFG( const fortran_int_t* n, void* alpha, void* x, + const fortran_int_t* incx, void* tau ); + +// Value-type variants of larft +void LAPACK_SLARFT( const char* direct, const char* storev, + const fortran_int_t* n, const fortran_int_t* k, float* v, + const fortran_int_t* ldv, const float* tau, float* t, + const fortran_int_t* ldt ); +void LAPACK_DLARFT( const char* direct, const char* storev, + const fortran_int_t* n, const fortran_int_t* k, double* v, + const fortran_int_t* ldv, const double* tau, double* t, + const fortran_int_t* ldt ); +void LAPACK_CLARFT( const char* direct, const char* storev, + const fortran_int_t* n, const fortran_int_t* k, void* v, + const fortran_int_t* ldv, const void* tau, void* t, + const fortran_int_t* ldt ); +void LAPACK_ZLARFT( const char* direct, const char* storev, + const fortran_int_t* n, const fortran_int_t* k, void* v, + const fortran_int_t* ldv, const void* tau, void* t, + const fortran_int_t* ldt ); + +// Value-type variants of larfx +void LAPACK_SLARFX( const char* side, const fortran_int_t* m, + const fortran_int_t* n, const float* v, const float* tau, float* c, + const fortran_int_t* ldc, float* work ); +void LAPACK_DLARFX( const char* side, const fortran_int_t* m, + const fortran_int_t* n, const double* v, const double* tau, double* c, + const fortran_int_t* ldc, double* work ); +void LAPACK_CLARFX( const char* side, const fortran_int_t* m, + const fortran_int_t* n, const void* v, const void* tau, void* c, + const fortran_int_t* ldc, void* work ); +void LAPACK_ZLARFX( const char* side, const fortran_int_t* m, + const fortran_int_t* n, const void* v, const void* tau, void* c, + const fortran_int_t* ldc, void* work ); + +// Value-type variants of largv +void LAPACK_SLARGV( const fortran_int_t* n, float* x, + const fortran_int_t* incx, float* y, const fortran_int_t* incy, + float* c, const fortran_int_t* incc ); +void LAPACK_DLARGV( const fortran_int_t* n, double* x, + const fortran_int_t* incx, double* y, const fortran_int_t* incy, + double* c, const fortran_int_t* incc ); +void LAPACK_CLARGV( const fortran_int_t* n, void* x, + const fortran_int_t* incx, void* y, const fortran_int_t* incy, + float* c, const fortran_int_t* incc ); +void LAPACK_ZLARGV( const fortran_int_t* n, void* x, + const fortran_int_t* incx, void* y, const fortran_int_t* incy, + double* c, const fortran_int_t* incc ); + +// Value-type variants of larnv +void LAPACK_SLARNV( const fortran_int_t* idist, fortran_int_t* iseed, + const fortran_int_t* n, float* x ); +void LAPACK_DLARNV( const fortran_int_t* idist, fortran_int_t* iseed, + const fortran_int_t* n, double* x ); +void LAPACK_CLARNV( const fortran_int_t* idist, fortran_int_t* iseed, + const fortran_int_t* n, void* x ); +void LAPACK_ZLARNV( const fortran_int_t* idist, fortran_int_t* iseed, + const fortran_int_t* n, void* x ); + +// Value-type variants of larrb +void LAPACK_SLARRB( const fortran_int_t* n, const float* d, const float* lld, + const fortran_int_t* ifirst, const fortran_int_t* ilast, + const float* rtol1, const float* rtol2, const fortran_int_t* offset, + float* w, float* wgap, float* werr, float* work, fortran_int_t* iwork, + const float* pivmin, const float* spdiam, const fortran_int_t* twist, + fortran_int_t* info ); +void LAPACK_DLARRB( const fortran_int_t* n, const double* d, + const double* lld, const fortran_int_t* ifirst, + const fortran_int_t* ilast, const double* rtol1, const double* rtol2, + const fortran_int_t* offset, double* w, double* wgap, double* werr, + double* work, fortran_int_t* iwork, const double* pivmin, + const double* spdiam, const fortran_int_t* twist, + fortran_int_t* info ); + +// Value-type variants of larre +void LAPACK_SLARRE( const char* range, const fortran_int_t* n, float* vl, + float* vu, const fortran_int_t* il, const fortran_int_t* iu, float* d, + float* e, float* e2, const float* rtol1, const float* rtol2, + const float* spltol, fortran_int_t* nsplit, fortran_int_t* isplit, + fortran_int_t* m, float* w, float* werr, float* wgap, + fortran_int_t* iblock, fortran_int_t* indexw, float* gers, + float* pivmin, float* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DLARRE( const char* range, const fortran_int_t* n, double* vl, + double* vu, const fortran_int_t* il, const fortran_int_t* iu, + double* d, double* e, double* e2, const double* rtol1, + const double* rtol2, const double* spltol, fortran_int_t* nsplit, + fortran_int_t* isplit, fortran_int_t* m, double* w, double* werr, + double* wgap, fortran_int_t* iblock, fortran_int_t* indexw, + double* gers, double* pivmin, double* work, fortran_int_t* iwork, + fortran_int_t* info ); + +// Value-type variants of langb +void LAPACK_SLANGB( const char* norm, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, const float* ab, + const fortran_int_t* ldab, float* work ); +void LAPACK_DLANGB( const char* norm, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, const double* ab, + const fortran_int_t* ldab, double* work ); +void LAPACK_CLANGB( const char* norm, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, const void* ab, + const fortran_int_t* ldab, float* work ); +void LAPACK_ZLANGB( const char* norm, const fortran_int_t* n, + const fortran_int_t* kl, const fortran_int_t* ku, const void* ab, + const fortran_int_t* ldab, double* work ); + +// Value-type variants of lange +void LAPACK_SLANGE( const char* norm, const fortran_int_t* m, + const fortran_int_t* n, const float* a, const fortran_int_t* lda, + float* work ); +void LAPACK_DLANGE( const char* norm, const fortran_int_t* m, + const fortran_int_t* n, const double* a, const fortran_int_t* lda, + double* work ); +void LAPACK_CLANGE( const char* norm, const fortran_int_t* m, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + float* work ); +void LAPACK_ZLANGE( const char* norm, const fortran_int_t* m, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + double* work ); + +// Value-type variants of lanhb +void LAPACK_CLANHB( const char* norm, const char* uplo, + const fortran_int_t* n, const fortran_int_t* k, const void* ab, + const fortran_int_t* ldab, float* work ); +void LAPACK_ZLANHB( const char* norm, const char* uplo, + const fortran_int_t* n, const fortran_int_t* k, const void* ab, + const fortran_int_t* ldab, double* work ); + +// Value-type variants of lanhe +void LAPACK_CLANHE( const char* norm, const char* uplo, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + float* work ); +void LAPACK_ZLANHE( const char* norm, const char* uplo, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + double* work ); + +// Value-type variants of lanhp +void LAPACK_CLANHP( const char* norm, const char* uplo, + const fortran_int_t* n, const void* ap, float* work ); +void LAPACK_ZLANHP( const char* norm, const char* uplo, + const fortran_int_t* n, const void* ap, double* work ); + +// Value-type variants of lanhs +void LAPACK_SLANHS( const char* norm, const fortran_int_t* n, const float* a, + const fortran_int_t* lda, float* work ); +void LAPACK_DLANHS( const char* norm, const fortran_int_t* n, const double* a, + const fortran_int_t* lda, double* work ); +void LAPACK_CLANHS( const char* norm, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, float* work ); +void LAPACK_ZLANHS( const char* norm, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, double* work ); + +// Value-type variants of lansb +void LAPACK_SLANSB( const char* norm, const char* uplo, + const fortran_int_t* n, const fortran_int_t* k, const float* ab, + const fortran_int_t* ldab, float* work ); +void LAPACK_DLANSB( const char* norm, const char* uplo, + const fortran_int_t* n, const fortran_int_t* k, const double* ab, + const fortran_int_t* ldab, double* work ); +void LAPACK_CLANSB( const char* norm, const char* uplo, + const fortran_int_t* n, const fortran_int_t* k, const void* ab, + const fortran_int_t* ldab, float* work ); +void LAPACK_ZLANSB( const char* norm, const char* uplo, + const fortran_int_t* n, const fortran_int_t* k, const void* ab, + const fortran_int_t* ldab, double* work ); + +// Value-type variants of lansp +void LAPACK_SLANSP( const char* norm, const char* uplo, + const fortran_int_t* n, const float* ap, float* work ); +void LAPACK_DLANSP( const char* norm, const char* uplo, + const fortran_int_t* n, const double* ap, double* work ); +void LAPACK_CLANSP( const char* norm, const char* uplo, + const fortran_int_t* n, const void* ap, float* work ); +void LAPACK_ZLANSP( const char* norm, const char* uplo, + const fortran_int_t* n, const void* ap, double* work ); + +// Value-type variants of lansy +void LAPACK_SLANSY( const char* norm, const char* uplo, + const fortran_int_t* n, const float* a, const fortran_int_t* lda, + float* work ); +void LAPACK_DLANSY( const char* norm, const char* uplo, + const fortran_int_t* n, const double* a, const fortran_int_t* lda, + double* work ); +void LAPACK_CLANSY( const char* norm, const char* uplo, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + float* work ); +void LAPACK_ZLANSY( const char* norm, const char* uplo, + const fortran_int_t* n, const void* a, const fortran_int_t* lda, + double* work ); + +// Value-type variants of lantb +void LAPACK_SLANTB( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const fortran_int_t* k, const float* ab, + const fortran_int_t* ldab, float* work ); +void LAPACK_DLANTB( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const fortran_int_t* k, const double* ab, + const fortran_int_t* ldab, double* work ); +void LAPACK_CLANTB( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const fortran_int_t* k, const void* ab, + const fortran_int_t* ldab, float* work ); +void LAPACK_ZLANTB( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const fortran_int_t* k, const void* ab, + const fortran_int_t* ldab, double* work ); + +// Value-type variants of lantp +void LAPACK_SLANTP( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const float* ap, float* work ); +void LAPACK_DLANTP( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const double* ap, double* work ); +void LAPACK_CLANTP( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const void* ap, float* work ); +void LAPACK_ZLANTP( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* n, const void* ap, double* work ); + +// Value-type variants of lantr +void LAPACK_SLANTR( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* m, const fortran_int_t* n, const float* a, + const fortran_int_t* lda, float* work ); +void LAPACK_DLANTR( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* m, const fortran_int_t* n, const double* a, + const fortran_int_t* lda, double* work ); +void LAPACK_CLANTR( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* m, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, float* work ); +void LAPACK_ZLANTR( const char* norm, const char* uplo, const char* diag, + const fortran_int_t* m, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, double* work ); + +// Value-type variants of labrd +void LAPACK_SLABRD( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nb, float* a, const fortran_int_t* lda, float* d, + float* e, float* tauq, float* taup, float* x, + const fortran_int_t* ldx, float* y, const fortran_int_t* ldy ); +void LAPACK_DLABRD( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nb, double* a, const fortran_int_t* lda, + double* d, double* e, double* tauq, double* taup, double* x, + const fortran_int_t* ldx, double* y, const fortran_int_t* ldy ); +void LAPACK_CLABRD( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nb, void* a, const fortran_int_t* lda, float* d, + float* e, void* tauq, void* taup, void* x, const fortran_int_t* ldx, + void* y, const fortran_int_t* ldy ); +void LAPACK_ZLABRD( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* nb, void* a, const fortran_int_t* lda, double* d, + double* e, void* tauq, void* taup, void* x, const fortran_int_t* ldx, + void* y, const fortran_int_t* ldy ); + +// Value-type variants of lacgv +void LAPACK_CLACGV( const fortran_int_t* n, void* x, + const fortran_int_t* incx ); +void LAPACK_ZLACGV( const fortran_int_t* n, void* x, + const fortran_int_t* incx ); + +// Value-type variants of lacon +void LAPACK_SLACON( const fortran_int_t* n, float* v, float* x, + fortran_int_t* isgn, float* est, fortran_int_t* kase ); +void LAPACK_DLACON( const fortran_int_t* n, double* v, double* x, + fortran_int_t* isgn, double* est, fortran_int_t* kase ); +void LAPACK_CLACON( const fortran_int_t* n, void* v, void* x, float* est, + fortran_int_t* kase ); +void LAPACK_ZLACON( const fortran_int_t* n, void* v, void* x, double* est, + fortran_int_t* kase ); + +// Value-type variants of laebz +void LAPACK_SLAEBZ( const fortran_int_t* ijob, const fortran_int_t* nitmax, + const fortran_int_t* n, const fortran_int_t* mmax, + const fortran_int_t* minp, const fortran_int_t* nbmin, + const float* abstol, const float* reltol, const float* pivmin, + const float* d, const float* e, const float* e2, fortran_int_t* nval, + float* ab, float* c, fortran_int_t* mout, fortran_int_t* nab, + float* work, fortran_int_t* iwork, fortran_int_t* info ); +void LAPACK_DLAEBZ( const fortran_int_t* ijob, const fortran_int_t* nitmax, + const fortran_int_t* n, const fortran_int_t* mmax, + const fortran_int_t* minp, const fortran_int_t* nbmin, + const double* abstol, const double* reltol, const double* pivmin, + const double* d, const double* e, const double* e2, + fortran_int_t* nval, double* ab, double* c, fortran_int_t* mout, + fortran_int_t* nab, double* work, fortran_int_t* iwork, + fortran_int_t* info ); + +// Value-type variants of lalsd +void LAPACK_SLALSD( const char* uplo, const fortran_int_t* smlsiz, + const fortran_int_t* n, const fortran_int_t* nrhs, float* d, float* e, + float* b, const fortran_int_t* ldb, const float* rcond, + fortran_int_t* rank, float* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_DLALSD( const char* uplo, const fortran_int_t* smlsiz, + const fortran_int_t* n, const fortran_int_t* nrhs, double* d, + double* e, double* b, const fortran_int_t* ldb, const double* rcond, + fortran_int_t* rank, double* work, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_CLALSD( const char* uplo, const fortran_int_t* smlsiz, + const fortran_int_t* n, const fortran_int_t* nrhs, float* d, float* e, + void* b, const fortran_int_t* ldb, const float* rcond, + fortran_int_t* rank, void* work, float* rwork, fortran_int_t* iwork, + fortran_int_t* info ); +void LAPACK_ZLALSD( const char* uplo, const fortran_int_t* smlsiz, + const fortran_int_t* n, const fortran_int_t* nrhs, double* d, + double* e, void* b, const fortran_int_t* ldb, const double* rcond, + fortran_int_t* rank, void* work, double* rwork, fortran_int_t* iwork, + fortran_int_t* info ); + +// Value-type variants of largv +void LAPACK_SLARGV( const fortran_int_t* n, float* x, + const fortran_int_t* incx, float* y, const fortran_int_t* incy, + float* c, const fortran_int_t* incc ); +void LAPACK_DLARGV( const fortran_int_t* n, double* x, + const fortran_int_t* incx, double* y, const fortran_int_t* incy, + double* c, const fortran_int_t* incc ); +void LAPACK_CLARGV( const fortran_int_t* n, void* x, + const fortran_int_t* incx, void* y, const fortran_int_t* incy, + float* c, const fortran_int_t* incc ); +void LAPACK_ZLARGV( const fortran_int_t* n, void* x, + const fortran_int_t* incx, void* y, const fortran_int_t* incy, + double* c, const fortran_int_t* incc ); + +// Value-type variants of larz +void LAPACK_SLARZ( const char* side, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* l, const float* v, + const fortran_int_t* incv, const float* tau, float* c, + const fortran_int_t* ldc, float* work ); +void LAPACK_DLARZ( const char* side, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* l, const double* v, + const fortran_int_t* incv, const double* tau, double* c, + const fortran_int_t* ldc, double* work ); +void LAPACK_CLARZ( const char* side, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* l, const void* v, + const fortran_int_t* incv, const void* tau, void* c, + const fortran_int_t* ldc, void* work ); +void LAPACK_ZLARZ( const char* side, const fortran_int_t* m, + const fortran_int_t* n, const fortran_int_t* l, const void* v, + const fortran_int_t* incv, const void* tau, void* c, + const fortran_int_t* ldc, void* work ); + +// Value-type variants of latrd +void LAPACK_SLATRD( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nb, float* a, const fortran_int_t* lda, float* e, + float* tau, float* w, const fortran_int_t* ldw ); +void LAPACK_DLATRD( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nb, double* a, const fortran_int_t* lda, + double* e, double* tau, double* w, const fortran_int_t* ldw ); +void LAPACK_CLATRD( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nb, void* a, const fortran_int_t* lda, float* e, + void* tau, void* w, const fortran_int_t* ldw ); +void LAPACK_ZLATRD( const char* uplo, const fortran_int_t* n, + const fortran_int_t* nb, void* a, const fortran_int_t* lda, double* e, + void* tau, void* w, const fortran_int_t* ldw ); + +// Value-type variants of latrs +void LAPACK_SLATRS( const char* uplo, const char* trans, const char* diag, + const char* normin, const fortran_int_t* n, const float* a, + const fortran_int_t* lda, float* x, float* scale, float* cnorm, + fortran_int_t* info ); +void LAPACK_DLATRS( const char* uplo, const char* trans, const char* diag, + const char* normin, const fortran_int_t* n, const double* a, + const fortran_int_t* lda, double* x, double* scale, double* cnorm, + fortran_int_t* info ); +void LAPACK_CLATRS( const char* uplo, const char* trans, const char* diag, + const char* normin, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, void* x, float* scale, float* cnorm, + fortran_int_t* info ); +void LAPACK_ZLATRS( const char* uplo, const char* trans, const char* diag, + const char* normin, const fortran_int_t* n, const void* a, + const fortran_int_t* lda, void* x, double* scale, double* cnorm, + fortran_int_t* info ); + +// Value-type variants of latrz +void LAPACK_SLATRZ( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* l, float* a, const fortran_int_t* lda, + float* tau, float* work ); +void LAPACK_DLATRZ( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* l, double* a, const fortran_int_t* lda, + double* tau, double* work ); +void LAPACK_CLATRZ( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* l, void* a, const fortran_int_t* lda, void* tau, + void* work ); +void LAPACK_ZLATRZ( const fortran_int_t* m, const fortran_int_t* n, + const fortran_int_t* l, void* a, const fortran_int_t* lda, void* tau, + void* work ); + +// +// LAPACK auxiliary routines +// + +fortran_int_t LAPACK_ILAENV(const fortran_int_t* ispec, const char* name, + const char* opt, const fortran_int_t* n1, const fortran_int_t* n2, + const fortran_int_t* n3, const fortran_int_t* n4, fortran_int_t, + fortran_int_t); + +} + +#endif + diff --git a/sdk/boost/numeric/bindings/lapack/detail/lapack_names.h b/sdk/boost/numeric/bindings/lapack/detail/lapack_names.h new file mode 100644 index 0000000..c87712f --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/detail/lapack_names.h @@ -0,0 +1,1442 @@ +// +// Copyright (c) 2003--2009 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DETAIL_LAPACK_NAMES_H +#define BOOST_NUMERIC_BINDINGS_LAPACK_DETAIL_LAPACK_NAMES_H + +#include + +// +// LAPACK computational routines +// + +// Value-type variants of hbgst +#define LAPACK_CHBGST FORTRAN_ID2( chbgst, CHBGST ) +#define LAPACK_ZHBGST FORTRAN_ID2( zhbgst, ZHBGST ) + +// Value-type variants of hegst +#define LAPACK_CHEGST FORTRAN_ID2( chegst, CHEGST ) +#define LAPACK_ZHEGST FORTRAN_ID2( zhegst, ZHEGST ) + +// Value-type variants of pbstf +#define LAPACK_SPBSTF FORTRAN_ID2( spbstf, SPBSTF ) +#define LAPACK_DPBSTF FORTRAN_ID2( dpbstf, DPBSTF ) +#define LAPACK_CPBSTF FORTRAN_ID2( cpbstf, CPBSTF ) +#define LAPACK_ZPBSTF FORTRAN_ID2( zpbstf, ZPBSTF ) + +// Value-type variants of sbgst +#define LAPACK_SSBGST FORTRAN_ID2( ssbgst, SSBGST ) +#define LAPACK_DSBGST FORTRAN_ID2( dsbgst, DSBGST ) + +// Value-type variants of sygst +#define LAPACK_SSYGST FORTRAN_ID2( ssygst, SSYGST ) +#define LAPACK_DSYGST FORTRAN_ID2( dsygst, DSYGST ) + +// Value-type variants of ggqrf +#define LAPACK_SGGQRF FORTRAN_ID2( sggqrf, SGGQRF ) +#define LAPACK_DGGQRF FORTRAN_ID2( dggqrf, DGGQRF ) +#define LAPACK_CGGQRF FORTRAN_ID2( cggqrf, CGGQRF ) +#define LAPACK_ZGGQRF FORTRAN_ID2( zggqrf, ZGGQRF ) + +// Value-type variants of ggrqf +#define LAPACK_SGGRQF FORTRAN_ID2( sggrqf, SGGRQF ) +#define LAPACK_DGGRQF FORTRAN_ID2( dggrqf, DGGRQF ) +#define LAPACK_CGGRQF FORTRAN_ID2( cggrqf, CGGRQF ) +#define LAPACK_ZGGRQF FORTRAN_ID2( zggrqf, ZGGRQF ) + +// Value-type variants of gelqf +#define LAPACK_SGELQF FORTRAN_ID2( sgelqf, SGELQF ) +#define LAPACK_DGELQF FORTRAN_ID2( dgelqf, DGELQF ) +#define LAPACK_CGELQF FORTRAN_ID2( cgelqf, CGELQF ) +#define LAPACK_ZGELQF FORTRAN_ID2( zgelqf, ZGELQF ) + +// Value-type variants of geqlf +#define LAPACK_SGEQLF FORTRAN_ID2( sgeqlf, SGEQLF ) +#define LAPACK_DGEQLF FORTRAN_ID2( dgeqlf, DGEQLF ) +#define LAPACK_CGEQLF FORTRAN_ID2( cgeqlf, CGEQLF ) +#define LAPACK_ZGEQLF FORTRAN_ID2( zgeqlf, ZGEQLF ) + +// Value-type variants of geqp3 +#define LAPACK_SGEQP3 FORTRAN_ID2( sgeqp3, SGEQP3 ) +#define LAPACK_DGEQP3 FORTRAN_ID2( dgeqp3, DGEQP3 ) +#define LAPACK_CGEQP3 FORTRAN_ID2( cgeqp3, CGEQP3 ) +#define LAPACK_ZGEQP3 FORTRAN_ID2( zgeqp3, ZGEQP3 ) + +// Value-type variants of geqrf +#define LAPACK_SGEQRF FORTRAN_ID2( sgeqrf, SGEQRF ) +#define LAPACK_DGEQRF FORTRAN_ID2( dgeqrf, DGEQRF ) +#define LAPACK_CGEQRF FORTRAN_ID2( cgeqrf, CGEQRF ) +#define LAPACK_ZGEQRF FORTRAN_ID2( zgeqrf, ZGEQRF ) + +// Value-type variants of gerqf +#define LAPACK_SGERQF FORTRAN_ID2( sgerqf, SGERQF ) +#define LAPACK_DGERQF FORTRAN_ID2( dgerqf, DGERQF ) +#define LAPACK_CGERQF FORTRAN_ID2( cgerqf, CGERQF ) +#define LAPACK_ZGERQF FORTRAN_ID2( zgerqf, ZGERQF ) + +// Value-type variants of orglq +#define LAPACK_SORGLQ FORTRAN_ID2( sorglq, SORGLQ ) +#define LAPACK_DORGLQ FORTRAN_ID2( dorglq, DORGLQ ) + +// Value-type variants of orgql +#define LAPACK_SORGQL FORTRAN_ID2( sorgql, SORGQL ) +#define LAPACK_DORGQL FORTRAN_ID2( dorgql, DORGQL ) + +// Value-type variants of orgqr +#define LAPACK_SORGQR FORTRAN_ID2( sorgqr, SORGQR ) +#define LAPACK_DORGQR FORTRAN_ID2( dorgqr, DORGQR ) + +// Value-type variants of orgrq +#define LAPACK_SORGRQ FORTRAN_ID2( sorgrq, SORGRQ ) +#define LAPACK_DORGRQ FORTRAN_ID2( dorgrq, DORGRQ ) + +// Value-type variants of ormlq +#define LAPACK_SORMLQ FORTRAN_ID2( sormlq, SORMLQ ) +#define LAPACK_DORMLQ FORTRAN_ID2( dormlq, DORMLQ ) + +// Value-type variants of ormql +#define LAPACK_SORMQL FORTRAN_ID2( sormql, SORMQL ) +#define LAPACK_DORMQL FORTRAN_ID2( dormql, DORMQL ) + +// Value-type variants of ormqr +#define LAPACK_SORMQR FORTRAN_ID2( sormqr, SORMQR ) +#define LAPACK_DORMQR FORTRAN_ID2( dormqr, DORMQR ) + +// Value-type variants of ormrq +#define LAPACK_SORMRQ FORTRAN_ID2( sormrq, SORMRQ ) +#define LAPACK_DORMRQ FORTRAN_ID2( dormrq, DORMRQ ) + +// Value-type variants of ormrz +#define LAPACK_SORMRZ FORTRAN_ID2( sormrz, SORMRZ ) +#define LAPACK_DORMRZ FORTRAN_ID2( dormrz, DORMRZ ) + +// Value-type variants of tzrzf +#define LAPACK_STZRZF FORTRAN_ID2( stzrzf, STZRZF ) +#define LAPACK_DTZRZF FORTRAN_ID2( dtzrzf, DTZRZF ) +#define LAPACK_CTZRZF FORTRAN_ID2( ctzrzf, CTZRZF ) +#define LAPACK_ZTZRZF FORTRAN_ID2( ztzrzf, ZTZRZF ) + +// Value-type variants of unglq +#define LAPACK_CUNGLQ FORTRAN_ID2( cunglq, CUNGLQ ) +#define LAPACK_ZUNGLQ FORTRAN_ID2( zunglq, ZUNGLQ ) + +// Value-type variants of ungql +#define LAPACK_CUNGQL FORTRAN_ID2( cungql, CUNGQL ) +#define LAPACK_ZUNGQL FORTRAN_ID2( zungql, ZUNGQL ) + +// Value-type variants of ungqr +#define LAPACK_CUNGQR FORTRAN_ID2( cungqr, CUNGQR ) +#define LAPACK_ZUNGQR FORTRAN_ID2( zungqr, ZUNGQR ) + +// Value-type variants of ungrq +#define LAPACK_CUNGRQ FORTRAN_ID2( cungrq, CUNGRQ ) +#define LAPACK_ZUNGRQ FORTRAN_ID2( zungrq, ZUNGRQ ) + +// Value-type variants of unmlq +#define LAPACK_CUNMLQ FORTRAN_ID2( cunmlq, CUNMLQ ) +#define LAPACK_ZUNMLQ FORTRAN_ID2( zunmlq, ZUNMLQ ) + +// Value-type variants of unmql +#define LAPACK_CUNMQL FORTRAN_ID2( cunmql, CUNMQL ) +#define LAPACK_ZUNMQL FORTRAN_ID2( zunmql, ZUNMQL ) + +// Value-type variants of unmqr +#define LAPACK_CUNMQR FORTRAN_ID2( cunmqr, CUNMQR ) +#define LAPACK_ZUNMQR FORTRAN_ID2( zunmqr, ZUNMQR ) + +// Value-type variants of unmrq +#define LAPACK_CUNMRQ FORTRAN_ID2( cunmrq, CUNMRQ ) +#define LAPACK_ZUNMRQ FORTRAN_ID2( zunmrq, ZUNMRQ ) + +// Value-type variants of unmrz +#define LAPACK_CUNMRZ FORTRAN_ID2( cunmrz, CUNMRZ ) +#define LAPACK_ZUNMRZ FORTRAN_ID2( zunmrz, ZUNMRZ ) + +// Value-type variants of bdsdc +#define LAPACK_SBDSDC FORTRAN_ID2( sbdsdc, SBDSDC ) +#define LAPACK_DBDSDC FORTRAN_ID2( dbdsdc, DBDSDC ) + +// Value-type variants of bdsqr +#define LAPACK_SBDSQR FORTRAN_ID2( sbdsqr, SBDSQR ) +#define LAPACK_DBDSQR FORTRAN_ID2( dbdsqr, DBDSQR ) +#define LAPACK_CBDSQR FORTRAN_ID2( cbdsqr, CBDSQR ) +#define LAPACK_ZBDSQR FORTRAN_ID2( zbdsqr, ZBDSQR ) + +// Value-type variants of gbbrd +#define LAPACK_SGBBRD FORTRAN_ID2( sgbbrd, SGBBRD ) +#define LAPACK_DGBBRD FORTRAN_ID2( dgbbrd, DGBBRD ) +#define LAPACK_CGBBRD FORTRAN_ID2( cgbbrd, CGBBRD ) +#define LAPACK_ZGBBRD FORTRAN_ID2( zgbbrd, ZGBBRD ) + +// Value-type variants of gebrd +#define LAPACK_SGEBRD FORTRAN_ID2( sgebrd, SGEBRD ) +#define LAPACK_DGEBRD FORTRAN_ID2( dgebrd, DGEBRD ) +#define LAPACK_CGEBRD FORTRAN_ID2( cgebrd, CGEBRD ) +#define LAPACK_ZGEBRD FORTRAN_ID2( zgebrd, ZGEBRD ) + +// Value-type variants of orgbr +#define LAPACK_SORGBR FORTRAN_ID2( sorgbr, SORGBR ) +#define LAPACK_DORGBR FORTRAN_ID2( dorgbr, DORGBR ) + +// Value-type variants of ormbr +#define LAPACK_SORMBR FORTRAN_ID2( sormbr, SORMBR ) +#define LAPACK_DORMBR FORTRAN_ID2( dormbr, DORMBR ) + +// Value-type variants of ungbr +#define LAPACK_CUNGBR FORTRAN_ID2( cungbr, CUNGBR ) +#define LAPACK_ZUNGBR FORTRAN_ID2( zungbr, ZUNGBR ) + +// Value-type variants of unmbr +#define LAPACK_CUNMBR FORTRAN_ID2( cunmbr, CUNMBR ) +#define LAPACK_ZUNMBR FORTRAN_ID2( zunmbr, ZUNMBR ) + +// Value-type variants of gebak +#define LAPACK_SGEBAK FORTRAN_ID2( sgebak, SGEBAK ) +#define LAPACK_DGEBAK FORTRAN_ID2( dgebak, DGEBAK ) +#define LAPACK_CGEBAK FORTRAN_ID2( cgebak, CGEBAK ) +#define LAPACK_ZGEBAK FORTRAN_ID2( zgebak, ZGEBAK ) + +// Value-type variants of gebal +#define LAPACK_SGEBAL FORTRAN_ID2( sgebal, SGEBAL ) +#define LAPACK_DGEBAL FORTRAN_ID2( dgebal, DGEBAL ) +#define LAPACK_CGEBAL FORTRAN_ID2( cgebal, CGEBAL ) +#define LAPACK_ZGEBAL FORTRAN_ID2( zgebal, ZGEBAL ) + +// Value-type variants of gehrd +#define LAPACK_SGEHRD FORTRAN_ID2( sgehrd, SGEHRD ) +#define LAPACK_DGEHRD FORTRAN_ID2( dgehrd, DGEHRD ) +#define LAPACK_CGEHRD FORTRAN_ID2( cgehrd, CGEHRD ) +#define LAPACK_ZGEHRD FORTRAN_ID2( zgehrd, ZGEHRD ) + +// Value-type variants of hsein +#define LAPACK_SHSEIN FORTRAN_ID2( shsein, SHSEIN ) +#define LAPACK_DHSEIN FORTRAN_ID2( dhsein, DHSEIN ) +#define LAPACK_CHSEIN FORTRAN_ID2( chsein, CHSEIN ) +#define LAPACK_ZHSEIN FORTRAN_ID2( zhsein, ZHSEIN ) + +// Value-type variants of hseqr +#define LAPACK_SHSEQR FORTRAN_ID2( shseqr, SHSEQR ) +#define LAPACK_DHSEQR FORTRAN_ID2( dhseqr, DHSEQR ) +#define LAPACK_CHSEQR FORTRAN_ID2( chseqr, CHSEQR ) +#define LAPACK_ZHSEQR FORTRAN_ID2( zhseqr, ZHSEQR ) + +// Value-type variants of orghr +#define LAPACK_SORGHR FORTRAN_ID2( sorghr, SORGHR ) +#define LAPACK_DORGHR FORTRAN_ID2( dorghr, DORGHR ) + +// Value-type variants of ormhr +#define LAPACK_SORMHR FORTRAN_ID2( sormhr, SORMHR ) +#define LAPACK_DORMHR FORTRAN_ID2( dormhr, DORMHR ) + +// Value-type variants of trevc +#define LAPACK_STREVC FORTRAN_ID2( strevc, STREVC ) +#define LAPACK_DTREVC FORTRAN_ID2( dtrevc, DTREVC ) +#define LAPACK_CTREVC FORTRAN_ID2( ctrevc, CTREVC ) +#define LAPACK_ZTREVC FORTRAN_ID2( ztrevc, ZTREVC ) + +// Value-type variants of trexc +#define LAPACK_STREXC FORTRAN_ID2( strexc, STREXC ) +#define LAPACK_DTREXC FORTRAN_ID2( dtrexc, DTREXC ) +#define LAPACK_CTREXC FORTRAN_ID2( ctrexc, CTREXC ) +#define LAPACK_ZTREXC FORTRAN_ID2( ztrexc, ZTREXC ) + +// Value-type variants of trsen +#define LAPACK_CTRSEN FORTRAN_ID2( ctrsen, CTRSEN ) +#define LAPACK_ZTRSEN FORTRAN_ID2( ztrsen, ZTRSEN ) + +// Value-type variants of trsna +#define LAPACK_STRSNA FORTRAN_ID2( strsna, STRSNA ) +#define LAPACK_DTRSNA FORTRAN_ID2( dtrsna, DTRSNA ) +#define LAPACK_CTRSNA FORTRAN_ID2( ctrsna, CTRSNA ) +#define LAPACK_ZTRSNA FORTRAN_ID2( ztrsna, ZTRSNA ) + +// Value-type variants of trsyl +#define LAPACK_STRSYL FORTRAN_ID2( strsyl, STRSYL ) +#define LAPACK_DTRSYL FORTRAN_ID2( dtrsyl, DTRSYL ) +#define LAPACK_CTRSYL FORTRAN_ID2( ctrsyl, CTRSYL ) +#define LAPACK_ZTRSYL FORTRAN_ID2( ztrsyl, ZTRSYL ) + +// Value-type variants of unghr +#define LAPACK_CUNGHR FORTRAN_ID2( cunghr, CUNGHR ) +#define LAPACK_ZUNGHR FORTRAN_ID2( zunghr, ZUNGHR ) + +// Value-type variants of unmhr +#define LAPACK_CUNMHR FORTRAN_ID2( cunmhr, CUNMHR ) +#define LAPACK_ZUNMHR FORTRAN_ID2( zunmhr, ZUNMHR ) + +// Value-type variants of gbcon +#define LAPACK_SGBCON FORTRAN_ID2( sgbcon, SGBCON ) +#define LAPACK_DGBCON FORTRAN_ID2( dgbcon, DGBCON ) +#define LAPACK_CGBCON FORTRAN_ID2( cgbcon, CGBCON ) +#define LAPACK_ZGBCON FORTRAN_ID2( zgbcon, ZGBCON ) + +// Value-type variants of gbequ +#define LAPACK_SGBEQU FORTRAN_ID2( sgbequ, SGBEQU ) +#define LAPACK_DGBEQU FORTRAN_ID2( dgbequ, DGBEQU ) +#define LAPACK_CGBEQU FORTRAN_ID2( cgbequ, CGBEQU ) +#define LAPACK_ZGBEQU FORTRAN_ID2( zgbequ, ZGBEQU ) + +// Value-type variants of gbrfs +#define LAPACK_SGBRFS FORTRAN_ID2( sgbrfs, SGBRFS ) +#define LAPACK_DGBRFS FORTRAN_ID2( dgbrfs, DGBRFS ) +#define LAPACK_CGBRFS FORTRAN_ID2( cgbrfs, CGBRFS ) +#define LAPACK_ZGBRFS FORTRAN_ID2( zgbrfs, ZGBRFS ) + +// Value-type variants of gbtrf +#define LAPACK_SGBTRF FORTRAN_ID2( sgbtrf, SGBTRF ) +#define LAPACK_DGBTRF FORTRAN_ID2( dgbtrf, DGBTRF ) +#define LAPACK_CGBTRF FORTRAN_ID2( cgbtrf, CGBTRF ) +#define LAPACK_ZGBTRF FORTRAN_ID2( zgbtrf, ZGBTRF ) + +// Value-type variants of gbtrs +#define LAPACK_SGBTRS FORTRAN_ID2( sgbtrs, SGBTRS ) +#define LAPACK_DGBTRS FORTRAN_ID2( dgbtrs, DGBTRS ) +#define LAPACK_CGBTRS FORTRAN_ID2( cgbtrs, CGBTRS ) +#define LAPACK_ZGBTRS FORTRAN_ID2( zgbtrs, ZGBTRS ) + +// Value-type variants of gecon +#define LAPACK_SGECON FORTRAN_ID2( sgecon, SGECON ) +#define LAPACK_DGECON FORTRAN_ID2( dgecon, DGECON ) +#define LAPACK_CGECON FORTRAN_ID2( cgecon, CGECON ) +#define LAPACK_ZGECON FORTRAN_ID2( zgecon, ZGECON ) + +// Value-type variants of geequ +#define LAPACK_SGEEQU FORTRAN_ID2( sgeequ, SGEEQU ) +#define LAPACK_DGEEQU FORTRAN_ID2( dgeequ, DGEEQU ) +#define LAPACK_CGEEQU FORTRAN_ID2( cgeequ, CGEEQU ) +#define LAPACK_ZGEEQU FORTRAN_ID2( zgeequ, ZGEEQU ) + +// Value-type variants of gerfs +#define LAPACK_SGERFS FORTRAN_ID2( sgerfs, SGERFS ) +#define LAPACK_DGERFS FORTRAN_ID2( dgerfs, DGERFS ) +#define LAPACK_CGERFS FORTRAN_ID2( cgerfs, CGERFS ) +#define LAPACK_ZGERFS FORTRAN_ID2( zgerfs, ZGERFS ) + +// Value-type variants of getrf +#define LAPACK_SGETRF FORTRAN_ID2( sgetrf, SGETRF ) +#define LAPACK_DGETRF FORTRAN_ID2( dgetrf, DGETRF ) +#define LAPACK_CGETRF FORTRAN_ID2( cgetrf, CGETRF ) +#define LAPACK_ZGETRF FORTRAN_ID2( zgetrf, ZGETRF ) + +// Value-type variants of getri +#define LAPACK_SGETRI FORTRAN_ID2( sgetri, SGETRI ) +#define LAPACK_DGETRI FORTRAN_ID2( dgetri, DGETRI ) +#define LAPACK_CGETRI FORTRAN_ID2( cgetri, CGETRI ) +#define LAPACK_ZGETRI FORTRAN_ID2( zgetri, ZGETRI ) + +// Value-type variants of getrs +#define LAPACK_SGETRS FORTRAN_ID2( sgetrs, SGETRS ) +#define LAPACK_DGETRS FORTRAN_ID2( dgetrs, DGETRS ) +#define LAPACK_CGETRS FORTRAN_ID2( cgetrs, CGETRS ) +#define LAPACK_ZGETRS FORTRAN_ID2( zgetrs, ZGETRS ) + +// Value-type variants of gtrfs +#define LAPACK_SGTRFS FORTRAN_ID2( sgtrfs, SGTRFS ) +#define LAPACK_DGTRFS FORTRAN_ID2( dgtrfs, DGTRFS ) +#define LAPACK_CGTRFS FORTRAN_ID2( cgtrfs, CGTRFS ) +#define LAPACK_ZGTRFS FORTRAN_ID2( zgtrfs, ZGTRFS ) + +// Value-type variants of gttrs +#define LAPACK_SGTTRS FORTRAN_ID2( sgttrs, SGTTRS ) +#define LAPACK_DGTTRS FORTRAN_ID2( dgttrs, DGTTRS ) +#define LAPACK_CGTTRS FORTRAN_ID2( cgttrs, CGTTRS ) +#define LAPACK_ZGTTRS FORTRAN_ID2( zgttrs, ZGTTRS ) + +// Value-type variants of hecon +#define LAPACK_CHECON FORTRAN_ID2( checon, CHECON ) +#define LAPACK_ZHECON FORTRAN_ID2( zhecon, ZHECON ) + +// Value-type variants of herfs +#define LAPACK_CHERFS FORTRAN_ID2( cherfs, CHERFS ) +#define LAPACK_ZHERFS FORTRAN_ID2( zherfs, ZHERFS ) + +// Value-type variants of hetrf +#define LAPACK_CHETRF FORTRAN_ID2( chetrf, CHETRF ) +#define LAPACK_ZHETRF FORTRAN_ID2( zhetrf, ZHETRF ) + +// Value-type variants of hetri +#define LAPACK_CHETRI FORTRAN_ID2( chetri, CHETRI ) +#define LAPACK_ZHETRI FORTRAN_ID2( zhetri, ZHETRI ) + +// Value-type variants of hetrs +#define LAPACK_CHETRS FORTRAN_ID2( chetrs, CHETRS ) +#define LAPACK_ZHETRS FORTRAN_ID2( zhetrs, ZHETRS ) + +// Value-type variants of hpcon +#define LAPACK_CHPCON FORTRAN_ID2( chpcon, CHPCON ) +#define LAPACK_ZHPCON FORTRAN_ID2( zhpcon, ZHPCON ) + +// Value-type variants of hprfs +#define LAPACK_CHPRFS FORTRAN_ID2( chprfs, CHPRFS ) +#define LAPACK_ZHPRFS FORTRAN_ID2( zhprfs, ZHPRFS ) + +// Value-type variants of hptrf +#define LAPACK_CHPTRF FORTRAN_ID2( chptrf, CHPTRF ) +#define LAPACK_ZHPTRF FORTRAN_ID2( zhptrf, ZHPTRF ) + +// Value-type variants of hptri +#define LAPACK_CHPTRI FORTRAN_ID2( chptri, CHPTRI ) +#define LAPACK_ZHPTRI FORTRAN_ID2( zhptri, ZHPTRI ) + +// Value-type variants of hptrs +#define LAPACK_CHPTRS FORTRAN_ID2( chptrs, CHPTRS ) +#define LAPACK_ZHPTRS FORTRAN_ID2( zhptrs, ZHPTRS ) + +// Value-type variants of pbcon +#define LAPACK_SPBCON FORTRAN_ID2( spbcon, SPBCON ) +#define LAPACK_DPBCON FORTRAN_ID2( dpbcon, DPBCON ) +#define LAPACK_CPBCON FORTRAN_ID2( cpbcon, CPBCON ) +#define LAPACK_ZPBCON FORTRAN_ID2( zpbcon, ZPBCON ) + +// Value-type variants of pbequ +#define LAPACK_SPBEQU FORTRAN_ID2( spbequ, SPBEQU ) +#define LAPACK_DPBEQU FORTRAN_ID2( dpbequ, DPBEQU ) +#define LAPACK_CPBEQU FORTRAN_ID2( cpbequ, CPBEQU ) +#define LAPACK_ZPBEQU FORTRAN_ID2( zpbequ, ZPBEQU ) + +// Value-type variants of pbrfs +#define LAPACK_SPBRFS FORTRAN_ID2( spbrfs, SPBRFS ) +#define LAPACK_DPBRFS FORTRAN_ID2( dpbrfs, DPBRFS ) +#define LAPACK_CPBRFS FORTRAN_ID2( cpbrfs, CPBRFS ) +#define LAPACK_ZPBRFS FORTRAN_ID2( zpbrfs, ZPBRFS ) + +// Value-type variants of pbtrf +#define LAPACK_SPBTRF FORTRAN_ID2( spbtrf, SPBTRF ) +#define LAPACK_DPBTRF FORTRAN_ID2( dpbtrf, DPBTRF ) +#define LAPACK_CPBTRF FORTRAN_ID2( cpbtrf, CPBTRF ) +#define LAPACK_ZPBTRF FORTRAN_ID2( zpbtrf, ZPBTRF ) + +// Value-type variants of pbtrs +#define LAPACK_SPBTRS FORTRAN_ID2( spbtrs, SPBTRS ) +#define LAPACK_DPBTRS FORTRAN_ID2( dpbtrs, DPBTRS ) +#define LAPACK_CPBTRS FORTRAN_ID2( cpbtrs, CPBTRS ) +#define LAPACK_ZPBTRS FORTRAN_ID2( zpbtrs, ZPBTRS ) + +// Value-type variants of pftrf +#define LAPACK_SPFTRF FORTRAN_ID2( spftrf, SPFTRF ) +#define LAPACK_DPFTRF FORTRAN_ID2( dpftrf, DPFTRF ) +#define LAPACK_CPFTRF FORTRAN_ID2( cpftrf, CPFTRF ) +#define LAPACK_ZPFTRF FORTRAN_ID2( zpftrf, ZPFTRF ) + +// Value-type variants of pftri +#define LAPACK_SPFTRI FORTRAN_ID2( spftri, SPFTRI ) +#define LAPACK_DPFTRI FORTRAN_ID2( dpftri, DPFTRI ) +#define LAPACK_CPFTRI FORTRAN_ID2( cpftri, CPFTRI ) +#define LAPACK_ZPFTRI FORTRAN_ID2( zpftri, ZPFTRI ) + +// Value-type variants of pftrs +#define LAPACK_SPFTRS FORTRAN_ID2( spftrs, SPFTRS ) +#define LAPACK_DPFTRS FORTRAN_ID2( dpftrs, DPFTRS ) +#define LAPACK_CPFTRS FORTRAN_ID2( cpftrs, CPFTRS ) +#define LAPACK_ZPFTRS FORTRAN_ID2( zpftrs, ZPFTRS ) + +// Value-type variants of pocon +#define LAPACK_SPOCON FORTRAN_ID2( spocon, SPOCON ) +#define LAPACK_DPOCON FORTRAN_ID2( dpocon, DPOCON ) +#define LAPACK_CPOCON FORTRAN_ID2( cpocon, CPOCON ) +#define LAPACK_ZPOCON FORTRAN_ID2( zpocon, ZPOCON ) + +// Value-type variants of poequ +#define LAPACK_SPOEQU FORTRAN_ID2( spoequ, SPOEQU ) +#define LAPACK_DPOEQU FORTRAN_ID2( dpoequ, DPOEQU ) +#define LAPACK_CPOEQU FORTRAN_ID2( cpoequ, CPOEQU ) +#define LAPACK_ZPOEQU FORTRAN_ID2( zpoequ, ZPOEQU ) + +// Value-type variants of porfs +#define LAPACK_SPORFS FORTRAN_ID2( sporfs, SPORFS ) +#define LAPACK_DPORFS FORTRAN_ID2( dporfs, DPORFS ) +#define LAPACK_CPORFS FORTRAN_ID2( cporfs, CPORFS ) +#define LAPACK_ZPORFS FORTRAN_ID2( zporfs, ZPORFS ) + +// Value-type variants of potrf +#define LAPACK_SPOTRF FORTRAN_ID2( spotrf, SPOTRF ) +#define LAPACK_DPOTRF FORTRAN_ID2( dpotrf, DPOTRF ) +#define LAPACK_CPOTRF FORTRAN_ID2( cpotrf, CPOTRF ) +#define LAPACK_ZPOTRF FORTRAN_ID2( zpotrf, ZPOTRF ) + +// Value-type variants of potri +#define LAPACK_SPOTRI FORTRAN_ID2( spotri, SPOTRI ) +#define LAPACK_DPOTRI FORTRAN_ID2( dpotri, DPOTRI ) +#define LAPACK_CPOTRI FORTRAN_ID2( cpotri, CPOTRI ) +#define LAPACK_ZPOTRI FORTRAN_ID2( zpotri, ZPOTRI ) + +// Value-type variants of potrs +#define LAPACK_SPOTRS FORTRAN_ID2( spotrs, SPOTRS ) +#define LAPACK_DPOTRS FORTRAN_ID2( dpotrs, DPOTRS ) +#define LAPACK_CPOTRS FORTRAN_ID2( cpotrs, CPOTRS ) +#define LAPACK_ZPOTRS FORTRAN_ID2( zpotrs, ZPOTRS ) + +// Value-type variants of ppcon +#define LAPACK_SPPCON FORTRAN_ID2( sppcon, SPPCON ) +#define LAPACK_DPPCON FORTRAN_ID2( dppcon, DPPCON ) +#define LAPACK_CPPCON FORTRAN_ID2( cppcon, CPPCON ) +#define LAPACK_ZPPCON FORTRAN_ID2( zppcon, ZPPCON ) + +// Value-type variants of ppequ +#define LAPACK_SPPEQU FORTRAN_ID2( sppequ, SPPEQU ) +#define LAPACK_DPPEQU FORTRAN_ID2( dppequ, DPPEQU ) +#define LAPACK_CPPEQU FORTRAN_ID2( cppequ, CPPEQU ) +#define LAPACK_ZPPEQU FORTRAN_ID2( zppequ, ZPPEQU ) + +// Value-type variants of pprfs +#define LAPACK_SPPRFS FORTRAN_ID2( spprfs, SPPRFS ) +#define LAPACK_DPPRFS FORTRAN_ID2( dpprfs, DPPRFS ) +#define LAPACK_CPPRFS FORTRAN_ID2( cpprfs, CPPRFS ) +#define LAPACK_ZPPRFS FORTRAN_ID2( zpprfs, ZPPRFS ) + +// Value-type variants of pptrf +#define LAPACK_SPPTRF FORTRAN_ID2( spptrf, SPPTRF ) +#define LAPACK_DPPTRF FORTRAN_ID2( dpptrf, DPPTRF ) +#define LAPACK_CPPTRF FORTRAN_ID2( cpptrf, CPPTRF ) +#define LAPACK_ZPPTRF FORTRAN_ID2( zpptrf, ZPPTRF ) + +// Value-type variants of pptri +#define LAPACK_SPPTRI FORTRAN_ID2( spptri, SPPTRI ) +#define LAPACK_DPPTRI FORTRAN_ID2( dpptri, DPPTRI ) +#define LAPACK_CPPTRI FORTRAN_ID2( cpptri, CPPTRI ) +#define LAPACK_ZPPTRI FORTRAN_ID2( zpptri, ZPPTRI ) + +// Value-type variants of pptrs +#define LAPACK_SPPTRS FORTRAN_ID2( spptrs, SPPTRS ) +#define LAPACK_DPPTRS FORTRAN_ID2( dpptrs, DPPTRS ) +#define LAPACK_CPPTRS FORTRAN_ID2( cpptrs, CPPTRS ) +#define LAPACK_ZPPTRS FORTRAN_ID2( zpptrs, ZPPTRS ) + +// Value-type variants of pstrf +#define LAPACK_SPSTRF FORTRAN_ID2( spstrf, SPSTRF ) +#define LAPACK_DPSTRF FORTRAN_ID2( dpstrf, DPSTRF ) +#define LAPACK_CPSTRF FORTRAN_ID2( cpstrf, CPSTRF ) +#define LAPACK_ZPSTRF FORTRAN_ID2( zpstrf, ZPSTRF ) + +// Value-type variants of ptcon +#define LAPACK_SPTCON FORTRAN_ID2( sptcon, SPTCON ) +#define LAPACK_DPTCON FORTRAN_ID2( dptcon, DPTCON ) +#define LAPACK_CPTCON FORTRAN_ID2( cptcon, CPTCON ) +#define LAPACK_ZPTCON FORTRAN_ID2( zptcon, ZPTCON ) + +// Value-type variants of ptrfs +#define LAPACK_SPTRFS FORTRAN_ID2( sptrfs, SPTRFS ) +#define LAPACK_DPTRFS FORTRAN_ID2( dptrfs, DPTRFS ) +#define LAPACK_CPTRFS FORTRAN_ID2( cptrfs, CPTRFS ) +#define LAPACK_ZPTRFS FORTRAN_ID2( zptrfs, ZPTRFS ) + +// Value-type variants of pttrf +#define LAPACK_SPTTRF FORTRAN_ID2( spttrf, SPTTRF ) +#define LAPACK_DPTTRF FORTRAN_ID2( dpttrf, DPTTRF ) +#define LAPACK_CPTTRF FORTRAN_ID2( cpttrf, CPTTRF ) +#define LAPACK_ZPTTRF FORTRAN_ID2( zpttrf, ZPTTRF ) + +// Value-type variants of pttrs +#define LAPACK_SPTTRS FORTRAN_ID2( spttrs, SPTTRS ) +#define LAPACK_DPTTRS FORTRAN_ID2( dpttrs, DPTTRS ) +#define LAPACK_CPTTRS FORTRAN_ID2( cpttrs, CPTTRS ) +#define LAPACK_ZPTTRS FORTRAN_ID2( zpttrs, ZPTTRS ) + +// Value-type variants of spcon +#define LAPACK_SSPCON FORTRAN_ID2( sspcon, SSPCON ) +#define LAPACK_DSPCON FORTRAN_ID2( dspcon, DSPCON ) +#define LAPACK_CSPCON FORTRAN_ID2( cspcon, CSPCON ) +#define LAPACK_ZSPCON FORTRAN_ID2( zspcon, ZSPCON ) + +// Value-type variants of sprfs +#define LAPACK_SSPRFS FORTRAN_ID2( ssprfs, SSPRFS ) +#define LAPACK_DSPRFS FORTRAN_ID2( dsprfs, DSPRFS ) +#define LAPACK_CSPRFS FORTRAN_ID2( csprfs, CSPRFS ) +#define LAPACK_ZSPRFS FORTRAN_ID2( zsprfs, ZSPRFS ) + +// Value-type variants of sptrf +#define LAPACK_SSPTRF FORTRAN_ID2( ssptrf, SSPTRF ) +#define LAPACK_DSPTRF FORTRAN_ID2( dsptrf, DSPTRF ) +#define LAPACK_CSPTRF FORTRAN_ID2( csptrf, CSPTRF ) +#define LAPACK_ZSPTRF FORTRAN_ID2( zsptrf, ZSPTRF ) + +// Value-type variants of sptri +#define LAPACK_SSPTRI FORTRAN_ID2( ssptri, SSPTRI ) +#define LAPACK_DSPTRI FORTRAN_ID2( dsptri, DSPTRI ) +#define LAPACK_CSPTRI FORTRAN_ID2( csptri, CSPTRI ) +#define LAPACK_ZSPTRI FORTRAN_ID2( zsptri, ZSPTRI ) + +// Value-type variants of sptrs +#define LAPACK_SSPTRS FORTRAN_ID2( ssptrs, SSPTRS ) +#define LAPACK_DSPTRS FORTRAN_ID2( dsptrs, DSPTRS ) +#define LAPACK_CSPTRS FORTRAN_ID2( csptrs, CSPTRS ) +#define LAPACK_ZSPTRS FORTRAN_ID2( zsptrs, ZSPTRS ) + +// Value-type variants of sycon +#define LAPACK_SSYCON FORTRAN_ID2( ssycon, SSYCON ) +#define LAPACK_DSYCON FORTRAN_ID2( dsycon, DSYCON ) +#define LAPACK_CSYCON FORTRAN_ID2( csycon, CSYCON ) +#define LAPACK_ZSYCON FORTRAN_ID2( zsycon, ZSYCON ) + +// Value-type variants of syrfs +#define LAPACK_SSYRFS FORTRAN_ID2( ssyrfs, SSYRFS ) +#define LAPACK_DSYRFS FORTRAN_ID2( dsyrfs, DSYRFS ) +#define LAPACK_CSYRFS FORTRAN_ID2( csyrfs, CSYRFS ) +#define LAPACK_ZSYRFS FORTRAN_ID2( zsyrfs, ZSYRFS ) + +// Value-type variants of sytrf +#define LAPACK_SSYTRF FORTRAN_ID2( ssytrf, SSYTRF ) +#define LAPACK_DSYTRF FORTRAN_ID2( dsytrf, DSYTRF ) +#define LAPACK_CSYTRF FORTRAN_ID2( csytrf, CSYTRF ) +#define LAPACK_ZSYTRF FORTRAN_ID2( zsytrf, ZSYTRF ) + +// Value-type variants of sytri +#define LAPACK_SSYTRI FORTRAN_ID2( ssytri, SSYTRI ) +#define LAPACK_DSYTRI FORTRAN_ID2( dsytri, DSYTRI ) +#define LAPACK_CSYTRI FORTRAN_ID2( csytri, CSYTRI ) +#define LAPACK_ZSYTRI FORTRAN_ID2( zsytri, ZSYTRI ) + +// Value-type variants of sytrs +#define LAPACK_SSYTRS FORTRAN_ID2( ssytrs, SSYTRS ) +#define LAPACK_DSYTRS FORTRAN_ID2( dsytrs, DSYTRS ) +#define LAPACK_CSYTRS FORTRAN_ID2( csytrs, CSYTRS ) +#define LAPACK_ZSYTRS FORTRAN_ID2( zsytrs, ZSYTRS ) + +// Value-type variants of tbcon +#define LAPACK_STBCON FORTRAN_ID2( stbcon, STBCON ) +#define LAPACK_DTBCON FORTRAN_ID2( dtbcon, DTBCON ) +#define LAPACK_CTBCON FORTRAN_ID2( ctbcon, CTBCON ) +#define LAPACK_ZTBCON FORTRAN_ID2( ztbcon, ZTBCON ) + +// Value-type variants of tbrfs +#define LAPACK_STBRFS FORTRAN_ID2( stbrfs, STBRFS ) +#define LAPACK_DTBRFS FORTRAN_ID2( dtbrfs, DTBRFS ) +#define LAPACK_CTBRFS FORTRAN_ID2( ctbrfs, CTBRFS ) +#define LAPACK_ZTBRFS FORTRAN_ID2( ztbrfs, ZTBRFS ) + +// Value-type variants of tbtrs +#define LAPACK_STBTRS FORTRAN_ID2( stbtrs, STBTRS ) +#define LAPACK_DTBTRS FORTRAN_ID2( dtbtrs, DTBTRS ) +#define LAPACK_CTBTRS FORTRAN_ID2( ctbtrs, CTBTRS ) +#define LAPACK_ZTBTRS FORTRAN_ID2( ztbtrs, ZTBTRS ) + +// Value-type variants of tftri +#define LAPACK_STFTRI FORTRAN_ID2( stftri, STFTRI ) +#define LAPACK_DTFTRI FORTRAN_ID2( dtftri, DTFTRI ) +#define LAPACK_CTFTRI FORTRAN_ID2( ctftri, CTFTRI ) +#define LAPACK_ZTFTRI FORTRAN_ID2( ztftri, ZTFTRI ) + +// Value-type variants of tpcon +#define LAPACK_STPCON FORTRAN_ID2( stpcon, STPCON ) +#define LAPACK_DTPCON FORTRAN_ID2( dtpcon, DTPCON ) +#define LAPACK_CTPCON FORTRAN_ID2( ctpcon, CTPCON ) +#define LAPACK_ZTPCON FORTRAN_ID2( ztpcon, ZTPCON ) + +// Value-type variants of tprfs +#define LAPACK_STPRFS FORTRAN_ID2( stprfs, STPRFS ) +#define LAPACK_DTPRFS FORTRAN_ID2( dtprfs, DTPRFS ) +#define LAPACK_CTPRFS FORTRAN_ID2( ctprfs, CTPRFS ) +#define LAPACK_ZTPRFS FORTRAN_ID2( ztprfs, ZTPRFS ) + +// Value-type variants of tptri +#define LAPACK_STPTRI FORTRAN_ID2( stptri, STPTRI ) +#define LAPACK_DTPTRI FORTRAN_ID2( dtptri, DTPTRI ) +#define LAPACK_CTPTRI FORTRAN_ID2( ctptri, CTPTRI ) +#define LAPACK_ZTPTRI FORTRAN_ID2( ztptri, ZTPTRI ) + +// Value-type variants of tptrs +#define LAPACK_STPTRS FORTRAN_ID2( stptrs, STPTRS ) +#define LAPACK_DTPTRS FORTRAN_ID2( dtptrs, DTPTRS ) +#define LAPACK_CTPTRS FORTRAN_ID2( ctptrs, CTPTRS ) +#define LAPACK_ZTPTRS FORTRAN_ID2( ztptrs, ZTPTRS ) + +// Value-type variants of trcon +#define LAPACK_STRCON FORTRAN_ID2( strcon, STRCON ) +#define LAPACK_DTRCON FORTRAN_ID2( dtrcon, DTRCON ) +#define LAPACK_CTRCON FORTRAN_ID2( ctrcon, CTRCON ) +#define LAPACK_ZTRCON FORTRAN_ID2( ztrcon, ZTRCON ) + +// Value-type variants of trrfs +#define LAPACK_STRRFS FORTRAN_ID2( strrfs, STRRFS ) +#define LAPACK_DTRRFS FORTRAN_ID2( dtrrfs, DTRRFS ) +#define LAPACK_CTRRFS FORTRAN_ID2( ctrrfs, CTRRFS ) +#define LAPACK_ZTRRFS FORTRAN_ID2( ztrrfs, ZTRRFS ) + +// Value-type variants of trtri +#define LAPACK_STRTRI FORTRAN_ID2( strtri, STRTRI ) +#define LAPACK_DTRTRI FORTRAN_ID2( dtrtri, DTRTRI ) +#define LAPACK_CTRTRI FORTRAN_ID2( ctrtri, CTRTRI ) +#define LAPACK_ZTRTRI FORTRAN_ID2( ztrtri, ZTRTRI ) + +// Value-type variants of trtrs +#define LAPACK_STRTRS FORTRAN_ID2( strtrs, STRTRS ) +#define LAPACK_DTRTRS FORTRAN_ID2( dtrtrs, DTRTRS ) +#define LAPACK_CTRTRS FORTRAN_ID2( ctrtrs, CTRTRS ) +#define LAPACK_ZTRTRS FORTRAN_ID2( ztrtrs, ZTRTRS ) + +// Value-type variants of hbtrd +#define LAPACK_CHBTRD FORTRAN_ID2( chbtrd, CHBTRD ) +#define LAPACK_ZHBTRD FORTRAN_ID2( zhbtrd, ZHBTRD ) + +// Value-type variants of hetrd +#define LAPACK_CHETRD FORTRAN_ID2( chetrd, CHETRD ) +#define LAPACK_ZHETRD FORTRAN_ID2( zhetrd, ZHETRD ) + +// Value-type variants of hptrd +#define LAPACK_CHPTRD FORTRAN_ID2( chptrd, CHPTRD ) +#define LAPACK_ZHPTRD FORTRAN_ID2( zhptrd, ZHPTRD ) + +// Value-type variants of opgtr +#define LAPACK_SOPGTR FORTRAN_ID2( sopgtr, SOPGTR ) +#define LAPACK_DOPGTR FORTRAN_ID2( dopgtr, DOPGTR ) + +// Value-type variants of opmtr +#define LAPACK_SOPMTR FORTRAN_ID2( sopmtr, SOPMTR ) +#define LAPACK_DOPMTR FORTRAN_ID2( dopmtr, DOPMTR ) + +// Value-type variants of orgtr +#define LAPACK_SORGTR FORTRAN_ID2( sorgtr, SORGTR ) +#define LAPACK_DORGTR FORTRAN_ID2( dorgtr, DORGTR ) + +// Value-type variants of ormtr +#define LAPACK_SORMTR FORTRAN_ID2( sormtr, SORMTR ) +#define LAPACK_DORMTR FORTRAN_ID2( dormtr, DORMTR ) + +// Value-type variants of pteqr +#define LAPACK_SPTEQR FORTRAN_ID2( spteqr, SPTEQR ) +#define LAPACK_DPTEQR FORTRAN_ID2( dpteqr, DPTEQR ) +#define LAPACK_CPTEQR FORTRAN_ID2( cpteqr, CPTEQR ) +#define LAPACK_ZPTEQR FORTRAN_ID2( zpteqr, ZPTEQR ) + +// Value-type variants of sbtrd +#define LAPACK_SSBTRD FORTRAN_ID2( ssbtrd, SSBTRD ) +#define LAPACK_DSBTRD FORTRAN_ID2( dsbtrd, DSBTRD ) + +// Value-type variants of sptrd +#define LAPACK_SSPTRD FORTRAN_ID2( ssptrd, SSPTRD ) +#define LAPACK_DSPTRD FORTRAN_ID2( dsptrd, DSPTRD ) + +// Value-type variants of stebz +#define LAPACK_SSTEBZ FORTRAN_ID2( sstebz, SSTEBZ ) +#define LAPACK_DSTEBZ FORTRAN_ID2( dstebz, DSTEBZ ) + +// Value-type variants of stedc +#define LAPACK_SSTEDC FORTRAN_ID2( sstedc, SSTEDC ) +#define LAPACK_DSTEDC FORTRAN_ID2( dstedc, DSTEDC ) +#define LAPACK_CSTEDC FORTRAN_ID2( cstedc, CSTEDC ) +#define LAPACK_ZSTEDC FORTRAN_ID2( zstedc, ZSTEDC ) + +// Value-type variants of stegr +#define LAPACK_SSTEGR FORTRAN_ID2( sstegr, SSTEGR ) +#define LAPACK_DSTEGR FORTRAN_ID2( dstegr, DSTEGR ) +#define LAPACK_CSTEGR FORTRAN_ID2( cstegr, CSTEGR ) +#define LAPACK_ZSTEGR FORTRAN_ID2( zstegr, ZSTEGR ) + +// Value-type variants of stein +#define LAPACK_SSTEIN FORTRAN_ID2( sstein, SSTEIN ) +#define LAPACK_DSTEIN FORTRAN_ID2( dstein, DSTEIN ) +#define LAPACK_CSTEIN FORTRAN_ID2( cstein, CSTEIN ) +#define LAPACK_ZSTEIN FORTRAN_ID2( zstein, ZSTEIN ) + +// Value-type variants of stemr +#define LAPACK_SSTEMR FORTRAN_ID2( sstemr, SSTEMR ) +#define LAPACK_DSTEMR FORTRAN_ID2( dstemr, DSTEMR ) +#define LAPACK_CSTEMR FORTRAN_ID2( cstemr, CSTEMR ) +#define LAPACK_ZSTEMR FORTRAN_ID2( zstemr, ZSTEMR ) + +// Value-type variants of steqr +#define LAPACK_SSTEQR FORTRAN_ID2( ssteqr, SSTEQR ) +#define LAPACK_DSTEQR FORTRAN_ID2( dsteqr, DSTEQR ) +#define LAPACK_CSTEQR FORTRAN_ID2( csteqr, CSTEQR ) +#define LAPACK_ZSTEQR FORTRAN_ID2( zsteqr, ZSTEQR ) + +// Value-type variants of sterf +#define LAPACK_SSTERF FORTRAN_ID2( ssterf, SSTERF ) +#define LAPACK_DSTERF FORTRAN_ID2( dsterf, DSTERF ) + +// Value-type variants of sytrd +#define LAPACK_SSYTRD FORTRAN_ID2( ssytrd, SSYTRD ) +#define LAPACK_DSYTRD FORTRAN_ID2( dsytrd, DSYTRD ) + +// Value-type variants of ungtr +#define LAPACK_CUNGTR FORTRAN_ID2( cungtr, CUNGTR ) +#define LAPACK_ZUNGTR FORTRAN_ID2( zungtr, ZUNGTR ) + +// Value-type variants of unmtr +#define LAPACK_CUNMTR FORTRAN_ID2( cunmtr, CUNMTR ) +#define LAPACK_ZUNMTR FORTRAN_ID2( zunmtr, ZUNMTR ) + +// Value-type variants of upgtr +#define LAPACK_CUPGTR FORTRAN_ID2( cupgtr, CUPGTR ) +#define LAPACK_ZUPGTR FORTRAN_ID2( zupgtr, ZUPGTR ) + +// Value-type variants of upmtr +#define LAPACK_CUPMTR FORTRAN_ID2( cupmtr, CUPMTR ) +#define LAPACK_ZUPMTR FORTRAN_ID2( zupmtr, ZUPMTR ) + +// Value-type variants of ggbak +#define LAPACK_SGGBAK FORTRAN_ID2( sggbak, SGGBAK ) +#define LAPACK_DGGBAK FORTRAN_ID2( dggbak, DGGBAK ) +#define LAPACK_CGGBAK FORTRAN_ID2( cggbak, CGGBAK ) +#define LAPACK_ZGGBAK FORTRAN_ID2( zggbak, ZGGBAK ) + +// Value-type variants of ggbal +#define LAPACK_SGGBAL FORTRAN_ID2( sggbal, SGGBAL ) +#define LAPACK_DGGBAL FORTRAN_ID2( dggbal, DGGBAL ) +#define LAPACK_CGGBAL FORTRAN_ID2( cggbal, CGGBAL ) +#define LAPACK_ZGGBAL FORTRAN_ID2( zggbal, ZGGBAL ) + +// Value-type variants of gghrd +#define LAPACK_SGGHRD FORTRAN_ID2( sgghrd, SGGHRD ) +#define LAPACK_DGGHRD FORTRAN_ID2( dgghrd, DGGHRD ) +#define LAPACK_CGGHRD FORTRAN_ID2( cgghrd, CGGHRD ) +#define LAPACK_ZGGHRD FORTRAN_ID2( zgghrd, ZGGHRD ) + +// Value-type variants of hgeqz +#define LAPACK_SHGEQZ FORTRAN_ID2( shgeqz, SHGEQZ ) +#define LAPACK_DHGEQZ FORTRAN_ID2( dhgeqz, DHGEQZ ) +#define LAPACK_CHGEQZ FORTRAN_ID2( chgeqz, CHGEQZ ) +#define LAPACK_ZHGEQZ FORTRAN_ID2( zhgeqz, ZHGEQZ ) + +// Value-type variants of tgevc +#define LAPACK_STGEVC FORTRAN_ID2( stgevc, STGEVC ) +#define LAPACK_DTGEVC FORTRAN_ID2( dtgevc, DTGEVC ) +#define LAPACK_CTGEVC FORTRAN_ID2( ctgevc, CTGEVC ) +#define LAPACK_ZTGEVC FORTRAN_ID2( ztgevc, ZTGEVC ) + +// Value-type variants of tgexc +#define LAPACK_STGEXC FORTRAN_ID2( stgexc, STGEXC ) +#define LAPACK_DTGEXC FORTRAN_ID2( dtgexc, DTGEXC ) +#define LAPACK_CTGEXC FORTRAN_ID2( ctgexc, CTGEXC ) +#define LAPACK_ZTGEXC FORTRAN_ID2( ztgexc, ZTGEXC ) + +// Value-type variants of tgsen +#define LAPACK_STGSEN FORTRAN_ID2( stgsen, STGSEN ) +#define LAPACK_DTGSEN FORTRAN_ID2( dtgsen, DTGSEN ) +#define LAPACK_CTGSEN FORTRAN_ID2( ctgsen, CTGSEN ) +#define LAPACK_ZTGSEN FORTRAN_ID2( ztgsen, ZTGSEN ) + +// Value-type variants of tgsna +#define LAPACK_STGSNA FORTRAN_ID2( stgsna, STGSNA ) +#define LAPACK_DTGSNA FORTRAN_ID2( dtgsna, DTGSNA ) +#define LAPACK_CTGSNA FORTRAN_ID2( ctgsna, CTGSNA ) +#define LAPACK_ZTGSNA FORTRAN_ID2( ztgsna, ZTGSNA ) + +// Value-type variants of tgsyl +#define LAPACK_STGSYL FORTRAN_ID2( stgsyl, STGSYL ) +#define LAPACK_DTGSYL FORTRAN_ID2( dtgsyl, DTGSYL ) +#define LAPACK_CTGSYL FORTRAN_ID2( ctgsyl, CTGSYL ) +#define LAPACK_ZTGSYL FORTRAN_ID2( ztgsyl, ZTGSYL ) + +// Value-type variants of ggsvp +#define LAPACK_SGGSVP FORTRAN_ID2( sggsvp, SGGSVP ) +#define LAPACK_DGGSVP FORTRAN_ID2( dggsvp, DGGSVP ) +#define LAPACK_CGGSVP FORTRAN_ID2( cggsvp, CGGSVP ) +#define LAPACK_ZGGSVP FORTRAN_ID2( zggsvp, ZGGSVP ) + +// Value-type variants of tgsja +#define LAPACK_STGSJA FORTRAN_ID2( stgsja, STGSJA ) +#define LAPACK_DTGSJA FORTRAN_ID2( dtgsja, DTGSJA ) +#define LAPACK_CTGSJA FORTRAN_ID2( ctgsja, CTGSJA ) +#define LAPACK_ZTGSJA FORTRAN_ID2( ztgsja, ZTGSJA ) + +// +// LAPACK driver routines +// + +// Value-type variants of gegv +#define LAPACK_SGEGV FORTRAN_ID2( sgegv, SGEGV ) +#define LAPACK_DGEGV FORTRAN_ID2( dgegv, DGEGV ) +#define LAPACK_CGEGV FORTRAN_ID2( cgegv, CGEGV ) +#define LAPACK_ZGEGV FORTRAN_ID2( zgegv, ZGEGV ) + +// Value-type variants of gges +#define LAPACK_SGGES FORTRAN_ID2( sgges, SGGES ) +#define LAPACK_DGGES FORTRAN_ID2( dgges, DGGES ) +#define LAPACK_CGGES FORTRAN_ID2( cgges, CGGES ) +#define LAPACK_ZGGES FORTRAN_ID2( zgges, ZGGES ) + +// Value-type variants of ggesx +#define LAPACK_SGGESX FORTRAN_ID2( sggesx, SGGESX ) +#define LAPACK_DGGESX FORTRAN_ID2( dggesx, DGGESX ) +#define LAPACK_CGGESX FORTRAN_ID2( cggesx, CGGESX ) +#define LAPACK_ZGGESX FORTRAN_ID2( zggesx, ZGGESX ) + +// Value-type variants of ggev +#define LAPACK_SGGEV FORTRAN_ID2( sggev, SGGEV ) +#define LAPACK_DGGEV FORTRAN_ID2( dggev, DGGEV ) +#define LAPACK_CGGEV FORTRAN_ID2( cggev, CGGEV ) +#define LAPACK_ZGGEV FORTRAN_ID2( zggev, ZGGEV ) + +// Value-type variants of ggevx +#define LAPACK_SGGEVX FORTRAN_ID2( sggevx, SGGEVX ) +#define LAPACK_DGGEVX FORTRAN_ID2( dggevx, DGGEVX ) +#define LAPACK_CGGEVX FORTRAN_ID2( cggevx, CGGEVX ) +#define LAPACK_ZGGEVX FORTRAN_ID2( zggevx, ZGGEVX ) + +// Value-type variants of ggsvd +#define LAPACK_SGGSVD FORTRAN_ID2( sggsvd, SGGSVD ) +#define LAPACK_DGGSVD FORTRAN_ID2( dggsvd, DGGSVD ) +#define LAPACK_CGGSVD FORTRAN_ID2( cggsvd, CGGSVD ) +#define LAPACK_ZGGSVD FORTRAN_ID2( zggsvd, ZGGSVD ) + +// Value-type variants of hbgv +#define LAPACK_CHBGV FORTRAN_ID2( chbgv, CHBGV ) +#define LAPACK_ZHBGV FORTRAN_ID2( zhbgv, ZHBGV ) + +// Value-type variants of hbgvd +#define LAPACK_CHBGVD FORTRAN_ID2( chbgvd, CHBGVD ) +#define LAPACK_ZHBGVD FORTRAN_ID2( zhbgvd, ZHBGVD ) + +// Value-type variants of hbgvx +#define LAPACK_CHBGVX FORTRAN_ID2( chbgvx, CHBGVX ) +#define LAPACK_ZHBGVX FORTRAN_ID2( zhbgvx, ZHBGVX ) + +// Value-type variants of hegv +#define LAPACK_CHEGV FORTRAN_ID2( chegv, CHEGV ) +#define LAPACK_ZHEGV FORTRAN_ID2( zhegv, ZHEGV ) + +// Value-type variants of hegvd +#define LAPACK_CHEGVD FORTRAN_ID2( chegvd, CHEGVD ) +#define LAPACK_ZHEGVD FORTRAN_ID2( zhegvd, ZHEGVD ) + +// Value-type variants of hegvx +#define LAPACK_CHEGVX FORTRAN_ID2( chegvx, CHEGVX ) +#define LAPACK_ZHEGVX FORTRAN_ID2( zhegvx, ZHEGVX ) + +// Value-type variants of hpgv +#define LAPACK_CHPGV FORTRAN_ID2( chpgv, CHPGV ) +#define LAPACK_ZHPGV FORTRAN_ID2( zhpgv, ZHPGV ) + +// Value-type variants of hpgvd +#define LAPACK_CHPGVD FORTRAN_ID2( chpgvd, CHPGVD ) +#define LAPACK_ZHPGVD FORTRAN_ID2( zhpgvd, ZHPGVD ) + +// Value-type variants of hpgvx +#define LAPACK_CHPGVX FORTRAN_ID2( chpgvx, CHPGVX ) +#define LAPACK_ZHPGVX FORTRAN_ID2( zhpgvx, ZHPGVX ) + +// Value-type variants of sbgv +#define LAPACK_SSBGV FORTRAN_ID2( ssbgv, SSBGV ) +#define LAPACK_DSBGV FORTRAN_ID2( dsbgv, DSBGV ) + +// Value-type variants of sbgvd +#define LAPACK_SSBGVD FORTRAN_ID2( ssbgvd, SSBGVD ) +#define LAPACK_DSBGVD FORTRAN_ID2( dsbgvd, DSBGVD ) + +// Value-type variants of sbgvx +#define LAPACK_SSBGVX FORTRAN_ID2( ssbgvx, SSBGVX ) +#define LAPACK_DSBGVX FORTRAN_ID2( dsbgvx, DSBGVX ) + +// Value-type variants of spgv +#define LAPACK_SSPGV FORTRAN_ID2( sspgv, SSPGV ) +#define LAPACK_DSPGV FORTRAN_ID2( dspgv, DSPGV ) + +// Value-type variants of spgvd +#define LAPACK_SSPGVD FORTRAN_ID2( sspgvd, SSPGVD ) +#define LAPACK_DSPGVD FORTRAN_ID2( dspgvd, DSPGVD ) + +// Value-type variants of spgvx +#define LAPACK_SSPGVX FORTRAN_ID2( sspgvx, SSPGVX ) +#define LAPACK_DSPGVX FORTRAN_ID2( dspgvx, DSPGVX ) + +// Value-type variants of sygv +#define LAPACK_SSYGV FORTRAN_ID2( ssygv, SSYGV ) +#define LAPACK_DSYGV FORTRAN_ID2( dsygv, DSYGV ) + +// Value-type variants of sygvd +#define LAPACK_SSYGVD FORTRAN_ID2( ssygvd, SSYGVD ) +#define LAPACK_DSYGVD FORTRAN_ID2( dsygvd, DSYGVD ) + +// Value-type variants of sygvx +#define LAPACK_SSYGVX FORTRAN_ID2( ssygvx, SSYGVX ) +#define LAPACK_DSYGVX FORTRAN_ID2( dsygvx, DSYGVX ) + +// Value-type variants of ggglm +#define LAPACK_SGGGLM FORTRAN_ID2( sggglm, SGGGLM ) +#define LAPACK_DGGGLM FORTRAN_ID2( dggglm, DGGGLM ) +#define LAPACK_CGGGLM FORTRAN_ID2( cggglm, CGGGLM ) +#define LAPACK_ZGGGLM FORTRAN_ID2( zggglm, ZGGGLM ) + +// Value-type variants of gglse +#define LAPACK_SGGLSE FORTRAN_ID2( sgglse, SGGLSE ) +#define LAPACK_DGGLSE FORTRAN_ID2( dgglse, DGGLSE ) +#define LAPACK_CGGLSE FORTRAN_ID2( cgglse, CGGLSE ) +#define LAPACK_ZGGLSE FORTRAN_ID2( zgglse, ZGGLSE ) + +// Value-type variants of gbsv +#define LAPACK_SGBSV FORTRAN_ID2( sgbsv, SGBSV ) +#define LAPACK_DGBSV FORTRAN_ID2( dgbsv, DGBSV ) +#define LAPACK_CGBSV FORTRAN_ID2( cgbsv, CGBSV ) +#define LAPACK_ZGBSV FORTRAN_ID2( zgbsv, ZGBSV ) + +// Value-type variants of gbsvx +#define LAPACK_SGBSVX FORTRAN_ID2( sgbsvx, SGBSVX ) +#define LAPACK_DGBSVX FORTRAN_ID2( dgbsvx, DGBSVX ) +#define LAPACK_CGBSVX FORTRAN_ID2( cgbsvx, CGBSVX ) +#define LAPACK_ZGBSVX FORTRAN_ID2( zgbsvx, ZGBSVX ) + +// Value-type variants of gejsv +#define LAPACK_SGEJSV FORTRAN_ID2( sgejsv, SGEJSV ) +#define LAPACK_DGEJSV FORTRAN_ID2( dgejsv, DGEJSV ) + +// Value-type variants of gesv +#define LAPACK_SGESV FORTRAN_ID2( sgesv, SGESV ) +#define LAPACK_DGESV FORTRAN_ID2( dgesv, DGESV ) +#define LAPACK_CGESV FORTRAN_ID2( cgesv, CGESV ) +#define LAPACK_ZGESV FORTRAN_ID2( zgesv, ZGESV ) + +// Value-type variants of gesvx +#define LAPACK_SGESVX FORTRAN_ID2( sgesvx, SGESVX ) +#define LAPACK_DGESVX FORTRAN_ID2( dgesvx, DGESVX ) +#define LAPACK_CGESVX FORTRAN_ID2( cgesvx, CGESVX ) +#define LAPACK_ZGESVX FORTRAN_ID2( zgesvx, ZGESVX ) + +// Value-type variants of gtsv +#define LAPACK_SGTSV FORTRAN_ID2( sgtsv, SGTSV ) +#define LAPACK_DGTSV FORTRAN_ID2( dgtsv, DGTSV ) +#define LAPACK_CGTSV FORTRAN_ID2( cgtsv, CGTSV ) +#define LAPACK_ZGTSV FORTRAN_ID2( zgtsv, ZGTSV ) + +// Value-type variants of gtsvx +#define LAPACK_SGTSVX FORTRAN_ID2( sgtsvx, SGTSVX ) +#define LAPACK_DGTSVX FORTRAN_ID2( dgtsvx, DGTSVX ) +#define LAPACK_CGTSVX FORTRAN_ID2( cgtsvx, CGTSVX ) +#define LAPACK_ZGTSVX FORTRAN_ID2( zgtsvx, ZGTSVX ) + +// Value-type variants of hesv +#define LAPACK_CHESV FORTRAN_ID2( chesv, CHESV ) +#define LAPACK_ZHESV FORTRAN_ID2( zhesv, ZHESV ) + +// Value-type variants of hesvx +#define LAPACK_CHESVX FORTRAN_ID2( chesvx, CHESVX ) +#define LAPACK_ZHESVX FORTRAN_ID2( zhesvx, ZHESVX ) + +// Value-type variants of hpsv +#define LAPACK_CHPSV FORTRAN_ID2( chpsv, CHPSV ) +#define LAPACK_ZHPSV FORTRAN_ID2( zhpsv, ZHPSV ) + +// Value-type variants of hpsvx +#define LAPACK_CHPSVX FORTRAN_ID2( chpsvx, CHPSVX ) +#define LAPACK_ZHPSVX FORTRAN_ID2( zhpsvx, ZHPSVX ) + +// Value-type variants of iter_gesv +#define LAPACK_DSGESV FORTRAN_ID2( dsgesv, DSGESV ) +#define LAPACK_ZCGESV FORTRAN_ID2( zcgesv, ZCGESV ) + +// Value-type variants of iter_posv +#define LAPACK_DSPOSV FORTRAN_ID2( dsposv, DSPOSV ) +#define LAPACK_ZCPOSV FORTRAN_ID2( zcposv, ZCPOSV ) + +// Value-type variants of pbsv +#define LAPACK_SPBSV FORTRAN_ID2( spbsv, SPBSV ) +#define LAPACK_DPBSV FORTRAN_ID2( dpbsv, DPBSV ) +#define LAPACK_CPBSV FORTRAN_ID2( cpbsv, CPBSV ) +#define LAPACK_ZPBSV FORTRAN_ID2( zpbsv, ZPBSV ) + +// Value-type variants of pbsvx +#define LAPACK_SPBSVX FORTRAN_ID2( spbsvx, SPBSVX ) +#define LAPACK_DPBSVX FORTRAN_ID2( dpbsvx, DPBSVX ) +#define LAPACK_CPBSVX FORTRAN_ID2( cpbsvx, CPBSVX ) +#define LAPACK_ZPBSVX FORTRAN_ID2( zpbsvx, ZPBSVX ) + +// Value-type variants of posv +#define LAPACK_SPOSV FORTRAN_ID2( sposv, SPOSV ) +#define LAPACK_DPOSV FORTRAN_ID2( dposv, DPOSV ) +#define LAPACK_CPOSV FORTRAN_ID2( cposv, CPOSV ) +#define LAPACK_ZPOSV FORTRAN_ID2( zposv, ZPOSV ) + +// Value-type variants of posvx +#define LAPACK_SPOSVX FORTRAN_ID2( sposvx, SPOSVX ) +#define LAPACK_DPOSVX FORTRAN_ID2( dposvx, DPOSVX ) +#define LAPACK_CPOSVX FORTRAN_ID2( cposvx, CPOSVX ) +#define LAPACK_ZPOSVX FORTRAN_ID2( zposvx, ZPOSVX ) + +// Value-type variants of ppsv +#define LAPACK_SPPSV FORTRAN_ID2( sppsv, SPPSV ) +#define LAPACK_DPPSV FORTRAN_ID2( dppsv, DPPSV ) +#define LAPACK_CPPSV FORTRAN_ID2( cppsv, CPPSV ) +#define LAPACK_ZPPSV FORTRAN_ID2( zppsv, ZPPSV ) + +// Value-type variants of ppsvx +#define LAPACK_SPPSVX FORTRAN_ID2( sppsvx, SPPSVX ) +#define LAPACK_DPPSVX FORTRAN_ID2( dppsvx, DPPSVX ) +#define LAPACK_CPPSVX FORTRAN_ID2( cppsvx, CPPSVX ) +#define LAPACK_ZPPSVX FORTRAN_ID2( zppsvx, ZPPSVX ) + +// Value-type variants of ptsv +#define LAPACK_SPTSV FORTRAN_ID2( sptsv, SPTSV ) +#define LAPACK_DPTSV FORTRAN_ID2( dptsv, DPTSV ) +#define LAPACK_CPTSV FORTRAN_ID2( cptsv, CPTSV ) +#define LAPACK_ZPTSV FORTRAN_ID2( zptsv, ZPTSV ) + +// Value-type variants of ptsvx +#define LAPACK_SPTSVX FORTRAN_ID2( sptsvx, SPTSVX ) +#define LAPACK_DPTSVX FORTRAN_ID2( dptsvx, DPTSVX ) +#define LAPACK_CPTSVX FORTRAN_ID2( cptsvx, CPTSVX ) +#define LAPACK_ZPTSVX FORTRAN_ID2( zptsvx, ZPTSVX ) + +// Value-type variants of spsv +#define LAPACK_SSPSV FORTRAN_ID2( sspsv, SSPSV ) +#define LAPACK_DSPSV FORTRAN_ID2( dspsv, DSPSV ) +#define LAPACK_CSPSV FORTRAN_ID2( cspsv, CSPSV ) +#define LAPACK_ZSPSV FORTRAN_ID2( zspsv, ZSPSV ) + +// Value-type variants of spsvx +#define LAPACK_SSPSVX FORTRAN_ID2( sspsvx, SSPSVX ) +#define LAPACK_DSPSVX FORTRAN_ID2( dspsvx, DSPSVX ) +#define LAPACK_CSPSVX FORTRAN_ID2( cspsvx, CSPSVX ) +#define LAPACK_ZSPSVX FORTRAN_ID2( zspsvx, ZSPSVX ) + +// Value-type variants of sysv +#define LAPACK_SSYSV FORTRAN_ID2( ssysv, SSYSV ) +#define LAPACK_DSYSV FORTRAN_ID2( dsysv, DSYSV ) +#define LAPACK_CSYSV FORTRAN_ID2( csysv, CSYSV ) +#define LAPACK_ZSYSV FORTRAN_ID2( zsysv, ZSYSV ) + +// Value-type variants of sysvx +#define LAPACK_SSYSVX FORTRAN_ID2( ssysvx, SSYSVX ) +#define LAPACK_DSYSVX FORTRAN_ID2( dsysvx, DSYSVX ) +#define LAPACK_CSYSVX FORTRAN_ID2( csysvx, CSYSVX ) +#define LAPACK_ZSYSVX FORTRAN_ID2( zsysvx, ZSYSVX ) + +// Value-type variants of gees +#define LAPACK_SGEES FORTRAN_ID2( sgees, SGEES ) +#define LAPACK_DGEES FORTRAN_ID2( dgees, DGEES ) +#define LAPACK_CGEES FORTRAN_ID2( cgees, CGEES ) +#define LAPACK_ZGEES FORTRAN_ID2( zgees, ZGEES ) + +// Value-type variants of geesx +#define LAPACK_SGEESX FORTRAN_ID2( sgeesx, SGEESX ) +#define LAPACK_DGEESX FORTRAN_ID2( dgeesx, DGEESX ) +#define LAPACK_CGEESX FORTRAN_ID2( cgeesx, CGEESX ) +#define LAPACK_ZGEESX FORTRAN_ID2( zgeesx, ZGEESX ) + +// Value-type variants of geev +#define LAPACK_SGEEV FORTRAN_ID2( sgeev, SGEEV ) +#define LAPACK_DGEEV FORTRAN_ID2( dgeev, DGEEV ) +#define LAPACK_CGEEV FORTRAN_ID2( cgeev, CGEEV ) +#define LAPACK_ZGEEV FORTRAN_ID2( zgeev, ZGEEV ) + +// Value-type variants of geevx +#define LAPACK_SGEEVX FORTRAN_ID2( sgeevx, SGEEVX ) +#define LAPACK_DGEEVX FORTRAN_ID2( dgeevx, DGEEVX ) +#define LAPACK_CGEEVX FORTRAN_ID2( cgeevx, CGEEVX ) +#define LAPACK_ZGEEVX FORTRAN_ID2( zgeevx, ZGEEVX ) + +// Value-type variants of gesdd +#define LAPACK_SGESDD FORTRAN_ID2( sgesdd, SGESDD ) +#define LAPACK_DGESDD FORTRAN_ID2( dgesdd, DGESDD ) +#define LAPACK_CGESDD FORTRAN_ID2( cgesdd, CGESDD ) +#define LAPACK_ZGESDD FORTRAN_ID2( zgesdd, ZGESDD ) + +// Value-type variants of gesvd +#define LAPACK_SGESVD FORTRAN_ID2( sgesvd, SGESVD ) +#define LAPACK_DGESVD FORTRAN_ID2( dgesvd, DGESVD ) +#define LAPACK_CGESVD FORTRAN_ID2( cgesvd, CGESVD ) +#define LAPACK_ZGESVD FORTRAN_ID2( zgesvd, ZGESVD ) + +// Value-type variants of hbev +#define LAPACK_CHBEV FORTRAN_ID2( chbev, CHBEV ) +#define LAPACK_ZHBEV FORTRAN_ID2( zhbev, ZHBEV ) + +// Value-type variants of hbevd +#define LAPACK_CHBEVD FORTRAN_ID2( chbevd, CHBEVD ) +#define LAPACK_ZHBEVD FORTRAN_ID2( zhbevd, ZHBEVD ) + +// Value-type variants of hbevx +#define LAPACK_CHBEVX FORTRAN_ID2( chbevx, CHBEVX ) +#define LAPACK_ZHBEVX FORTRAN_ID2( zhbevx, ZHBEVX ) + +// Value-type variants of heev +#define LAPACK_CHEEV FORTRAN_ID2( cheev, CHEEV ) +#define LAPACK_ZHEEV FORTRAN_ID2( zheev, ZHEEV ) + +// Value-type variants of heevd +#define LAPACK_CHEEVD FORTRAN_ID2( cheevd, CHEEVD ) +#define LAPACK_ZHEEVD FORTRAN_ID2( zheevd, ZHEEVD ) + +// Value-type variants of heevr +#define LAPACK_CHEEVR FORTRAN_ID2( cheevr, CHEEVR ) +#define LAPACK_ZHEEVR FORTRAN_ID2( zheevr, ZHEEVR ) + +// Value-type variants of heevx +#define LAPACK_CHEEVX FORTRAN_ID2( cheevx, CHEEVX ) +#define LAPACK_ZHEEVX FORTRAN_ID2( zheevx, ZHEEVX ) + +// Value-type variants of hpev +#define LAPACK_CHPEV FORTRAN_ID2( chpev, CHPEV ) +#define LAPACK_ZHPEV FORTRAN_ID2( zhpev, ZHPEV ) + +// Value-type variants of hpevd +#define LAPACK_CHPEVD FORTRAN_ID2( chpevd, CHPEVD ) +#define LAPACK_ZHPEVD FORTRAN_ID2( zhpevd, ZHPEVD ) + +// Value-type variants of hpevx +#define LAPACK_CHPEVX FORTRAN_ID2( chpevx, CHPEVX ) +#define LAPACK_ZHPEVX FORTRAN_ID2( zhpevx, ZHPEVX ) + +// Value-type variants of sbev +#define LAPACK_SSBEV FORTRAN_ID2( ssbev, SSBEV ) +#define LAPACK_DSBEV FORTRAN_ID2( dsbev, DSBEV ) + +// Value-type variants of sbevd +#define LAPACK_SSBEVD FORTRAN_ID2( ssbevd, SSBEVD ) +#define LAPACK_DSBEVD FORTRAN_ID2( dsbevd, DSBEVD ) + +// Value-type variants of sbevx +#define LAPACK_SSBEVX FORTRAN_ID2( ssbevx, SSBEVX ) +#define LAPACK_DSBEVX FORTRAN_ID2( dsbevx, DSBEVX ) + +// Value-type variants of spev +#define LAPACK_SSPEV FORTRAN_ID2( sspev, SSPEV ) +#define LAPACK_DSPEV FORTRAN_ID2( dspev, DSPEV ) + +// Value-type variants of spevd +#define LAPACK_SSPEVD FORTRAN_ID2( sspevd, SSPEVD ) +#define LAPACK_DSPEVD FORTRAN_ID2( dspevd, DSPEVD ) + +// Value-type variants of spevx +#define LAPACK_SSPEVX FORTRAN_ID2( sspevx, SSPEVX ) +#define LAPACK_DSPEVX FORTRAN_ID2( dspevx, DSPEVX ) + +// Value-type variants of stev +#define LAPACK_SSTEV FORTRAN_ID2( sstev, SSTEV ) +#define LAPACK_DSTEV FORTRAN_ID2( dstev, DSTEV ) + +// Value-type variants of stevd +#define LAPACK_SSTEVD FORTRAN_ID2( sstevd, SSTEVD ) +#define LAPACK_DSTEVD FORTRAN_ID2( dstevd, DSTEVD ) + +// Value-type variants of stevr +#define LAPACK_SSTEVR FORTRAN_ID2( sstevr, SSTEVR ) +#define LAPACK_DSTEVR FORTRAN_ID2( dstevr, DSTEVR ) + +// Value-type variants of stevx +#define LAPACK_SSTEVX FORTRAN_ID2( sstevx, SSTEVX ) +#define LAPACK_DSTEVX FORTRAN_ID2( dstevx, DSTEVX ) + +// Value-type variants of syev +#define LAPACK_SSYEV FORTRAN_ID2( ssyev, SSYEV ) +#define LAPACK_DSYEV FORTRAN_ID2( dsyev, DSYEV ) + +// Value-type variants of syevd +#define LAPACK_SSYEVD FORTRAN_ID2( ssyevd, SSYEVD ) +#define LAPACK_DSYEVD FORTRAN_ID2( dsyevd, DSYEVD ) + +// Value-type variants of syevr +#define LAPACK_SSYEVR FORTRAN_ID2( ssyevr, SSYEVR ) +#define LAPACK_DSYEVR FORTRAN_ID2( dsyevr, DSYEVR ) + +// Value-type variants of syevx +#define LAPACK_SSYEVX FORTRAN_ID2( ssyevx, SSYEVX ) +#define LAPACK_DSYEVX FORTRAN_ID2( dsyevx, DSYEVX ) + +// Value-type variants of gels +#define LAPACK_SGELS FORTRAN_ID2( sgels, SGELS ) +#define LAPACK_DGELS FORTRAN_ID2( dgels, DGELS ) +#define LAPACK_CGELS FORTRAN_ID2( cgels, CGELS ) +#define LAPACK_ZGELS FORTRAN_ID2( zgels, ZGELS ) + +// Value-type variants of gelsd +#define LAPACK_SGELSD FORTRAN_ID2( sgelsd, SGELSD ) +#define LAPACK_DGELSD FORTRAN_ID2( dgelsd, DGELSD ) +#define LAPACK_CGELSD FORTRAN_ID2( cgelsd, CGELSD ) +#define LAPACK_ZGELSD FORTRAN_ID2( zgelsd, ZGELSD ) + +// Value-type variants of gelss +#define LAPACK_SGELSS FORTRAN_ID2( sgelss, SGELSS ) +#define LAPACK_DGELSS FORTRAN_ID2( dgelss, DGELSS ) +#define LAPACK_CGELSS FORTRAN_ID2( cgelss, CGELSS ) +#define LAPACK_ZGELSS FORTRAN_ID2( zgelss, ZGELSS ) + +// Value-type variants of gelsy +#define LAPACK_SGELSY FORTRAN_ID2( sgelsy, SGELSY ) +#define LAPACK_DGELSY FORTRAN_ID2( dgelsy, DGELSY ) +#define LAPACK_CGELSY FORTRAN_ID2( cgelsy, CGELSY ) +#define LAPACK_ZGELSY FORTRAN_ID2( zgelsy, ZGELSY ) + +// +// LAPACK auxiliary routines +// + +// Value-type variants of larf +#define LAPACK_SLARF FORTRAN_ID2( slarf, SLARF ) +#define LAPACK_DLARF FORTRAN_ID2( dlarf, DLARF ) +#define LAPACK_CLARF FORTRAN_ID2( clarf, CLARF ) +#define LAPACK_ZLARF FORTRAN_ID2( zlarf, ZLARF ) + +// Value-type variants of larfb +#define LAPACK_SLARFB FORTRAN_ID2( slarfb, SLARFB ) +#define LAPACK_DLARFB FORTRAN_ID2( dlarfb, DLARFB ) +#define LAPACK_CLARFB FORTRAN_ID2( clarfb, CLARFB ) +#define LAPACK_ZLARFB FORTRAN_ID2( zlarfb, ZLARFB ) + +// Value-type variants of larfg +#define LAPACK_SLARFG FORTRAN_ID2( slarfg, SLARFG ) +#define LAPACK_DLARFG FORTRAN_ID2( dlarfg, DLARFG ) +#define LAPACK_CLARFG FORTRAN_ID2( clarfg, CLARFG ) +#define LAPACK_ZLARFG FORTRAN_ID2( zlarfg, ZLARFG ) + +// Value-type variants of larft +#define LAPACK_SLARFT FORTRAN_ID2( slarft, SLARFT ) +#define LAPACK_DLARFT FORTRAN_ID2( dlarft, DLARFT ) +#define LAPACK_CLARFT FORTRAN_ID2( clarft, CLARFT ) +#define LAPACK_ZLARFT FORTRAN_ID2( zlarft, ZLARFT ) + +// Value-type variants of larfx +#define LAPACK_SLARFX FORTRAN_ID2( slarfx, SLARFX ) +#define LAPACK_DLARFX FORTRAN_ID2( dlarfx, DLARFX ) +#define LAPACK_CLARFX FORTRAN_ID2( clarfx, CLARFX ) +#define LAPACK_ZLARFX FORTRAN_ID2( zlarfx, ZLARFX ) + +// Value-type variants of largv +#define LAPACK_SLARGV FORTRAN_ID2( slargv, SLARGV ) +#define LAPACK_DLARGV FORTRAN_ID2( dlargv, DLARGV ) +#define LAPACK_CLARGV FORTRAN_ID2( clargv, CLARGV ) +#define LAPACK_ZLARGV FORTRAN_ID2( zlargv, ZLARGV ) + +// Value-type variants of larnv +#define LAPACK_SLARNV FORTRAN_ID2( slarnv, SLARNV ) +#define LAPACK_DLARNV FORTRAN_ID2( dlarnv, DLARNV ) +#define LAPACK_CLARNV FORTRAN_ID2( clarnv, CLARNV ) +#define LAPACK_ZLARNV FORTRAN_ID2( zlarnv, ZLARNV ) + +// Value-type variants of larrb +#define LAPACK_SLARRB FORTRAN_ID2( slarrb, SLARRB ) +#define LAPACK_DLARRB FORTRAN_ID2( dlarrb, DLARRB ) + +// Value-type variants of larre +#define LAPACK_SLARRE FORTRAN_ID2( slarre, SLARRE ) +#define LAPACK_DLARRE FORTRAN_ID2( dlarre, DLARRE ) + +// Value-type variants of langb +#define LAPACK_SLANGB FORTRAN_ID2( slangb, SLANGB ) +#define LAPACK_DLANGB FORTRAN_ID2( dlangb, DLANGB ) +#define LAPACK_CLANGB FORTRAN_ID2( clangb, CLANGB ) +#define LAPACK_ZLANGB FORTRAN_ID2( zlangb, ZLANGB ) + +// Value-type variants of lange +#define LAPACK_SLANGE FORTRAN_ID2( slange, SLANGE ) +#define LAPACK_DLANGE FORTRAN_ID2( dlange, DLANGE ) +#define LAPACK_CLANGE FORTRAN_ID2( clange, CLANGE ) +#define LAPACK_ZLANGE FORTRAN_ID2( zlange, ZLANGE ) + +// Value-type variants of lanhb +#define LAPACK_CLANHB FORTRAN_ID2( clanhb, CLANHB ) +#define LAPACK_ZLANHB FORTRAN_ID2( zlanhb, ZLANHB ) + +// Value-type variants of lanhe +#define LAPACK_CLANHE FORTRAN_ID2( clanhe, CLANHE ) +#define LAPACK_ZLANHE FORTRAN_ID2( zlanhe, ZLANHE ) + +// Value-type variants of lanhp +#define LAPACK_CLANHP FORTRAN_ID2( clanhp, CLANHP ) +#define LAPACK_ZLANHP FORTRAN_ID2( zlanhp, ZLANHP ) + +// Value-type variants of lanhs +#define LAPACK_SLANHS FORTRAN_ID2( slanhs, SLANHS ) +#define LAPACK_DLANHS FORTRAN_ID2( dlanhs, DLANHS ) +#define LAPACK_CLANHS FORTRAN_ID2( clanhs, CLANHS ) +#define LAPACK_ZLANHS FORTRAN_ID2( zlanhs, ZLANHS ) + +// Value-type variants of lansb +#define LAPACK_SLANSB FORTRAN_ID2( slansb, SLANSB ) +#define LAPACK_DLANSB FORTRAN_ID2( dlansb, DLANSB ) +#define LAPACK_CLANSB FORTRAN_ID2( clansb, CLANSB ) +#define LAPACK_ZLANSB FORTRAN_ID2( zlansb, ZLANSB ) + +// Value-type variants of lansp +#define LAPACK_SLANSP FORTRAN_ID2( slansp, SLANSP ) +#define LAPACK_DLANSP FORTRAN_ID2( dlansp, DLANSP ) +#define LAPACK_CLANSP FORTRAN_ID2( clansp, CLANSP ) +#define LAPACK_ZLANSP FORTRAN_ID2( zlansp, ZLANSP ) + +// Value-type variants of lansy +#define LAPACK_SLANSY FORTRAN_ID2( slansy, SLANSY ) +#define LAPACK_DLANSY FORTRAN_ID2( dlansy, DLANSY ) +#define LAPACK_CLANSY FORTRAN_ID2( clansy, CLANSY ) +#define LAPACK_ZLANSY FORTRAN_ID2( zlansy, ZLANSY ) + +// Value-type variants of lantb +#define LAPACK_SLANTB FORTRAN_ID2( slantb, SLANTB ) +#define LAPACK_DLANTB FORTRAN_ID2( dlantb, DLANTB ) +#define LAPACK_CLANTB FORTRAN_ID2( clantb, CLANTB ) +#define LAPACK_ZLANTB FORTRAN_ID2( zlantb, ZLANTB ) + +// Value-type variants of lantp +#define LAPACK_SLANTP FORTRAN_ID2( slantp, SLANTP ) +#define LAPACK_DLANTP FORTRAN_ID2( dlantp, DLANTP ) +#define LAPACK_CLANTP FORTRAN_ID2( clantp, CLANTP ) +#define LAPACK_ZLANTP FORTRAN_ID2( zlantp, ZLANTP ) + +// Value-type variants of lantr +#define LAPACK_SLANTR FORTRAN_ID2( slantr, SLANTR ) +#define LAPACK_DLANTR FORTRAN_ID2( dlantr, DLANTR ) +#define LAPACK_CLANTR FORTRAN_ID2( clantr, CLANTR ) +#define LAPACK_ZLANTR FORTRAN_ID2( zlantr, ZLANTR ) + +// Value-type variants of labrd +#define LAPACK_SLABRD FORTRAN_ID2( slabrd, SLABRD ) +#define LAPACK_DLABRD FORTRAN_ID2( dlabrd, DLABRD ) +#define LAPACK_CLABRD FORTRAN_ID2( clabrd, CLABRD ) +#define LAPACK_ZLABRD FORTRAN_ID2( zlabrd, ZLABRD ) + +// Value-type variants of lacgv +#define LAPACK_CLACGV FORTRAN_ID2( clacgv, CLACGV ) +#define LAPACK_ZLACGV FORTRAN_ID2( zlacgv, ZLACGV ) + +// Value-type variants of lacon +#define LAPACK_SLACON FORTRAN_ID2( slacon, SLACON ) +#define LAPACK_DLACON FORTRAN_ID2( dlacon, DLACON ) +#define LAPACK_CLACON FORTRAN_ID2( clacon, CLACON ) +#define LAPACK_ZLACON FORTRAN_ID2( zlacon, ZLACON ) + +// Value-type variants of laebz +#define LAPACK_SLAEBZ FORTRAN_ID2( slaebz, SLAEBZ ) +#define LAPACK_DLAEBZ FORTRAN_ID2( dlaebz, DLAEBZ ) + +// Value-type variants of lalsd +#define LAPACK_SLALSD FORTRAN_ID2( slalsd, SLALSD ) +#define LAPACK_DLALSD FORTRAN_ID2( dlalsd, DLALSD ) +#define LAPACK_CLALSD FORTRAN_ID2( clalsd, CLALSD ) +#define LAPACK_ZLALSD FORTRAN_ID2( zlalsd, ZLALSD ) + +// Value-type variants of largv +#define LAPACK_SLARGV FORTRAN_ID2( slargv, SLARGV ) +#define LAPACK_DLARGV FORTRAN_ID2( dlargv, DLARGV ) +#define LAPACK_CLARGV FORTRAN_ID2( clargv, CLARGV ) +#define LAPACK_ZLARGV FORTRAN_ID2( zlargv, ZLARGV ) + +// Value-type variants of larz +#define LAPACK_SLARZ FORTRAN_ID2( slarz, SLARZ ) +#define LAPACK_DLARZ FORTRAN_ID2( dlarz, DLARZ ) +#define LAPACK_CLARZ FORTRAN_ID2( clarz, CLARZ ) +#define LAPACK_ZLARZ FORTRAN_ID2( zlarz, ZLARZ ) + +// Value-type variants of latrd +#define LAPACK_SLATRD FORTRAN_ID2( slatrd, SLATRD ) +#define LAPACK_DLATRD FORTRAN_ID2( dlatrd, DLATRD ) +#define LAPACK_CLATRD FORTRAN_ID2( clatrd, CLATRD ) +#define LAPACK_ZLATRD FORTRAN_ID2( zlatrd, ZLATRD ) + +// Value-type variants of latrs +#define LAPACK_SLATRS FORTRAN_ID2( slatrs, SLATRS ) +#define LAPACK_DLATRS FORTRAN_ID2( dlatrs, DLATRS ) +#define LAPACK_CLATRS FORTRAN_ID2( clatrs, CLATRS ) +#define LAPACK_ZLATRS FORTRAN_ID2( zlatrs, ZLATRS ) + +// Value-type variants of latrz +#define LAPACK_SLATRZ FORTRAN_ID2( slatrz, SLATRZ ) +#define LAPACK_DLATRZ FORTRAN_ID2( dlatrz, DLATRZ ) +#define LAPACK_CLATRZ FORTRAN_ID2( clatrz, CLATRZ ) +#define LAPACK_ZLATRZ FORTRAN_ID2( zlatrz, ZLATRZ ) + +// +// LAPACK auxiliary routines +// + +#define LAPACK_ILAENV FORTRAN_ID2( ilaenv, ILAENV ) + +#endif + diff --git a/sdk/boost/numeric/bindings/lapack/detail/lapack_option.hpp b/sdk/boost/numeric/bindings/lapack/detail/lapack_option.hpp new file mode 100644 index 0000000..292b6ec --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/detail/lapack_option.hpp @@ -0,0 +1,32 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DETAIL_LAPACK_OPTION_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DETAIL_LAPACK_OPTION_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { +namespace detail { + +template< typename Tag > +struct lapack_option: bindings::blas::detail::blas_option< Tag > {}; + +template<> +struct lapack_option< tag::both >: mpl::char_< 'B' > {}; + +} // namespace detail +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver.hpp b/sdk/boost/numeric/bindings/lapack/driver.hpp new file mode 100644 index 0000000..ef08398 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver.hpp @@ -0,0 +1,103 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gbsv.hpp b/sdk/boost/numeric/bindings/lapack/driver/gbsv.hpp new file mode 100644 index 0000000..518e3bf --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gbsv.hpp @@ -0,0 +1,183 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GBSV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GBSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gbsv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gbsv( const fortran_int_t n, const fortran_int_t kl, + const fortran_int_t ku, const fortran_int_t nrhs, float* ab, + const fortran_int_t ldab, fortran_int_t* ipiv, float* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SGBSV( &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gbsv( const fortran_int_t n, const fortran_int_t kl, + const fortran_int_t ku, const fortran_int_t nrhs, double* ab, + const fortran_int_t ldab, fortran_int_t* ipiv, double* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DGBSV( &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gbsv( const fortran_int_t n, const fortran_int_t kl, + const fortran_int_t ku, const fortran_int_t nrhs, + std::complex* ab, const fortran_int_t ldab, + fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CGBSV( &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gbsv( const fortran_int_t n, const fortran_int_t kl, + const fortran_int_t ku, const fortran_int_t nrhs, + std::complex* ab, const fortran_int_t ldab, + fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZGBSV( &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gbsv. +// +template< typename Value > +struct gbsv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( MatrixAB& ab, VectorIPIV& ipiv, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower(ab) >= 0 ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(ab) ); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + 2*bindings::bandwidth_lower(ab)+(bindings::bandwidth_upper(ab)- + bindings::bandwidth_lower(ab))+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + BOOST_ASSERT( (bindings::bandwidth_upper(ab)- + bindings::bandwidth_lower(ab)) >= 0 ); + return detail::gbsv( bindings::size_column(ab), + bindings::bandwidth_lower(ab), (bindings::bandwidth_upper(ab)- + bindings::bandwidth_lower(ab)), bindings::size_column(b), + bindings::begin_value(ab), bindings::stride_major(ab), + bindings::begin_value(ipiv), bindings::begin_value(b), + bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gbsv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gbsv. Its overload differs for +// +template< typename MatrixAB, typename VectorIPIV, typename MatrixB > +inline std::ptrdiff_t gbsv( MatrixAB& ab, VectorIPIV& ipiv, MatrixB& b ) { + return gbsv_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab, ipiv, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gbsvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/gbsvx.hpp new file mode 100644 index 0000000..c1a7544 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gbsvx.hpp @@ -0,0 +1,547 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GBSVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GBSVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gbsvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Trans > +inline std::ptrdiff_t gbsvx( const char fact, const Trans, + const fortran_int_t n, const fortran_int_t kl, const fortran_int_t ku, + const fortran_int_t nrhs, float* ab, const fortran_int_t ldab, + float* afb, const fortran_int_t ldafb, fortran_int_t* ipiv, + char& equed, float* r, float* c, float* b, const fortran_int_t ldb, + float* x, const fortran_int_t ldx, float& rcond, float* ferr, + float* berr, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SGBSVX( &fact, &lapack_option< Trans >::value, &n, &kl, &ku, &nrhs, + ab, &ldab, afb, &ldafb, ipiv, &equed, r, c, b, &ldb, x, &ldx, + &rcond, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Trans > +inline std::ptrdiff_t gbsvx( const char fact, const Trans, + const fortran_int_t n, const fortran_int_t kl, const fortran_int_t ku, + const fortran_int_t nrhs, double* ab, const fortran_int_t ldab, + double* afb, const fortran_int_t ldafb, fortran_int_t* ipiv, + char& equed, double* r, double* c, double* b, const fortran_int_t ldb, + double* x, const fortran_int_t ldx, double& rcond, double* ferr, + double* berr, double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DGBSVX( &fact, &lapack_option< Trans >::value, &n, &kl, &ku, &nrhs, + ab, &ldab, afb, &ldafb, ipiv, &equed, r, c, b, &ldb, x, &ldx, + &rcond, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gbsvx( const char fact, const Trans, + const fortran_int_t n, const fortran_int_t kl, const fortran_int_t ku, + const fortran_int_t nrhs, std::complex* ab, + const fortran_int_t ldab, std::complex* afb, + const fortran_int_t ldafb, fortran_int_t* ipiv, char& equed, float* r, + float* c, std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float& rcond, + float* ferr, float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGBSVX( &fact, &lapack_option< Trans >::value, &n, &kl, &ku, &nrhs, + ab, &ldab, afb, &ldafb, ipiv, &equed, r, c, b, &ldb, x, &ldx, + &rcond, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gbsvx( const char fact, const Trans, + const fortran_int_t n, const fortran_int_t kl, const fortran_int_t ku, + const fortran_int_t nrhs, std::complex* ab, + const fortran_int_t ldab, std::complex* afb, + const fortran_int_t ldafb, fortran_int_t* ipiv, char& equed, + double* r, double* c, std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, double& rcond, double* ferr, double* berr, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGBSVX( &fact, &lapack_option< Trans >::value, &n, &kl, &ku, &nrhs, + ab, &ldab, afb, &ldafb, ipiv, &equed, r, c, b, &ldb, x, &ldx, + &rcond, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gbsvx. +// +template< typename Value, typename Enable = void > +struct gbsvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gbsvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char fact, MatrixAB& ab, + MatrixAFB& afb, VectorIPIV& ipiv, char& equed, VectorR& r, + VectorC& c, MatrixB& b, MatrixX& x, real_type& rcond, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAFB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAFB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower_op(ab, trans()) >= 0 ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column_op(ab, trans()) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column_op(ab, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(ab, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(afb) == 1 || + bindings::stride_minor(afb) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + bindings::bandwidth_lower_op(ab, trans())+ + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans()))+1 ); + BOOST_ASSERT( bindings::stride_major(afb) >= + 2*bindings::bandwidth_lower_op(ab, trans())+ + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans()))+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans())) >= 0 ); + BOOST_ASSERT( equed == 'N' || equed == 'R' || equed == 'C' || + equed == 'B' ); + BOOST_ASSERT( fact == 'F' || fact == 'N' || fact == 'E' ); + return detail::gbsvx( fact, trans(), bindings::size_column_op(ab, + trans()), bindings::bandwidth_lower_op(ab, trans()), + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans())), + bindings::size_column(b), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(afb), + bindings::stride_major(afb), bindings::begin_value(ipiv), + equed, bindings::begin_value(r), bindings::begin_value(c), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixAB& ab, + MatrixAFB& afb, VectorIPIV& ipiv, char& equed, VectorR& r, + VectorC& c, MatrixB& b, MatrixX& x, real_type& rcond, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAFB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column_op(ab, trans()) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column_op(ab, trans()) ) ); + return invoke( fact, ab, afb, ipiv, equed, r, c, b, x, rcond, ferr, + berr, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixAB& ab, + MatrixAFB& afb, VectorIPIV& ipiv, char& equed, VectorR& r, + VectorC& c, MatrixB& b, MatrixX& x, real_type& rcond, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAFB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + return invoke( fact, ab, afb, ipiv, equed, r, c, b, x, rcond, ferr, + berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gbsvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char fact, MatrixAB& ab, + MatrixAFB& afb, VectorIPIV& ipiv, char& equed, VectorR& r, + VectorC& c, MatrixB& b, MatrixX& x, real_type& rcond, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAFB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAFB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::bandwidth_lower_op(ab, trans()) >= 0 ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column_op(ab, trans()) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column_op(ab, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(ab, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(afb) == 1 || + bindings::stride_minor(afb) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= + bindings::bandwidth_lower_op(ab, trans())+ + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans()))+1 ); + BOOST_ASSERT( bindings::stride_major(afb) >= + 2*bindings::bandwidth_lower_op(ab, trans())+ + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans()))+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(ab, trans())) ); + BOOST_ASSERT( (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans())) >= 0 ); + BOOST_ASSERT( equed == 'N' || equed == 'R' || equed == 'C' || + equed == 'B' ); + BOOST_ASSERT( fact == 'F' || fact == 'N' || fact == 'E' ); + return detail::gbsvx( fact, trans(), bindings::size_column_op(ab, + trans()), bindings::bandwidth_lower_op(ab, trans()), + (bindings::bandwidth_upper_op(ab, trans())- + bindings::bandwidth_lower_op(ab, trans())), + bindings::size_column(b), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(afb), + bindings::stride_major(afb), bindings::begin_value(ipiv), + equed, bindings::begin_value(r), bindings::begin_value(c), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixAB& ab, + MatrixAFB& afb, VectorIPIV& ipiv, char& equed, VectorR& r, + VectorC& c, MatrixB& b, MatrixX& x, real_type& rcond, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAFB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column_op(ab, trans()) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column_op(ab, trans()) ) ); + return invoke( fact, ab, afb, ipiv, equed, r, c, b, x, rcond, ferr, + berr, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixAB& ab, + MatrixAFB& afb, VectorIPIV& ipiv, char& equed, VectorR& r, + VectorC& c, MatrixB& b, MatrixX& x, real_type& rcond, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAFB >::type order; + typedef typename result_of::trans_tag< MatrixAB, order >::type trans; + return invoke( fact, ab, afb, ipiv, equed, r, c, b, x, rcond, ferr, + berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gbsvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gbsvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gbsvx( const char fact, MatrixAB& ab, MatrixAFB& afb, VectorIPIV& ipiv, + char& equed, VectorR& r, VectorC& c, MatrixB& b, MatrixX& x, + typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type& rcond, VectorFERR& ferr, VectorBERR& berr, + Workspace work ) { + return gbsvx_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( fact, ab, afb, ipiv, equed, r, c, b, + x, rcond, ferr, berr, work ); +} + +// +// Overloaded function for gbsvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixAFB, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +gbsvx( const char fact, MatrixAB& ab, MatrixAFB& afb, VectorIPIV& ipiv, + char& equed, VectorR& r, VectorC& c, MatrixB& b, MatrixX& x, + typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type& rcond, VectorFERR& ferr, VectorBERR& berr ) { + return gbsvx_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( fact, ab, afb, ipiv, equed, r, c, b, + x, rcond, ferr, berr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gees.hpp b/sdk/boost/numeric/bindings/lapack/driver/gees.hpp new file mode 100644 index 0000000..42c765a --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gees.hpp @@ -0,0 +1,520 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GEES_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GEES_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gees is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gees( const char jobvs, const char sort, + external_fp select, const fortran_int_t n, float* a, + const fortran_int_t lda, fortran_int_t& sdim, float* wr, float* wi, + float* vs, const fortran_int_t ldvs, float* work, + const fortran_int_t lwork, fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_SGEES( &jobvs, &sort, select, &n, a, &lda, &sdim, wr, wi, vs, + &ldvs, work, &lwork, bwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gees( const char jobvs, const char sort, + external_fp select, const fortran_int_t n, double* a, + const fortran_int_t lda, fortran_int_t& sdim, double* wr, double* wi, + double* vs, const fortran_int_t ldvs, double* work, + const fortran_int_t lwork, fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_DGEES( &jobvs, &sort, select, &n, a, &lda, &sdim, wr, wi, vs, + &ldvs, work, &lwork, bwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gees( const char jobvs, const char sort, + external_fp select, const fortran_int_t n, std::complex* a, + const fortran_int_t lda, fortran_int_t& sdim, std::complex* w, + std::complex* vs, const fortran_int_t ldvs, + std::complex* work, const fortran_int_t lwork, float* rwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_CGEES( &jobvs, &sort, select, &n, a, &lda, &sdim, w, vs, &ldvs, + work, &lwork, rwork, bwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gees( const char jobvs, const char sort, + external_fp select, const fortran_int_t n, std::complex* a, + const fortran_int_t lda, fortran_int_t& sdim, std::complex* w, + std::complex* vs, const fortran_int_t ldvs, + std::complex* work, const fortran_int_t lwork, double* rwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_ZGEES( &jobvs, &sort, select, &n, a, &lda, &sdim, w, vs, &ldvs, + work, &lwork, rwork, bwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gees. +// +template< typename Value, typename Enable = void > +struct gees_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gees_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVS, typename WORK, typename BWORK > + static std::ptrdiff_t invoke( const char jobvs, const char sort, + external_fp select, MatrixA& a, fortran_int_t& sdim, + VectorWR& wr, VectorWI& wi, MatrixVS& vs, detail::workspace2< + WORK, BWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVS >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWI >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWI >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVS >::value) ); + BOOST_ASSERT( bindings::size(wi) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_bool_t())) >= + min_size_bwork( bindings::size_column(a), sort )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(wr) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(vs) == 1 || + bindings::stride_minor(vs) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvs == 'N' || jobvs == 'V' ); + BOOST_ASSERT( sort == 'N' || sort == 'S' ); + return detail::gees( jobvs, sort, select, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), sdim, + bindings::begin_value(wr), bindings::begin_value(wi), + bindings::begin_value(vs), bindings::stride_major(vs), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_bool_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVS > + static std::ptrdiff_t invoke( const char jobvs, const char sort, + external_fp select, MatrixA& a, fortran_int_t& sdim, + VectorWR& wr, VectorWI& wi, MatrixVS& vs, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + return invoke( jobvs, sort, select, a, sdim, wr, wi, vs, + workspace( tmp_work, tmp_bwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVS > + static std::ptrdiff_t invoke( const char jobvs, const char sort, + external_fp select, MatrixA& a, fortran_int_t& sdim, + VectorWR& wr, VectorWI& wi, MatrixVS& vs, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + detail::gees( jobvs, sort, select, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), sdim, + bindings::begin_value(wr), bindings::begin_value(wi), + bindings::begin_value(vs), bindings::stride_major(vs), + &opt_size_work, -1, bindings::begin_value(tmp_bwork) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobvs, sort, select, a, sdim, wr, wi, vs, + workspace( tmp_work, tmp_bwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 3*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array bwork. + // + static std::ptrdiff_t min_size_bwork( const std::ptrdiff_t n, + const char sort ) { + if ( sort == 'N' ) + return 0; + else + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gees_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename MatrixVS, + typename WORK, typename RWORK, typename BWORK > + static std::ptrdiff_t invoke( const char jobvs, const char sort, + external_fp select, MatrixA& a, fortran_int_t& sdim, + VectorW& w, MatrixVS& vs, detail::workspace3< WORK, RWORK, + BWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVS >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVS >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_bool_t())) >= + min_size_bwork( bindings::size_column(a), sort )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(vs) == 1 || + bindings::stride_minor(vs) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvs == 'N' || jobvs == 'V' ); + BOOST_ASSERT( sort == 'N' || sort == 'S' ); + return detail::gees( jobvs, sort, select, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), sdim, + bindings::begin_value(w), bindings::begin_value(vs), + bindings::stride_major(vs), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_bool_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW, typename MatrixVS > + static std::ptrdiff_t invoke( const char jobvs, const char sort, + external_fp select, MatrixA& a, fortran_int_t& sdim, + VectorW& w, MatrixVS& vs, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + return invoke( jobvs, sort, select, a, sdim, w, vs, + workspace( tmp_work, tmp_rwork, tmp_bwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW, typename MatrixVS > + static std::ptrdiff_t invoke( const char jobvs, const char sort, + external_fp select, MatrixA& a, fortran_int_t& sdim, + VectorW& w, MatrixVS& vs, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + detail::gees( jobvs, sort, select, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), sdim, + bindings::begin_value(w), bindings::begin_value(vs), + bindings::stride_major(vs), &opt_size_work, -1, + bindings::begin_value(tmp_rwork), + bindings::begin_value(tmp_bwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobvs, sort, select, a, sdim, w, vs, + workspace( tmp_work, tmp_rwork, tmp_bwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 2*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array bwork. + // + static std::ptrdiff_t min_size_bwork( const std::ptrdiff_t n, + const char sort ) { + if ( sort == 'N' ) + return 0; + else + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gees_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gees. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVS, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gees( const char jobvs, const char sort, external_fp select, MatrixA& a, + fortran_int_t& sdim, VectorWR& wr, VectorWI& wi, MatrixVS& vs, + Workspace work ) { + return gees_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvs, sort, select, a, sdim, wr, wi, + vs, work ); +} + +// +// Overloaded function for gees. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVS > +inline typename boost::disable_if< detail::is_workspace< MatrixVS >, + std::ptrdiff_t >::type +gees( const char jobvs, const char sort, external_fp select, MatrixA& a, + fortran_int_t& sdim, VectorWR& wr, VectorWI& wi, MatrixVS& vs ) { + return gees_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvs, sort, select, a, sdim, wr, wi, + vs, optimal_workspace() ); +} + +// +// Overloaded function for gees. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorW, typename MatrixVS, + typename Workspace > +inline typename boost::enable_if< mpl::and_< is_complex< + typename bindings::value_type< MatrixA >::type >, + detail::is_workspace< Workspace > >, + std::ptrdiff_t >::type +gees( const char jobvs, const char sort, external_fp select, MatrixA& a, + fortran_int_t& sdim, VectorW& w, MatrixVS& vs, Workspace work ) { + return gees_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvs, sort, select, a, sdim, w, vs, + work ); +} + +// +// Overloaded function for gees. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorW, typename MatrixVS > +inline typename boost::disable_if< mpl::or_< is_real< + typename bindings::value_type< MatrixA >::type >, + detail::is_workspace< MatrixVS > >, + std::ptrdiff_t >::type +gees( const char jobvs, const char sort, external_fp select, MatrixA& a, + fortran_int_t& sdim, VectorW& w, MatrixVS& vs ) { + return gees_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvs, sort, select, a, sdim, w, vs, + optimal_workspace() ); +} + +// +// Overloaded function for gees. Its overload differs for +// * VectorW +// * User-defined workspace +// +template< typename MatrixA, typename VectorW, typename MatrixVS, + typename Workspace > +inline typename boost::enable_if< mpl::and_< is_real< + typename bindings::value_type< MatrixA >::type >, + detail::is_workspace< Workspace > >, + std::ptrdiff_t >::type +gees( const char jobvs, const char sort, external_fp select, MatrixA& a, + fortran_int_t& sdim, VectorW& w, MatrixVS& vs, Workspace work ) { + std::ptrdiff_t info = gees_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvs, sort, select, a, sdim, + bindings::detail::real_part_view(w), bindings::detail::imag_part_view(w), + vs, work ); + bindings::detail::interlace(w); + return info; +} + +// +// Overloaded function for gees. Its overload differs for +// * VectorW +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorW, typename MatrixVS > +inline typename boost::disable_if< mpl::or_< is_complex< + typename bindings::value_type< MatrixA >::type >, + detail::is_workspace< MatrixVS > >, + std::ptrdiff_t >::type +gees( const char jobvs, const char sort, external_fp select, MatrixA& a, + fortran_int_t& sdim, VectorW& w, MatrixVS& vs ) { + std::ptrdiff_t info = gees_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvs, sort, select, a, sdim, + bindings::detail::real_part_view(w), bindings::detail::imag_part_view(w), + vs, optimal_workspace() ); + bindings::detail::interlace(w); + return info; +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/geesx.hpp b/sdk/boost/numeric/bindings/lapack/driver/geesx.hpp new file mode 100644 index 0000000..6486213 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/geesx.hpp @@ -0,0 +1,537 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GEESX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GEESX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for geesx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t geesx( const char jobvs, const char sort, + external_fp select, const char sense, const fortran_int_t n, float* a, + const fortran_int_t lda, fortran_int_t& sdim, float* wr, float* wi, + float* vs, const fortran_int_t ldvs, float& rconde, float& rcondv, + float* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork, fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_SGEESX( &jobvs, &sort, select, &sense, &n, a, &lda, &sdim, wr, wi, + vs, &ldvs, &rconde, &rcondv, work, &lwork, iwork, &liwork, bwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t geesx( const char jobvs, const char sort, + external_fp select, const char sense, const fortran_int_t n, + double* a, const fortran_int_t lda, fortran_int_t& sdim, double* wr, + double* wi, double* vs, const fortran_int_t ldvs, double& rconde, + double& rcondv, double* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_DGEESX( &jobvs, &sort, select, &sense, &n, a, &lda, &sdim, wr, wi, + vs, &ldvs, &rconde, &rcondv, work, &lwork, iwork, &liwork, bwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geesx( const char jobvs, const char sort, + external_fp select, const char sense, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, fortran_int_t& sdim, + std::complex* w, std::complex* vs, + const fortran_int_t ldvs, float& rconde, float& rcondv, + std::complex* work, const fortran_int_t lwork, float* rwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_CGEESX( &jobvs, &sort, select, &sense, &n, a, &lda, &sdim, w, vs, + &ldvs, &rconde, &rcondv, work, &lwork, rwork, bwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geesx( const char jobvs, const char sort, + external_fp select, const char sense, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, fortran_int_t& sdim, + std::complex* w, std::complex* vs, + const fortran_int_t ldvs, double& rconde, double& rcondv, + std::complex* work, const fortran_int_t lwork, double* rwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_ZGEESX( &jobvs, &sort, select, &sense, &n, a, &lda, &sdim, w, vs, + &ldvs, &rconde, &rcondv, work, &lwork, rwork, bwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to geesx. +// +template< typename Value, typename Enable = void > +struct geesx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct geesx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVS, typename WORK, typename IWORK, typename BWORK > + static std::ptrdiff_t invoke( const char jobvs, const char sort, + external_fp select, const char sense, MatrixA& a, + fortran_int_t& sdim, VectorWR& wr, VectorWI& wi, MatrixVS& vs, + real_type& rconde, real_type& rcondv, detail::workspace3< WORK, + IWORK, BWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVS >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWI >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWI >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVS >::value) ); + BOOST_ASSERT( bindings::size(wi) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a), sense )); + BOOST_ASSERT( bindings::size(work.select(fortran_bool_t())) >= + min_size_bwork( bindings::size_column(a), sort )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a), sense )); + BOOST_ASSERT( bindings::size(wr) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(vs) == 1 || + bindings::stride_minor(vs) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvs == 'N' || jobvs == 'V' ); + BOOST_ASSERT( sense == 'N' || sense == 'E' || sense == 'V' || + sense == 'B' ); + BOOST_ASSERT( sort == 'N' || sort == 'S' ); + return detail::geesx( jobvs, sort, select, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), sdim, bindings::begin_value(wr), + bindings::begin_value(wi), bindings::begin_value(vs), + bindings::stride_major(vs), rconde, rcondv, + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())), + bindings::begin_value(work.select(fortran_bool_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVS > + static std::ptrdiff_t invoke( const char jobvs, const char sort, + external_fp select, const char sense, MatrixA& a, + fortran_int_t& sdim, VectorWR& wr, VectorWI& wi, MatrixVS& vs, + real_type& rconde, real_type& rcondv, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a), sense ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a), sense ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + return invoke( jobvs, sort, select, sense, a, sdim, wr, wi, vs, + rconde, rcondv, workspace( tmp_work, tmp_iwork, tmp_bwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVS > + static std::ptrdiff_t invoke( const char jobvs, const char sort, + external_fp select, const char sense, MatrixA& a, + fortran_int_t& sdim, VectorWR& wr, VectorWI& wi, MatrixVS& vs, + real_type& rconde, real_type& rcondv, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + detail::geesx( jobvs, sort, select, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), sdim, bindings::begin_value(wr), + bindings::begin_value(wi), bindings::begin_value(vs), + bindings::stride_major(vs), rconde, rcondv, &opt_size_work, + -1, &opt_size_iwork, -1, bindings::begin_value(tmp_bwork) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobvs, sort, select, sense, a, sdim, wr, wi, vs, + rconde, rcondv, workspace( tmp_work, tmp_iwork, tmp_bwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const char sense ) { + if ( sense == 'N' ) + return std::max< std::ptrdiff_t >( 1, 3*n ); + else + return std::max< std::ptrdiff_t >( 1, n+n*n/2 ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n, + const char sense ) { + if ( sense == 'N' || sense == 'E' ) + return 1; + else + return std::max< std::ptrdiff_t >( 1, n*n/4 ); + } + + // + // Static member function that returns the minimum size of + // workspace-array bwork. + // + static std::ptrdiff_t min_size_bwork( const std::ptrdiff_t n, + const char sort ) { + if ( sort == 'N' ) + return 0; + else + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct geesx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename MatrixVS, + typename WORK, typename RWORK, typename BWORK > + static std::ptrdiff_t invoke( const char jobvs, const char sort, + external_fp select, const char sense, MatrixA& a, + fortran_int_t& sdim, VectorW& w, MatrixVS& vs, + real_type& rconde, real_type& rcondv, detail::workspace3< WORK, + RWORK, BWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVS >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVS >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_bool_t())) >= + min_size_bwork( bindings::size_column(a), sort )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a), sense )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(vs) == 1 || + bindings::stride_minor(vs) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvs == 'N' || jobvs == 'V' ); + BOOST_ASSERT( sense == 'N' || sense == 'E' || sense == 'V' || + sense == 'B' ); + BOOST_ASSERT( sort == 'N' || sort == 'S' ); + return detail::geesx( jobvs, sort, select, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), sdim, bindings::begin_value(w), + bindings::begin_value(vs), bindings::stride_major(vs), rconde, + rcondv, bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_bool_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW, typename MatrixVS > + static std::ptrdiff_t invoke( const char jobvs, const char sort, + external_fp select, const char sense, MatrixA& a, + fortran_int_t& sdim, VectorW& w, MatrixVS& vs, + real_type& rconde, real_type& rcondv, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a), sense ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + return invoke( jobvs, sort, select, sense, a, sdim, w, vs, rconde, + rcondv, workspace( tmp_work, tmp_rwork, tmp_bwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW, typename MatrixVS > + static std::ptrdiff_t invoke( const char jobvs, const char sort, + external_fp select, const char sense, MatrixA& a, + fortran_int_t& sdim, VectorW& w, MatrixVS& vs, + real_type& rconde, real_type& rcondv, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + detail::geesx( jobvs, sort, select, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), sdim, bindings::begin_value(w), + bindings::begin_value(vs), bindings::stride_major(vs), rconde, + rcondv, &opt_size_work, -1, bindings::begin_value(tmp_rwork), + bindings::begin_value(tmp_bwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobvs, sort, select, sense, a, sdim, w, vs, rconde, + rcondv, workspace( tmp_work, tmp_rwork, tmp_bwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const char sense ) { + if ( sense == 'N' ) + return std::max< std::ptrdiff_t >( 1, 2*n ); + else + return std::max< std::ptrdiff_t >( 1, n*n/2 ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array bwork. + // + static std::ptrdiff_t min_size_bwork( const std::ptrdiff_t n, + const char sort ) { + if ( sort == 'N' ) + return 0; + else + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the geesx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for geesx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVS, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +geesx( const char jobvs, const char sort, external_fp select, + const char sense, MatrixA& a, fortran_int_t& sdim, VectorWR& wr, + VectorWI& wi, MatrixVS& vs, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rconde, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& rcondv, Workspace work ) { + return geesx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvs, sort, select, sense, a, sdim, + wr, wi, vs, rconde, rcondv, work ); +} + +// +// Overloaded function for geesx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVS > +inline typename boost::disable_if< detail::is_workspace< MatrixVS >, + std::ptrdiff_t >::type +geesx( const char jobvs, const char sort, external_fp select, + const char sense, MatrixA& a, fortran_int_t& sdim, VectorWR& wr, + VectorWI& wi, MatrixVS& vs, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rconde, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& rcondv ) { + return geesx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvs, sort, select, sense, a, sdim, + wr, wi, vs, rconde, rcondv, optimal_workspace() ); +} + +// +// Overloaded function for geesx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorW, typename MatrixVS, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +geesx( const char jobvs, const char sort, external_fp select, + const char sense, MatrixA& a, fortran_int_t& sdim, VectorW& w, + MatrixVS& vs, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rconde, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& rcondv, Workspace work ) { + return geesx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvs, sort, select, sense, a, sdim, w, + vs, rconde, rcondv, work ); +} + +// +// Overloaded function for geesx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorW, typename MatrixVS > +inline typename boost::disable_if< detail::is_workspace< MatrixVS >, + std::ptrdiff_t >::type +geesx( const char jobvs, const char sort, external_fp select, + const char sense, MatrixA& a, fortran_int_t& sdim, VectorW& w, + MatrixVS& vs, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rconde, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& rcondv ) { + return geesx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvs, sort, select, sense, a, sdim, w, + vs, rconde, rcondv, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/geev.hpp b/sdk/boost/numeric/bindings/lapack/driver/geev.hpp new file mode 100644 index 0000000..1754a06 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/geev.hpp @@ -0,0 +1,456 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GEEV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GEEV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for geev is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t geev( const char jobvl, const char jobvr, + const fortran_int_t n, float* a, const fortran_int_t lda, float* wr, + float* wi, float* vl, const fortran_int_t ldvl, float* vr, + const fortran_int_t ldvr, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGEEV( &jobvl, &jobvr, &n, a, &lda, wr, wi, vl, &ldvl, vr, &ldvr, + work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t geev( const char jobvl, const char jobvr, + const fortran_int_t n, double* a, const fortran_int_t lda, double* wr, + double* wi, double* vl, const fortran_int_t ldvl, double* vr, + const fortran_int_t ldvr, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGEEV( &jobvl, &jobvr, &n, a, &lda, wr, wi, vl, &ldvl, vr, &ldvr, + work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geev( const char jobvl, const char jobvr, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* w, + std::complex* vl, const fortran_int_t ldvl, + std::complex* vr, const fortran_int_t ldvr, + std::complex* work, const fortran_int_t lwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGEEV( &jobvl, &jobvr, &n, a, &lda, w, vl, &ldvl, vr, &ldvr, work, + &lwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geev( const char jobvl, const char jobvr, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* w, + std::complex* vl, const fortran_int_t ldvl, + std::complex* vr, const fortran_int_t ldvr, + std::complex* work, const fortran_int_t lwork, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGEEV( &jobvl, &jobvr, &n, a, &lda, w, vl, &ldvl, vr, &ldvr, work, + &lwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to geev. +// +template< typename Value, typename Enable = void > +struct geev_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct geev_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVL, typename MatrixVR, typename WORK > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, VectorWR& wr, VectorWI& wi, MatrixVL& vl, + MatrixVR& vr, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWI >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWI >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_ASSERT( bindings::size(wi) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobvl, jobvr, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(wr) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvl == 'N' || jobvl == 'V' ); + BOOST_ASSERT( jobvr == 'N' || jobvr == 'V' ); + return detail::geev( jobvl, jobvr, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(wr), bindings::begin_value(wi), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, VectorWR& wr, VectorWI& wi, MatrixVL& vl, + MatrixVR& vr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( jobvl, + jobvr, bindings::size_column(a) ) ); + return invoke( jobvl, jobvr, a, wr, wi, vl, vr, + workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, VectorWR& wr, VectorWI& wi, MatrixVL& vl, + MatrixVR& vr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::geev( jobvl, jobvr, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(wr), bindings::begin_value(wi), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobvl, jobvr, a, wr, wi, vl, vr, + workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobvl, const char jobvr, + const std::ptrdiff_t n ) { + if ( jobvl == 'V' || jobvr == 'V' ) + return std::max< std::ptrdiff_t >( 1, 4*n ); + else + return std::max< std::ptrdiff_t >( 1, 3*n ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct geev_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename MatrixVL, + typename MatrixVR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, VectorW& w, MatrixVL& vl, MatrixVR& vr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvl == 'N' || jobvl == 'V' ); + BOOST_ASSERT( jobvr == 'N' || jobvr == 'V' ); + return detail::geev( jobvl, jobvr, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW, typename MatrixVL, + typename MatrixVR > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, VectorW& w, MatrixVL& vl, MatrixVR& vr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( jobvl, jobvr, a, w, vl, vr, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW, typename MatrixVL, + typename MatrixVR > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, VectorW& w, MatrixVL& vl, MatrixVR& vr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + detail::geev( jobvl, jobvr, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), &opt_size_work, -1, + bindings::begin_value(tmp_rwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobvl, jobvr, a, w, vl, vr, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 2*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the geev_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for geev. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVL, typename MatrixVR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +geev( const char jobvl, const char jobvr, MatrixA& a, VectorWR& wr, + VectorWI& wi, MatrixVL& vl, MatrixVR& vr, Workspace work ) { + return geev_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvl, jobvr, a, wr, wi, vl, vr, work ); +} + +// +// Overloaded function for geev. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVL, typename MatrixVR > +inline typename boost::disable_if< detail::is_workspace< MatrixVR >, + std::ptrdiff_t >::type +geev( const char jobvl, const char jobvr, MatrixA& a, VectorWR& wr, + VectorWI& wi, MatrixVL& vl, MatrixVR& vr ) { + return geev_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvl, jobvr, a, wr, wi, vl, vr, + optimal_workspace() ); +} + +// +// Overloaded function for geev. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorW, typename MatrixVL, + typename MatrixVR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +geev( const char jobvl, const char jobvr, MatrixA& a, VectorW& w, + MatrixVL& vl, MatrixVR& vr, Workspace work ) { + return geev_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvl, jobvr, a, w, vl, vr, work ); +} + +// +// Overloaded function for geev. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorW, typename MatrixVL, + typename MatrixVR > +inline typename boost::disable_if< detail::is_workspace< MatrixVR >, + std::ptrdiff_t >::type +geev( const char jobvl, const char jobvr, MatrixA& a, VectorW& w, + MatrixVL& vl, MatrixVR& vr ) { + return geev_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvl, jobvr, a, w, vl, vr, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/geevx.hpp b/sdk/boost/numeric/bindings/lapack/driver/geevx.hpp new file mode 100644 index 0000000..5eec32d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/geevx.hpp @@ -0,0 +1,597 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GEEVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GEEVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for geevx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t geevx( const char balanc, const char jobvl, + const char jobvr, const char sense, const fortran_int_t n, float* a, + const fortran_int_t lda, float* wr, float* wi, float* vl, + const fortran_int_t ldvl, float* vr, const fortran_int_t ldvr, + fortran_int_t& ilo, fortran_int_t& ihi, float* scale, float& abnrm, + float* rconde, float* rcondv, float* work, const fortran_int_t lwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SGEEVX( &balanc, &jobvl, &jobvr, &sense, &n, a, &lda, wr, wi, vl, + &ldvl, vr, &ldvr, &ilo, &ihi, scale, &abnrm, rconde, rcondv, work, + &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t geevx( const char balanc, const char jobvl, + const char jobvr, const char sense, const fortran_int_t n, double* a, + const fortran_int_t lda, double* wr, double* wi, double* vl, + const fortran_int_t ldvl, double* vr, const fortran_int_t ldvr, + fortran_int_t& ilo, fortran_int_t& ihi, double* scale, double& abnrm, + double* rconde, double* rcondv, double* work, + const fortran_int_t lwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DGEEVX( &balanc, &jobvl, &jobvr, &sense, &n, a, &lda, wr, wi, vl, + &ldvl, vr, &ldvr, &ilo, &ihi, scale, &abnrm, rconde, rcondv, work, + &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geevx( const char balanc, const char jobvl, + const char jobvr, const char sense, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* w, std::complex* vl, + const fortran_int_t ldvl, std::complex* vr, + const fortran_int_t ldvr, fortran_int_t& ilo, fortran_int_t& ihi, + float* scale, float& abnrm, float* rconde, float* rcondv, + std::complex* work, const fortran_int_t lwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGEEVX( &balanc, &jobvl, &jobvr, &sense, &n, a, &lda, w, vl, &ldvl, + vr, &ldvr, &ilo, &ihi, scale, &abnrm, rconde, rcondv, work, + &lwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t geevx( const char balanc, const char jobvl, + const char jobvr, const char sense, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* w, std::complex* vl, + const fortran_int_t ldvl, std::complex* vr, + const fortran_int_t ldvr, fortran_int_t& ilo, fortran_int_t& ihi, + double* scale, double& abnrm, double* rconde, double* rcondv, + std::complex* work, const fortran_int_t lwork, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGEEVX( &balanc, &jobvl, &jobvr, &sense, &n, a, &lda, w, vl, &ldvl, + vr, &ldvr, &ilo, &ihi, scale, &abnrm, rconde, rcondv, work, + &lwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to geevx. +// +template< typename Value, typename Enable = void > +struct geevx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct geevx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVL, typename MatrixVR, typename VectorSCALE, + typename VectorRCONDE, typename VectorRCONDV, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const char balanc, const char jobvl, + const char jobvr, const char sense, MatrixA& a, VectorWR& wr, + VectorWI& wi, MatrixVL& vl, MatrixVR& vr, fortran_int_t& ilo, + fortran_int_t& ihi, VectorSCALE& scale, real_type& abnrm, + VectorRCONDE& rconde, VectorRCONDV& rcondv, detail::workspace2< + WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorWI >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorSCALE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRCONDE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRCONDV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorWI >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorSCALE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRCONDE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRCONDV >::value) ); + BOOST_ASSERT( bindings::size(rconde) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(rcondv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(wi) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( sense, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( sense, jobvl, jobvr, + bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(wr) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( balanc == 'N' || balanc == 'P' || balanc == 'S' || + balanc == 'B' ); + BOOST_ASSERT( jobvl == 'N' || jobvl == 'V' || jobvl == 'E' || + jobvl == 'B' ); + BOOST_ASSERT( jobvr == 'N' || jobvr == 'V' || jobvr == 'E' || + jobvr == 'B' ); + BOOST_ASSERT( sense == 'N' || sense == 'E' || sense == 'V' || + sense == 'B' ); + return detail::geevx( balanc, jobvl, jobvr, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(wr), + bindings::begin_value(wi), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), ilo, ihi, + bindings::begin_value(scale), abnrm, + bindings::begin_value(rconde), bindings::begin_value(rcondv), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVL, typename MatrixVR, typename VectorSCALE, + typename VectorRCONDE, typename VectorRCONDV > + static std::ptrdiff_t invoke( const char balanc, const char jobvl, + const char jobvr, const char sense, MatrixA& a, VectorWR& wr, + VectorWI& wi, MatrixVL& vl, MatrixVR& vr, fortran_int_t& ilo, + fortran_int_t& ihi, VectorSCALE& scale, real_type& abnrm, + VectorRCONDE& rconde, VectorRCONDV& rcondv, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( sense, + jobvl, jobvr, bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( sense, bindings::size_column(a) ) ); + return invoke( balanc, jobvl, jobvr, sense, a, wr, wi, vl, vr, ilo, + ihi, scale, abnrm, rconde, rcondv, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVL, typename MatrixVR, typename VectorSCALE, + typename VectorRCONDE, typename VectorRCONDV > + static std::ptrdiff_t invoke( const char balanc, const char jobvl, + const char jobvr, const char sense, MatrixA& a, VectorWR& wr, + VectorWI& wi, MatrixVL& vl, MatrixVR& vr, fortran_int_t& ilo, + fortran_int_t& ihi, VectorSCALE& scale, real_type& abnrm, + VectorRCONDE& rconde, VectorRCONDV& rcondv, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( sense, bindings::size_column(a) ) ); + detail::geevx( balanc, jobvl, jobvr, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(wr), + bindings::begin_value(wi), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), ilo, ihi, + bindings::begin_value(scale), abnrm, + bindings::begin_value(rconde), bindings::begin_value(rcondv), + &opt_size_work, -1, bindings::begin_value(tmp_iwork) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( balanc, jobvl, jobvr, sense, a, wr, wi, vl, vr, ilo, + ihi, scale, abnrm, rconde, rcondv, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char sense, const char jobvl, + const char jobvr, const std::ptrdiff_t n ) { + if ( sense == 'N' || sense == 'E' ) { + if ( jobvl =='V' || jobvr == 'V' ) + return std::max< std::ptrdiff_t >( 1, 3*n ); + else + return std::max< std::ptrdiff_t >( 1, 2*n ); + } else + return std::max< std::ptrdiff_t >( 1, n*(n+6) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char sense, + const std::ptrdiff_t n ) { + if ( sense == 'N' || sense == 'E' ) + return 0; + else + return 2*n-2; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct geevx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename MatrixVL, + typename MatrixVR, typename VectorSCALE, typename VectorRCONDE, + typename VectorRCONDV, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char balanc, const char jobvl, + const char jobvr, const char sense, MatrixA& a, VectorW& w, + MatrixVL& vl, MatrixVR& vr, fortran_int_t& ilo, + fortran_int_t& ihi, VectorSCALE& scale, real_type& abnrm, + VectorRCONDE& rconde, VectorRCONDV& rcondv, detail::workspace2< + WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorSCALE >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRCONDE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorSCALE >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRCONDV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorSCALE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRCONDE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRCONDV >::value) ); + BOOST_ASSERT( bindings::size(rconde) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(rcondv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( sense, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( balanc == 'N' || balanc == 'P' || balanc == 'S' || + balanc == 'B' ); + BOOST_ASSERT( jobvl == 'N' || jobvl == 'V' || jobvl == 'E' || + jobvl == 'B' ); + BOOST_ASSERT( jobvr == 'N' || jobvr == 'V' || jobvr == 'E' || + jobvr == 'B' ); + BOOST_ASSERT( sense == 'N' || sense == 'E' || sense == 'V' || + sense == 'B' ); + return detail::geevx( balanc, jobvl, jobvr, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(w), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), ilo, + ihi, bindings::begin_value(scale), abnrm, + bindings::begin_value(rconde), bindings::begin_value(rcondv), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW, typename MatrixVL, + typename MatrixVR, typename VectorSCALE, typename VectorRCONDE, + typename VectorRCONDV > + static std::ptrdiff_t invoke( const char balanc, const char jobvl, + const char jobvr, const char sense, MatrixA& a, VectorW& w, + MatrixVL& vl, MatrixVR& vr, fortran_int_t& ilo, + fortran_int_t& ihi, VectorSCALE& scale, real_type& abnrm, + VectorRCONDE& rconde, VectorRCONDV& rcondv, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( sense, + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( balanc, jobvl, jobvr, sense, a, w, vl, vr, ilo, ihi, + scale, abnrm, rconde, rcondv, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW, typename MatrixVL, + typename MatrixVR, typename VectorSCALE, typename VectorRCONDE, + typename VectorRCONDV > + static std::ptrdiff_t invoke( const char balanc, const char jobvl, + const char jobvr, const char sense, MatrixA& a, VectorW& w, + MatrixVL& vl, MatrixVR& vr, fortran_int_t& ilo, + fortran_int_t& ihi, VectorSCALE& scale, real_type& abnrm, + VectorRCONDE& rconde, VectorRCONDV& rcondv, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + detail::geevx( balanc, jobvl, jobvr, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(w), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), ilo, + ihi, bindings::begin_value(scale), abnrm, + bindings::begin_value(rconde), bindings::begin_value(rcondv), + &opt_size_work, -1, bindings::begin_value(tmp_rwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( balanc, jobvl, jobvr, sense, a, w, vl, vr, ilo, ihi, + scale, abnrm, rconde, rcondv, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char sense, + const std::ptrdiff_t n ) { + if ( sense == 'N' || sense == 'E' ) + return std::max< std::ptrdiff_t >( 1, 2*n ); + else + return std::max< std::ptrdiff_t >( 1, n*n + 2*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the geevx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for geevx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVL, typename MatrixVR, typename VectorSCALE, + typename VectorRCONDE, typename VectorRCONDV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +geevx( const char balanc, const char jobvl, const char jobvr, + const char sense, MatrixA& a, VectorWR& wr, VectorWI& wi, + MatrixVL& vl, MatrixVR& vr, fortran_int_t& ilo, + fortran_int_t& ihi, VectorSCALE& scale, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& abnrm, + VectorRCONDE& rconde, VectorRCONDV& rcondv, Workspace work ) { + return geevx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( balanc, jobvl, jobvr, sense, a, wr, wi, + vl, vr, ilo, ihi, scale, abnrm, rconde, rcondv, work ); +} + +// +// Overloaded function for geevx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorWR, typename VectorWI, + typename MatrixVL, typename MatrixVR, typename VectorSCALE, + typename VectorRCONDE, typename VectorRCONDV > +inline typename boost::disable_if< detail::is_workspace< VectorRCONDV >, + std::ptrdiff_t >::type +geevx( const char balanc, const char jobvl, const char jobvr, + const char sense, MatrixA& a, VectorWR& wr, VectorWI& wi, + MatrixVL& vl, MatrixVR& vr, fortran_int_t& ilo, + fortran_int_t& ihi, VectorSCALE& scale, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& abnrm, + VectorRCONDE& rconde, VectorRCONDV& rcondv ) { + return geevx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( balanc, jobvl, jobvr, sense, a, wr, wi, + vl, vr, ilo, ihi, scale, abnrm, rconde, rcondv, + optimal_workspace() ); +} + +// +// Overloaded function for geevx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorW, typename MatrixVL, + typename MatrixVR, typename VectorSCALE, typename VectorRCONDE, + typename VectorRCONDV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +geevx( const char balanc, const char jobvl, const char jobvr, + const char sense, MatrixA& a, VectorW& w, MatrixVL& vl, MatrixVR& vr, + fortran_int_t& ilo, fortran_int_t& ihi, VectorSCALE& scale, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& abnrm, VectorRCONDE& rconde, + VectorRCONDV& rcondv, Workspace work ) { + return geevx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( balanc, jobvl, jobvr, sense, a, w, vl, + vr, ilo, ihi, scale, abnrm, rconde, rcondv, work ); +} + +// +// Overloaded function for geevx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorW, typename MatrixVL, + typename MatrixVR, typename VectorSCALE, typename VectorRCONDE, + typename VectorRCONDV > +inline typename boost::disable_if< detail::is_workspace< VectorRCONDV >, + std::ptrdiff_t >::type +geevx( const char balanc, const char jobvl, const char jobvr, + const char sense, MatrixA& a, VectorW& w, MatrixVL& vl, MatrixVR& vr, + fortran_int_t& ilo, fortran_int_t& ihi, VectorSCALE& scale, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& abnrm, VectorRCONDE& rconde, + VectorRCONDV& rcondv ) { + return geevx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( balanc, jobvl, jobvr, sense, a, w, vl, + vr, ilo, ihi, scale, abnrm, rconde, rcondv, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gegv.hpp b/sdk/boost/numeric/bindings/lapack/driver/gegv.hpp new file mode 100644 index 0000000..3ae73a1 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gegv.hpp @@ -0,0 +1,509 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GEGV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GEGV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gegv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gegv( const char jobvl, const char jobvr, + const fortran_int_t n, float* a, const fortran_int_t lda, float* b, + const fortran_int_t ldb, float* alphar, float* alphai, float* beta, + float* vl, const fortran_int_t ldvl, float* vr, + const fortran_int_t ldvr, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGEGV( &jobvl, &jobvr, &n, a, &lda, b, &ldb, alphar, alphai, beta, + vl, &ldvl, vr, &ldvr, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gegv( const char jobvl, const char jobvr, + const fortran_int_t n, double* a, const fortran_int_t lda, double* b, + const fortran_int_t ldb, double* alphar, double* alphai, double* beta, + double* vl, const fortran_int_t ldvl, double* vr, + const fortran_int_t ldvr, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGEGV( &jobvl, &jobvr, &n, a, &lda, b, &ldb, alphar, alphai, beta, + vl, &ldvl, vr, &ldvr, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gegv( const char jobvl, const char jobvr, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, std::complex* alpha, + std::complex* beta, std::complex* vl, + const fortran_int_t ldvl, std::complex* vr, + const fortran_int_t ldvr, std::complex* work, + const fortran_int_t lwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGEGV( &jobvl, &jobvr, &n, a, &lda, b, &ldb, alpha, beta, vl, + &ldvl, vr, &ldvr, work, &lwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gegv( const char jobvl, const char jobvr, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, std::complex* alpha, + std::complex* beta, std::complex* vl, + const fortran_int_t ldvl, std::complex* vr, + const fortran_int_t ldvr, std::complex* work, + const fortran_int_t lwork, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGEGV( &jobvl, &jobvr, &n, a, &lda, b, &ldb, alpha, beta, vl, + &ldvl, vr, &ldvr, work, &lwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gegv. +// +template< typename Value, typename Enable = void > +struct gegv_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gegv_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR, typename WORK > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, MatrixB& b, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVL& vl, + MatrixVR& vr, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAI >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAI >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_ASSERT( bindings::size(alphar) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(beta) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvl == 'N' || jobvl == 'V' ); + BOOST_ASSERT( jobvr == 'N' || jobvr == 'V' ); + return detail::gegv( jobvl, jobvr, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(alphar), bindings::begin_value(alphai), + bindings::begin_value(beta), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, MatrixB& b, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVL& vl, + MatrixVR& vr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( jobvl, jobvr, a, b, alphar, alphai, beta, vl, vr, + workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, MatrixB& b, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVL& vl, + MatrixVR& vr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::gegv( jobvl, jobvr, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(alphar), bindings::begin_value(alphai), + bindings::begin_value(beta), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobvl, jobvr, a, b, alphar, alphai, beta, vl, vr, + workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,8*n); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gegv_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, + MatrixVL& vl, MatrixVR& vr, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_ASSERT( bindings::size(alpha) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(beta) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvl == 'N' || jobvl == 'V' ); + BOOST_ASSERT( jobvr == 'N' || jobvr == 'V' ); + return detail::gegv( jobvl, jobvr, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(alpha), bindings::begin_value(beta), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, + MatrixVL& vl, MatrixVR& vr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( jobvl, jobvr, a, b, alpha, beta, vl, vr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, + MatrixVL& vl, MatrixVR& vr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + detail::gegv( jobvl, jobvr, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(alpha), bindings::begin_value(beta), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), + &opt_size_work, -1, bindings::begin_value(tmp_rwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobvl, jobvr, a, b, alpha, beta, vl, vr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,2*n); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 8*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gegv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gegv. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gegv( const char jobvl, const char jobvr, MatrixA& a, MatrixB& b, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixVL& vl, MatrixVR& vr, Workspace work ) { + return gegv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvl, jobvr, a, b, alphar, alphai, + beta, vl, vr, work ); +} + +// +// Overloaded function for gegv. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR > +inline typename boost::disable_if< detail::is_workspace< MatrixVR >, + std::ptrdiff_t >::type +gegv( const char jobvl, const char jobvr, MatrixA& a, MatrixB& b, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixVL& vl, MatrixVR& vr ) { + return gegv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvl, jobvr, a, b, alphar, alphai, + beta, vl, vr, optimal_workspace() ); +} + +// +// Overloaded function for gegv. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gegv( const char jobvl, const char jobvr, MatrixA& a, MatrixB& b, + VectorALPHA& alpha, VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, + Workspace work ) { + return gegv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvl, jobvr, a, b, alpha, beta, vl, + vr, work ); +} + +// +// Overloaded function for gegv. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR > +inline typename boost::disable_if< detail::is_workspace< MatrixVR >, + std::ptrdiff_t >::type +gegv( const char jobvl, const char jobvr, MatrixA& a, MatrixB& b, + VectorALPHA& alpha, VectorBETA& beta, MatrixVL& vl, MatrixVR& vr ) { + return gegv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvl, jobvr, a, b, alpha, beta, vl, + vr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gejsv.hpp b/sdk/boost/numeric/bindings/lapack/driver/gejsv.hpp new file mode 100644 index 0000000..ad2737f --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gejsv.hpp @@ -0,0 +1,274 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GEJSV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GEJSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gejsv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gejsv( const char joba, const char jobu, const char jobv, + const char jobr, const char jobt, const char jobp, + const fortran_int_t m, const fortran_int_t n, float* a, + const fortran_int_t lda, float* sva, float* u, + const fortran_int_t ldu, float* v, const fortran_int_t ldv, + float* work, const fortran_int_t lwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SGEJSV( &joba, &jobu, &jobv, &jobr, &jobt, &jobp, &m, &n, a, &lda, + sva, u, &ldu, v, &ldv, work, &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gejsv( const char joba, const char jobu, const char jobv, + const char jobr, const char jobt, const char jobp, + const fortran_int_t m, const fortran_int_t n, double* a, + const fortran_int_t lda, double* sva, double* u, + const fortran_int_t ldu, double* v, const fortran_int_t ldv, + double* work, const fortran_int_t lwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DGEJSV( &joba, &jobu, &jobv, &jobr, &jobt, &jobp, &m, &n, a, &lda, + sva, u, &ldu, v, &ldv, work, &lwork, iwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gejsv. +// +template< typename Value > +struct gejsv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorSVA, typename MatrixU, + typename MatrixV, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char joba, const char jobu, + const char jobv, const char jobr, const char jobt, + const char jobp, MatrixA& a, VectorSVA& sva, MatrixU& u, + MatrixV& v, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorSVA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorSVA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_row(a), + bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( joba, jobu, jobv, bindings::size_row(a), + bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::gejsv( joba, jobu, jobv, jobr, jobt, jobp, + bindings::size_row(a), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(sva), bindings::begin_value(u), + bindings::stride_major(u), bindings::begin_value(v), + bindings::stride_major(v), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorSVA, typename MatrixU, + typename MatrixV > + static std::ptrdiff_t invoke( const char joba, const char jobu, + const char jobv, const char jobr, const char jobt, + const char jobp, MatrixA& a, VectorSVA& sva, MatrixU& u, + MatrixV& v, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( joba, + jobu, jobv, bindings::size_row(a), + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_row(a), + bindings::size_column(a) ) ); + return invoke( joba, jobu, jobv, jobr, jobt, jobp, a, sva, u, v, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorSVA, typename MatrixU, + typename MatrixV > + static std::ptrdiff_t invoke( const char joba, const char jobu, + const char jobv, const char jobr, const char jobt, + const char jobp, MatrixA& a, VectorSVA& sva, MatrixU& u, + MatrixV& v, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( joba, jobu, jobv, jobr, jobt, jobp, a, sva, u, v, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char joba, const char jobu, + const char jobv, const std::ptrdiff_t m, const std::ptrdiff_t n ) { + if ( jobu == 'N' && jobv == 'N' ) { + if ( joba != 'E' && joba != 'G' ) + return std::max< std::ptrdiff_t >( std::max< + std::ptrdiff_t >( 2*m+n, 4*n+1), 7 ); + else + return std::max< std::ptrdiff_t >( std::max< + std::ptrdiff_t >( 2*m+n, n*n+4*n), 7 ); + } else if ( jobu == 'N' || jobu == 'W' || jobv == 'N' || + jobv == 'W' ) { + return std::max< std::ptrdiff_t >( 2*n+m, 7); + } else { + if ( jobv != 'J' ) + return 6*n+2*n*n; + else + return std::max< std::ptrdiff_t >( m+3*n+n*n, 7); + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t m, + const std::ptrdiff_t n ) { + return m+3*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gejsv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gejsv. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorSVA, typename MatrixU, + typename MatrixV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gejsv( const char joba, const char jobu, const char jobv, + const char jobr, const char jobt, const char jobp, MatrixA& a, + VectorSVA& sva, MatrixU& u, MatrixV& v, Workspace work ) { + return gejsv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( joba, jobu, jobv, jobr, jobt, jobp, a, + sva, u, v, work ); +} + +// +// Overloaded function for gejsv. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorSVA, typename MatrixU, + typename MatrixV > +inline typename boost::disable_if< detail::is_workspace< MatrixV >, + std::ptrdiff_t >::type +gejsv( const char joba, const char jobu, const char jobv, + const char jobr, const char jobt, const char jobp, MatrixA& a, + VectorSVA& sva, MatrixU& u, MatrixV& v ) { + return gejsv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( joba, jobu, jobv, jobr, jobt, jobp, a, + sva, u, v, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gels.hpp b/sdk/boost/numeric/bindings/lapack/driver/gels.hpp new file mode 100644 index 0000000..55fc728 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gels.hpp @@ -0,0 +1,375 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GELS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GELS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gels is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Trans > +inline std::ptrdiff_t gels( const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t nrhs, float* a, + const fortran_int_t lda, float* b, const fortran_int_t ldb, + float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGELS( &lapack_option< Trans >::value, &m, &n, &nrhs, a, &lda, b, + &ldb, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Trans > +inline std::ptrdiff_t gels( const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t nrhs, double* a, + const fortran_int_t lda, double* b, const fortran_int_t ldb, + double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGELS( &lapack_option< Trans >::value, &m, &n, &nrhs, a, &lda, b, + &ldb, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gels( const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t nrhs, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CGELS( &lapack_option< Trans >::value, &m, &n, &nrhs, a, &lda, b, + &ldb, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gels( const Trans, const fortran_int_t m, + const fortran_int_t n, const fortran_int_t nrhs, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZGELS( &lapack_option< Trans >::value, &m, &n, &nrhs, a, &lda, b, + &ldb, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gels. +// +template< typename Value, typename Enable = void > +struct gels_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gels_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row_op(a, trans()), + bindings::size_column_op(a, trans()), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + std::max< std::ptrdiff_t >(bindings::size_row_op(a, trans()), + bindings::size_column_op(a, trans()))) ); + return detail::gels( trans(), bindings::size_row_op(a, trans()), + bindings::size_column_op(a, trans()), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row_op(a, trans()), bindings::size_column_op(a, + trans()), bindings::size_column(b) ) ); + return invoke( a, b, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + real_type opt_size_work; + detail::gels( trans(), bindings::size_row_op(a, trans()), + bindings::size_column_op(a, trans()), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, b, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n, const std::ptrdiff_t nrhs ) { + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( m, n ); + return std::max< std::ptrdiff_t >( 1, minmn + std::max< + std::ptrdiff_t >( minmn, nrhs ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gels_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row_op(a, trans()), + bindings::size_column_op(a, trans()), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + std::max< std::ptrdiff_t >(bindings::size_row_op(a, trans()), + bindings::size_column_op(a, trans()))) ); + return detail::gels( trans(), bindings::size_row_op(a, trans()), + bindings::size_column_op(a, trans()), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row_op(a, trans()), bindings::size_column_op(a, + trans()), bindings::size_column(b) ) ); + return invoke( a, b, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixB >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + value_type opt_size_work; + detail::gels( trans(), bindings::size_row_op(a, trans()), + bindings::size_column_op(a, trans()), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, b, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n, const std::ptrdiff_t nrhs ) { + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( m, n ); + return std::max< std::ptrdiff_t >( 1, minmn + std::max< + std::ptrdiff_t >( minmn, nrhs ) ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gels_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gels. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gels( MatrixA& a, MatrixB& b, Workspace work ) { + return gels_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, work ); +} + +// +// Overloaded function for gels. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB > +inline typename boost::disable_if< detail::is_workspace< MatrixB >, + std::ptrdiff_t >::type +gels( MatrixA& a, MatrixB& b ) { + return gels_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gelsd.hpp b/sdk/boost/numeric/bindings/lapack/driver/gelsd.hpp new file mode 100644 index 0000000..aa10c9c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gelsd.hpp @@ -0,0 +1,493 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GELSD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GELSD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gelsd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gelsd( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nrhs, float* a, const fortran_int_t lda, float* b, + const fortran_int_t ldb, float* s, const float rcond, + fortran_int_t& rank, float* work, const fortran_int_t lwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SGELSD( &m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, &rank, work, + &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gelsd( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nrhs, double* a, const fortran_int_t lda, + double* b, const fortran_int_t ldb, double* s, const double rcond, + fortran_int_t& rank, double* work, const fortran_int_t lwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DGELSD( &m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, &rank, work, + &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gelsd( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, float* s, const float rcond, + fortran_int_t& rank, std::complex* work, + const fortran_int_t lwork, float* rwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_CGELSD( &m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, &rank, work, + &lwork, rwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gelsd( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nrhs, const std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, double* s, const double rcond, + fortran_int_t& rank, std::complex* work, + const fortran_int_t lwork, double* rwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_ZGELSD( &m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, &rank, work, + &lwork, rwork, iwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gelsd. +// +template< typename Value, typename Enable = void > +struct gelsd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gelsd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorS, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorS& s, + const real_type rcond, fortran_int_t& rank, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + std::ptrdiff_t smlsiz = ilaenv(9, "GELSD", ""); + std::ptrdiff_t nlvl = std::max< + std::ptrdiff_t >( static_cast(std::log( + static_cast(minmn)/static_cast(smlsiz+ + 1))/std::log(2.0)) + 1, 0 ); + BOOST_ASSERT( bindings::size(s) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( minmn, nlvl )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( minmn, smlsiz, nlvl, + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + std::max< std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a))) ); + return detail::gelsd( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(s), rcond, + rank, bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorS > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorS& s, + const real_type rcond, fortran_int_t& rank, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + std::ptrdiff_t smlsiz = ilaenv(9, "GELSD", ""); + std::ptrdiff_t nlvl = std::max< + std::ptrdiff_t >( static_cast(std::log( + static_cast(minmn)/static_cast(smlsiz+ + 1))/std::log(2.0)) + 1, 0 ); + bindings::detail::array< real_type > tmp_work( min_size_work( minmn, + smlsiz, nlvl, bindings::size_column(b) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( minmn, nlvl ) ); + return invoke( a, b, s, rcond, rank, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorS > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorS& s, + const real_type rcond, fortran_int_t& rank, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + std::ptrdiff_t smlsiz = ilaenv(9, "GELSD", ""); + std::ptrdiff_t nlvl = std::max< + std::ptrdiff_t >( static_cast(std::log( + static_cast(minmn)/static_cast(smlsiz+ + 1))/std::log(2.0)) + 1, 0 ); + real_type opt_size_work; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( minmn, nlvl ) ); + detail::gelsd( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(s), rcond, + rank, &opt_size_work, -1, bindings::begin_value(tmp_iwork) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, b, s, rcond, rank, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t minmn, + const std::ptrdiff_t smlsiz, const std::ptrdiff_t nlvl, + const std::ptrdiff_t nrhs ) { + std::ptrdiff_t smlsiz_plus_one = smlsiz + 1; + return std::max< std::ptrdiff_t >( 1, 12*minmn + 2*minmn*smlsiz + + 8*minmn*nlvl + minmn*nrhs + + smlsiz_plus_one * smlsiz_plus_one ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t minmn, + const std::ptrdiff_t nlvl ) { + return std::max< std::ptrdiff_t >( 1, 3*minmn*nlvl + 11*minmn ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gelsd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorS, + typename WORK, typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorS& s, + const real_type rcond, fortran_int_t& rank, + detail::workspace3< WORK, RWORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + std::ptrdiff_t smlsiz = ilaenv(9, "GELSD", ""); + std::ptrdiff_t nlvl = std::max< + std::ptrdiff_t >( static_cast(std::log( + static_cast(minmn)/static_cast(smlsiz+ + 1))/std::log(2.0)) + 1, 0 ); + BOOST_ASSERT( bindings::size(s) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( minmn, nlvl )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( minmn, smlsiz, nlvl, + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a), minmn, + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + std::max< std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a))) ); + return detail::gelsd( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(s), rcond, + rank, bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorS > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorS& s, + const real_type rcond, fortran_int_t& rank, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + std::ptrdiff_t smlsiz = ilaenv(9, "GELSD", ""); + std::ptrdiff_t nlvl = std::max< + std::ptrdiff_t >( static_cast(std::log( + static_cast(minmn)/static_cast(smlsiz+ + 1))/std::log(2.0)) + 1, 0 ); + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a), minmn, bindings::size_column(b) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( minmn, + smlsiz, nlvl, bindings::size_column(b) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( minmn, nlvl ) ); + return invoke( a, b, s, rcond, rank, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorS > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorS& s, + const real_type rcond, fortran_int_t& rank, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + std::ptrdiff_t smlsiz = ilaenv(9, "GELSD", ""); + std::ptrdiff_t nlvl = std::max< + std::ptrdiff_t >( static_cast(std::log( + static_cast(minmn)/static_cast(smlsiz+ + 1))/std::log(2.0)) + 1, 0 ); + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( minmn, + smlsiz, nlvl, bindings::size_column(b) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( minmn, nlvl ) ); + detail::gelsd( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(s), rcond, + rank, &opt_size_work, -1, bindings::begin_value(tmp_rwork), + bindings::begin_value(tmp_iwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, b, s, rcond, rank, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t minmn, const std::ptrdiff_t nrhs ) { + return std::max< std::ptrdiff_t >( 1, 2*minmn + std::max< + std::ptrdiff_t >( n, minmn*nrhs ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t minmn, + const std::ptrdiff_t smlsiz, const std::ptrdiff_t nlvl, + const std::ptrdiff_t nrhs ) { + std::ptrdiff_t smlsiz_plus_one = smlsiz + 1; + return std::max< std::ptrdiff_t >( 1, 10*minmn + 2*minmn*smlsiz + + 8*minmn*nlvl + 3*smlsiz*nrhs + + smlsiz_plus_one * smlsiz_plus_one ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t minmn, + const std::ptrdiff_t nlvl ) { + return std::max< std::ptrdiff_t >( 1, 3*minmn*nlvl + 11*minmn ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gelsd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gelsd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorS, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gelsd( MatrixA& a, MatrixB& b, VectorS& s, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type rcond, fortran_int_t& rank, + Workspace work ) { + return gelsd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, s, rcond, rank, work ); +} + +// +// Overloaded function for gelsd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorS > +inline typename boost::disable_if< detail::is_workspace< VectorS >, + std::ptrdiff_t >::type +gelsd( MatrixA& a, MatrixB& b, VectorS& s, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type rcond, fortran_int_t& rank ) { + return gelsd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, s, rcond, rank, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gelss.hpp b/sdk/boost/numeric/bindings/lapack/driver/gelss.hpp new file mode 100644 index 0000000..0134612 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gelss.hpp @@ -0,0 +1,415 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GELSS_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GELSS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gelss is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gelss( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nrhs, float* a, const fortran_int_t lda, float* b, + const fortran_int_t ldb, float* s, const float rcond, + fortran_int_t& rank, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGELSS( &m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, &rank, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gelss( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nrhs, double* a, const fortran_int_t lda, + double* b, const fortran_int_t ldb, double* s, const double rcond, + fortran_int_t& rank, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGELSS( &m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, &rank, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gelss( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, float* s, const float rcond, + fortran_int_t& rank, std::complex* work, + const fortran_int_t lwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGELSS( &m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, &rank, work, + &lwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gelss( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, double* s, const double rcond, + fortran_int_t& rank, std::complex* work, + const fortran_int_t lwork, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGELSS( &m, &n, &nrhs, a, &lda, b, &ldb, s, &rcond, &rank, work, + &lwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gelss. +// +template< typename Value, typename Enable = void > +struct gelss_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gelss_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorS, + typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorS& s, + const real_type rcond, fortran_int_t& rank, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_ASSERT( bindings::size(s) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a), bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + std::max< std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a))) ); + return detail::gelss( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(s), rcond, + rank, bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorS > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorS& s, + const real_type rcond, fortran_int_t& rank, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b) ) ); + return invoke( a, b, s, rcond, rank, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorS > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorS& s, + const real_type rcond, fortran_int_t& rank, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::gelss( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(s), rcond, + rank, &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, b, s, rcond, rank, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n, const std::ptrdiff_t nrhs ) { + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( m, n ); + return std::max< std::ptrdiff_t >( 1, 3*minmn + std::max< + std::ptrdiff_t >( std::max< std::ptrdiff_t >( 2*minmn, std::max< + std::ptrdiff_t >(m,n) ), nrhs ) ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gelss_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorS, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorS& s, + const real_type rcond, fortran_int_t& rank, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + BOOST_ASSERT( bindings::size(s) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( minmn )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a), bindings::size_column(b), minmn )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + std::max< std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a))) ); + return detail::gelss( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(s), rcond, + rank, bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorS > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorS& s, + const real_type rcond, fortran_int_t& rank, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), minmn ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + minmn ) ); + return invoke( a, b, s, rcond, rank, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorS > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorS& s, + const real_type rcond, fortran_int_t& rank, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + minmn ) ); + detail::gelss( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(s), rcond, + rank, &opt_size_work, -1, bindings::begin_value(tmp_rwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, b, s, rcond, rank, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n, const std::ptrdiff_t nrhs, + const std::ptrdiff_t minmn ) { + return std::max< std::ptrdiff_t >( 1, 2*minmn + std::max< + std::ptrdiff_t >( std::max< std::ptrdiff_t >( m,n ), nrhs ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t minmn ) { + return 5*minmn; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gelss_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gelss. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorS, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gelss( MatrixA& a, MatrixB& b, VectorS& s, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type rcond, fortran_int_t& rank, + Workspace work ) { + return gelss_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, s, rcond, rank, work ); +} + +// +// Overloaded function for gelss. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorS > +inline typename boost::disable_if< detail::is_workspace< VectorS >, + std::ptrdiff_t >::type +gelss( MatrixA& a, MatrixB& b, VectorS& s, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type rcond, fortran_int_t& rank ) { + return gelss_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, s, rcond, rank, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gelsy.hpp b/sdk/boost/numeric/bindings/lapack/driver/gelsy.hpp new file mode 100644 index 0000000..901c169 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gelsy.hpp @@ -0,0 +1,400 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GELSY_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GELSY_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gelsy is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gelsy( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nrhs, float* a, const fortran_int_t lda, float* b, + const fortran_int_t ldb, fortran_int_t* jpvt, const float rcond, + fortran_int_t& rank, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGELSY( &m, &n, &nrhs, a, &lda, b, &ldb, jpvt, &rcond, &rank, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gelsy( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nrhs, double* a, const fortran_int_t lda, + double* b, const fortran_int_t ldb, fortran_int_t* jpvt, + const double rcond, fortran_int_t& rank, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGELSY( &m, &n, &nrhs, a, &lda, b, &ldb, jpvt, &rcond, &rank, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gelsy( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, fortran_int_t* jpvt, const float rcond, + fortran_int_t& rank, std::complex* work, + const fortran_int_t lwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGELSY( &m, &n, &nrhs, a, &lda, b, &ldb, jpvt, &rcond, &rank, work, + &lwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gelsy( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, fortran_int_t* jpvt, const double rcond, + fortran_int_t& rank, std::complex* work, + const fortran_int_t lwork, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGELSY( &m, &n, &nrhs, a, &lda, b, &ldb, jpvt, &rcond, &rank, work, + &lwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gelsy. +// +template< typename Value, typename Enable = void > +struct gelsy_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gelsy_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorJPVT, + typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorJPVT& jpvt, + const real_type rcond, fortran_int_t& rank, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorJPVT >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a), bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + std::max< std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a))) ); + return detail::gelsy( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(jpvt), rcond, + rank, bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorJPVT > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorJPVT& jpvt, + const real_type rcond, fortran_int_t& rank, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b) ) ); + return invoke( a, b, jpvt, rcond, rank, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorJPVT > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorJPVT& jpvt, + const real_type rcond, fortran_int_t& rank, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::gelsy( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(jpvt), rcond, + rank, &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, b, jpvt, rcond, rank, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n, const std::ptrdiff_t nrhs ) { + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( m, n ); + return std::max< std::ptrdiff_t >( 1, std::max< std::ptrdiff_t >( minmn+ + 3*n+1, 2*minmn+nrhs )); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gelsy_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorJPVT, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorJPVT& jpvt, + const real_type rcond, fortran_int_t& rank, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorJPVT >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a), bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + std::max< std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a))) ); + return detail::gelsy( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(jpvt), rcond, + rank, bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorJPVT > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorJPVT& jpvt, + const real_type rcond, fortran_int_t& rank, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( a, b, jpvt, rcond, rank, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorJPVT > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorJPVT& jpvt, + const real_type rcond, fortran_int_t& rank, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + detail::gelsy( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(jpvt), rcond, + rank, &opt_size_work, -1, bindings::begin_value(tmp_rwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, b, jpvt, rcond, rank, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n, const std::ptrdiff_t nrhs ) { + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( m, n ); + return std::max< std::ptrdiff_t >( 1, std::max< + std::ptrdiff_t >( std::max< std::ptrdiff_t >( 2*minmn, n+1 ), + minmn+nrhs ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gelsy_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gelsy. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorJPVT, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gelsy( MatrixA& a, MatrixB& b, VectorJPVT& jpvt, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type rcond, fortran_int_t& rank, + Workspace work ) { + return gelsy_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, jpvt, rcond, rank, work ); +} + +// +// Overloaded function for gelsy. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorJPVT > +inline typename boost::disable_if< detail::is_workspace< VectorJPVT >, + std::ptrdiff_t >::type +gelsy( MatrixA& a, MatrixB& b, VectorJPVT& jpvt, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type rcond, fortran_int_t& rank ) { + return gelsy_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, jpvt, rcond, rank, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gesdd.hpp b/sdk/boost/numeric/bindings/lapack/driver/gesdd.hpp new file mode 100644 index 0000000..fa6b54a --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gesdd.hpp @@ -0,0 +1,465 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GESDD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GESDD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gesdd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gesdd( const char jobz, const fortran_int_t m, + const fortran_int_t n, float* a, const fortran_int_t lda, float* s, + float* u, const fortran_int_t ldu, float* vt, + const fortran_int_t ldvt, float* work, const fortran_int_t lwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SGESDD( &jobz, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, + &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gesdd( const char jobz, const fortran_int_t m, + const fortran_int_t n, double* a, const fortran_int_t lda, double* s, + double* u, const fortran_int_t ldu, double* vt, + const fortran_int_t ldvt, double* work, const fortran_int_t lwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DGESDD( &jobz, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, + &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gesdd( const char jobz, const fortran_int_t m, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, float* s, std::complex* u, + const fortran_int_t ldu, std::complex* vt, + const fortran_int_t ldvt, std::complex* work, + const fortran_int_t lwork, float* rwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_CGESDD( &jobz, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, + &lwork, rwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gesdd( const char jobz, const fortran_int_t m, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, double* s, std::complex* u, + const fortran_int_t ldu, std::complex* vt, + const fortran_int_t ldvt, std::complex* work, + const fortran_int_t lwork, double* rwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_ZGESDD( &jobz, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, + &lwork, rwork, iwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gesdd. +// +template< typename Value, typename Enable = void > +struct gesdd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gesdd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorS& s, + MatrixU& u, MatrixVT& vt, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVT >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVT >::value) ); + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + BOOST_ASSERT( bindings::size(s) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( minmn )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a), jobz, minmn )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(vt) == 1 || + bindings::stride_minor(vt) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( jobz == 'A' || jobz == 'S' || jobz == 'O' || + jobz == 'N' ); + return detail::gesdd( jobz, bindings::size_row(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(s), + bindings::begin_value(u), bindings::stride_major(u), + bindings::begin_value(vt), bindings::stride_major(vt), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorS& s, + MatrixU& u, MatrixVT& vt, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a), jobz, + minmn ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( minmn ) ); + return invoke( jobz, a, s, u, vt, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorS& s, + MatrixU& u, MatrixVT& vt, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( jobz, a, s, u, vt, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n, const char jobz, + const std::ptrdiff_t minmn ) { + if ( n == 0 ) return 1; + if ( jobz == 'N' ) return 3*minmn + std::max< + std::ptrdiff_t >( std::max< std::ptrdiff_t >(m,n), 7*minmn ); + if ( jobz == 'O' ) return 3*minmn*minmn + std::max< + std::ptrdiff_t >( std::max< std::ptrdiff_t >( m,n ), + 5*minmn*minmn + 4*minmn ); + return 3*minmn*minmn + std::max< std::ptrdiff_t >( std::max< + std::ptrdiff_t >( m,n ), 4*minmn*minmn + 4*minmn ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t minmn ) { + return 8*minmn; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gesdd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT, typename WORK, typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorS& s, + MatrixU& u, MatrixVT& vt, detail::workspace3< WORK, RWORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVT >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVT >::value) ); + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + BOOST_ASSERT( bindings::size(s) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( minmn )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( minmn, jobz )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a), jobz, minmn )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(vt) == 1 || + bindings::stride_minor(vt) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( jobz == 'A' || jobz == 'S' || jobz == 'O' || + jobz == 'N' ); + return detail::gesdd( jobz, bindings::size_row(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(s), + bindings::begin_value(u), bindings::stride_major(u), + bindings::begin_value(vt), bindings::stride_major(vt), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorS& s, + MatrixU& u, MatrixVT& vt, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a), jobz, + minmn ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( minmn, + jobz ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( minmn ) ); + return invoke( jobz, a, s, u, vt, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorS& s, + MatrixU& u, MatrixVT& vt, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( minmn, + jobz ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( minmn ) ); + detail::gesdd( jobz, bindings::size_row(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(s), + bindings::begin_value(u), bindings::stride_major(u), + bindings::begin_value(vt), bindings::stride_major(vt), + &opt_size_work, -1, bindings::begin_value(tmp_rwork), + bindings::begin_value(tmp_iwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobz, a, s, u, vt, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n, const char jobz, + const std::ptrdiff_t minmn ) { + if ( n == 0 ) return 1; + if ( jobz == 'N' ) return 2*minmn + std::max< std::ptrdiff_t >( m,n ); + if ( jobz == 'O' ) return 2*(minmn*minmn + minmn) + std::max< + std::ptrdiff_t >( m, n ); + return minmn*minmn + 2*minmn + std::max< std::ptrdiff_t >( m, n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t minmn, + const char jobz ) { + if ( jobz == 'N' ) return 5*minmn; + return 5*minmn*minmn + 7*minmn; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t minmn ) { + return 8*minmn; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gesdd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gesdd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gesdd( const char jobz, MatrixA& a, VectorS& s, MatrixU& u, MatrixVT& vt, + Workspace work ) { + return gesdd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, a, s, u, vt, work ); +} + +// +// Overloaded function for gesdd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT > +inline typename boost::disable_if< detail::is_workspace< MatrixVT >, + std::ptrdiff_t >::type +gesdd( const char jobz, MatrixA& a, VectorS& s, MatrixU& u, + MatrixVT& vt ) { + return gesdd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, a, s, u, vt, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gesv.hpp b/sdk/boost/numeric/bindings/lapack/driver/gesv.hpp new file mode 100644 index 0000000..5fd564d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gesv.hpp @@ -0,0 +1,242 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GESV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GESV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gesv is selected by defining a pre-processor +// variable, which can be one of +// * for ATLAS's CLAPACK, define BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// * netlib-compatible LAPACK is the default +// +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * float value-type. +// +template< typename Order > +inline std::ptrdiff_t gesv( Order, const int n, const int nrhs, float* a, + const int lda, int* ipiv, float* b, const int ldb ) { + return clapack_sgesv( clapack_option< Order >::value, n, nrhs, a, lda, + ipiv, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * double value-type. +// +template< typename Order > +inline std::ptrdiff_t gesv( Order, const int n, const int nrhs, double* a, + const int lda, int* ipiv, double* b, const int ldb ) { + return clapack_dgesv( clapack_option< Order >::value, n, nrhs, a, lda, + ipiv, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order > +inline std::ptrdiff_t gesv( Order, const int n, const int nrhs, + std::complex* a, const int lda, int* ipiv, + std::complex* b, const int ldb ) { + return clapack_cgesv( clapack_option< Order >::value, n, nrhs, a, lda, + ipiv, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order > +inline std::ptrdiff_t gesv( Order, const int n, const int nrhs, + std::complex* a, const int lda, int* ipiv, + std::complex* b, const int ldb ) { + return clapack_zgesv( clapack_option< Order >::value, n, nrhs, a, lda, + ipiv, b, ldb ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Order > +inline std::ptrdiff_t gesv( Order, const fortran_int_t n, + const fortran_int_t nrhs, float* a, const fortran_int_t lda, + fortran_int_t* ipiv, float* b, const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_SGESV( &n, &nrhs, a, &lda, ipiv, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Order > +inline std::ptrdiff_t gesv( Order, const fortran_int_t n, + const fortran_int_t nrhs, double* a, const fortran_int_t lda, + fortran_int_t* ipiv, double* b, const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_DGESV( &n, &nrhs, a, &lda, ipiv, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order > +inline std::ptrdiff_t gesv( Order, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_CGESV( &n, &nrhs, a, &lda, ipiv, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order > +inline std::ptrdiff_t gesv( Order, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_ZGESV( &n, &nrhs, a, &lda, ipiv, b, &ldb, &info ); + return info; +} + +#endif +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gesv. +// +template< typename Value > +struct gesv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::gesv( order(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gesv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gesv. Its overload differs for +// +template< typename MatrixA, typename VectorIPIV, typename MatrixB > +inline std::ptrdiff_t gesv( MatrixA& a, VectorIPIV& ipiv, MatrixB& b ) { + return gesv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gesvd.hpp b/sdk/boost/numeric/bindings/lapack/driver/gesvd.hpp new file mode 100644 index 0000000..a907a5d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gesvd.hpp @@ -0,0 +1,470 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GESVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GESVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gesvd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gesvd( const char jobu, const char jobvt, + const fortran_int_t m, const fortran_int_t n, float* a, + const fortran_int_t lda, float* s, float* u, const fortran_int_t ldu, + float* vt, const fortran_int_t ldvt, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGESVD( &jobu, &jobvt, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, + work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gesvd( const char jobu, const char jobvt, + const fortran_int_t m, const fortran_int_t n, double* a, + const fortran_int_t lda, double* s, double* u, + const fortran_int_t ldu, double* vt, const fortran_int_t ldvt, + double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGESVD( &jobu, &jobvt, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, + work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gesvd( const char jobu, const char jobvt, + const fortran_int_t m, const fortran_int_t n, std::complex* a, + const fortran_int_t lda, float* s, std::complex* u, + const fortran_int_t ldu, std::complex* vt, + const fortran_int_t ldvt, std::complex* work, + const fortran_int_t lwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGESVD( &jobu, &jobvt, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, + work, &lwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gesvd( const char jobu, const char jobvt, + const fortran_int_t m, const fortran_int_t n, std::complex* a, + const fortran_int_t lda, double* s, std::complex* u, + const fortran_int_t ldu, std::complex* vt, + const fortran_int_t ldvt, std::complex* work, + const fortran_int_t lwork, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGESVD( &jobu, &jobvt, &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, + work, &lwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gesvd. +// +template< typename Value, typename Enable = void > +struct gesvd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gesvd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT, typename WORK > + static std::ptrdiff_t invoke( const char jobu, const char jobvt, + MatrixA& a, VectorS& s, MatrixU& u, MatrixVT& vt, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVT >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVT >::value) ); + BOOST_ASSERT( bindings::size(s) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobu, jobvt, bindings::size_row(a), + bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(vt) == 1 || + bindings::stride_minor(vt) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( jobu == 'A' || jobu == 'S' || jobu == 'O' || + jobu == 'N' ); + BOOST_ASSERT( jobvt == 'A' || jobvt == 'S' || jobvt == 'O' || + jobvt == 'N' ); + return detail::gesvd( jobu, jobvt, bindings::size_row(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(s), + bindings::begin_value(u), bindings::stride_major(u), + bindings::begin_value(vt), bindings::stride_major(vt), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT > + static std::ptrdiff_t invoke( const char jobu, const char jobvt, + MatrixA& a, VectorS& s, MatrixU& u, MatrixVT& vt, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( jobu, + jobvt, bindings::size_row(a), bindings::size_column(a) ) ); + return invoke( jobu, jobvt, a, s, u, vt, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT > + static std::ptrdiff_t invoke( const char jobu, const char jobvt, + MatrixA& a, VectorS& s, MatrixU& u, MatrixVT& vt, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::gesvd( jobu, jobvt, bindings::size_row(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(s), + bindings::begin_value(u), bindings::stride_major(u), + bindings::begin_value(vt), bindings::stride_major(vt), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobu, jobvt, a, s, u, vt, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobu, const char jobvt, + const std::ptrdiff_t m, const std::ptrdiff_t n ) { + // + // Contributed by Marco Guazzone + // Also see http://tinyurl.com/5rbpdc5 + // + if ( m == 0 || n == 0 ) { + return 1; + } else if ( m >= n ) { + if ( jobu == 'N' ) { + return 5*n; + } else { + return std::max< std::ptrdiff_t >(3*n+m,5*n); + } + } else { + if ( jobvt == 'N' ) { + return 5*m; + } else { + return std::max< std::ptrdiff_t >(3*m+n,5*m); + } + } + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gesvd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char jobu, const char jobvt, + MatrixA& a, VectorS& s, MatrixU& u, MatrixVT& vt, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVT >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVT >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVT >::value) ); + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + BOOST_ASSERT( bindings::size(s) >= std::min< + std::ptrdiff_t >(bindings::size_row(a), + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( minmn )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( jobu, jobvt, bindings::size_row(a), + bindings::size_column(a), minmn )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(vt) == 1 || + bindings::stride_minor(vt) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( jobu == 'A' || jobu == 'S' || jobu == 'O' || + jobu == 'N' ); + BOOST_ASSERT( jobvt == 'A' || jobvt == 'S' || jobvt == 'O' || + jobvt == 'N' ); + return detail::gesvd( jobu, jobvt, bindings::size_row(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(s), + bindings::begin_value(u), bindings::stride_major(u), + bindings::begin_value(vt), bindings::stride_major(vt), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT > + static std::ptrdiff_t invoke( const char jobu, const char jobvt, + MatrixA& a, VectorS& s, MatrixU& u, MatrixVT& vt, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + bindings::detail::array< value_type > tmp_work( min_size_work( jobu, + jobvt, bindings::size_row(a), bindings::size_column(a), + minmn ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + minmn ) ); + return invoke( jobu, jobvt, a, s, u, vt, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT > + static std::ptrdiff_t invoke( const char jobu, const char jobvt, + MatrixA& a, VectorS& s, MatrixU& u, MatrixVT& vt, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + std::ptrdiff_t minmn = std::min< std::ptrdiff_t >( size_row(a), + size_column(a) ); + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + minmn ) ); + detail::gesvd( jobu, jobvt, bindings::size_row(a), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(s), + bindings::begin_value(u), bindings::stride_major(u), + bindings::begin_value(vt), bindings::stride_major(vt), + &opt_size_work, -1, bindings::begin_value(tmp_rwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobu, jobvt, a, s, u, vt, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobu, const char jobvt, + const std::ptrdiff_t m, const std::ptrdiff_t n, + const std::ptrdiff_t minmn ) { + // + // Contributed by Marco Guazzone + // Also see http://tinyurl.com/5rbpdc5 + // + if ( minmn == 0 ) { + return 1; + } else if ( m >= n ) { + if ( jobu == 'N' ) { + return 3*n; + } else { + return 2*n+m; + } + } else { + if ( jobvt == 'N' ) { + return 3*m; + } else { + return 2*m+n; + } + } + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t minmn ) { + return 5*minmn; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gesvd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gesvd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gesvd( const char jobu, const char jobvt, MatrixA& a, VectorS& s, + MatrixU& u, MatrixVT& vt, Workspace work ) { + return gesvd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobu, jobvt, a, s, u, vt, work ); +} + +// +// Overloaded function for gesvd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorS, typename MatrixU, + typename MatrixVT > +inline typename boost::disable_if< detail::is_workspace< MatrixVT >, + std::ptrdiff_t >::type +gesvd( const char jobu, const char jobvt, MatrixA& a, VectorS& s, + MatrixU& u, MatrixVT& vt ) { + return gesvd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobu, jobvt, a, s, u, vt, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gesvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/gesvx.hpp new file mode 100644 index 0000000..ebb9390 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gesvx.hpp @@ -0,0 +1,524 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GESVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GESVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gesvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Trans > +inline std::ptrdiff_t gesvx( const char fact, const Trans, + const fortran_int_t n, const fortran_int_t nrhs, float* a, + const fortran_int_t lda, float* af, const fortran_int_t ldaf, + fortran_int_t* ipiv, char& equed, float* r, float* c, float* b, + const fortran_int_t ldb, float* x, const fortran_int_t ldx, + float& rcond, float* ferr, float* berr, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SGESVX( &fact, &lapack_option< Trans >::value, &n, &nrhs, a, &lda, + af, &ldaf, ipiv, &equed, r, c, b, &ldb, x, &ldx, &rcond, ferr, + berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Trans > +inline std::ptrdiff_t gesvx( const char fact, const Trans, + const fortran_int_t n, const fortran_int_t nrhs, double* a, + const fortran_int_t lda, double* af, const fortran_int_t ldaf, + fortran_int_t* ipiv, char& equed, double* r, double* c, double* b, + const fortran_int_t ldb, double* x, const fortran_int_t ldx, + double& rcond, double* ferr, double* berr, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DGESVX( &fact, &lapack_option< Trans >::value, &n, &nrhs, a, &lda, + af, &ldaf, ipiv, &equed, r, c, b, &ldb, x, &ldx, &rcond, ferr, + berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gesvx( const char fact, const Trans, + const fortran_int_t n, const fortran_int_t nrhs, + std::complex* a, const fortran_int_t lda, + std::complex* af, const fortran_int_t ldaf, + fortran_int_t* ipiv, char& equed, float* r, float* c, + std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float& rcond, + float* ferr, float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGESVX( &fact, &lapack_option< Trans >::value, &n, &nrhs, a, &lda, + af, &ldaf, ipiv, &equed, r, c, b, &ldb, x, &ldx, &rcond, ferr, + berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gesvx( const char fact, const Trans, + const fortran_int_t n, const fortran_int_t nrhs, + std::complex* a, const fortran_int_t lda, + std::complex* af, const fortran_int_t ldaf, + fortran_int_t* ipiv, char& equed, double* r, double* c, + std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, double& rcond, + double* ferr, double* berr, std::complex* work, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGESVX( &fact, &lapack_option< Trans >::value, &n, &nrhs, a, &lda, + af, &ldaf, ipiv, &equed, r, c, b, &ldb, x, &ldx, &rcond, ferr, + berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gesvx. +// +template< typename Value, typename Enable = void > +struct gesvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gesvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char fact, MatrixA& a, MatrixAF& af, + VectorIPIV& ipiv, char& equed, VectorR& r, VectorC& c, MatrixB& b, + MatrixX& x, real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAF >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column_op(a, trans()) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column_op(a, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( equed == 'N' || equed == 'R' || equed == 'C' || + equed == 'B' ); + BOOST_ASSERT( fact == 'F' || fact == 'N' || fact == 'E' ); + return detail::gesvx( fact, trans(), bindings::size_column_op(a, + trans()), bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + equed, bindings::begin_value(r), bindings::begin_value(c), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixA& a, MatrixAF& af, + VectorIPIV& ipiv, char& equed, VectorR& r, VectorC& c, MatrixB& b, + MatrixX& x, real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAF >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column_op(a, trans()) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column_op(a, trans()) ) ); + return invoke( fact, a, af, ipiv, equed, r, c, b, x, rcond, ferr, + berr, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixA& a, MatrixAF& af, + VectorIPIV& ipiv, char& equed, VectorR& r, VectorC& c, MatrixB& b, + MatrixX& x, real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAF >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + return invoke( fact, a, af, ipiv, equed, r, c, b, x, rcond, ferr, + berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 4*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gesvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char fact, MatrixA& a, MatrixAF& af, + VectorIPIV& ipiv, char& equed, VectorR& r, VectorC& c, MatrixB& b, + MatrixX& x, real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAF >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column_op(a, trans()) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column_op(a, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(a, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(a, trans())) ); + BOOST_ASSERT( equed == 'N' || equed == 'R' || equed == 'C' || + equed == 'B' ); + BOOST_ASSERT( fact == 'F' || fact == 'N' || fact == 'E' ); + return detail::gesvx( fact, trans(), bindings::size_column_op(a, + trans()), bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + equed, bindings::begin_value(r), bindings::begin_value(c), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixA& a, MatrixAF& af, + VectorIPIV& ipiv, char& equed, VectorR& r, VectorC& c, MatrixB& b, + MatrixX& x, real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAF >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column_op(a, trans()) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column_op(a, trans()) ) ); + return invoke( fact, a, af, ipiv, equed, r, c, b, x, rcond, ferr, + berr, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixA& a, MatrixAF& af, + VectorIPIV& ipiv, char& equed, VectorR& r, VectorC& c, MatrixB& b, + MatrixX& x, real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixAF >::type order; + typedef typename result_of::trans_tag< MatrixA, order >::type trans; + return invoke( fact, a, af, ipiv, equed, r, c, b, x, rcond, ferr, + berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 2*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gesvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gesvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gesvx( const char fact, MatrixA& a, MatrixAF& af, VectorIPIV& ipiv, + char& equed, VectorR& r, VectorC& c, MatrixB& b, MatrixX& x, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& rcond, VectorFERR& ferr, VectorBERR& berr, + Workspace work ) { + return gesvx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( fact, a, af, ipiv, equed, r, c, b, x, + rcond, ferr, berr, work ); +} + +// +// Overloaded function for gesvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename VectorR, typename VectorC, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +gesvx( const char fact, MatrixA& a, MatrixAF& af, VectorIPIV& ipiv, + char& equed, VectorR& r, VectorC& c, MatrixB& b, MatrixX& x, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& rcond, VectorFERR& ferr, VectorBERR& berr ) { + return gesvx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( fact, a, af, ipiv, equed, r, c, b, x, + rcond, ferr, berr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gges.hpp b/sdk/boost/numeric/bindings/lapack/driver/gges.hpp new file mode 100644 index 0000000..2860a7f --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gges.hpp @@ -0,0 +1,580 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGES_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGES_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gges is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gges( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const fortran_int_t n, float* a, + const fortran_int_t lda, float* b, const fortran_int_t ldb, + fortran_int_t& sdim, float* alphar, float* alphai, float* beta, + float* vsl, const fortran_int_t ldvsl, float* vsr, + const fortran_int_t ldvsr, float* work, const fortran_int_t lwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_SGGES( &jobvsl, &jobvsr, &sort, selctg, &n, a, &lda, b, &ldb, + &sdim, alphar, alphai, beta, vsl, &ldvsl, vsr, &ldvsr, work, + &lwork, bwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gges( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const fortran_int_t n, double* a, + const fortran_int_t lda, double* b, const fortran_int_t ldb, + fortran_int_t& sdim, double* alphar, double* alphai, double* beta, + double* vsl, const fortran_int_t ldvsl, double* vsr, + const fortran_int_t ldvsr, double* work, const fortran_int_t lwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_DGGES( &jobvsl, &jobvsr, &sort, selctg, &n, a, &lda, b, &ldb, + &sdim, alphar, alphai, beta, vsl, &ldvsl, vsr, &ldvsr, work, + &lwork, bwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gges( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, fortran_int_t& sdim, + std::complex* alpha, std::complex* beta, + std::complex* vsl, const fortran_int_t ldvsl, + std::complex* vsr, const fortran_int_t ldvsr, + std::complex* work, const fortran_int_t lwork, float* rwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_CGGES( &jobvsl, &jobvsr, &sort, selctg, &n, a, &lda, b, &ldb, + &sdim, alpha, beta, vsl, &ldvsl, vsr, &ldvsr, work, &lwork, rwork, + bwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gges( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, fortran_int_t& sdim, + std::complex* alpha, std::complex* beta, + std::complex* vsl, const fortran_int_t ldvsl, + std::complex* vsr, const fortran_int_t ldvsr, + std::complex* work, const fortran_int_t lwork, double* rwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_ZGGES( &jobvsl, &jobvsr, &sort, selctg, &n, a, &lda, b, &ldb, + &sdim, alpha, beta, vsl, &ldvsl, vsr, &ldvsr, work, &lwork, rwork, + bwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gges. +// +template< typename Value, typename Enable = void > +struct gges_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gges_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVSL, + typename MatrixVSR, typename WORK, typename BWORK > + static std::ptrdiff_t invoke( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, MatrixA& a, MatrixB& b, + fortran_int_t& sdim, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVSL& vsl, + MatrixVSR& vsr, detail::workspace2< WORK, BWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVSL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVSR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAI >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVSL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVSR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAI >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVSL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVSR >::value) ); + BOOST_ASSERT( bindings::size(alphai) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(alphar) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_bool_t())) >= + min_size_bwork( bindings::size_column(a), sort )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(vsl) == 1 || + bindings::stride_minor(vsl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vsr) == 1 || + bindings::stride_minor(vsr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvsl == 'N' || jobvsl == 'V' ); + BOOST_ASSERT( jobvsr == 'N' || jobvsr == 'V' ); + BOOST_ASSERT( sort == 'N' || sort == 'S' ); + return detail::gges( jobvsl, jobvsr, sort, selctg, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), sdim, + bindings::begin_value(alphar), bindings::begin_value(alphai), + bindings::begin_value(beta), bindings::begin_value(vsl), + bindings::stride_major(vsl), bindings::begin_value(vsr), + bindings::stride_major(vsr), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_bool_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVSL, + typename MatrixVSR > + static std::ptrdiff_t invoke( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, MatrixA& a, MatrixB& b, + fortran_int_t& sdim, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVSL& vsl, + MatrixVSR& vsr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + return invoke( jobvsl, jobvsr, sort, selctg, a, b, sdim, alphar, + alphai, beta, vsl, vsr, workspace( tmp_work, tmp_bwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVSL, + typename MatrixVSR > + static std::ptrdiff_t invoke( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, MatrixA& a, MatrixB& b, + fortran_int_t& sdim, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVSL& vsl, + MatrixVSR& vsr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + detail::gges( jobvsl, jobvsr, sort, selctg, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), sdim, + bindings::begin_value(alphar), bindings::begin_value(alphai), + bindings::begin_value(beta), bindings::begin_value(vsl), + bindings::stride_major(vsl), bindings::begin_value(vsr), + bindings::stride_major(vsr), &opt_size_work, -1, + bindings::begin_value(tmp_bwork) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobvsl, jobvsr, sort, selctg, a, b, sdim, alphar, + alphai, beta, vsl, vsr, workspace( tmp_work, tmp_bwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + if ( n == 0 ) { + return 1; + } else { + return std::max< std::ptrdiff_t >( 8*n, 6*n + 16 ); + } + } + + // + // Static member function that returns the minimum size of + // workspace-array bwork. + // + static std::ptrdiff_t min_size_bwork( const std::ptrdiff_t n, + const char sort ) { + if ( sort == 'N' ) + return 0; + else + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gges_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVSL, typename MatrixVSR, + typename WORK, typename RWORK, typename BWORK > + static std::ptrdiff_t invoke( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, MatrixA& a, MatrixB& b, + fortran_int_t& sdim, VectorALPHA& alpha, VectorBETA& beta, + MatrixVSL& vsl, MatrixVSR& vsr, detail::workspace3< WORK, RWORK, + BWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVSL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVSR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVSL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVSR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVSL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVSR >::value) ); + BOOST_ASSERT( bindings::size(alpha) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(beta) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_bool_t())) >= + min_size_bwork( bindings::size_column(a), sort )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(vsl) == 1 || + bindings::stride_minor(vsl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vsr) == 1 || + bindings::stride_minor(vsr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvsl == 'N' || jobvsl == 'V' ); + BOOST_ASSERT( jobvsr == 'N' || jobvsr == 'V' ); + BOOST_ASSERT( sort == 'N' || sort == 'S' ); + return detail::gges( jobvsl, jobvsr, sort, selctg, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), sdim, bindings::begin_value(alpha), + bindings::begin_value(beta), bindings::begin_value(vsl), + bindings::stride_major(vsl), bindings::begin_value(vsr), + bindings::stride_major(vsr), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_bool_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVSL, typename MatrixVSR > + static std::ptrdiff_t invoke( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, MatrixA& a, MatrixB& b, + fortran_int_t& sdim, VectorALPHA& alpha, VectorBETA& beta, + MatrixVSL& vsl, MatrixVSR& vsr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + return invoke( jobvsl, jobvsr, sort, selctg, a, b, sdim, alpha, beta, + vsl, vsr, workspace( tmp_work, tmp_rwork, tmp_bwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVSL, typename MatrixVSR > + static std::ptrdiff_t invoke( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, MatrixA& a, MatrixB& b, + fortran_int_t& sdim, VectorALPHA& alpha, VectorBETA& beta, + MatrixVSL& vsl, MatrixVSR& vsr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + detail::gges( jobvsl, jobvsr, sort, selctg, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), sdim, bindings::begin_value(alpha), + bindings::begin_value(beta), bindings::begin_value(vsl), + bindings::stride_major(vsl), bindings::begin_value(vsr), + bindings::stride_major(vsr), &opt_size_work, -1, + bindings::begin_value(tmp_rwork), + bindings::begin_value(tmp_bwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobvsl, jobvsr, sort, selctg, a, b, sdim, alpha, beta, + vsl, vsr, workspace( tmp_work, tmp_rwork, tmp_bwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 2*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 8*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array bwork. + // + static std::ptrdiff_t min_size_bwork( const std::ptrdiff_t n, + const char sort ) { + if ( sort == 'N' ) + return 0; + else + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gges_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gges. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVSL, + typename MatrixVSR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gges( const char jobvsl, const char jobvsr, const char sort, + external_fp selctg, MatrixA& a, MatrixB& b, fortran_int_t& sdim, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixVSL& vsl, MatrixVSR& vsr, Workspace work ) { + return gges_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvsl, jobvsr, sort, selctg, a, b, + sdim, alphar, alphai, beta, vsl, vsr, work ); +} + +// +// Overloaded function for gges. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVSL, + typename MatrixVSR > +inline typename boost::disable_if< detail::is_workspace< MatrixVSR >, + std::ptrdiff_t >::type +gges( const char jobvsl, const char jobvsr, const char sort, + external_fp selctg, MatrixA& a, MatrixB& b, fortran_int_t& sdim, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixVSL& vsl, MatrixVSR& vsr ) { + return gges_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvsl, jobvsr, sort, selctg, a, b, + sdim, alphar, alphai, beta, vsl, vsr, optimal_workspace() ); +} + +// +// Overloaded function for gges. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVSL, typename MatrixVSR, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gges( const char jobvsl, const char jobvsr, const char sort, + external_fp selctg, MatrixA& a, MatrixB& b, fortran_int_t& sdim, + VectorALPHA& alpha, VectorBETA& beta, MatrixVSL& vsl, MatrixVSR& vsr, + Workspace work ) { + return gges_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvsl, jobvsr, sort, selctg, a, b, + sdim, alpha, beta, vsl, vsr, work ); +} + +// +// Overloaded function for gges. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVSL, typename MatrixVSR > +inline typename boost::disable_if< detail::is_workspace< MatrixVSR >, + std::ptrdiff_t >::type +gges( const char jobvsl, const char jobvsr, const char sort, + external_fp selctg, MatrixA& a, MatrixB& b, fortran_int_t& sdim, + VectorALPHA& alpha, VectorBETA& beta, MatrixVSL& vsl, + MatrixVSR& vsr ) { + return gges_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvsl, jobvsr, sort, selctg, a, b, + sdim, alpha, beta, vsl, vsr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/ggesx.hpp b/sdk/boost/numeric/bindings/lapack/driver/ggesx.hpp new file mode 100644 index 0000000..fa3ad97 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/ggesx.hpp @@ -0,0 +1,683 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGESX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGESX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ggesx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ggesx( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const char sense, + const fortran_int_t n, float* a, const fortran_int_t lda, float* b, + const fortran_int_t ldb, fortran_int_t& sdim, float* alphar, + float* alphai, float* beta, float* vsl, const fortran_int_t ldvsl, + float* vsr, const fortran_int_t ldvsr, float* rconde, float* rcondv, + float* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork, fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_SGGESX( &jobvsl, &jobvsr, &sort, selctg, &sense, &n, a, &lda, b, + &ldb, &sdim, alphar, alphai, beta, vsl, &ldvsl, vsr, &ldvsr, + rconde, rcondv, work, &lwork, iwork, &liwork, bwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ggesx( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const char sense, + const fortran_int_t n, double* a, const fortran_int_t lda, double* b, + const fortran_int_t ldb, fortran_int_t& sdim, double* alphar, + double* alphai, double* beta, double* vsl, const fortran_int_t ldvsl, + double* vsr, const fortran_int_t ldvsr, double* rconde, + double* rcondv, double* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_DGGESX( &jobvsl, &jobvsr, &sort, selctg, &sense, &n, a, &lda, b, + &ldb, &sdim, alphar, alphai, beta, vsl, &ldvsl, vsr, &ldvsr, + rconde, rcondv, work, &lwork, iwork, &liwork, bwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggesx( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const char sense, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, fortran_int_t& sdim, + std::complex* alpha, std::complex* beta, + std::complex* vsl, const fortran_int_t ldvsl, + std::complex* vsr, const fortran_int_t ldvsr, float* rconde, + float* rcondv, std::complex* work, const fortran_int_t lwork, + float* rwork, fortran_int_t* iwork, const fortran_int_t liwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_CGGESX( &jobvsl, &jobvsr, &sort, selctg, &sense, &n, a, &lda, b, + &ldb, &sdim, alpha, beta, vsl, &ldvsl, vsr, &ldvsr, rconde, + rcondv, work, &lwork, rwork, iwork, &liwork, bwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggesx( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const char sense, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, fortran_int_t& sdim, + std::complex* alpha, std::complex* beta, + std::complex* vsl, const fortran_int_t ldvsl, + std::complex* vsr, const fortran_int_t ldvsr, double* rconde, + double* rcondv, std::complex* work, const fortran_int_t lwork, + double* rwork, fortran_int_t* iwork, const fortran_int_t liwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_ZGGESX( &jobvsl, &jobvsr, &sort, selctg, &sense, &n, a, &lda, b, + &ldb, &sdim, alpha, beta, vsl, &ldvsl, vsr, &ldvsr, rconde, + rcondv, work, &lwork, rwork, iwork, &liwork, bwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ggesx. +// +template< typename Value, typename Enable = void > +struct ggesx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ggesx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVSL, + typename MatrixVSR, typename VectorRCONDE, typename VectorRCONDV, + typename WORK, typename IWORK, typename BWORK > + static std::ptrdiff_t invoke( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const char sense, MatrixA& a, + MatrixB& b, fortran_int_t& sdim, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVSL& vsl, + MatrixVSR& vsr, VectorRCONDE& rconde, VectorRCONDV& rcondv, + detail::workspace3< WORK, IWORK, BWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVSL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVSR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAI >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVSL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVSR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRCONDE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRCONDV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAI >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVSL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVSR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRCONDE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRCONDV >::value) ); + BOOST_ASSERT( bindings::size(alphai) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(alphar) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a), sense )); + BOOST_ASSERT( bindings::size(work.select(fortran_bool_t())) >= + min_size_bwork( bindings::size_column(a), sort )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a), sense )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(vsl) == 1 || + bindings::stride_minor(vsl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vsr) == 1 || + bindings::stride_minor(vsr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvsl == 'N' || jobvsl == 'V' ); + BOOST_ASSERT( jobvsr == 'N' || jobvsr == 'V' ); + BOOST_ASSERT( sense == 'N' || sense == 'E' || sense == 'V' || + sense == 'B' ); + BOOST_ASSERT( sort == 'N' || sort == 'S' ); + return detail::ggesx( jobvsl, jobvsr, sort, selctg, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), sdim, + bindings::begin_value(alphar), bindings::begin_value(alphai), + bindings::begin_value(beta), bindings::begin_value(vsl), + bindings::stride_major(vsl), bindings::begin_value(vsr), + bindings::stride_major(vsr), bindings::begin_value(rconde), + bindings::begin_value(rcondv), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())), + bindings::begin_value(work.select(fortran_bool_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVSL, + typename MatrixVSR, typename VectorRCONDE, typename VectorRCONDV > + static std::ptrdiff_t invoke( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const char sense, MatrixA& a, + MatrixB& b, fortran_int_t& sdim, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVSL& vsl, + MatrixVSR& vsr, VectorRCONDE& rconde, VectorRCONDV& rcondv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a), sense ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a), sense ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + return invoke( jobvsl, jobvsr, sort, selctg, sense, a, b, sdim, + alphar, alphai, beta, vsl, vsr, rconde, rcondv, + workspace( tmp_work, tmp_iwork, tmp_bwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVSL, + typename MatrixVSR, typename VectorRCONDE, typename VectorRCONDV > + static std::ptrdiff_t invoke( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const char sense, MatrixA& a, + MatrixB& b, fortran_int_t& sdim, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVSL& vsl, + MatrixVSR& vsr, VectorRCONDE& rconde, VectorRCONDV& rcondv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a), sense ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + detail::ggesx( jobvsl, jobvsr, sort, selctg, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), sdim, + bindings::begin_value(alphar), bindings::begin_value(alphai), + bindings::begin_value(beta), bindings::begin_value(vsl), + bindings::stride_major(vsl), bindings::begin_value(vsr), + bindings::stride_major(vsr), bindings::begin_value(rconde), + bindings::begin_value(rcondv), &opt_size_work, -1, + bindings::begin_value(tmp_iwork), -1, + bindings::begin_value(tmp_bwork) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobvsl, jobvsr, sort, selctg, sense, a, b, sdim, + alphar, alphai, beta, vsl, vsr, rconde, rcondv, + workspace( tmp_work, tmp_iwork, tmp_bwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const char sense ) { + if ( n == 0 ) + return 1; + if ( sense == 'N' ) + return std::max< std::ptrdiff_t >( 8*n, 6*n+16 ); + else + return std::max< std::ptrdiff_t >( 8*n, std::max< + std::ptrdiff_t >( 6*n+16, n*n/2 )); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n, + const char sense ) { + if ( sense == 'N' ) + return 1; + else + return std::max< std::ptrdiff_t >( 1, n+6 ); + } + + // + // Static member function that returns the minimum size of + // workspace-array bwork. + // + static std::ptrdiff_t min_size_bwork( const std::ptrdiff_t n, + const char sort ) { + if ( sort == 'N' ) + return 0; + else + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ggesx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVSL, typename MatrixVSR, + typename VectorRCONDE, typename VectorRCONDV, typename WORK, + typename RWORK, typename IWORK, typename BWORK > + static std::ptrdiff_t invoke( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const char sense, MatrixA& a, + MatrixB& b, fortran_int_t& sdim, VectorALPHA& alpha, + VectorBETA& beta, MatrixVSL& vsl, MatrixVSR& vsr, + VectorRCONDE& rconde, VectorRCONDV& rcondv, detail::workspace4< + WORK, RWORK, IWORK, BWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVSL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVSR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorRCONDE >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRCONDV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVSL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVSR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVSL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVSR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRCONDE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRCONDV >::value) ); + BOOST_ASSERT( bindings::size(alpha) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(beta) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a), sense )); + BOOST_ASSERT( bindings::size(work.select(fortran_bool_t())) >= + min_size_bwork( bindings::size_column(a), sort )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a), sense )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(vsl) == 1 || + bindings::stride_minor(vsl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vsr) == 1 || + bindings::stride_minor(vsr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvsl == 'N' || jobvsl == 'V' ); + BOOST_ASSERT( jobvsr == 'N' || jobvsr == 'V' ); + BOOST_ASSERT( sense == 'N' || sense == 'E' || sense == 'V' || + sense == 'B' ); + BOOST_ASSERT( sort == 'N' || sort == 'S' ); + return detail::ggesx( jobvsl, jobvsr, sort, selctg, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), sdim, bindings::begin_value(alpha), + bindings::begin_value(beta), bindings::begin_value(vsl), + bindings::stride_major(vsl), bindings::begin_value(vsr), + bindings::stride_major(vsr), bindings::begin_value(rconde), + bindings::begin_value(rcondv), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(fortran_bool_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVSL, typename MatrixVSR, + typename VectorRCONDE, typename VectorRCONDV > + static std::ptrdiff_t invoke( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const char sense, MatrixA& a, + MatrixB& b, fortran_int_t& sdim, VectorALPHA& alpha, + VectorBETA& beta, MatrixVSL& vsl, MatrixVSR& vsr, + VectorRCONDE& rconde, VectorRCONDV& rcondv, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a), sense ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a), sense ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + return invoke( jobvsl, jobvsr, sort, selctg, sense, a, b, sdim, alpha, + beta, vsl, vsr, rconde, rcondv, workspace( tmp_work, + tmp_rwork, tmp_iwork, tmp_bwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVSL, typename MatrixVSR, + typename VectorRCONDE, typename VectorRCONDV > + static std::ptrdiff_t invoke( const char jobvsl, const char jobvsr, + const char sort, external_fp selctg, const char sense, MatrixA& a, + MatrixB& b, fortran_int_t& sdim, VectorALPHA& alpha, + VectorBETA& beta, MatrixVSL& vsl, MatrixVSR& vsr, + VectorRCONDE& rconde, VectorRCONDV& rcondv, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a), sense ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + bindings::size_column(a), sort ) ); + detail::ggesx( jobvsl, jobvsr, sort, selctg, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), sdim, bindings::begin_value(alpha), + bindings::begin_value(beta), bindings::begin_value(vsl), + bindings::stride_major(vsl), bindings::begin_value(vsr), + bindings::stride_major(vsr), bindings::begin_value(rconde), + bindings::begin_value(rcondv), &opt_size_work, -1, + bindings::begin_value(tmp_rwork), + bindings::begin_value(tmp_iwork), -1, + bindings::begin_value(tmp_bwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobvsl, jobvsr, sort, selctg, sense, a, b, sdim, alpha, + beta, vsl, vsr, rconde, rcondv, workspace( tmp_work, + tmp_rwork, tmp_iwork, tmp_bwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const char sense ) { + if ( sense == 'N' ) + return std::max< std::ptrdiff_t >( 1, 2*n ); + else + return std::max< std::ptrdiff_t >( 1, std::max< + std::ptrdiff_t >( 2*n, n*n/2 ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 8*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n, + const char sense ) { + if ( sense == 'N' ) + return 1; + else + return std::max< std::ptrdiff_t >( 1, n+2 ); + } + + // + // Static member function that returns the minimum size of + // workspace-array bwork. + // + static std::ptrdiff_t min_size_bwork( const std::ptrdiff_t n, + const char sort ) { + if ( sort == 'N' ) + return 0; + else + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ggesx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ggesx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVSL, + typename MatrixVSR, typename VectorRCONDE, typename VectorRCONDV, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ggesx( const char jobvsl, const char jobvsr, const char sort, + external_fp selctg, const char sense, MatrixA& a, MatrixB& b, + fortran_int_t& sdim, VectorALPHAR& alphar, VectorALPHAI& alphai, + VectorBETA& beta, MatrixVSL& vsl, MatrixVSR& vsr, + VectorRCONDE& rconde, VectorRCONDV& rcondv, Workspace work ) { + return ggesx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvsl, jobvsr, sort, selctg, sense, a, + b, sdim, alphar, alphai, beta, vsl, vsr, rconde, rcondv, work ); +} + +// +// Overloaded function for ggesx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVSL, + typename MatrixVSR, typename VectorRCONDE, typename VectorRCONDV > +inline typename boost::disable_if< detail::is_workspace< VectorRCONDV >, + std::ptrdiff_t >::type +ggesx( const char jobvsl, const char jobvsr, const char sort, + external_fp selctg, const char sense, MatrixA& a, MatrixB& b, + fortran_int_t& sdim, VectorALPHAR& alphar, VectorALPHAI& alphai, + VectorBETA& beta, MatrixVSL& vsl, MatrixVSR& vsr, + VectorRCONDE& rconde, VectorRCONDV& rcondv ) { + return ggesx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvsl, jobvsr, sort, selctg, sense, a, + b, sdim, alphar, alphai, beta, vsl, vsr, rconde, rcondv, + optimal_workspace() ); +} + +// +// Overloaded function for ggesx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVSL, typename MatrixVSR, + typename VectorRCONDE, typename VectorRCONDV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ggesx( const char jobvsl, const char jobvsr, const char sort, + external_fp selctg, const char sense, MatrixA& a, MatrixB& b, + fortran_int_t& sdim, VectorALPHA& alpha, VectorBETA& beta, + MatrixVSL& vsl, MatrixVSR& vsr, VectorRCONDE& rconde, + VectorRCONDV& rcondv, Workspace work ) { + return ggesx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvsl, jobvsr, sort, selctg, sense, a, + b, sdim, alpha, beta, vsl, vsr, rconde, rcondv, work ); +} + +// +// Overloaded function for ggesx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVSL, typename MatrixVSR, + typename VectorRCONDE, typename VectorRCONDV > +inline typename boost::disable_if< detail::is_workspace< VectorRCONDV >, + std::ptrdiff_t >::type +ggesx( const char jobvsl, const char jobvsr, const char sort, + external_fp selctg, const char sense, MatrixA& a, MatrixB& b, + fortran_int_t& sdim, VectorALPHA& alpha, VectorBETA& beta, + MatrixVSL& vsl, MatrixVSR& vsr, VectorRCONDE& rconde, + VectorRCONDV& rcondv ) { + return ggesx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvsl, jobvsr, sort, selctg, sense, a, + b, sdim, alpha, beta, vsl, vsr, rconde, rcondv, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/ggev.hpp b/sdk/boost/numeric/bindings/lapack/driver/ggev.hpp new file mode 100644 index 0000000..7d6e162 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/ggev.hpp @@ -0,0 +1,509 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGEV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGEV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ggev is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ggev( const char jobvl, const char jobvr, + const fortran_int_t n, float* a, const fortran_int_t lda, float* b, + const fortran_int_t ldb, float* alphar, float* alphai, float* beta, + float* vl, const fortran_int_t ldvl, float* vr, + const fortran_int_t ldvr, float* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGGEV( &jobvl, &jobvr, &n, a, &lda, b, &ldb, alphar, alphai, beta, + vl, &ldvl, vr, &ldvr, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ggev( const char jobvl, const char jobvr, + const fortran_int_t n, double* a, const fortran_int_t lda, double* b, + const fortran_int_t ldb, double* alphar, double* alphai, double* beta, + double* vl, const fortran_int_t ldvl, double* vr, + const fortran_int_t ldvr, double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGGEV( &jobvl, &jobvr, &n, a, &lda, b, &ldb, alphar, alphai, beta, + vl, &ldvl, vr, &ldvr, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggev( const char jobvl, const char jobvr, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, std::complex* alpha, + std::complex* beta, std::complex* vl, + const fortran_int_t ldvl, std::complex* vr, + const fortran_int_t ldvr, std::complex* work, + const fortran_int_t lwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGGEV( &jobvl, &jobvr, &n, a, &lda, b, &ldb, alpha, beta, vl, + &ldvl, vr, &ldvr, work, &lwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggev( const char jobvl, const char jobvr, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, std::complex* alpha, + std::complex* beta, std::complex* vl, + const fortran_int_t ldvl, std::complex* vr, + const fortran_int_t ldvr, std::complex* work, + const fortran_int_t lwork, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGGEV( &jobvl, &jobvr, &n, a, &lda, b, &ldb, alpha, beta, vl, + &ldvl, vr, &ldvr, work, &lwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ggev. +// +template< typename Value, typename Enable = void > +struct ggev_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ggev_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR, typename WORK > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, MatrixB& b, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVL& vl, + MatrixVR& vr, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAI >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAI >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_ASSERT( bindings::size(alphai) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(alphar) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvl == 'N' || jobvl == 'V' ); + BOOST_ASSERT( jobvr == 'N' || jobvr == 'V' ); + return detail::ggev( jobvl, jobvr, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(alphar), bindings::begin_value(alphai), + bindings::begin_value(beta), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, MatrixB& b, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVL& vl, + MatrixVR& vr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( jobvl, jobvr, a, b, alphar, alphai, beta, vl, vr, + workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, MatrixB& b, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVL& vl, + MatrixVR& vr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::ggev( jobvl, jobvr, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(alphar), bindings::begin_value(alphai), + bindings::begin_value(beta), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobvl, jobvr, a, b, alphar, alphai, beta, vl, vr, + workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,8*n); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ggev_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, + MatrixVL& vl, MatrixVR& vr, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_ASSERT( bindings::size(alpha) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(beta) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobvl == 'N' || jobvl == 'V' ); + BOOST_ASSERT( jobvr == 'N' || jobvr == 'V' ); + return detail::ggev( jobvl, jobvr, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(alpha), bindings::begin_value(beta), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, + MatrixVL& vl, MatrixVR& vr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( jobvl, jobvr, a, b, alpha, beta, vl, vr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR > + static std::ptrdiff_t invoke( const char jobvl, const char jobvr, + MatrixA& a, MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, + MatrixVL& vl, MatrixVR& vr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + detail::ggev( jobvl, jobvr, bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(alpha), bindings::begin_value(beta), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), + &opt_size_work, -1, bindings::begin_value(tmp_rwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobvl, jobvr, a, b, alpha, beta, vl, vr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,2*n); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 8*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ggev_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ggev. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ggev( const char jobvl, const char jobvr, MatrixA& a, MatrixB& b, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixVL& vl, MatrixVR& vr, Workspace work ) { + return ggev_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvl, jobvr, a, b, alphar, alphai, + beta, vl, vr, work ); +} + +// +// Overloaded function for ggev. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR > +inline typename boost::disable_if< detail::is_workspace< MatrixVR >, + std::ptrdiff_t >::type +ggev( const char jobvl, const char jobvr, MatrixA& a, MatrixB& b, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixVL& vl, MatrixVR& vr ) { + return ggev_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvl, jobvr, a, b, alphar, alphai, + beta, vl, vr, optimal_workspace() ); +} + +// +// Overloaded function for ggev. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ggev( const char jobvl, const char jobvr, MatrixA& a, MatrixB& b, + VectorALPHA& alpha, VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, + Workspace work ) { + return ggev_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvl, jobvr, a, b, alpha, beta, vl, + vr, work ); +} + +// +// Overloaded function for ggev. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR > +inline typename boost::disable_if< detail::is_workspace< MatrixVR >, + std::ptrdiff_t >::type +ggev( const char jobvl, const char jobvr, MatrixA& a, MatrixB& b, + VectorALPHA& alpha, VectorBETA& beta, MatrixVL& vl, MatrixVR& vr ) { + return ggev_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobvl, jobvr, a, b, alpha, beta, vl, + vr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/ggevx.hpp b/sdk/boost/numeric/bindings/lapack/driver/ggevx.hpp new file mode 100644 index 0000000..54eeed0 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/ggevx.hpp @@ -0,0 +1,756 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGEVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGEVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ggevx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ggevx( const char balanc, const char jobvl, + const char jobvr, const char sense, const fortran_int_t n, float* a, + const fortran_int_t lda, float* b, const fortran_int_t ldb, + float* alphar, float* alphai, float* beta, float* vl, + const fortran_int_t ldvl, float* vr, const fortran_int_t ldvr, + fortran_int_t& ilo, fortran_int_t& ihi, float* lscale, float* rscale, + float& abnrm, float& bbnrm, float* rconde, float* rcondv, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_SGGEVX( &balanc, &jobvl, &jobvr, &sense, &n, a, &lda, b, &ldb, + alphar, alphai, beta, vl, &ldvl, vr, &ldvr, &ilo, &ihi, lscale, + rscale, &abnrm, &bbnrm, rconde, rcondv, work, &lwork, iwork, + bwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ggevx( const char balanc, const char jobvl, + const char jobvr, const char sense, const fortran_int_t n, double* a, + const fortran_int_t lda, double* b, const fortran_int_t ldb, + double* alphar, double* alphai, double* beta, double* vl, + const fortran_int_t ldvl, double* vr, const fortran_int_t ldvr, + fortran_int_t& ilo, fortran_int_t& ihi, double* lscale, + double* rscale, double& abnrm, double& bbnrm, double* rconde, + double* rcondv, double* work, const fortran_int_t lwork, + fortran_int_t* iwork, fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_DGGEVX( &balanc, &jobvl, &jobvr, &sense, &n, a, &lda, b, &ldb, + alphar, alphai, beta, vl, &ldvl, vr, &ldvr, &ilo, &ihi, lscale, + rscale, &abnrm, &bbnrm, rconde, rcondv, work, &lwork, iwork, + bwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggevx( const char balanc, const char jobvl, + const char jobvr, const char sense, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, + std::complex* alpha, std::complex* beta, + std::complex* vl, const fortran_int_t ldvl, + std::complex* vr, const fortran_int_t ldvr, fortran_int_t& ilo, + fortran_int_t& ihi, float* lscale, float* rscale, float& abnrm, + float& bbnrm, float* rconde, float* rcondv, std::complex* work, + const fortran_int_t lwork, float* rwork, fortran_int_t* iwork, + fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_CGGEVX( &balanc, &jobvl, &jobvr, &sense, &n, a, &lda, b, &ldb, + alpha, beta, vl, &ldvl, vr, &ldvr, &ilo, &ihi, lscale, rscale, + &abnrm, &bbnrm, rconde, rcondv, work, &lwork, rwork, iwork, bwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggevx( const char balanc, const char jobvl, + const char jobvr, const char sense, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, + std::complex* alpha, std::complex* beta, + std::complex* vl, const fortran_int_t ldvl, + std::complex* vr, const fortran_int_t ldvr, + fortran_int_t& ilo, fortran_int_t& ihi, double* lscale, + double* rscale, double& abnrm, double& bbnrm, double* rconde, + double* rcondv, std::complex* work, const fortran_int_t lwork, + double* rwork, fortran_int_t* iwork, fortran_bool_t* bwork ) { + fortran_int_t info(0); + LAPACK_ZGGEVX( &balanc, &jobvl, &jobvr, &sense, &n, a, &lda, b, &ldb, + alpha, beta, vl, &ldvl, vr, &ldvr, &ilo, &ihi, lscale, rscale, + &abnrm, &bbnrm, rconde, rcondv, work, &lwork, rwork, iwork, bwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ggevx. +// +template< typename Value, typename Enable = void > +struct ggevx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ggevx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR, typename VectorLSCALE, typename VectorRSCALE, + typename VectorRCONDE, typename VectorRCONDV, typename WORK, + typename IWORK, typename BWORK > + static std::ptrdiff_t invoke( const char balanc, const char jobvl, + const char jobvr, const char sense, MatrixA& a, MatrixB& b, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixVL& vl, MatrixVR& vr, fortran_int_t& ilo, + fortran_int_t& ihi, VectorLSCALE& lscale, + VectorRSCALE& rscale, real_type& abnrm, real_type& bbnrm, + VectorRCONDE& rconde, VectorRCONDV& rcondv, detail::workspace3< + WORK, IWORK, BWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHAI >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorLSCALE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRSCALE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRCONDE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRCONDV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHAI >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorLSCALE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRSCALE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRCONDE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRCONDV >::value) ); + BOOST_ASSERT( bindings::size(alphai) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(alphar) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( sense, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(fortran_bool_t())) >= + min_size_bwork( sense, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( balanc, jobvl, jobvr, sense, + bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( balanc == 'N' || balanc == 'P' || balanc == 'S' || + balanc == 'B' ); + BOOST_ASSERT( jobvl == 'N' || jobvl == 'V' ); + BOOST_ASSERT( jobvr == 'N' || jobvr == 'V' ); + BOOST_ASSERT( sense == 'N' || sense == 'E' || sense == 'V' || + sense == 'B' ); + return detail::ggevx( balanc, jobvl, jobvr, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(alphar), + bindings::begin_value(alphai), bindings::begin_value(beta), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), ilo, + ihi, bindings::begin_value(lscale), + bindings::begin_value(rscale), abnrm, bbnrm, + bindings::begin_value(rconde), bindings::begin_value(rcondv), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(work.select(fortran_bool_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR, typename VectorLSCALE, typename VectorRSCALE, + typename VectorRCONDE, typename VectorRCONDV > + static std::ptrdiff_t invoke( const char balanc, const char jobvl, + const char jobvr, const char sense, MatrixA& a, MatrixB& b, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixVL& vl, MatrixVR& vr, fortran_int_t& ilo, + fortran_int_t& ihi, VectorLSCALE& lscale, + VectorRSCALE& rscale, real_type& abnrm, real_type& bbnrm, + VectorRCONDE& rconde, VectorRCONDV& rcondv, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( balanc, + jobvl, jobvr, sense, bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( sense, bindings::size_column(a) ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + sense, bindings::size_column(a) ) ); + return invoke( balanc, jobvl, jobvr, sense, a, b, alphar, alphai, + beta, vl, vr, ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, + rcondv, workspace( tmp_work, tmp_iwork, tmp_bwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR, typename VectorLSCALE, typename VectorRSCALE, + typename VectorRCONDE, typename VectorRCONDV > + static std::ptrdiff_t invoke( const char balanc, const char jobvl, + const char jobvr, const char sense, MatrixA& a, MatrixB& b, + VectorALPHAR& alphar, VectorALPHAI& alphai, VectorBETA& beta, + MatrixVL& vl, MatrixVR& vr, fortran_int_t& ilo, + fortran_int_t& ihi, VectorLSCALE& lscale, + VectorRSCALE& rscale, real_type& abnrm, real_type& bbnrm, + VectorRCONDE& rconde, VectorRCONDV& rcondv, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( sense, bindings::size_column(a) ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + sense, bindings::size_column(a) ) ); + detail::ggevx( balanc, jobvl, jobvr, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(alphar), + bindings::begin_value(alphai), bindings::begin_value(beta), + bindings::begin_value(vl), bindings::stride_major(vl), + bindings::begin_value(vr), bindings::stride_major(vr), ilo, + ihi, bindings::begin_value(lscale), + bindings::begin_value(rscale), abnrm, bbnrm, + bindings::begin_value(rconde), bindings::begin_value(rcondv), + &opt_size_work, -1, bindings::begin_value(tmp_iwork), + bindings::begin_value(tmp_bwork) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( balanc, jobvl, jobvr, sense, a, b, alphar, alphai, + beta, vl, vr, ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, + rcondv, workspace( tmp_work, tmp_iwork, tmp_bwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char balanc, const char jobvl, + const char jobvr, const char sense, const std::ptrdiff_t n ) { + if ( balanc == 'S' || balanc == 'B' || jobvl == 'V' || jobvr == 'V' ) + return std::max< std::ptrdiff_t >( 1, 6*n ); + if ( sense == 'E' ) + return std::max< std::ptrdiff_t >( 1, 10*n ); + if ( sense == 'V' || sense == 'B' ) + return 2*n*n + 8*n + 16; + return std::max< std::ptrdiff_t >( 1, 2*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char sense, + const std::ptrdiff_t n ) { + if ( sense == 'E' ) + return 0; + else + return n+6; + } + + // + // Static member function that returns the minimum size of + // workspace-array bwork. + // + static std::ptrdiff_t min_size_bwork( const char sense, + const std::ptrdiff_t n ) { + if ( sense == 'N' ) + return 0; + else + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ggevx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR, + typename VectorLSCALE, typename VectorRSCALE, + typename VectorRCONDE, typename VectorRCONDV, typename WORK, + typename RWORK, typename IWORK, typename BWORK > + static std::ptrdiff_t invoke( const char balanc, const char jobvl, + const char jobvr, const char sense, MatrixA& a, MatrixB& b, + VectorALPHA& alpha, VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, + fortran_int_t& ilo, fortran_int_t& ihi, + VectorLSCALE& lscale, VectorRSCALE& rscale, real_type& abnrm, + real_type& bbnrm, VectorRCONDE& rconde, VectorRCONDV& rcondv, + detail::workspace4< WORK, RWORK, IWORK, BWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorLSCALE >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRSCALE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorLSCALE >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRCONDE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorLSCALE >::type >::type, + typename remove_const< typename bindings::value_type< + VectorRCONDV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVL >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixVR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixVR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorLSCALE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRSCALE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRCONDE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorRCONDV >::value) ); + BOOST_ASSERT( bindings::size(alpha) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(beta) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( sense, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(fortran_bool_t())) >= + min_size_bwork( sense, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( balanc, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( sense, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(vl) == 1 || + bindings::stride_minor(vl) == 1 ); + BOOST_ASSERT( bindings::size_minor(vr) == 1 || + bindings::stride_minor(vr) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( balanc == 'N' || balanc == 'P' || balanc == 'S' || + balanc == 'B' ); + BOOST_ASSERT( jobvl == 'N' || jobvl == 'V' ); + BOOST_ASSERT( jobvr == 'N' || jobvr == 'V' ); + BOOST_ASSERT( sense == 'N' || sense == 'E' || sense == 'V' || + sense == 'B' ); + return detail::ggevx( balanc, jobvl, jobvr, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(alpha), + bindings::begin_value(beta), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), ilo, ihi, + bindings::begin_value(lscale), bindings::begin_value(rscale), + abnrm, bbnrm, bindings::begin_value(rconde), + bindings::begin_value(rcondv), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(work.select(fortran_bool_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR, + typename VectorLSCALE, typename VectorRSCALE, + typename VectorRCONDE, typename VectorRCONDV > + static std::ptrdiff_t invoke( const char balanc, const char jobvl, + const char jobvr, const char sense, MatrixA& a, MatrixB& b, + VectorALPHA& alpha, VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, + fortran_int_t& ilo, fortran_int_t& ihi, + VectorLSCALE& lscale, VectorRSCALE& rscale, real_type& abnrm, + real_type& bbnrm, VectorRCONDE& rconde, VectorRCONDV& rcondv, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( sense, + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + balanc, bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( sense, bindings::size_column(a) ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + sense, bindings::size_column(a) ) ); + return invoke( balanc, jobvl, jobvr, sense, a, b, alpha, beta, vl, vr, + ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv, + workspace( tmp_work, tmp_rwork, tmp_iwork, tmp_bwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR, + typename VectorLSCALE, typename VectorRSCALE, + typename VectorRCONDE, typename VectorRCONDV > + static std::ptrdiff_t invoke( const char balanc, const char jobvl, + const char jobvr, const char sense, MatrixA& a, MatrixB& b, + VectorALPHA& alpha, VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, + fortran_int_t& ilo, fortran_int_t& ihi, + VectorLSCALE& lscale, VectorRSCALE& rscale, real_type& abnrm, + real_type& bbnrm, VectorRCONDE& rconde, VectorRCONDV& rcondv, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + balanc, bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( sense, bindings::size_column(a) ) ); + bindings::detail::array< fortran_bool_t > tmp_bwork( min_size_bwork( + sense, bindings::size_column(a) ) ); + detail::ggevx( balanc, jobvl, jobvr, sense, + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(alpha), + bindings::begin_value(beta), bindings::begin_value(vl), + bindings::stride_major(vl), bindings::begin_value(vr), + bindings::stride_major(vr), ilo, ihi, + bindings::begin_value(lscale), bindings::begin_value(rscale), + abnrm, bbnrm, bindings::begin_value(rconde), + bindings::begin_value(rcondv), &opt_size_work, -1, + bindings::begin_value(tmp_rwork), + bindings::begin_value(tmp_iwork), + bindings::begin_value(tmp_bwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( balanc, jobvl, jobvr, sense, a, b, alpha, beta, vl, vr, + ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv, + workspace( tmp_work, tmp_rwork, tmp_iwork, tmp_bwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char sense, + const std::ptrdiff_t n ) { + if ( sense == 'N' ) + return std::max< std::ptrdiff_t >( 1, 2*n ); + else { + if ( sense == 'E' ) + return std::max< std::ptrdiff_t >( 1, 4*n ); + else + return std::max< std::ptrdiff_t >( 1, 2*n*n+2*n ); + } + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const char balanc, + const std::ptrdiff_t n ) { + if ( balanc == 'S' || balanc == 'B' ) + return std::max< std::ptrdiff_t >( 1, 6*n ); + else + return std::max< std::ptrdiff_t >( 1, 2*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char sense, + const std::ptrdiff_t n ) { + if ( sense == 'E' ) + return 0; + else + return n+2; + } + + // + // Static member function that returns the minimum size of + // workspace-array bwork. + // + static std::ptrdiff_t min_size_bwork( const char sense, + const std::ptrdiff_t n ) { + if ( sense == 'N' ) + return 0; + else + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ggevx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ggevx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR, typename VectorLSCALE, typename VectorRSCALE, + typename VectorRCONDE, typename VectorRCONDV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ggevx( const char balanc, const char jobvl, const char jobvr, + const char sense, MatrixA& a, MatrixB& b, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, + fortran_int_t& ilo, fortran_int_t& ihi, VectorLSCALE& lscale, + VectorRSCALE& rscale, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& abnrm, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& bbnrm, VectorRCONDE& rconde, + VectorRCONDV& rcondv, Workspace work ) { + return ggevx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( balanc, jobvl, jobvr, sense, a, b, + alphar, alphai, beta, vl, vr, ilo, ihi, lscale, rscale, abnrm, + bbnrm, rconde, rcondv, work ); +} + +// +// Overloaded function for ggevx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorALPHAR, + typename VectorALPHAI, typename VectorBETA, typename MatrixVL, + typename MatrixVR, typename VectorLSCALE, typename VectorRSCALE, + typename VectorRCONDE, typename VectorRCONDV > +inline typename boost::disable_if< detail::is_workspace< VectorRCONDV >, + std::ptrdiff_t >::type +ggevx( const char balanc, const char jobvl, const char jobvr, + const char sense, MatrixA& a, MatrixB& b, VectorALPHAR& alphar, + VectorALPHAI& alphai, VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, + fortran_int_t& ilo, fortran_int_t& ihi, VectorLSCALE& lscale, + VectorRSCALE& rscale, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& abnrm, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& bbnrm, VectorRCONDE& rconde, + VectorRCONDV& rcondv ) { + return ggevx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( balanc, jobvl, jobvr, sense, a, b, + alphar, alphai, beta, vl, vr, ilo, ihi, lscale, rscale, abnrm, + bbnrm, rconde, rcondv, optimal_workspace() ); +} + +// +// Overloaded function for ggevx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR, + typename VectorLSCALE, typename VectorRSCALE, typename VectorRCONDE, + typename VectorRCONDV, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ggevx( const char balanc, const char jobvl, const char jobvr, + const char sense, MatrixA& a, MatrixB& b, VectorALPHA& alpha, + VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, fortran_int_t& ilo, + fortran_int_t& ihi, VectorLSCALE& lscale, VectorRSCALE& rscale, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& abnrm, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& bbnrm, + VectorRCONDE& rconde, VectorRCONDV& rcondv, Workspace work ) { + return ggevx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( balanc, jobvl, jobvr, sense, a, b, + alpha, beta, vl, vr, ilo, ihi, lscale, rscale, abnrm, bbnrm, + rconde, rcondv, work ); +} + +// +// Overloaded function for ggevx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixVL, typename MatrixVR, + typename VectorLSCALE, typename VectorRSCALE, typename VectorRCONDE, + typename VectorRCONDV > +inline typename boost::disable_if< detail::is_workspace< VectorRCONDV >, + std::ptrdiff_t >::type +ggevx( const char balanc, const char jobvl, const char jobvr, + const char sense, MatrixA& a, MatrixB& b, VectorALPHA& alpha, + VectorBETA& beta, MatrixVL& vl, MatrixVR& vr, fortran_int_t& ilo, + fortran_int_t& ihi, VectorLSCALE& lscale, VectorRSCALE& rscale, + typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type& abnrm, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& bbnrm, + VectorRCONDE& rconde, VectorRCONDV& rcondv ) { + return ggevx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( balanc, jobvl, jobvr, sense, a, b, + alpha, beta, vl, vr, ilo, ihi, lscale, rscale, abnrm, bbnrm, + rconde, rcondv, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/ggglm.hpp b/sdk/boost/numeric/bindings/lapack/driver/ggglm.hpp new file mode 100644 index 0000000..f5e4c5a --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/ggglm.hpp @@ -0,0 +1,407 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGGLM_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGGLM_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ggglm is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ggglm( const fortran_int_t n, const fortran_int_t m, + const fortran_int_t p, float* a, const fortran_int_t lda, float* b, + const fortran_int_t ldb, float* d, float* x, float* y, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGGGLM( &n, &m, &p, a, &lda, b, &ldb, d, x, y, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ggglm( const fortran_int_t n, const fortran_int_t m, + const fortran_int_t p, double* a, const fortran_int_t lda, double* b, + const fortran_int_t ldb, double* d, double* x, double* y, + double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGGGLM( &n, &m, &p, a, &lda, b, &ldb, d, x, y, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggglm( const fortran_int_t n, const fortran_int_t m, + const fortran_int_t p, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, std::complex* d, + std::complex* x, std::complex* y, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CGGGLM( &n, &m, &p, a, &lda, b, &ldb, d, x, y, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggglm( const fortran_int_t n, const fortran_int_t m, + const fortran_int_t p, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, std::complex* d, + std::complex* x, std::complex* y, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZGGGLM( &n, &m, &p, a, &lda, b, &ldb, d, x, y, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ggglm. +// +template< typename Value, typename Enable = void > +struct ggglm_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ggglm_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorD, + typename VectorX, typename VectorY, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorD& d, + VectorX& x, VectorY& y, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a), bindings::size_column(b) )); + BOOST_ASSERT( bindings::size(x) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(y) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size_column(b) >= bindings::size_row(a)- + bindings::size_column(a) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::ggglm( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(d), + bindings::begin_value(x), bindings::begin_value(y), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorD, + typename VectorX, typename VectorY > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorD& d, + VectorX& x, VectorY& y, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b) ) ); + return invoke( a, b, d, x, y, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorD, + typename VectorX, typename VectorY > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorD& d, + VectorX& x, VectorY& y, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::ggglm( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(d), + bindings::begin_value(x), bindings::begin_value(y), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, b, d, x, y, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t m, const std::ptrdiff_t p ) { + return std::max< std::ptrdiff_t >(1,n+m+p); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ggglm_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorD, + typename VectorX, typename VectorY, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorD& d, + VectorX& x, VectorY& y, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorY >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorY >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a), bindings::size_column(b) )); + BOOST_ASSERT( bindings::size(x) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(y) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size_column(b) >= bindings::size_row(a)- + bindings::size_column(a) ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + return detail::ggglm( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(d), + bindings::begin_value(x), bindings::begin_value(y), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorD, + typename VectorX, typename VectorY > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorD& d, + VectorX& x, VectorY& y, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b) ) ); + return invoke( a, b, d, x, y, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorD, + typename VectorX, typename VectorY > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorD& d, + VectorX& x, VectorY& y, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::ggglm( bindings::size_row(a), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(d), + bindings::begin_value(x), bindings::begin_value(y), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, b, d, x, y, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t m, const std::ptrdiff_t p ) { + return std::max< std::ptrdiff_t >(1,n+m+p); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ggglm_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ggglm. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorD, + typename VectorX, typename VectorY, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ggglm( MatrixA& a, MatrixB& b, VectorD& d, VectorX& x, VectorY& y, + Workspace work ) { + return ggglm_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, d, x, y, work ); +} + +// +// Overloaded function for ggglm. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorD, + typename VectorX, typename VectorY > +inline typename boost::disable_if< detail::is_workspace< VectorY >, + std::ptrdiff_t >::type +ggglm( MatrixA& a, MatrixB& b, VectorD& d, VectorX& x, VectorY& y ) { + return ggglm_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, d, x, y, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gglse.hpp b/sdk/boost/numeric/bindings/lapack/driver/gglse.hpp new file mode 100644 index 0000000..80e64d1 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gglse.hpp @@ -0,0 +1,405 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGLSE_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGLSE_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gglse is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gglse( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t p, float* a, const fortran_int_t lda, float* b, + const fortran_int_t ldb, float* c, float* d, float* x, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SGGLSE( &m, &n, &p, a, &lda, b, &ldb, c, d, x, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gglse( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t p, double* a, const fortran_int_t lda, double* b, + const fortran_int_t ldb, double* c, double* d, double* x, + double* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DGGLSE( &m, &n, &p, a, &lda, b, &ldb, c, d, x, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gglse( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t p, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, std::complex* c, + std::complex* d, std::complex* x, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CGGLSE( &m, &n, &p, a, &lda, b, &ldb, c, d, x, work, &lwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gglse( const fortran_int_t m, const fortran_int_t n, + const fortran_int_t p, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, std::complex* c, + std::complex* d, std::complex* x, + std::complex* work, const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZGGLSE( &m, &n, &p, a, &lda, b, &ldb, c, d, x, work, &lwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gglse. +// +template< typename Value, typename Enable = void > +struct gglse_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gglse_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorC, + typename VectorD, typename VectorX, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorC& c, + VectorD& d, VectorX& x, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_ASSERT( bindings::size(c) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_row(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a), bindings::size_row(b) )); + BOOST_ASSERT( bindings::size(x) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(b)) ); + return detail::gglse( bindings::size_row(a), bindings::size_column(a), + bindings::size_row(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(c), + bindings::begin_value(d), bindings::begin_value(x), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorC, + typename VectorD, typename VectorX > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorC& c, + VectorD& d, VectorX& x, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a), + bindings::size_row(b) ) ); + return invoke( a, b, c, d, x, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorC, + typename VectorD, typename VectorX > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorC& c, + VectorD& d, VectorX& x, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + detail::gglse( bindings::size_row(a), bindings::size_column(a), + bindings::size_row(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(c), + bindings::begin_value(d), bindings::begin_value(x), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, b, c, d, x, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n, const std::ptrdiff_t p ) { + return std::max< std::ptrdiff_t >(1,m+n+p); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gglse_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorC, + typename VectorD, typename VectorX, typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorC& c, + VectorD& d, VectorX& x, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorC >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorC >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorX >::value) ); + BOOST_ASSERT( bindings::size(c) >= bindings::size_row(a) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_row(b) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_row(a), + bindings::size_column(a), bindings::size_row(b) )); + BOOST_ASSERT( bindings::size(x) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(b)) ); + return detail::gglse( bindings::size_row(a), bindings::size_column(a), + bindings::size_row(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(c), + bindings::begin_value(d), bindings::begin_value(x), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorC, + typename VectorD, typename VectorX > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorC& c, + VectorD& d, VectorX& x, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_row(a), bindings::size_column(a), + bindings::size_row(b) ) ); + return invoke( a, b, c, d, x, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorC, + typename VectorD, typename VectorX > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b, VectorC& c, + VectorD& d, VectorX& x, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + value_type opt_size_work; + detail::gglse( bindings::size_row(a), bindings::size_column(a), + bindings::size_row(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(c), + bindings::begin_value(d), bindings::begin_value(x), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, b, c, d, x, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t m, + const std::ptrdiff_t n, const std::ptrdiff_t p ) { + return std::max< std::ptrdiff_t >(1,m+n+p); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gglse_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gglse. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorC, + typename VectorD, typename VectorX, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gglse( MatrixA& a, MatrixB& b, VectorC& c, VectorD& d, VectorX& x, + Workspace work ) { + return gglse_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, c, d, x, work ); +} + +// +// Overloaded function for gglse. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorC, + typename VectorD, typename VectorX > +inline typename boost::disable_if< detail::is_workspace< VectorX >, + std::ptrdiff_t >::type +gglse( MatrixA& a, MatrixB& b, VectorC& c, VectorD& d, VectorX& x ) { + return gglse_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, c, d, x, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/ggsvd.hpp b/sdk/boost/numeric/bindings/lapack/driver/ggsvd.hpp new file mode 100644 index 0000000..2277895 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/ggsvd.hpp @@ -0,0 +1,514 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGSVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GGSVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ggsvd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ggsvd( const char jobu, const char jobv, const char jobq, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t p, + fortran_int_t& k, fortran_int_t& l, float* a, const fortran_int_t lda, + float* b, const fortran_int_t ldb, float* alpha, float* beta, + float* u, const fortran_int_t ldu, float* v, const fortran_int_t ldv, + float* q, const fortran_int_t ldq, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SGGSVD( &jobu, &jobv, &jobq, &m, &n, &p, &k, &l, a, &lda, b, &ldb, + alpha, beta, u, &ldu, v, &ldv, q, &ldq, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ggsvd( const char jobu, const char jobv, const char jobq, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t p, + fortran_int_t& k, fortran_int_t& l, double* a, + const fortran_int_t lda, double* b, const fortran_int_t ldb, + double* alpha, double* beta, double* u, const fortran_int_t ldu, + double* v, const fortran_int_t ldv, double* q, + const fortran_int_t ldq, double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DGGSVD( &jobu, &jobv, &jobq, &m, &n, &p, &k, &l, a, &lda, b, &ldb, + alpha, beta, u, &ldu, v, &ldv, q, &ldq, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggsvd( const char jobu, const char jobv, const char jobq, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t p, + fortran_int_t& k, fortran_int_t& l, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, float* alpha, float* beta, + std::complex* u, const fortran_int_t ldu, + std::complex* v, const fortran_int_t ldv, + std::complex* q, const fortran_int_t ldq, + std::complex* work, float* rwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_CGGSVD( &jobu, &jobv, &jobq, &m, &n, &p, &k, &l, a, &lda, b, &ldb, + alpha, beta, u, &ldu, v, &ldv, q, &ldq, work, rwork, iwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ggsvd( const char jobu, const char jobv, const char jobq, + const fortran_int_t m, const fortran_int_t n, const fortran_int_t p, + fortran_int_t& k, fortran_int_t& l, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, double* alpha, double* beta, + std::complex* u, const fortran_int_t ldu, + std::complex* v, const fortran_int_t ldv, + std::complex* q, const fortran_int_t ldq, + std::complex* work, double* rwork, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_ZGGSVD( &jobu, &jobv, &jobq, &m, &n, &p, &k, &l, a, &lda, b, &ldb, + alpha, beta, u, &ldu, v, &ldv, q, &ldq, work, rwork, iwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ggsvd. +// +template< typename Value, typename Enable = void > +struct ggsvd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ggsvd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, fortran_int_t& k, fortran_int_t& l, + MatrixA& a, MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, + MatrixU& u, MatrixV& v, MatrixQ& q, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorALPHA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::size(alpha) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a), + bindings::size_row(a), bindings::size_row(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::size_row(b) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(b)) ); + BOOST_ASSERT( jobq == 'Q' || jobq == 'N' ); + BOOST_ASSERT( jobu == 'U' || jobu == 'N' ); + BOOST_ASSERT( jobv == 'V' || jobv == 'N' ); + return detail::ggsvd( jobu, jobv, jobq, bindings::size_row(a), + bindings::size_column(a), bindings::size_row(b), k, l, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(alpha), bindings::begin_value(beta), + bindings::begin_value(u), bindings::stride_major(u), + bindings::begin_value(v), bindings::stride_major(v), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, fortran_int_t& k, fortran_int_t& l, + MatrixA& a, MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, + MatrixU& u, MatrixV& v, MatrixQ& q, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a), bindings::size_row(a), + bindings::size_row(b) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( jobu, jobv, jobq, k, l, a, b, alpha, beta, u, v, q, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, fortran_int_t& k, fortran_int_t& l, + MatrixA& a, MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, + MatrixU& u, MatrixV& v, MatrixQ& q, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( jobu, jobv, jobq, k, l, a, b, alpha, beta, u, v, q, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t m, const std::ptrdiff_t p ) { + return std::max< std::ptrdiff_t >(3*n,std::max< std::ptrdiff_t >(m,p))+n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ggsvd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ, typename WORK, typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, fortran_int_t& k, fortran_int_t& l, + MatrixA& a, MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, + MatrixU& u, MatrixV& v, MatrixQ& q, detail::workspace3< WORK, + RWORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorALPHA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBETA >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixV >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorALPHA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBETA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_ASSERT( bindings::size(alpha) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a), + bindings::size_row(a), bindings::size_row(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(u) == 1 || + bindings::stride_minor(u) == 1 ); + BOOST_ASSERT( bindings::size_minor(v) == 1 || + bindings::stride_minor(v) == 1 ); + BOOST_ASSERT( bindings::size_row(a) >= 0 ); + BOOST_ASSERT( bindings::size_row(b) >= 0 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_row(b)) ); + BOOST_ASSERT( jobq == 'Q' || jobq == 'N' ); + BOOST_ASSERT( jobu == 'U' || jobu == 'N' ); + BOOST_ASSERT( jobv == 'V' || jobv == 'N' ); + return detail::ggsvd( jobu, jobv, jobq, bindings::size_row(a), + bindings::size_column(a), bindings::size_row(b), k, l, + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(alpha), bindings::begin_value(beta), + bindings::begin_value(u), bindings::stride_major(u), + bindings::begin_value(v), bindings::stride_major(v), + bindings::begin_value(q), bindings::stride_major(q), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, fortran_int_t& k, fortran_int_t& l, + MatrixA& a, MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, + MatrixU& u, MatrixV& v, MatrixQ& q, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a), bindings::size_row(a), + bindings::size_row(b) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( jobu, jobv, jobq, k, l, a, b, alpha, beta, u, v, q, + workspace( tmp_work, tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ > + static std::ptrdiff_t invoke( const char jobu, const char jobv, + const char jobq, fortran_int_t& k, fortran_int_t& l, + MatrixA& a, MatrixB& b, VectorALPHA& alpha, VectorBETA& beta, + MatrixU& u, MatrixV& v, MatrixQ& q, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( jobu, jobv, jobq, k, l, a, b, alpha, beta, u, v, q, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t m, const std::ptrdiff_t p ) { + return std::max< std::ptrdiff_t >(3*n,std::max< std::ptrdiff_t >(m,p))+n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ggsvd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ggsvd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ggsvd( const char jobu, const char jobv, const char jobq, + fortran_int_t& k, fortran_int_t& l, MatrixA& a, MatrixB& b, + VectorALPHA& alpha, VectorBETA& beta, MatrixU& u, MatrixV& v, + MatrixQ& q, Workspace work ) { + return ggsvd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobu, jobv, jobq, k, l, a, b, alpha, + beta, u, v, q, work ); +} + +// +// Overloaded function for ggsvd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorALPHA, + typename VectorBETA, typename MatrixU, typename MatrixV, + typename MatrixQ > +inline typename boost::disable_if< detail::is_workspace< MatrixQ >, + std::ptrdiff_t >::type +ggsvd( const char jobu, const char jobv, const char jobq, + fortran_int_t& k, fortran_int_t& l, MatrixA& a, MatrixB& b, + VectorALPHA& alpha, VectorBETA& beta, MatrixU& u, MatrixV& v, + MatrixQ& q ) { + return ggsvd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobu, jobv, jobq, k, l, a, b, alpha, + beta, u, v, q, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gtsv.hpp b/sdk/boost/numeric/bindings/lapack/driver/gtsv.hpp new file mode 100644 index 0000000..a829d9d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gtsv.hpp @@ -0,0 +1,181 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GTSV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GTSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gtsv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t gtsv( const fortran_int_t n, const fortran_int_t nrhs, + float* dl, float* d, float* du, float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SGTSV( &n, &nrhs, dl, d, du, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t gtsv( const fortran_int_t n, const fortran_int_t nrhs, + double* dl, double* d, double* du, double* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DGTSV( &n, &nrhs, dl, d, du, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gtsv( const fortran_int_t n, const fortran_int_t nrhs, + std::complex* dl, std::complex* d, + std::complex* du, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CGTSV( &n, &nrhs, dl, d, du, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t gtsv( const fortran_int_t n, const fortran_int_t nrhs, + std::complex* dl, std::complex* d, + std::complex* du, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZGTSV( &n, &nrhs, dl, d, du, b, &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gtsv. +// +template< typename Value > +struct gtsv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename MatrixB > + static std::ptrdiff_t invoke( const fortran_int_t n, VectorDL& dl, + VectorD& d, VectorDU& du, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDL >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDU >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(d) >= n ); + BOOST_ASSERT( bindings::size(dl) >= n-1 ); + BOOST_ASSERT( bindings::size(du) >= n-1 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + n) ); + BOOST_ASSERT( n >= 0 ); + return detail::gtsv( n, bindings::size_column(b), + bindings::begin_value(dl), bindings::begin_value(d), + bindings::begin_value(du), bindings::begin_value(b), + bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gtsv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gtsv. Its overload differs for +// +template< typename VectorDL, typename VectorD, typename VectorDU, + typename MatrixB > +inline std::ptrdiff_t gtsv( const fortran_int_t n, VectorDL& dl, + VectorD& d, VectorDU& du, MatrixB& b ) { + return gtsv_impl< typename bindings::value_type< + VectorDL >::type >::invoke( n, dl, d, du, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/gtsvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/gtsvx.hpp new file mode 100644 index 0000000..7f6b2ff --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/gtsvx.hpp @@ -0,0 +1,556 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GTSVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_GTSVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for gtsvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Trans > +inline std::ptrdiff_t gtsvx( const char fact, const Trans, + const fortran_int_t n, const fortran_int_t nrhs, const float* dl, + const float* d, const float* du, float* dlf, float* df, float* duf, + float* du2, fortran_int_t* ipiv, const float* b, + const fortran_int_t ldb, float* x, const fortran_int_t ldx, + float& rcond, float* ferr, float* berr, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SGTSVX( &fact, &lapack_option< Trans >::value, &n, &nrhs, dl, d, + du, dlf, df, duf, du2, ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, + work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Trans > +inline std::ptrdiff_t gtsvx( const char fact, const Trans, + const fortran_int_t n, const fortran_int_t nrhs, const double* dl, + const double* d, const double* du, double* dlf, double* df, + double* duf, double* du2, fortran_int_t* ipiv, const double* b, + const fortran_int_t ldb, double* x, const fortran_int_t ldx, + double& rcond, double* ferr, double* berr, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DGTSVX( &fact, &lapack_option< Trans >::value, &n, &nrhs, dl, d, + du, dlf, df, duf, du2, ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, + work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gtsvx( const char fact, const Trans, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* dl, const std::complex* d, + const std::complex* du, std::complex* dlf, + std::complex* df, std::complex* duf, + std::complex* du2, fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float& rcond, + float* ferr, float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CGTSVX( &fact, &lapack_option< Trans >::value, &n, &nrhs, dl, d, + du, dlf, df, duf, du2, ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, + work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Trans > +inline std::ptrdiff_t gtsvx( const char fact, const Trans, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* dl, const std::complex* d, + const std::complex* du, std::complex* dlf, + std::complex* df, std::complex* duf, + std::complex* du2, fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, double& rcond, + double* ferr, double* berr, std::complex* work, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZGTSVX( &fact, &lapack_option< Trans >::value, &n, &nrhs, dl, d, + du, dlf, df, duf, du2, ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, + work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to gtsvx. +// +template< typename Value, typename Enable = void > +struct gtsvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct gtsvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char fact, const VectorDL& dl, + const VectorD& d, const VectorDU& du, VectorDLF& dlf, + VectorDF& df, VectorDUF& duf, VectorDU2& du2, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, real_type& rcond, VectorFERR& ferr, + VectorBERR& berr, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorD, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDLF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDUF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDU2 >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDLF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDUF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDU2 >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column_op(d, + trans()) ); + BOOST_ASSERT( bindings::size(dl) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(du) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column_op(d, trans()) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column_op(d, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(d, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(d, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(d, trans())) ); + BOOST_ASSERT( fact == 'F' || fact == 'N' ); + return detail::gtsvx( fact, trans(), bindings::size_column_op(d, + trans()), bindings::size_column(b), bindings::begin_value(dl), + bindings::begin_value(d), bindings::begin_value(du), + bindings::begin_value(dlf), bindings::begin_value(df), + bindings::begin_value(duf), bindings::begin_value(du2), + bindings::begin_value(ipiv), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), rcond, bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const VectorDL& dl, + const VectorD& d, const VectorDU& du, VectorDLF& dlf, + VectorDF& df, VectorDUF& duf, VectorDU2& du2, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, real_type& rcond, VectorFERR& ferr, + VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorD, order >::type trans; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column_op(d, trans()) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column_op(d, trans()) ) ); + return invoke( fact, dl, d, du, dlf, df, duf, du2, ipiv, b, x, rcond, + ferr, berr, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const VectorDL& dl, + const VectorD& d, const VectorDU& du, VectorDLF& dlf, + VectorDF& df, VectorDUF& duf, VectorDU2& du2, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, real_type& rcond, VectorFERR& ferr, + VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorD, order >::type trans; + return invoke( fact, dl, d, du, dlf, df, duf, du2, ipiv, b, x, rcond, + ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct gtsvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char fact, const VectorDL& dl, + const VectorD& d, const VectorDU& du, VectorDLF& dlf, + VectorDF& df, VectorDUF& duf, VectorDU2& du2, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, real_type& rcond, VectorFERR& ferr, + VectorBERR& berr, detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorD, order >::type trans; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorD >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDU >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDLF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDUF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDU2 >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorDL >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDLF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDUF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDU2 >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size_column_op(d, + trans()) ); + BOOST_ASSERT( bindings::size(dl) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(du) >= bindings::size_column_op(d, + trans())-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column_op(d, trans()) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column_op(d, trans()) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_column_op(d, trans()) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(d, trans())) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column_op(d, trans())) ); + BOOST_ASSERT( fact == 'F' || fact == 'N' ); + return detail::gtsvx( fact, trans(), bindings::size_column_op(d, + trans()), bindings::size_column(b), bindings::begin_value(dl), + bindings::begin_value(d), bindings::begin_value(du), + bindings::begin_value(dlf), bindings::begin_value(df), + bindings::begin_value(duf), bindings::begin_value(du2), + bindings::begin_value(ipiv), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), rcond, bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const VectorDL& dl, + const VectorD& d, const VectorDU& du, VectorDLF& dlf, + VectorDF& df, VectorDUF& duf, VectorDU2& du2, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, real_type& rcond, VectorFERR& ferr, + VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorD, order >::type trans; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column_op(d, trans()) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column_op(d, trans()) ) ); + return invoke( fact, dl, d, du, dlf, df, duf, du2, ipiv, b, x, rcond, + ferr, berr, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const VectorDL& dl, + const VectorD& d, const VectorDU& du, VectorDLF& dlf, + VectorDF& df, VectorDUF& duf, VectorDU2& du2, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, real_type& rcond, VectorFERR& ferr, + VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef tag::column_major order; + typedef typename result_of::trans_tag< VectorD, order >::type trans; + return invoke( fact, dl, d, du, dlf, df, duf, du2, ipiv, b, x, rcond, + ferr, berr, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the gtsvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for gtsvx. Its overload differs for +// * User-defined workspace +// +template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +gtsvx( const char fact, const VectorDL& dl, const VectorD& d, + const VectorDU& du, VectorDLF& dlf, VectorDF& df, VectorDUF& duf, + VectorDU2& du2, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + typename remove_imaginary< typename bindings::value_type< + VectorDL >::type >::type& rcond, VectorFERR& ferr, VectorBERR& berr, + Workspace work ) { + return gtsvx_impl< typename bindings::value_type< + VectorDL >::type >::invoke( fact, dl, d, du, dlf, df, duf, du2, + ipiv, b, x, rcond, ferr, berr, work ); +} + +// +// Overloaded function for gtsvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorDL, typename VectorD, typename VectorDU, + typename VectorDLF, typename VectorDF, typename VectorDUF, + typename VectorDU2, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename VectorFERR, typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +gtsvx( const char fact, const VectorDL& dl, const VectorD& d, + const VectorDU& du, VectorDLF& dlf, VectorDF& df, VectorDUF& duf, + VectorDU2& du2, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + typename remove_imaginary< typename bindings::value_type< + VectorDL >::type >::type& rcond, VectorFERR& ferr, VectorBERR& berr ) { + return gtsvx_impl< typename bindings::value_type< + VectorDL >::type >::invoke( fact, dl, d, du, dlf, df, duf, du2, + ipiv, b, x, rcond, ferr, berr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hbev.hpp b/sdk/boost/numeric/bindings/lapack/driver/hbev.hpp new file mode 100644 index 0000000..1236309 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hbev.hpp @@ -0,0 +1,358 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HBEV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HBEV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hbev is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbev( const char jobz, const UpLo, const fortran_int_t n, + const fortran_int_t kd, float* ab, const fortran_int_t ldab, float* w, + float* z, const fortran_int_t ldz, float* work ) { + fortran_int_t info(0); + LAPACK_SSBEV( &jobz, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, w, + z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbev( const char jobz, const UpLo, const fortran_int_t n, + const fortran_int_t kd, double* ab, const fortran_int_t ldab, + double* w, double* z, const fortran_int_t ldz, double* work ) { + fortran_int_t info(0); + LAPACK_DSBEV( &jobz, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, w, + z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbev( const char jobz, const UpLo, const fortran_int_t n, + const fortran_int_t kd, std::complex* ab, + const fortran_int_t ldab, float* w, std::complex* z, + const fortran_int_t ldz, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CHBEV( &jobz, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, w, + z, &ldz, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbev( const char jobz, const UpLo, const fortran_int_t n, + const fortran_int_t kd, std::complex* ab, + const fortran_int_t ldab, double* w, std::complex* z, + const fortran_int_t ldz, std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZHBEV( &jobz, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, w, + z, &ldz, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hbev. +// +template< typename Value, typename Enable = void > +struct hbev_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hbev_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorW, typename MatrixZ, + typename WORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hbev( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + return invoke( jobz, ab, w, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( jobz, ab, w, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,3*n-2); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hbev_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorW, typename MatrixZ, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hbev( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ab) ) ); + return invoke( jobz, ab, w, z, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( jobz, ab, w, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,3*n-2); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hbev_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hbev. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename VectorW, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hbev( const char jobz, MatrixAB& ab, VectorW& w, MatrixZ& z, + Workspace work ) { + return hbev_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, w, z, work ); +} + +// +// Overloaded function for hbev. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename VectorW, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +hbev( const char jobz, MatrixAB& ab, VectorW& w, MatrixZ& z ) { + return hbev_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, w, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hbevd.hpp b/sdk/boost/numeric/bindings/lapack/driver/hbevd.hpp new file mode 100644 index 0000000..1e14914 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hbevd.hpp @@ -0,0 +1,459 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HBEVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HBEVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hbevd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbevd( const char jobz, const UpLo, + const fortran_int_t n, const fortran_int_t kd, float* ab, + const fortran_int_t ldab, float* w, float* z, const fortran_int_t ldz, + float* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSBEVD( &jobz, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, + w, z, &ldz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbevd( const char jobz, const UpLo, + const fortran_int_t n, const fortran_int_t kd, double* ab, + const fortran_int_t ldab, double* w, double* z, + const fortran_int_t ldz, double* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSBEVD( &jobz, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, + w, z, &ldz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbevd( const char jobz, const UpLo, + const fortran_int_t n, const fortran_int_t kd, + std::complex* ab, const fortran_int_t ldab, float* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, const fortran_int_t lwork, float* rwork, + const fortran_int_t lrwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_CHBEVD( &jobz, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, + w, z, &ldz, work, &lwork, rwork, &lrwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbevd( const char jobz, const UpLo, + const fortran_int_t n, const fortran_int_t kd, + std::complex* ab, const fortran_int_t ldab, double* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, const fortran_int_t lwork, double* rwork, + const fortran_int_t lrwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_ZHBEVD( &jobz, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, + w, z, &ldz, work, &lwork, rwork, &lrwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hbevd. +// +template< typename Value, typename Enable = void > +struct hbevd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hbevd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorW, typename MatrixZ, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hbevd( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( jobz, + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(ab) ) ); + return invoke( jobz, ab, w, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::hbevd( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, ab, w, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return 2*n; + else + return 1 + 5*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hbevd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorW, typename MatrixZ, + typename WORK, typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, detail::workspace3< WORK, RWORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hbevd( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( jobz, + bindings::size_column(ab) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( jobz, + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(ab) ) ); + return invoke( jobz, ab, w, z, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + value_type opt_size_work; + real_type opt_size_rwork; + fortran_int_t opt_size_iwork; + detail::hbevd( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, &opt_size_rwork, -1, &opt_size_iwork, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< real_type > tmp_rwork( + traits::detail::to_int( opt_size_rwork ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, ab, w, z, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return n; + else + return 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return n; + else + return 1 + 5*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hbevd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hbevd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename VectorW, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hbevd( const char jobz, MatrixAB& ab, VectorW& w, MatrixZ& z, + Workspace work ) { + return hbevd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, w, z, work ); +} + +// +// Overloaded function for hbevd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename VectorW, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +hbevd( const char jobz, MatrixAB& ab, VectorW& w, MatrixZ& z ) { + return hbevd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, w, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hbevx.hpp b/sdk/boost/numeric/bindings/lapack/driver/hbevx.hpp new file mode 100644 index 0000000..c1db14b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hbevx.hpp @@ -0,0 +1,484 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HBEVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HBEVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hbevx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, const fortran_int_t kd, float* ab, + const fortran_int_t ldab, float* q, const fortran_int_t ldq, + const float vl, const float vu, const fortran_int_t il, + const fortran_int_t iu, const float abstol, fortran_int_t& m, + float* w, float* z, const fortran_int_t ldz, float* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSBEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, &kd, ab, + &ldab, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, + iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, const fortran_int_t kd, double* ab, + const fortran_int_t ldab, double* q, const fortran_int_t ldq, + const double vl, const double vu, const fortran_int_t il, + const fortran_int_t iu, const double abstol, fortran_int_t& m, + double* w, double* z, const fortran_int_t ldz, double* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSBEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, &kd, ab, + &ldab, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, + iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, const fortran_int_t kd, + std::complex* ab, const fortran_int_t ldab, + std::complex* q, const fortran_int_t ldq, const float vl, + const float vu, const fortran_int_t il, const fortran_int_t iu, + const float abstol, fortran_int_t& m, float* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, float* rwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_CHBEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, &kd, ab, + &ldab, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, + rwork, iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, const fortran_int_t kd, + std::complex* ab, const fortran_int_t ldab, + std::complex* q, const fortran_int_t ldq, const double vl, + const double vu, const fortran_int_t il, const fortran_int_t iu, + const double abstol, fortran_int_t& m, double* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, double* rwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_ZHBEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, &kd, ab, + &ldab, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, + rwork, iwork, ifail, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hbevx. +// +template< typename Value, typename Enable = void > +struct hbevx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hbevx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixQ, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixQ& q, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(ab) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(q) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::hbevx( jobz, range, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(q), + bindings::stride_major(q), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixQ, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixQ& q, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ab) ) ); + return invoke( jobz, range, ab, q, vl, vu, il, iu, abstol, m, w, z, + ifail, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixQ, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixQ& q, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( jobz, range, ab, q, vl, vu, il, iu, abstol, m, w, z, + ifail, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 7*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hbevx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixQ, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename WORK, + typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixQ& q, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace3< WORK, RWORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(ab) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(q) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::hbevx( jobz, range, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(q), + bindings::stride_major(q), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixQ, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixQ& q, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ab) ) ); + return invoke( jobz, range, ab, q, vl, vu, il, iu, abstol, m, w, z, + ifail, workspace( tmp_work, tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixQ, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixQ& q, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( jobz, range, ab, q, vl, vu, il, iu, abstol, m, w, z, + ifail, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 7*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hbevx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hbevx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixQ, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hbevx( const char jobz, const char range, MatrixAB& ab, MatrixQ& q, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, Workspace work ) { + return hbevx_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, range, ab, q, vl, vu, il, iu, + abstol, m, w, z, ifail, work ); +} + +// +// Overloaded function for hbevx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixQ, typename VectorW, + typename MatrixZ, typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +hbevx( const char jobz, const char range, MatrixAB& ab, MatrixQ& q, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail ) { + return hbevx_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, range, ab, q, vl, vu, il, iu, + abstol, m, w, z, ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hbgv.hpp b/sdk/boost/numeric/bindings/lapack/driver/hbgv.hpp new file mode 100644 index 0000000..f966778 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hbgv.hpp @@ -0,0 +1,397 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HBGV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HBGV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hbgv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgv( const char jobz, const UpLo, const fortran_int_t n, + const fortran_int_t ka, const fortran_int_t kb, float* ab, + const fortran_int_t ldab, float* bb, const fortran_int_t ldbb, + float* w, float* z, const fortran_int_t ldz, float* work ) { + fortran_int_t info(0); + LAPACK_SSBGV( &jobz, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, w, z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgv( const char jobz, const UpLo, const fortran_int_t n, + const fortran_int_t ka, const fortran_int_t kb, double* ab, + const fortran_int_t ldab, double* bb, const fortran_int_t ldbb, + double* w, double* z, const fortran_int_t ldz, double* work ) { + fortran_int_t info(0); + LAPACK_DSBGV( &jobz, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, w, z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgv( const char jobz, const UpLo, const fortran_int_t n, + const fortran_int_t ka, const fortran_int_t kb, + std::complex* ab, const fortran_int_t ldab, + std::complex* bb, const fortran_int_t ldbb, float* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CHBGV( &jobz, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, w, z, &ldz, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgv( const char jobz, const UpLo, const fortran_int_t n, + const fortran_int_t ka, const fortran_int_t kb, + std::complex* ab, const fortran_int_t ldab, + std::complex* bb, const fortran_int_t ldbb, double* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZHBGV( &jobz, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, w, z, &ldz, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hbgv. +// +template< typename Value, typename Enable = void > +struct hbgv_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hbgv_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ, typename WORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::bandwidth(bb, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(bb) == 1 || + bindings::stride_minor(bb) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(bb) >= bindings::bandwidth(bb, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hbgv( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + return invoke( jobz, ab, bb, w, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( jobz, ab, bb, w, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hbgv_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::bandwidth(bb, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(bb) == 1 || + bindings::stride_minor(bb) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(bb) >= bindings::bandwidth(bb, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hbgv( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ab) ) ); + return invoke( jobz, ab, bb, w, z, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( jobz, ab, bb, w, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 3*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hbgv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hbgv. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hbgv( const char jobz, MatrixAB& ab, MatrixBB& bb, VectorW& w, + MatrixZ& z, Workspace work ) { + return hbgv_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, bb, w, z, work ); +} + +// +// Overloaded function for hbgv. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +hbgv( const char jobz, MatrixAB& ab, MatrixBB& bb, VectorW& w, + MatrixZ& z ) { + return hbgv_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, bb, w, z, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hbgvd.hpp b/sdk/boost/numeric/bindings/lapack/driver/hbgvd.hpp new file mode 100644 index 0000000..8332f56 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hbgvd.hpp @@ -0,0 +1,505 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HBGVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HBGVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hbgvd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgvd( const char jobz, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + float* ab, const fortran_int_t ldab, float* bb, + const fortran_int_t ldbb, float* w, float* z, const fortran_int_t ldz, + float* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSBGVD( &jobz, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, w, z, &ldz, work, &lwork, iwork, &liwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgvd( const char jobz, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + double* ab, const fortran_int_t ldab, double* bb, + const fortran_int_t ldbb, double* w, double* z, + const fortran_int_t ldz, double* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSBGVD( &jobz, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, w, z, &ldz, work, &lwork, iwork, &liwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgvd( const char jobz, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + std::complex* ab, const fortran_int_t ldab, + std::complex* bb, const fortran_int_t ldbb, float* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, const fortran_int_t lwork, float* rwork, + const fortran_int_t lrwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_CHBGVD( &jobz, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, w, z, &ldz, work, &lwork, rwork, &lrwork, iwork, + &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgvd( const char jobz, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + std::complex* ab, const fortran_int_t ldab, + std::complex* bb, const fortran_int_t ldbb, double* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, const fortran_int_t lwork, double* rwork, + const fortran_int_t lrwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_ZHBGVD( &jobz, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, w, z, &ldz, work, &lwork, rwork, &lrwork, iwork, + &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hbgvd. +// +template< typename Value, typename Enable = void > +struct hbgvd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hbgvd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::bandwidth(bb, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(bb) == 1 || + bindings::stride_minor(bb) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(bb) >= bindings::bandwidth(bb, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hbgvd( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( jobz, + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(ab) ) ); + return invoke( jobz, ab, bb, w, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::hbgvd( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, ab, bb, w, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return 3*n; + else + return 1 + 5*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hbgvd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ, typename WORK, typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, detail::workspace3< WORK, RWORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::bandwidth(bb, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(bb) == 1 || + bindings::stride_minor(bb) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(bb) >= bindings::bandwidth(bb, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hbgvd( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( jobz, + bindings::size_column(ab) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( jobz, + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(ab) ) ); + return invoke( jobz, ab, bb, w, z, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + value_type opt_size_work; + real_type opt_size_rwork; + fortran_int_t opt_size_iwork; + detail::hbgvd( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, &opt_size_rwork, -1, &opt_size_iwork, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< real_type > tmp_rwork( + traits::detail::to_int( opt_size_rwork ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, ab, bb, w, z, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return n; + else + return 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return n; + else + return 1 + 5*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hbgvd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hbgvd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hbgvd( const char jobz, MatrixAB& ab, MatrixBB& bb, VectorW& w, + MatrixZ& z, Workspace work ) { + return hbgvd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, bb, w, z, work ); +} + +// +// Overloaded function for hbgvd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +hbgvd( const char jobz, MatrixAB& ab, MatrixBB& bb, VectorW& w, + MatrixZ& z ) { + return hbgvd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, bb, w, z, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hbgvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/hbgvx.hpp new file mode 100644 index 0000000..d8a3f78 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hbgvx.hpp @@ -0,0 +1,514 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HBGVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HBGVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hbgvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgvx( const char jobz, const char range, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + float* ab, const fortran_int_t ldab, float* bb, + const fortran_int_t ldbb, float* q, const fortran_int_t ldq, + const float vl, const float vu, const fortran_int_t il, + const fortran_int_t iu, const float abstol, fortran_int_t& m, + float* w, float* z, const fortran_int_t ldz, float* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSBGVX( &jobz, &range, &lapack_option< UpLo >::value, &n, &ka, &kb, + ab, &ldab, bb, &ldbb, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, + z, &ldz, work, iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgvx( const char jobz, const char range, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + double* ab, const fortran_int_t ldab, double* bb, + const fortran_int_t ldbb, double* q, const fortran_int_t ldq, + const double vl, const double vu, const fortran_int_t il, + const fortran_int_t iu, const double abstol, fortran_int_t& m, + double* w, double* z, const fortran_int_t ldz, double* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSBGVX( &jobz, &range, &lapack_option< UpLo >::value, &n, &ka, &kb, + ab, &ldab, bb, &ldbb, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, + z, &ldz, work, iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgvx( const char jobz, const char range, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + std::complex* ab, const fortran_int_t ldab, + std::complex* bb, const fortran_int_t ldbb, + std::complex* q, const fortran_int_t ldq, const float vl, + const float vu, const fortran_int_t il, const fortran_int_t iu, + const float abstol, fortran_int_t& m, float* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, float* rwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_CHBGVX( &jobz, &range, &lapack_option< UpLo >::value, &n, &ka, &kb, + ab, &ldab, bb, &ldbb, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, + z, &ldz, work, rwork, iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hbgvx( const char jobz, const char range, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + std::complex* ab, const fortran_int_t ldab, + std::complex* bb, const fortran_int_t ldbb, + std::complex* q, const fortran_int_t ldq, const double vl, + const double vu, const fortran_int_t il, const fortran_int_t iu, + const double abstol, fortran_int_t& m, double* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, double* rwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_ZHBGVX( &jobz, &range, &lapack_option< UpLo >::value, &n, &ka, &kb, + ab, &ldab, bb, &ldbb, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, + z, &ldz, work, rwork, iwork, ifail, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hbgvx. +// +template< typename Value, typename Enable = void > +struct hbgvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hbgvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixBB, typename MatrixQ, + typename VectorW, typename MatrixZ, typename VectorIFAIL, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixBB& bb, MatrixQ& q, const real_type vl, + const real_type vu, const fortran_int_t il, + const fortran_int_t iu, const real_type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::bandwidth(bb, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(bb) == 1 || + bindings::stride_minor(bb) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(bb) >= bindings::bandwidth(bb, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::hbgvx( jobz, range, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(q), + bindings::stride_major(q), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixBB, typename MatrixQ, + typename VectorW, typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixBB& bb, MatrixQ& q, const real_type vl, + const real_type vu, const fortran_int_t il, + const fortran_int_t iu, const real_type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ab) ) ); + return invoke( jobz, range, ab, bb, q, vl, vu, il, iu, abstol, m, w, + z, ifail, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixBB, typename MatrixQ, + typename VectorW, typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixBB& bb, MatrixQ& q, const real_type vl, + const real_type vu, const fortran_int_t il, + const fortran_int_t iu, const real_type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( jobz, range, ab, bb, q, vl, vu, il, iu, abstol, m, w, + z, ifail, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 7*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hbgvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixBB, typename MatrixQ, + typename VectorW, typename MatrixZ, typename VectorIFAIL, + typename WORK, typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixBB& bb, MatrixQ& q, const real_type vl, + const real_type vu, const fortran_int_t il, + const fortran_int_t iu, const real_type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + detail::workspace3< WORK, RWORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::bandwidth(bb, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(bb) == 1 || + bindings::stride_minor(bb) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(bb) >= bindings::bandwidth(bb, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::hbgvx( jobz, range, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(q), + bindings::stride_major(q), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixBB, typename MatrixQ, + typename VectorW, typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixBB& bb, MatrixQ& q, const real_type vl, + const real_type vu, const fortran_int_t il, + const fortran_int_t iu, const real_type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ab) ) ); + return invoke( jobz, range, ab, bb, q, vl, vu, il, iu, abstol, m, w, + z, ifail, workspace( tmp_work, tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixBB, typename MatrixQ, + typename VectorW, typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixBB& bb, MatrixQ& q, const real_type vl, + const real_type vu, const fortran_int_t il, + const fortran_int_t iu, const real_type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( jobz, range, ab, bb, q, vl, vu, il, iu, abstol, m, w, + z, ifail, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 7*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hbgvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hbgvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixBB, typename MatrixQ, + typename VectorW, typename MatrixZ, typename VectorIFAIL, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hbgvx( const char jobz, const char range, MatrixAB& ab, MatrixBB& bb, + MatrixQ& q, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + Workspace work ) { + return hbgvx_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, range, ab, bb, q, vl, vu, il, + iu, abstol, m, w, z, ifail, work ); +} + +// +// Overloaded function for hbgvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixBB, typename MatrixQ, + typename VectorW, typename MatrixZ, typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +hbgvx( const char jobz, const char range, MatrixAB& ab, MatrixBB& bb, + MatrixQ& q, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail ) { + return hbgvx_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, range, ab, bb, q, vl, vu, il, + iu, abstol, m, w, z, ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/heev.hpp b/sdk/boost/numeric/bindings/lapack/driver/heev.hpp new file mode 100644 index 0000000..93fbf87 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/heev.hpp @@ -0,0 +1,351 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEEV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEEV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for heev is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heev( const char jobz, const UpLo, const fortran_int_t n, + float* a, const fortran_int_t lda, float* w, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SSYEV( &jobz, &lapack_option< UpLo >::value, &n, a, &lda, w, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heev( const char jobz, const UpLo, const fortran_int_t n, + double* a, const fortran_int_t lda, double* w, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DSYEV( &jobz, &lapack_option< UpLo >::value, &n, a, &lda, w, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heev( const char jobz, const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, float* w, + std::complex* work, const fortran_int_t lwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CHEEV( &jobz, &lapack_option< UpLo >::value, &n, a, &lda, w, work, + &lwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heev( const char jobz, const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, double* w, + std::complex* work, const fortran_int_t lwork, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZHEEV( &jobz, &lapack_option< UpLo >::value, &n, a, &lda, w, work, + &lwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to heev. +// +template< typename Value, typename Enable = void > +struct heev_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct heev_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename WORK > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::heev( jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( jobz, a, w, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + detail::heev( jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobz, a, w, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,3*n-1); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct heev_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename WORK, + typename RWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::heev( jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( jobz, a, w, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + detail::heev( jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), &opt_size_work, -1, + bindings::begin_value(tmp_rwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobz, a, w, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,2*n-1); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,3*n-2); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the heev_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for heev. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorW, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +heev( const char jobz, MatrixA& a, VectorW& w, Workspace work ) { + return heev_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, a, w, work ); +} + +// +// Overloaded function for heev. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorW > +inline typename boost::disable_if< detail::is_workspace< VectorW >, + std::ptrdiff_t >::type +heev( const char jobz, MatrixA& a, VectorW& w ) { + return heev_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, a, w, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/heevd.hpp b/sdk/boost/numeric/bindings/lapack/driver/heevd.hpp new file mode 100644 index 0000000..18a104e --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/heevd.hpp @@ -0,0 +1,428 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEEVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEEVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for heevd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heevd( const char jobz, const UpLo, + const fortran_int_t n, float* a, const fortran_int_t lda, float* w, + float* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSYEVD( &jobz, &lapack_option< UpLo >::value, &n, a, &lda, w, work, + &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heevd( const char jobz, const UpLo, + const fortran_int_t n, double* a, const fortran_int_t lda, double* w, + double* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSYEVD( &jobz, &lapack_option< UpLo >::value, &n, a, &lda, w, work, + &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heevd( const char jobz, const UpLo, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, float* w, std::complex* work, + const fortran_int_t lwork, float* rwork, const fortran_int_t lrwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_CHEEVD( &jobz, &lapack_option< UpLo >::value, &n, a, &lda, w, work, + &lwork, rwork, &lrwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heevd( const char jobz, const UpLo, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, double* w, std::complex* work, + const fortran_int_t lwork, double* rwork, const fortran_int_t lrwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_ZHEEVD( &jobz, &lapack_option< UpLo >::value, &n, a, &lda, w, work, + &lwork, rwork, &lrwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to heevd. +// +template< typename Value, typename Enable = void > +struct heevd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct heevd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::heevd( jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( jobz, + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(a) ) ); + return invoke( jobz, a, w, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::heevd( jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), &opt_size_work, -1, &opt_size_iwork, + -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, a, w, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return 2*n + 1; + else + return 1 + 6*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct heevd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename WORK, + typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + detail::workspace3< WORK, RWORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::heevd( jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( jobz, + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( jobz, + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(a) ) ); + return invoke( jobz, a, w, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + real_type opt_size_rwork; + fortran_int_t opt_size_iwork; + detail::heevd( jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), &opt_size_work, -1, &opt_size_rwork, + -1, &opt_size_iwork, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< real_type > tmp_rwork( + traits::detail::to_int( opt_size_rwork ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, a, w, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return n+1; + else + return 2*n + n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return n; + else + return 1 + 5*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the heevd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for heevd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorW, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +heevd( const char jobz, MatrixA& a, VectorW& w, Workspace work ) { + return heevd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, a, w, work ); +} + +// +// Overloaded function for heevd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorW > +inline typename boost::disable_if< detail::is_workspace< VectorW >, + std::ptrdiff_t >::type +heevd( const char jobz, MatrixA& a, VectorW& w ) { + return heevd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, a, w, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/heevr.hpp b/sdk/boost/numeric/bindings/lapack/driver/heevr.hpp new file mode 100644 index 0000000..f10c449 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/heevr.hpp @@ -0,0 +1,489 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEEVR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEEVR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for heevr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heevr( const char jobz, const char range, const UpLo, + const fortran_int_t n, float* a, const fortran_int_t lda, + const float vl, const float vu, const fortran_int_t il, + const fortran_int_t iu, const float abstol, fortran_int_t& m, + float* w, float* z, const fortran_int_t ldz, fortran_int_t* isuppz, + float* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSYEVR( &jobz, &range, &lapack_option< UpLo >::value, &n, a, &lda, + &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, isuppz, work, &lwork, + iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heevr( const char jobz, const char range, const UpLo, + const fortran_int_t n, double* a, const fortran_int_t lda, + const double vl, const double vu, const fortran_int_t il, + const fortran_int_t iu, const double abstol, fortran_int_t& m, + double* w, double* z, const fortran_int_t ldz, fortran_int_t* isuppz, + double* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSYEVR( &jobz, &range, &lapack_option< UpLo >::value, &n, a, &lda, + &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, isuppz, work, &lwork, + iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heevr( const char jobz, const char range, const UpLo, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, const float vl, const float vu, + const fortran_int_t il, const fortran_int_t iu, const float abstol, + fortran_int_t& m, float* w, std::complex* z, + const fortran_int_t ldz, fortran_int_t* isuppz, + std::complex* work, const fortran_int_t lwork, float* rwork, + const fortran_int_t lrwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_CHEEVR( &jobz, &range, &lapack_option< UpLo >::value, &n, a, &lda, + &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, isuppz, work, &lwork, + rwork, &lrwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heevr( const char jobz, const char range, const UpLo, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, const double vl, const double vu, + const fortran_int_t il, const fortran_int_t iu, const double abstol, + fortran_int_t& m, double* w, std::complex* z, + const fortran_int_t ldz, fortran_int_t* isuppz, + std::complex* work, const fortran_int_t lwork, double* rwork, + const fortran_int_t lrwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_ZHEEVR( &jobz, &range, &lapack_option< UpLo >::value, &n, a, &lda, + &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, isuppz, work, &lwork, + rwork, &lrwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to heevr. +// +template< typename Value, typename Enable = void > +struct heevr_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct heevr_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorISUPPZ, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorISUPPZ >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::heevr( jobz, range, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), vl, vu, + il, iu, abstol, m, bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(isuppz), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( jobz, range, a, vl, vu, il, iu, abstol, m, w, z, + isuppz, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::heevr( jobz, range, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), vl, vu, + il, iu, abstol, m, bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(isuppz), &opt_size_work, -1, + &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, range, a, vl, vu, il, iu, abstol, m, w, z, + isuppz, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 26*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 10*n ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct heevr_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorISUPPZ, typename WORK, typename RWORK, + typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, detail::workspace3< WORK, RWORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorISUPPZ >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::heevr( jobz, range, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), vl, vu, + il, iu, abstol, m, bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(isuppz), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( jobz, range, a, vl, vu, il, iu, abstol, m, w, z, + isuppz, workspace( tmp_work, tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + real_type opt_size_rwork; + fortran_int_t opt_size_iwork; + detail::heevr( jobz, range, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), vl, vu, + il, iu, abstol, m, bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(isuppz), &opt_size_work, -1, + &opt_size_rwork, -1, &opt_size_iwork, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< real_type > tmp_rwork( + traits::detail::to_int( opt_size_rwork ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, range, a, vl, vu, il, iu, abstol, m, w, z, + isuppz, workspace( tmp_work, tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 2*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 24*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 10*n ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the heevr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for heevr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorISUPPZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +heevr( const char jobz, const char range, MatrixA& a, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, Workspace work ) { + return heevr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, range, a, vl, vu, il, iu, abstol, + m, w, z, isuppz, work ); +} + +// +// Overloaded function for heevr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorISUPPZ > +inline typename boost::disable_if< detail::is_workspace< VectorISUPPZ >, + std::ptrdiff_t >::type +heevr( const char jobz, const char range, MatrixA& a, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz ) { + return heevr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, range, a, vl, vu, il, iu, abstol, + m, w, z, isuppz, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/heevx.hpp b/sdk/boost/numeric/bindings/lapack/driver/heevx.hpp new file mode 100644 index 0000000..e0efc62 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/heevx.hpp @@ -0,0 +1,485 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEEVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEEVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for heevx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, float* a, const fortran_int_t lda, + const float vl, const float vu, const fortran_int_t il, + const fortran_int_t iu, const float abstol, fortran_int_t& m, + float* w, float* z, const fortran_int_t ldz, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSYEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, a, &lda, + &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, &lwork, iwork, + ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, double* a, const fortran_int_t lda, + const double vl, const double vu, const fortran_int_t il, + const fortran_int_t iu, const double abstol, fortran_int_t& m, + double* w, double* z, const fortran_int_t ldz, double* work, + const fortran_int_t lwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSYEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, a, &lda, + &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, &lwork, iwork, + ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, const float vl, const float vu, + const fortran_int_t il, const fortran_int_t iu, const float abstol, + fortran_int_t& m, float* w, std::complex* z, + const fortran_int_t ldz, std::complex* work, + const fortran_int_t lwork, float* rwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_CHEEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, a, &lda, + &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, &lwork, rwork, + iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t heevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, std::complex* a, + const fortran_int_t lda, const double vl, const double vu, + const fortran_int_t il, const fortran_int_t iu, const double abstol, + fortran_int_t& m, double* w, std::complex* z, + const fortran_int_t ldz, std::complex* work, + const fortran_int_t lwork, double* rwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_ZHEEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, a, &lda, + &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, &lwork, rwork, + iwork, ifail, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to heevx. +// +template< typename Value, typename Enable = void > +struct heevx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct heevx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorIFAIL, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::heevx( jobz, range, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), vl, vu, + il, iu, abstol, m, bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( jobz, range, a, vl, vu, il, iu, abstol, m, w, z, ifail, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + detail::heevx( jobz, range, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), vl, vu, + il, iu, abstol, m, bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, bindings::begin_value(tmp_iwork), + bindings::begin_value(ifail) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobz, range, a, vl, vu, il, iu, abstol, m, w, z, ifail, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else + return 8*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct heevx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorIFAIL, typename WORK, typename RWORK, + typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace3< WORK, RWORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::heevx( jobz, range, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), vl, vu, + il, iu, abstol, m, bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( jobz, range, a, vl, vu, il, iu, abstol, m, w, z, ifail, + workspace( tmp_work, tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + detail::heevx( jobz, range, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), vl, vu, + il, iu, abstol, m, bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, bindings::begin_value(tmp_rwork), + bindings::begin_value(tmp_iwork), + bindings::begin_value(ifail) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobz, range, a, vl, vu, il, iu, abstol, m, w, z, ifail, + workspace( tmp_work, tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 2*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 7*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the heevx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for heevx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorIFAIL, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +heevx( const char jobz, const char range, MatrixA& a, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, Workspace work ) { + return heevx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, range, a, vl, vu, il, iu, abstol, + m, w, z, ifail, work ); +} + +// +// Overloaded function for heevx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +heevx( const char jobz, const char range, MatrixA& a, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail ) { + return heevx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, range, a, vl, vu, il, iu, abstol, + m, w, z, ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hegv.hpp b/sdk/boost/numeric/bindings/lapack/driver/hegv.hpp new file mode 100644 index 0000000..572c556 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hegv.hpp @@ -0,0 +1,393 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEGV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEGV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hegv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegv( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, float* a, const fortran_int_t lda, + float* b, const fortran_int_t ldb, float* w, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SSYGV( &itype, &jobz, &lapack_option< UpLo >::value, &n, a, &lda, + b, &ldb, w, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegv( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, double* a, const fortran_int_t lda, + double* b, const fortran_int_t ldb, double* w, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DSYGV( &itype, &jobz, &lapack_option< UpLo >::value, &n, a, &lda, + b, &ldb, w, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegv( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, float* w, std::complex* work, + const fortran_int_t lwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CHEGV( &itype, &jobz, &lapack_option< UpLo >::value, &n, a, &lda, + b, &ldb, w, work, &lwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegv( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, double* w, std::complex* work, + const fortran_int_t lwork, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZHEGV( &itype, &jobz, &lapack_option< UpLo >::value, &n, a, &lda, + b, &ldb, w, work, &lwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hegv. +// +template< typename Value, typename Enable = void > +struct hegv_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hegv_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename WORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hegv( itype, jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(w), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorW > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( itype, jobz, a, b, w, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorW > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + detail::hegv( itype, jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(w), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( itype, jobz, a, b, w, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 3*n-1 ); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hegv_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hegv( itype, jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(w), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorW > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( itype, jobz, a, b, w, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorW > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + detail::hegv( itype, jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(w), &opt_size_work, -1, + bindings::begin_value(tmp_rwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( itype, jobz, a, b, w, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 2*n-1 ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 3*n-2 ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hegv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hegv. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorW, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hegv( const fortran_int_t itype, const char jobz, MatrixA& a, + MatrixB& b, VectorW& w, Workspace work ) { + return hegv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, jobz, a, b, w, work ); +} + +// +// Overloaded function for hegv. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorW > +inline typename boost::disable_if< detail::is_workspace< VectorW >, + std::ptrdiff_t >::type +hegv( const fortran_int_t itype, const char jobz, MatrixA& a, + MatrixB& b, VectorW& w ) { + return hegv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, jobz, a, b, w, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hegvd.hpp b/sdk/boost/numeric/bindings/lapack/driver/hegvd.hpp new file mode 100644 index 0000000..d79dcf8 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hegvd.hpp @@ -0,0 +1,468 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEGVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEGVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hegvd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegvd( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, float* a, const fortran_int_t lda, + float* b, const fortran_int_t ldb, float* w, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSYGVD( &itype, &jobz, &lapack_option< UpLo >::value, &n, a, &lda, + b, &ldb, w, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegvd( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, double* a, const fortran_int_t lda, + double* b, const fortran_int_t ldb, double* w, double* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSYGVD( &itype, &jobz, &lapack_option< UpLo >::value, &n, a, &lda, + b, &ldb, w, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegvd( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, float* w, std::complex* work, + const fortran_int_t lwork, float* rwork, const fortran_int_t lrwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_CHEGVD( &itype, &jobz, &lapack_option< UpLo >::value, &n, a, &lda, + b, &ldb, w, work, &lwork, rwork, &lrwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegvd( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb, double* w, std::complex* work, + const fortran_int_t lwork, double* rwork, const fortran_int_t lrwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_ZHEGVD( &itype, &jobz, &lapack_option< UpLo >::value, &n, a, &lda, + b, &ldb, w, work, &lwork, rwork, &lrwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hegvd. +// +template< typename Value, typename Enable = void > +struct hegvd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hegvd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hegvd( itype, jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(w), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorW > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( jobz, + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(a) ) ); + return invoke( itype, jobz, a, b, w, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorW > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::hegvd( itype, jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(w), &opt_size_work, -1, &opt_size_iwork, + -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( itype, jobz, a, b, w, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return 2*n + 1; + else + return 1 + 6*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hegvd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename WORK, typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + detail::workspace3< WORK, RWORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hegvd( itype, jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(w), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorW > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( jobz, + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( jobz, + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(a) ) ); + return invoke( itype, jobz, a, b, w, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorW > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + real_type opt_size_rwork; + fortran_int_t opt_size_iwork; + detail::hegvd( itype, jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(w), &opt_size_work, -1, &opt_size_rwork, + -1, &opt_size_iwork, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< real_type > tmp_rwork( + traits::detail::to_int( opt_size_rwork ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( itype, jobz, a, b, w, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return n+1; + else + return 2*n + n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return n; + else + return 1 + 5*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hegvd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hegvd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorW, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hegvd( const fortran_int_t itype, const char jobz, MatrixA& a, + MatrixB& b, VectorW& w, Workspace work ) { + return hegvd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, jobz, a, b, w, work ); +} + +// +// Overloaded function for hegvd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorW > +inline typename boost::disable_if< detail::is_workspace< VectorW >, + std::ptrdiff_t >::type +hegvd( const fortran_int_t itype, const char jobz, MatrixA& a, + MatrixB& b, VectorW& w ) { + return hegvd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, jobz, a, b, w, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hegvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/hegvx.hpp new file mode 100644 index 0000000..96211d2 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hegvx.hpp @@ -0,0 +1,522 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEGVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HEGVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hegvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegvx( const fortran_int_t itype, const char jobz, + const char range, const UpLo, const fortran_int_t n, float* a, + const fortran_int_t lda, float* b, const fortran_int_t ldb, + const float vl, const float vu, const fortran_int_t il, + const fortran_int_t iu, const float abstol, fortran_int_t& m, + float* w, float* z, const fortran_int_t ldz, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSYGVX( &itype, &jobz, &range, &lapack_option< UpLo >::value, &n, + a, &lda, b, &ldb, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, + work, &lwork, iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegvx( const fortran_int_t itype, const char jobz, + const char range, const UpLo, const fortran_int_t n, double* a, + const fortran_int_t lda, double* b, const fortran_int_t ldb, + const double vl, const double vu, const fortran_int_t il, + const fortran_int_t iu, const double abstol, fortran_int_t& m, + double* w, double* z, const fortran_int_t ldz, double* work, + const fortran_int_t lwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSYGVX( &itype, &jobz, &range, &lapack_option< UpLo >::value, &n, + a, &lda, b, &ldb, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, + work, &lwork, iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegvx( const fortran_int_t itype, const char jobz, + const char range, const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, const float vl, + const float vu, const fortran_int_t il, const fortran_int_t iu, + const float abstol, fortran_int_t& m, float* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, const fortran_int_t lwork, float* rwork, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_CHEGVX( &itype, &jobz, &range, &lapack_option< UpLo >::value, &n, + a, &lda, b, &ldb, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, + work, &lwork, rwork, iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hegvx( const fortran_int_t itype, const char jobz, + const char range, const UpLo, const fortran_int_t n, + std::complex* a, const fortran_int_t lda, + std::complex* b, const fortran_int_t ldb, const double vl, + const double vu, const fortran_int_t il, const fortran_int_t iu, + const double abstol, fortran_int_t& m, double* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, const fortran_int_t lwork, double* rwork, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_ZHEGVX( &itype, &jobz, &range, &lapack_option< UpLo >::value, &n, + a, &lda, b, &ldb, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, + work, &lwork, rwork, iwork, ifail, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hegvx. +// +template< typename Value, typename Enable = void > +struct hegvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hegvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixA& a, MatrixB& b, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::hegvx( itype, jobz, range, uplo(), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixA& a, MatrixB& b, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( itype, jobz, range, a, b, vl, vu, il, iu, abstol, m, w, + z, ifail, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixA& a, MatrixB& b, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + detail::hegvx( itype, jobz, range, uplo(), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), &opt_size_work, -1, + bindings::begin_value(tmp_iwork), + bindings::begin_value(ifail) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( itype, jobz, range, a, b, vl, vu, il, iu, abstol, m, w, + z, ifail, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,8*n); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hegvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename WORK, + typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixA& a, MatrixB& b, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace3< WORK, RWORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::hegvx( itype, jobz, range, uplo(), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixA& a, MatrixB& b, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( itype, jobz, range, a, b, vl, vu, il, iu, abstol, m, w, + z, ifail, workspace( tmp_work, tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixA& a, MatrixB& b, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + detail::hegvx( itype, jobz, range, uplo(), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), &opt_size_work, -1, + bindings::begin_value(tmp_rwork), + bindings::begin_value(tmp_iwork), + bindings::begin_value(ifail) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( itype, jobz, range, a, b, vl, vu, il, iu, abstol, m, w, + z, ifail, workspace( tmp_work, tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,2*n); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 7*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hegvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hegvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hegvx( const fortran_int_t itype, const char jobz, const char range, + MatrixA& a, MatrixB& b, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + Workspace work ) { + return hegvx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, jobz, range, a, b, vl, vu, il, + iu, abstol, m, w, z, ifail, work ); +} + +// +// Overloaded function for hegvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorW, + typename MatrixZ, typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +hegvx( const fortran_int_t itype, const char jobz, const char range, + MatrixA& a, MatrixB& b, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail ) { + return hegvx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, jobz, range, a, b, vl, vu, il, + iu, abstol, m, w, z, ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hesv.hpp b/sdk/boost/numeric/bindings/lapack/driver/hesv.hpp new file mode 100644 index 0000000..24cef91 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hesv.hpp @@ -0,0 +1,362 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HESV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HESV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hesv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hesv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, float* a, const fortran_int_t lda, + fortran_int_t* ipiv, float* b, const fortran_int_t ldb, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SSYSV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hesv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, double* a, const fortran_int_t lda, + fortran_int_t* ipiv, double* b, const fortran_int_t ldb, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DSYSV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hesv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CHESV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hesv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZHESV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hesv. +// +template< typename Value, typename Enable = void > +struct hesv_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hesv_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work()); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::hesv( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work() ); + return invoke( a, ipiv, b, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + detail::hesv( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, ipiv, b, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work() { + return 1; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hesv_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work()); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::hesv( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work() ); + return invoke( a, ipiv, b, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + detail::hesv( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, ipiv, b, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work() { + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hesv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hesv. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hesv( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, Workspace work ) { + return hesv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, b, work ); +} + +// +// Overloaded function for hesv. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorIPIV, typename MatrixB > +inline typename boost::disable_if< detail::is_workspace< MatrixB >, + std::ptrdiff_t >::type +hesv( MatrixA& a, VectorIPIV& ipiv, MatrixB& b ) { + return hesv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, b, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hesvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/hesvx.hpp new file mode 100644 index 0000000..97b5a04 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hesvx.hpp @@ -0,0 +1,516 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HESVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HESVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hesvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hesvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, const float* a, + const fortran_int_t lda, float* af, const fortran_int_t ldaf, + fortran_int_t* ipiv, const float* b, const fortran_int_t ldb, + float* x, const fortran_int_t ldx, float& rcond, float* ferr, + float* berr, float* work, const fortran_int_t lwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SSYSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, + af, &ldaf, ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, + &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hesvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, const double* a, + const fortran_int_t lda, double* af, const fortran_int_t ldaf, + fortran_int_t* ipiv, const double* b, const fortran_int_t ldb, + double* x, const fortran_int_t ldx, double& rcond, double* ferr, + double* berr, double* work, const fortran_int_t lwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DSYSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, + af, &ldaf, ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, + &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hesvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* a, const fortran_int_t lda, + std::complex* af, const fortran_int_t ldaf, + fortran_int_t* ipiv, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, float& rcond, float* ferr, float* berr, + std::complex* work, const fortran_int_t lwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CHESVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, + af, &ldaf, ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, + &lwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hesvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* a, const fortran_int_t lda, + std::complex* af, const fortran_int_t ldaf, + fortran_int_t* ipiv, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, double& rcond, double* ferr, double* berr, + std::complex* work, const fortran_int_t lwork, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZHESVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, + af, &ldaf, ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, + &lwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hesvx. +// +template< typename Value, typename Enable = void > +struct hesvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hesvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char fact, const MatrixA& a, + MatrixAF& af, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( fact == 'F' || fact == 'N' ); + return detail::hesvx( fact, uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixA& a, + MatrixAF& af, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( fact, a, af, ipiv, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixA& a, + MatrixAF& af, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + detail::hesvx( fact, uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + &opt_size_work, -1, bindings::begin_value(tmp_iwork) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( fact, a, af, ipiv, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 3*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hesvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char fact, const MatrixA& a, + MatrixAF& af, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( fact == 'F' || fact == 'N' ); + return detail::hesvx( fact, uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixA& a, + MatrixAF& af, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( fact, a, af, ipiv, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixA& a, + MatrixAF& af, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + detail::hesvx( fact, uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + &opt_size_work, -1, bindings::begin_value(tmp_rwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( fact, a, af, ipiv, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 2*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hesvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hesvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hesvx( const char fact, const MatrixA& a, MatrixAF& af, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond, + VectorFERR& ferr, VectorBERR& berr, Workspace work ) { + return hesvx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( fact, a, af, ipiv, b, x, rcond, ferr, + berr, work ); +} + +// +// Overloaded function for hesvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +hesvx( const char fact, const MatrixA& a, MatrixAF& af, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond, + VectorFERR& ferr, VectorBERR& berr ) { + return hesvx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( fact, a, af, ipiv, b, x, rcond, ferr, + berr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hpev.hpp b/sdk/boost/numeric/bindings/lapack/driver/hpev.hpp new file mode 100644 index 0000000..711cf16 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hpev.hpp @@ -0,0 +1,340 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPEV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPEV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hpev is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpev( const char jobz, const UpLo, const fortran_int_t n, + float* ap, float* w, float* z, const fortran_int_t ldz, float* work ) { + fortran_int_t info(0); + LAPACK_SSPEV( &jobz, &lapack_option< UpLo >::value, &n, ap, w, z, &ldz, + work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpev( const char jobz, const UpLo, const fortran_int_t n, + double* ap, double* w, double* z, const fortran_int_t ldz, + double* work ) { + fortran_int_t info(0); + LAPACK_DSPEV( &jobz, &lapack_option< UpLo >::value, &n, ap, w, z, &ldz, + work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpev( const char jobz, const UpLo, const fortran_int_t n, + std::complex* ap, float* w, std::complex* z, + const fortran_int_t ldz, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CHPEV( &jobz, &lapack_option< UpLo >::value, &n, ap, w, z, &ldz, + work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpev( const char jobz, const UpLo, const fortran_int_t n, + std::complex* ap, double* w, std::complex* z, + const fortran_int_t ldz, std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZHPEV( &jobz, &lapack_option< UpLo >::value, &n, ap, w, z, &ldz, + work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hpev. +// +template< typename Value, typename Enable = void > +struct hpev_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hpev_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename WORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hpev( jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + return invoke( jobz, ap, w, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( jobz, ap, w, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hpev_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hpev( jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ap) ) ); + return invoke( jobz, ap, w, z, workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( jobz, ap, w, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,2*n-1); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,3*n-2); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hpev_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hpev. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hpev( const char jobz, MatrixAP& ap, VectorW& w, MatrixZ& z, + Workspace work ) { + return hpev_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( jobz, ap, w, z, work ); +} + +// +// Overloaded function for hpev. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename VectorW, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +hpev( const char jobz, MatrixAP& ap, VectorW& w, MatrixZ& z ) { + return hpev_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( jobz, ap, w, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hpevd.hpp b/sdk/boost/numeric/bindings/lapack/driver/hpevd.hpp new file mode 100644 index 0000000..f2d2f9d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hpevd.hpp @@ -0,0 +1,438 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPEVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPEVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hpevd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpevd( const char jobz, const UpLo, + const fortran_int_t n, float* ap, float* w, float* z, + const fortran_int_t ldz, float* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSPEVD( &jobz, &lapack_option< UpLo >::value, &n, ap, w, z, &ldz, + work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpevd( const char jobz, const UpLo, + const fortran_int_t n, double* ap, double* w, double* z, + const fortran_int_t ldz, double* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSPEVD( &jobz, &lapack_option< UpLo >::value, &n, ap, w, z, &ldz, + work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpevd( const char jobz, const UpLo, + const fortran_int_t n, std::complex* ap, float* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, const fortran_int_t lwork, float* rwork, + const fortran_int_t lrwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_CHPEVD( &jobz, &lapack_option< UpLo >::value, &n, ap, w, z, &ldz, + work, &lwork, rwork, &lrwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpevd( const char jobz, const UpLo, + const fortran_int_t n, std::complex* ap, double* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, const fortran_int_t lwork, double* rwork, + const fortran_int_t lrwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_ZHPEVD( &jobz, &lapack_option< UpLo >::value, &n, ap, w, z, &ldz, + work, &lwork, rwork, &lrwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hpevd. +// +template< typename Value, typename Enable = void > +struct hpevd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hpevd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hpevd( jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( jobz, + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(ap) ) ); + return invoke( jobz, ap, w, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::hpevd( jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, ap, w, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return 2*n; + else + return 1 + 6*n + n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hpevd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename WORK, typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, detail::workspace3< WORK, RWORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hpevd( jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( jobz, + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( jobz, + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(ap) ) ); + return invoke( jobz, ap, w, z, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + value_type opt_size_work; + real_type opt_size_rwork; + fortran_int_t opt_size_iwork; + detail::hpevd( jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, &opt_size_rwork, -1, &opt_size_iwork, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< real_type > tmp_rwork( + traits::detail::to_int( opt_size_rwork ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, ap, w, z, workspace( tmp_work, tmp_rwork, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return n; + else + return 2*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return n; + else + return 1 + 5*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hpevd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hpevd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hpevd( const char jobz, MatrixAP& ap, VectorW& w, MatrixZ& z, + Workspace work ) { + return hpevd_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( jobz, ap, w, z, work ); +} + +// +// Overloaded function for hpevd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename VectorW, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +hpevd( const char jobz, MatrixAP& ap, VectorW& w, MatrixZ& z ) { + return hpevd_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( jobz, ap, w, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hpevx.hpp b/sdk/boost/numeric/bindings/lapack/driver/hpevx.hpp new file mode 100644 index 0000000..ae1cfdf --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hpevx.hpp @@ -0,0 +1,436 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPEVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPEVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hpevx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, float* ap, const float vl, const float vu, + const fortran_int_t il, const fortran_int_t iu, const float abstol, + fortran_int_t& m, float* w, float* z, const fortran_int_t ldz, + float* work, fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSPEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, ap, &vl, + &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, iwork, ifail, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, double* ap, const double vl, const double vu, + const fortran_int_t il, const fortran_int_t iu, const double abstol, + fortran_int_t& m, double* w, double* z, const fortran_int_t ldz, + double* work, fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSPEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, ap, &vl, + &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, iwork, ifail, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, std::complex* ap, const float vl, + const float vu, const fortran_int_t il, const fortran_int_t iu, + const float abstol, fortran_int_t& m, float* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, float* rwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_CHPEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, ap, &vl, + &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, rwork, iwork, ifail, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, std::complex* ap, const double vl, + const double vu, const fortran_int_t il, const fortran_int_t iu, + const double abstol, fortran_int_t& m, double* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, double* rwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_ZHPEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, ap, &vl, + &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, rwork, iwork, ifail, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hpevx. +// +template< typename Value, typename Enable = void > +struct hpevx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hpevx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename VectorIFAIL, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAP& ap, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::hpevx( jobz, range, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAP& ap, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( jobz, range, ap, vl, vu, il, iu, abstol, m, w, z, + ifail, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAP& ap, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( jobz, range, ap, vl, vu, il, iu, abstol, m, w, z, + ifail, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 8*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hpevx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename VectorIFAIL, typename WORK, typename RWORK, + typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAP& ap, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace3< WORK, RWORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::hpevx( jobz, range, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAP& ap, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( jobz, range, ap, vl, vu, il, iu, abstol, m, w, z, + ifail, workspace( tmp_work, tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAP& ap, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( jobz, range, ap, vl, vu, il, iu, abstol, m, w, z, + ifail, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 7*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hpevx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hpevx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename VectorIFAIL, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hpevx( const char jobz, const char range, MatrixAP& ap, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, Workspace work ) { + return hpevx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( jobz, range, ap, vl, vu, il, iu, + abstol, m, w, z, ifail, work ); +} + +// +// Overloaded function for hpevx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +hpevx( const char jobz, const char range, MatrixAP& ap, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail ) { + return hpevx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( jobz, range, ap, vl, vu, il, iu, + abstol, m, w, z, ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hpgv.hpp b/sdk/boost/numeric/bindings/lapack/driver/hpgv.hpp new file mode 100644 index 0000000..8602419 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hpgv.hpp @@ -0,0 +1,369 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPGV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPGV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hpgv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpgv( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, float* ap, float* bp, float* w, + float* z, const fortran_int_t ldz, float* work ) { + fortran_int_t info(0); + LAPACK_SSPGV( &itype, &jobz, &lapack_option< UpLo >::value, &n, ap, bp, w, + z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpgv( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, double* ap, double* bp, double* w, + double* z, const fortran_int_t ldz, double* work ) { + fortran_int_t info(0); + LAPACK_DSPGV( &itype, &jobz, &lapack_option< UpLo >::value, &n, ap, bp, w, + z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpgv( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, std::complex* ap, + std::complex* bp, float* w, std::complex* z, + const fortran_int_t ldz, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CHPGV( &itype, &jobz, &lapack_option< UpLo >::value, &n, ap, bp, w, + z, &ldz, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpgv( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, std::complex* ap, + std::complex* bp, double* w, std::complex* z, + const fortran_int_t ldz, std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZHPGV( &itype, &jobz, &lapack_option< UpLo >::value, &n, ap, bp, w, + z, &ldz, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hpgv. +// +template< typename Value, typename Enable = void > +struct hpgv_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hpgv_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename WORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hpgv( itype, jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(bp), + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + return invoke( itype, jobz, ap, bp, w, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( itype, jobz, ap, bp, w, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hpgv_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hpgv( itype, jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(bp), + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ap) ) ); + return invoke( itype, jobz, ap, bp, w, z, workspace( tmp_work, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( itype, jobz, ap, bp, w, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,2*n-1); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,3*n-2); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hpgv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hpgv. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hpgv( const fortran_int_t itype, const char jobz, MatrixAP& ap, + MatrixBP& bp, VectorW& w, MatrixZ& z, Workspace work ) { + return hpgv_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( itype, jobz, ap, bp, w, z, work ); +} + +// +// Overloaded function for hpgv. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +hpgv( const fortran_int_t itype, const char jobz, MatrixAP& ap, + MatrixBP& bp, VectorW& w, MatrixZ& z ) { + return hpgv_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( itype, jobz, ap, bp, w, z, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hpgvd.hpp b/sdk/boost/numeric/bindings/lapack/driver/hpgvd.hpp new file mode 100644 index 0000000..83f191b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hpgvd.hpp @@ -0,0 +1,469 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPGVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPGVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hpgvd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpgvd( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, float* ap, float* bp, float* w, + float* z, const fortran_int_t ldz, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSPGVD( &itype, &jobz, &lapack_option< UpLo >::value, &n, ap, bp, + w, z, &ldz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpgvd( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, double* ap, double* bp, double* w, + double* z, const fortran_int_t ldz, double* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSPGVD( &itype, &jobz, &lapack_option< UpLo >::value, &n, ap, bp, + w, z, &ldz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpgvd( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, std::complex* ap, + std::complex* bp, float* w, std::complex* z, + const fortran_int_t ldz, std::complex* work, + const fortran_int_t lwork, float* rwork, const fortran_int_t lrwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_CHPGVD( &itype, &jobz, &lapack_option< UpLo >::value, &n, ap, bp, + w, z, &ldz, work, &lwork, rwork, &lrwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpgvd( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, std::complex* ap, + std::complex* bp, double* w, std::complex* z, + const fortran_int_t ldz, std::complex* work, + const fortran_int_t lwork, double* rwork, const fortran_int_t lrwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_ZHPGVD( &itype, &jobz, &lapack_option< UpLo >::value, &n, ap, bp, + w, z, &ldz, work, &lwork, rwork, &lrwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hpgvd. +// +template< typename Value, typename Enable = void > +struct hpgvd_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hpgvd_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hpgvd( itype, jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(bp), + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( jobz, + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(ap) ) ); + return invoke( itype, jobz, ap, bp, w, z, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::hpgvd( itype, jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(bp), + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), &opt_size_work, -1, + &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( itype, jobz, ap, bp, w, z, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return 2*n; + else + return 1 + 6*n + n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hpgvd_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename WORK, typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, detail::workspace3< WORK, RWORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::hpgvd( itype, jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(bp), + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( jobz, + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( jobz, + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(ap) ) ); + return invoke( itype, jobz, ap, bp, w, z, workspace( tmp_work, + tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + value_type opt_size_work; + real_type opt_size_rwork; + fortran_int_t opt_size_iwork; + detail::hpgvd( itype, jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(bp), + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), &opt_size_work, -1, + &opt_size_rwork, -1, &opt_size_iwork, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< real_type > tmp_rwork( + traits::detail::to_int( opt_size_rwork ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( itype, jobz, ap, bp, w, z, workspace( tmp_work, + tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return n; + else + return 2*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return n; + else + return 1 + 5*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hpgvd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hpgvd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hpgvd( const fortran_int_t itype, const char jobz, MatrixAP& ap, + MatrixBP& bp, VectorW& w, MatrixZ& z, Workspace work ) { + return hpgvd_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( itype, jobz, ap, bp, w, z, work ); +} + +// +// Overloaded function for hpgvd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +hpgvd( const fortran_int_t itype, const char jobz, MatrixAP& ap, + MatrixBP& bp, VectorW& w, MatrixZ& z ) { + return hpgvd_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( itype, jobz, ap, bp, w, z, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hpgvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/hpgvx.hpp new file mode 100644 index 0000000..9bb8bb1 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hpgvx.hpp @@ -0,0 +1,462 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPGVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPGVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hpgvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpgvx( const fortran_int_t itype, const char jobz, + const char range, const UpLo, const fortran_int_t n, float* ap, + float* bp, const float vl, const float vu, const fortran_int_t il, + const fortran_int_t iu, const float abstol, fortran_int_t& m, + float* w, float* z, const fortran_int_t ldz, float* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSPGVX( &itype, &jobz, &range, &lapack_option< UpLo >::value, &n, + ap, bp, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, iwork, + ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpgvx( const fortran_int_t itype, const char jobz, + const char range, const UpLo, const fortran_int_t n, double* ap, + double* bp, const double vl, const double vu, const fortran_int_t il, + const fortran_int_t iu, const double abstol, fortran_int_t& m, + double* w, double* z, const fortran_int_t ldz, double* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSPGVX( &itype, &jobz, &range, &lapack_option< UpLo >::value, &n, + ap, bp, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, iwork, + ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpgvx( const fortran_int_t itype, const char jobz, + const char range, const UpLo, const fortran_int_t n, + std::complex* ap, std::complex* bp, const float vl, + const float vu, const fortran_int_t il, const fortran_int_t iu, + const float abstol, fortran_int_t& m, float* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, float* rwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_CHPGVX( &itype, &jobz, &range, &lapack_option< UpLo >::value, &n, + ap, bp, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, rwork, + iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpgvx( const fortran_int_t itype, const char jobz, + const char range, const UpLo, const fortran_int_t n, + std::complex* ap, std::complex* bp, const double vl, + const double vu, const fortran_int_t il, const fortran_int_t iu, + const double abstol, fortran_int_t& m, double* w, + std::complex* z, const fortran_int_t ldz, + std::complex* work, double* rwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_ZHPGVX( &itype, &jobz, &range, &lapack_option< UpLo >::value, &n, + ap, bp, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, rwork, + iwork, ifail, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hpgvx. +// +template< typename Value, typename Enable = void > +struct hpgvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hpgvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixAP& ap, MatrixBP& bp, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::hpgvx( itype, jobz, range, uplo(), + bindings::size_column(ap), bindings::begin_value(ap), + bindings::begin_value(bp), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixAP& ap, MatrixBP& bp, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( itype, jobz, range, ap, bp, vl, vu, il, iu, abstol, m, + w, z, ifail, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixAP& ap, MatrixBP& bp, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( itype, jobz, range, ap, bp, vl, vu, il, iu, abstol, m, + w, z, ifail, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 8*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hpgvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename WORK, + typename RWORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixAP& ap, MatrixBP& bp, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace3< WORK, RWORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::hpgvx( itype, jobz, range, uplo(), + bindings::size_column(ap), bindings::begin_value(ap), + bindings::begin_value(bp), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixAP& ap, MatrixBP& bp, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( itype, jobz, range, ap, bp, vl, vu, il, iu, abstol, m, + w, z, ifail, workspace( tmp_work, tmp_rwork, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixAP& ap, MatrixBP& bp, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( itype, jobz, range, ap, bp, vl, vu, il, iu, abstol, m, + w, z, ifail, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return 7*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hpgvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hpgvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hpgvx( const fortran_int_t itype, const char jobz, const char range, + MatrixAP& ap, MatrixBP& bp, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + Workspace work ) { + return hpgvx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( itype, jobz, range, ap, bp, vl, vu, + il, iu, abstol, m, w, z, ifail, work ); +} + +// +// Overloaded function for hpgvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +hpgvx( const fortran_int_t itype, const char jobz, const char range, + MatrixAP& ap, MatrixBP& bp, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail ) { + return hpgvx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( itype, jobz, range, ap, bp, vl, vu, + il, iu, abstol, m, w, z, ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hpsv.hpp b/sdk/boost/numeric/bindings/lapack/driver/hpsv.hpp new file mode 100644 index 0000000..6815437 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hpsv.hpp @@ -0,0 +1,176 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPSV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hpsv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpsv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, float* ap, fortran_int_t* ipiv, float* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SSPSV( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpsv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, double* ap, fortran_int_t* ipiv, double* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DSPSV( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpsv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* ap, + fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CHPSV( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpsv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* ap, + fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZHPSV( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, &ldb, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hpsv. +// +template< typename Value > +struct hpsv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( MatrixAP& ap, VectorIPIV& ipiv, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + return detail::hpsv( uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(ipiv), bindings::begin_value(b), + bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hpsv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hpsv. Its overload differs for +// +template< typename MatrixAP, typename VectorIPIV, typename MatrixB > +inline std::ptrdiff_t hpsv( MatrixAP& ap, VectorIPIV& ipiv, MatrixB& b ) { + return hpsv_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/hpsvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/hpsvx.hpp new file mode 100644 index 0000000..f6f5108 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/hpsvx.hpp @@ -0,0 +1,457 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPSVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_HPSVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for hpsvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, const float* ap, + float* afp, fortran_int_t* ipiv, const float* b, + const fortran_int_t ldb, float* x, const fortran_int_t ldx, + float& rcond, float* ferr, float* berr, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SSPSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, + ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, const double* ap, + double* afp, fortran_int_t* ipiv, const double* b, + const fortran_int_t ldb, double* x, const fortran_int_t ldx, + double& rcond, double* ferr, double* berr, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DSPSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, + ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* ap, std::complex* afp, + fortran_int_t* ipiv, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, float& rcond, float* ferr, float* berr, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CHPSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, + ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t hpsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* ap, std::complex* afp, + fortran_int_t* ipiv, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, double& rcond, double* ferr, double* berr, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZHPSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, + ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to hpsvx. +// +template< typename Value, typename Enable = void > +struct hpsvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct hpsvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char fact, const MatrixAP& ap, + MatrixAFP& afp, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAFP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( fact == 'F' || fact == 'N' ); + return detail::hpsvx( fact, uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(afp), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixAP& ap, + MatrixAFP& afp, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( fact, ap, afp, ipiv, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixAP& ap, + MatrixAFP& afp, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( fact, ap, afp, ipiv, b, x, rcond, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct hpsvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char fact, const MatrixAP& ap, + MatrixAFP& afp, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAFP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( fact == 'F' || fact == 'N' ); + return detail::hpsvx( fact, uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(afp), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixAP& ap, + MatrixAFP& afp, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ap) ) ); + return invoke( fact, ap, afp, ipiv, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixAP& ap, + MatrixAFP& afp, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( fact, ap, afp, ipiv, b, x, rcond, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the hpsvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for hpsvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +hpsvx( const char fact, const MatrixAP& ap, MatrixAFP& afp, + VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type& rcond, VectorFERR& ferr, VectorBERR& berr, + Workspace work ) { + return hpsvx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( fact, ap, afp, ipiv, b, x, rcond, + ferr, berr, work ); +} + +// +// Overloaded function for hpsvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +hpsvx( const char fact, const MatrixAP& ap, MatrixAFP& afp, + VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type& rcond, VectorFERR& ferr, VectorBERR& berr ) { + return hpsvx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( fact, ap, afp, ipiv, b, x, rcond, + ferr, berr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/iter_gesv.hpp b/sdk/boost/numeric/bindings/lapack/driver/iter_gesv.hpp new file mode 100644 index 0000000..d82b9c4 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/iter_gesv.hpp @@ -0,0 +1,390 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_ITER_GESV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_ITER_GESV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for iter_gesv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t iter_gesv( const fortran_int_t n, + const fortran_int_t nrhs, double* a, const fortran_int_t lda, + fortran_int_t* ipiv, const double* b, const fortran_int_t ldb, + double* x, const fortran_int_t ldx, double* work, float* swork, + fortran_int_t& iter ) { + fortran_int_t info(0); + LAPACK_DSGESV( &n, &nrhs, a, &lda, ipiv, b, &ldb, x, &ldx, work, swork, + &iter, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t iter_gesv( const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, fortran_int_t* ipiv, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, + std::complex* work, std::complex* swork, double* rwork, + fortran_int_t& iter ) { + fortran_int_t info(0); + LAPACK_ZCGESV( &n, &nrhs, a, &lda, ipiv, b, &ldb, x, &ldx, work, swork, + rwork, &iter, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to iter_gesv. +// +template< typename Value, typename Enable = void > +struct iter_gesv_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct iter_gesv_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename WORK, typename SWORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, fortran_int_t& iter, + detail::workspace2< WORK, SWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_swork( bindings::size_column(a), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::iter_gesv( bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(real_type())), iter ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename MatrixX > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, fortran_int_t& iter, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a), bindings::size_column(b) ) ); + bindings::detail::array< real_type > tmp_swork( min_size_swork( + bindings::size_column(a), bindings::size_column(b) ) ); + return invoke( a, ipiv, b, x, iter, workspace( tmp_work, tmp_swork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename MatrixX > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, fortran_int_t& iter, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( a, ipiv, b, x, iter, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t nrhs ) { + return n*nrhs; + } + + // + // Static member function that returns the minimum size of + // workspace-array swork. + // + static std::ptrdiff_t min_size_swork( const std::ptrdiff_t n, + const std::ptrdiff_t nrhs ) { + return n*(n+nrhs); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct iter_gesv_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename WORK, typename SWORK, typename RWORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, fortran_int_t& iter, + detail::workspace3< WORK, SWORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_ASSERT( bindings::size(ipiv) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_swork( bindings::size_column(a), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::iter_gesv( bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())), iter ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename MatrixX > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, fortran_int_t& iter, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a), bindings::size_column(b) ) ); + bindings::detail::array< value_type > tmp_swork( min_size_swork( + bindings::size_column(a), bindings::size_column(b) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( a, ipiv, b, x, iter, workspace( tmp_work, tmp_swork, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename MatrixX > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, fortran_int_t& iter, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( a, ipiv, b, x, iter, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t nrhs ) { + return n*nrhs; + } + + // + // Static member function that returns the minimum size of + // workspace-array swork. + // + static std::ptrdiff_t min_size_swork( const std::ptrdiff_t n, + const std::ptrdiff_t nrhs ) { + return n*(n+nrhs); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the iter_gesv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for iter_gesv. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename MatrixX, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +iter_gesv( MatrixA& a, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + fortran_int_t& iter, Workspace work ) { + return iter_gesv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, b, x, iter, work ); +} + +// +// Overloaded function for iter_gesv. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename MatrixX > +inline typename boost::disable_if< detail::is_workspace< MatrixX >, + std::ptrdiff_t >::type +iter_gesv( MatrixA& a, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + fortran_int_t& iter ) { + return iter_gesv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, b, x, iter, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/iter_posv.hpp b/sdk/boost/numeric/bindings/lapack/driver/iter_posv.hpp new file mode 100644 index 0000000..f8c85f3 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/iter_posv.hpp @@ -0,0 +1,383 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_ITER_POSV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_ITER_POSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for iter_posv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t iter_posv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, double* a, const fortran_int_t lda, + const double* b, const fortran_int_t ldb, double* x, + const fortran_int_t ldx, double* work, float* swork, + fortran_int_t& iter ) { + fortran_int_t info(0); + LAPACK_DSPOSV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, b, &ldb, + x, &ldx, work, swork, &iter, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t iter_posv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, std::complex* work, + std::complex* swork, double* rwork, fortran_int_t& iter ) { + fortran_int_t info(0); + LAPACK_ZCPOSV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, b, &ldb, + x, &ldx, work, swork, rwork, &iter, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to iter_posv. +// +template< typename Value, typename Enable = void > +struct iter_posv_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct iter_posv_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixX, + typename WORK, typename SWORK > + static std::ptrdiff_t invoke( MatrixA& a, const MatrixB& b, MatrixX& x, + fortran_int_t& iter, detail::workspace2< WORK, SWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_swork( bindings::size_column(a), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::iter_posv( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(real_type())), iter ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename MatrixX > + static std::ptrdiff_t invoke( MatrixA& a, const MatrixB& b, MatrixX& x, + fortran_int_t& iter, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a), bindings::size_column(b) ) ); + bindings::detail::array< real_type > tmp_swork( min_size_swork( + bindings::size_column(a), bindings::size_column(b) ) ); + return invoke( a, b, x, iter, workspace( tmp_work, tmp_swork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename MatrixX > + static std::ptrdiff_t invoke( MatrixA& a, const MatrixB& b, MatrixX& x, + fortran_int_t& iter, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, b, x, iter, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t nrhs ) { + return n*nrhs; + } + + // + // Static member function that returns the minimum size of + // workspace-array swork. + // + static std::ptrdiff_t min_size_swork( const std::ptrdiff_t n, + const std::ptrdiff_t nrhs ) { + return n*(n+nrhs); + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct iter_posv_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename MatrixX, + typename WORK, typename SWORK, typename RWORK > + static std::ptrdiff_t invoke( MatrixA& a, const MatrixB& b, MatrixX& x, + fortran_int_t& iter, detail::workspace3< WORK, SWORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_swork( bindings::size_column(a), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a), + bindings::size_column(b) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::iter_posv( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())), iter ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename MatrixX > + static std::ptrdiff_t invoke( MatrixA& a, const MatrixB& b, MatrixX& x, + fortran_int_t& iter, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a), bindings::size_column(b) ) ); + bindings::detail::array< value_type > tmp_swork( min_size_swork( + bindings::size_column(a), bindings::size_column(b) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( a, b, x, iter, workspace( tmp_work, tmp_swork, + tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename MatrixX > + static std::ptrdiff_t invoke( MatrixA& a, const MatrixB& b, MatrixX& x, + fortran_int_t& iter, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( a, b, x, iter, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n, + const std::ptrdiff_t nrhs ) { + return n*nrhs; + } + + // + // Static member function that returns the minimum size of + // workspace-array swork. + // + static std::ptrdiff_t min_size_swork( const std::ptrdiff_t n, + const std::ptrdiff_t nrhs ) { + return n*(n+nrhs); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the iter_posv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for iter_posv. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename MatrixX, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +iter_posv( MatrixA& a, const MatrixB& b, MatrixX& x, fortran_int_t& iter, + Workspace work ) { + return iter_posv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, x, iter, work ); +} + +// +// Overloaded function for iter_posv. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename MatrixX > +inline typename boost::disable_if< detail::is_workspace< MatrixX >, + std::ptrdiff_t >::type +iter_posv( MatrixA& a, const MatrixB& b, MatrixX& x, + fortran_int_t& iter ) { + return iter_posv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b, x, iter, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/pbsv.hpp b/sdk/boost/numeric/bindings/lapack/driver/pbsv.hpp new file mode 100644 index 0000000..dd42a27 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/pbsv.hpp @@ -0,0 +1,182 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_PBSV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_PBSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pbsv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbsv( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const fortran_int_t nrhs, float* ab, + const fortran_int_t ldab, float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SPBSV( &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, &ldab, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbsv( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const fortran_int_t nrhs, double* ab, + const fortran_int_t ldab, double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DPBSV( &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, &ldab, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbsv( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const fortran_int_t nrhs, + std::complex* ab, const fortran_int_t ldab, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CPBSV( &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, &ldab, b, + &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbsv( const UpLo, const fortran_int_t n, + const fortran_int_t kd, const fortran_int_t nrhs, + std::complex* ab, const fortran_int_t ldab, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZPBSV( &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, &ldab, b, + &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pbsv. +// +template< typename Value > +struct pbsv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixB > + static std::ptrdiff_t invoke( MatrixAB& ab, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + return detail::pbsv( uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::size_column(b), + bindings::begin_value(ab), bindings::stride_major(ab), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pbsv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pbsv. Its overload differs for +// +template< typename MatrixAB, typename MatrixB > +inline std::ptrdiff_t pbsv( MatrixAB& ab, MatrixB& b ) { + return pbsv_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( ab, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/pbsvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/pbsvx.hpp new file mode 100644 index 0000000..bcdd5d8 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/pbsvx.hpp @@ -0,0 +1,508 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_PBSVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_PBSVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for pbsvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t kd, + const fortran_int_t nrhs, float* ab, const fortran_int_t ldab, + float* afb, const fortran_int_t ldafb, char& equed, float* s, + float* b, const fortran_int_t ldb, float* x, const fortran_int_t ldx, + float& rcond, float* ferr, float* berr, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SPBSVX( &fact, &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, + &ldab, afb, &ldafb, &equed, s, b, &ldb, x, &ldx, &rcond, ferr, + berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t kd, + const fortran_int_t nrhs, double* ab, const fortran_int_t ldab, + double* afb, const fortran_int_t ldafb, char& equed, double* s, + double* b, const fortran_int_t ldb, double* x, + const fortran_int_t ldx, double& rcond, double* ferr, double* berr, + double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DPBSVX( &fact, &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, + &ldab, afb, &ldafb, &equed, s, b, &ldb, x, &ldx, &rcond, ferr, + berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t kd, + const fortran_int_t nrhs, std::complex* ab, + const fortran_int_t ldab, std::complex* afb, + const fortran_int_t ldafb, char& equed, float* s, + std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float& rcond, + float* ferr, float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CPBSVX( &fact, &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, + &ldab, afb, &ldafb, &equed, s, b, &ldb, x, &ldx, &rcond, ferr, + berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t pbsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t kd, + const fortran_int_t nrhs, std::complex* ab, + const fortran_int_t ldab, std::complex* afb, + const fortran_int_t ldafb, char& equed, double* s, + std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, double& rcond, + double* ferr, double* berr, std::complex* work, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZPBSVX( &fact, &lapack_option< UpLo >::value, &n, &kd, &nrhs, ab, + &ldab, afb, &ldafb, &equed, s, b, &ldb, x, &ldx, &rcond, ferr, + berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to pbsvx. +// +template< typename Value, typename Enable = void > +struct pbsvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct pbsvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixAFB, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char fact, MatrixAB& ab, + MatrixAFB& afb, char& equed, VectorS& s, MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAFB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAFB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(afb) == 1 || + bindings::stride_minor(afb) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(afb) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + BOOST_ASSERT( equed == 'N' || equed == 'Y' ); + BOOST_ASSERT( fact == 'F' || fact == 'Y' || fact == 'N' || + fact == 'E' ); + return detail::pbsvx( fact, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::size_column(b), + bindings::begin_value(ab), bindings::stride_major(ab), + bindings::begin_value(afb), bindings::stride_major(afb), + equed, bindings::begin_value(s), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), rcond, bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixAFB, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixAB& ab, + MatrixAFB& afb, char& equed, VectorS& s, MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ab) ) ); + return invoke( fact, ab, afb, equed, s, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixAFB, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixAB& ab, + MatrixAFB& afb, char& equed, VectorS& s, MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( fact, ab, afb, equed, s, b, x, rcond, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct pbsvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixAFB, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char fact, MatrixAB& ab, + MatrixAFB& afb, char& equed, VectorS& s, MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAFB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorS >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorS >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAFB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(afb) == 1 || + bindings::stride_minor(afb) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(afb) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + BOOST_ASSERT( equed == 'N' || equed == 'Y' ); + BOOST_ASSERT( fact == 'F' || fact == 'Y' || fact == 'N' || + fact == 'E' ); + return detail::pbsvx( fact, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::size_column(b), + bindings::begin_value(ab), bindings::stride_major(ab), + bindings::begin_value(afb), bindings::stride_major(afb), + equed, bindings::begin_value(s), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), rcond, bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixAFB, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixAB& ab, + MatrixAFB& afb, char& equed, VectorS& s, MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ab) ) ); + return invoke( fact, ab, afb, equed, s, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixAFB, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixAB& ab, + MatrixAFB& afb, char& equed, VectorS& s, MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( fact, ab, afb, equed, s, b, x, rcond, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the pbsvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for pbsvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixAFB, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +pbsvx( const char fact, MatrixAB& ab, MatrixAFB& afb, char& equed, + VectorS& s, MatrixB& b, MatrixX& x, typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type& rcond, + VectorFERR& ferr, VectorBERR& berr, Workspace work ) { + return pbsvx_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( fact, ab, afb, equed, s, b, x, rcond, + ferr, berr, work ); +} + +// +// Overloaded function for pbsvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixAFB, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +pbsvx( const char fact, MatrixAB& ab, MatrixAFB& afb, char& equed, + VectorS& s, MatrixB& b, MatrixX& x, typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type& rcond, + VectorFERR& ferr, VectorBERR& berr ) { + return pbsvx_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( fact, ab, afb, equed, s, b, x, rcond, + ferr, berr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/posv.hpp b/sdk/boost/numeric/bindings/lapack/driver/posv.hpp new file mode 100644 index 0000000..6f5d964 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/posv.hpp @@ -0,0 +1,246 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_POSV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_POSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for posv is selected by defining a pre-processor +// variable, which can be one of +// * for ATLAS's CLAPACK, define BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// * netlib-compatible LAPACK is the default +// +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +#include +#include +#else +#include +#include +#endif + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +#if defined BOOST_NUMERIC_BINDINGS_LAPACK_CLAPACK +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * float value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t posv( Order, const UpLo, const int n, const int nrhs, + float* a, const int lda, float* b, const int ldb ) { + return clapack_sposv( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, nrhs, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * double value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t posv( Order, const UpLo, const int n, const int nrhs, + double* a, const int lda, double* b, const int ldb ) { + return clapack_dposv( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, nrhs, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t posv( Order, const UpLo, const int n, const int nrhs, + std::complex* a, const int lda, std::complex* b, + const int ldb ) { + return clapack_cposv( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, nrhs, a, lda, b, ldb ); +} + +// +// Overloaded function for dispatching to +// * ATLAS's CLAPACK backend, and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t posv( Order, const UpLo, const int n, const int nrhs, + std::complex* a, const int lda, std::complex* b, + const int ldb ) { + return clapack_zposv( clapack_option< Order >::value, clapack_option< + UpLo >::value, n, nrhs, a, lda, b, ldb ); +} + +#else +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t posv( Order, const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, float* a, const fortran_int_t lda, float* b, + const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_SPOSV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t posv( Order, const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, double* a, const fortran_int_t lda, + double* b, const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_DPOSV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t posv( Order, const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_CPOSV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename Order, typename UpLo > +inline std::ptrdiff_t posv( Order, const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, std::complex* b, + const fortran_int_t ldb ) { + BOOST_STATIC_ASSERT( (is_same::value) ); + fortran_int_t info(0); + LAPACK_ZPOSV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, b, &ldb, + &info ); + return info; +} + +#endif +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to posv. +// +template< typename Value > +struct posv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::data_order< MatrixA >::type order; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::posv( order(), uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the posv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for posv. Its overload differs for +// +template< typename MatrixA, typename MatrixB > +inline std::ptrdiff_t posv( MatrixA& a, MatrixB& b ) { + return posv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/posvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/posvx.hpp new file mode 100644 index 0000000..c2316c0 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/posvx.hpp @@ -0,0 +1,495 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_POSVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_POSVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for posvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t posvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, float* a, + const fortran_int_t lda, float* af, const fortran_int_t ldaf, + char& equed, float* s, float* b, const fortran_int_t ldb, float* x, + const fortran_int_t ldx, float& rcond, float* ferr, float* berr, + float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SPOSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, + af, &ldaf, &equed, s, b, &ldb, x, &ldx, &rcond, ferr, berr, work, + iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t posvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, double* a, + const fortran_int_t lda, double* af, const fortran_int_t ldaf, + char& equed, double* s, double* b, const fortran_int_t ldb, double* x, + const fortran_int_t ldx, double& rcond, double* ferr, double* berr, + double* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DPOSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, + af, &ldaf, &equed, s, b, &ldb, x, &ldx, &rcond, ferr, berr, work, + iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t posvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, + std::complex* a, const fortran_int_t lda, + std::complex* af, const fortran_int_t ldaf, char& equed, + float* s, std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float& rcond, + float* ferr, float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CPOSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, + af, &ldaf, &equed, s, b, &ldb, x, &ldx, &rcond, ferr, berr, work, + rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t posvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, + std::complex* a, const fortran_int_t lda, + std::complex* af, const fortran_int_t ldaf, char& equed, + double* s, std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, double& rcond, + double* ferr, double* berr, std::complex* work, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZPOSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, + af, &ldaf, &equed, s, b, &ldb, x, &ldx, &rcond, ferr, berr, work, + rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to posvx. +// +template< typename Value, typename Enable = void > +struct posvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct posvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char fact, MatrixA& a, MatrixAF& af, + char& equed, VectorS& s, MatrixB& b, MatrixX& x, real_type& rcond, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( equed == 'N' || equed == 'Y' ); + BOOST_ASSERT( fact == 'F' || fact == 'Y' || fact == 'N' || + fact == 'E' ); + return detail::posvx( fact, uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), equed, bindings::begin_value(s), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixA& a, MatrixAF& af, + char& equed, VectorS& s, MatrixB& b, MatrixX& x, real_type& rcond, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( fact, a, af, equed, s, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixA& a, MatrixAF& af, + char& equed, VectorS& s, MatrixB& b, MatrixX& x, real_type& rcond, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( fact, a, af, equed, s, b, x, rcond, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct posvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char fact, MatrixA& a, MatrixAF& af, + char& equed, VectorS& s, MatrixB& b, MatrixX& x, real_type& rcond, + VectorFERR& ferr, VectorBERR& berr, detail::workspace2< WORK, + RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorS >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorS >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( equed == 'N' || equed == 'Y' ); + BOOST_ASSERT( fact == 'F' || fact == 'Y' || fact == 'N' || + fact == 'E' ); + return detail::posvx( fact, uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), equed, bindings::begin_value(s), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixA& a, MatrixAF& af, + char& equed, VectorS& s, MatrixB& b, MatrixX& x, real_type& rcond, + VectorFERR& ferr, VectorBERR& berr, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( fact, a, af, equed, s, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixA& a, MatrixAF& af, + char& equed, VectorS& s, MatrixB& b, MatrixX& x, real_type& rcond, + VectorFERR& ferr, VectorBERR& berr, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + return invoke( fact, a, af, equed, s, b, x, rcond, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the posvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for posvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixAF, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +posvx( const char fact, MatrixA& a, MatrixAF& af, char& equed, + VectorS& s, MatrixB& b, MatrixX& x, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond, + VectorFERR& ferr, VectorBERR& berr, Workspace work ) { + return posvx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( fact, a, af, equed, s, b, x, rcond, + ferr, berr, work ); +} + +// +// Overloaded function for posvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixAF, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +posvx( const char fact, MatrixA& a, MatrixAF& af, char& equed, + VectorS& s, MatrixB& b, MatrixX& x, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond, + VectorFERR& ferr, VectorBERR& berr ) { + return posvx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( fact, a, af, equed, s, b, x, rcond, + ferr, berr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/ppsv.hpp b/sdk/boost/numeric/bindings/lapack/driver/ppsv.hpp new file mode 100644 index 0000000..94f84ce --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/ppsv.hpp @@ -0,0 +1,172 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_PPSV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_PPSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ppsv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppsv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, float* ap, float* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SPPSV( &lapack_option< UpLo >::value, &n, &nrhs, ap, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppsv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, double* ap, double* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DPPSV( &lapack_option< UpLo >::value, &n, &nrhs, ap, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppsv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* ap, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CPPSV( &lapack_option< UpLo >::value, &n, &nrhs, ap, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppsv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* ap, + std::complex* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZPPSV( &lapack_option< UpLo >::value, &n, &nrhs, ap, b, &ldb, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ppsv. +// +template< typename Value > +struct ppsv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixB > + static std::ptrdiff_t invoke( MatrixAP& ap, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + return detail::ppsv( uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ppsv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ppsv. Its overload differs for +// +template< typename MatrixAP, typename MatrixB > +inline std::ptrdiff_t ppsv( MatrixAP& ap, MatrixB& b ) { + return ppsv_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/ppsvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/ppsvx.hpp new file mode 100644 index 0000000..4475970 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/ppsvx.hpp @@ -0,0 +1,474 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_PPSVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_PPSVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ppsvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, float* ap, + float* afp, char& equed, float* s, float* b, const fortran_int_t ldb, + float* x, const fortran_int_t ldx, float& rcond, float* ferr, + float* berr, float* work, fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SPPSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, + &equed, s, b, &ldb, x, &ldx, &rcond, ferr, berr, work, iwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, double* ap, + double* afp, char& equed, double* s, double* b, + const fortran_int_t ldb, double* x, const fortran_int_t ldx, + double& rcond, double* ferr, double* berr, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DPPSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, + &equed, s, b, &ldb, x, &ldx, &rcond, ferr, berr, work, iwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, + std::complex* ap, std::complex* afp, char& equed, + float* s, std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float& rcond, + float* ferr, float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CPPSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, + &equed, s, b, &ldb, x, &ldx, &rcond, ferr, berr, work, rwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t ppsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, + std::complex* ap, std::complex* afp, char& equed, + double* s, std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, double& rcond, + double* ferr, double* berr, std::complex* work, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZPPSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, + &equed, s, b, &ldb, x, &ldx, &rcond, ferr, berr, work, rwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ppsvx. +// +template< typename Value, typename Enable = void > +struct ppsvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ppsvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorAFP, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char fact, MatrixAP& ap, + VectorAFP& afp, char& equed, VectorS& s, MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorAFP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorS >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorAFP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( equed == 'N' || equed == 'Y' ); + BOOST_ASSERT( fact == 'F' || fact == 'Y' || fact == 'N' || + fact == 'E' ); + return detail::ppsvx( fact, uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(afp), equed, bindings::begin_value(s), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorAFP, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixAP& ap, + VectorAFP& afp, char& equed, VectorS& s, MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( fact, ap, afp, equed, s, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorAFP, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixAP& ap, + VectorAFP& afp, char& equed, VectorS& s, MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( fact, ap, afp, equed, s, b, x, rcond, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ppsvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorAFP, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char fact, MatrixAP& ap, + VectorAFP& afp, char& equed, VectorS& s, MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorS >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorS >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorAFP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorAFP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorS >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( equed == 'N' || equed == 'Y' ); + BOOST_ASSERT( fact == 'F' || fact == 'Y' || fact == 'N' || + fact == 'E' ); + return detail::ppsvx( fact, uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(afp), equed, bindings::begin_value(s), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorAFP, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixAP& ap, + VectorAFP& afp, char& equed, VectorS& s, MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ap) ) ); + return invoke( fact, ap, afp, equed, s, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorAFP, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, MatrixAP& ap, + VectorAFP& afp, char& equed, VectorS& s, MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( fact, ap, afp, equed, s, b, x, rcond, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ppsvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ppsvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename VectorAFP, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ppsvx( const char fact, MatrixAP& ap, VectorAFP& afp, char& equed, + VectorS& s, MatrixB& b, MatrixX& x, typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type& rcond, + VectorFERR& ferr, VectorBERR& berr, Workspace work ) { + return ppsvx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( fact, ap, afp, equed, s, b, x, rcond, + ferr, berr, work ); +} + +// +// Overloaded function for ppsvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename VectorAFP, typename VectorS, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +ppsvx( const char fact, MatrixAP& ap, VectorAFP& afp, char& equed, + VectorS& s, MatrixB& b, MatrixX& x, typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type& rcond, + VectorFERR& ferr, VectorBERR& berr ) { + return ppsvx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( fact, ap, afp, equed, s, b, x, rcond, + ferr, berr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/ptsv.hpp b/sdk/boost/numeric/bindings/lapack/driver/ptsv.hpp new file mode 100644 index 0000000..fc48a73 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/ptsv.hpp @@ -0,0 +1,216 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_PTSV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_PTSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ptsv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ptsv( const fortran_int_t n, const fortran_int_t nrhs, + float* d, float* e, float* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SPTSV( &n, &nrhs, d, e, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ptsv( const fortran_int_t n, const fortran_int_t nrhs, + double* d, double* e, double* b, const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DPTSV( &n, &nrhs, d, e, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ptsv( const fortran_int_t n, const fortran_int_t nrhs, + float* d, std::complex* e, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CPTSV( &n, &nrhs, d, e, b, &ldb, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ptsv( const fortran_int_t n, const fortran_int_t nrhs, + double* d, std::complex* e, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZPTSV( &n, &nrhs, d, e, b, &ldb, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ptsv. +// +template< typename Value, typename Enable = void > +struct ptsv_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ptsv_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixB > + static std::ptrdiff_t invoke( VectorD& d, VectorE& e, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size(d)) ); + return detail::ptsv( bindings::size(d), bindings::size_column(b), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ptsv_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixB > + static std::ptrdiff_t invoke( VectorD& d, VectorE& e, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorE >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size(d)) ); + return detail::ptsv( bindings::size(d), bindings::size_column(b), + bindings::begin_value(d), bindings::begin_value(e), + bindings::begin_value(b), bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ptsv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ptsv. Its overload differs for +// +template< typename VectorD, typename VectorE, typename MatrixB > +inline std::ptrdiff_t ptsv( VectorD& d, VectorE& e, MatrixB& b ) { + return ptsv_impl< typename bindings::value_type< + VectorE >::type >::invoke( d, e, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/ptsvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/ptsvx.hpp new file mode 100644 index 0000000..8378d1f --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/ptsvx.hpp @@ -0,0 +1,452 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_PTSVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_PTSVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for ptsvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t ptsvx( const char fact, const fortran_int_t n, + const fortran_int_t nrhs, const float* d, const float* e, float* df, + float* ef, const float* b, const fortran_int_t ldb, float* x, + const fortran_int_t ldx, float& rcond, float* ferr, float* berr, + float* work ) { + fortran_int_t info(0); + LAPACK_SPTSVX( &fact, &n, &nrhs, d, e, df, ef, b, &ldb, x, &ldx, &rcond, + ferr, berr, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t ptsvx( const char fact, const fortran_int_t n, + const fortran_int_t nrhs, const double* d, const double* e, + double* df, double* ef, const double* b, const fortran_int_t ldb, + double* x, const fortran_int_t ldx, double& rcond, double* ferr, + double* berr, double* work ) { + fortran_int_t info(0); + LAPACK_DPTSVX( &fact, &n, &nrhs, d, e, df, ef, b, &ldb, x, &ldx, &rcond, + ferr, berr, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ptsvx( const char fact, const fortran_int_t n, + const fortran_int_t nrhs, const float* d, + const std::complex* e, float* df, std::complex* ef, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, float& rcond, + float* ferr, float* berr, std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CPTSVX( &fact, &n, &nrhs, d, e, df, ef, b, &ldb, x, &ldx, &rcond, + ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +inline std::ptrdiff_t ptsvx( const char fact, const fortran_int_t n, + const fortran_int_t nrhs, const double* d, + const std::complex* e, double* df, std::complex* ef, + const std::complex* b, const fortran_int_t ldb, + std::complex* x, const fortran_int_t ldx, double& rcond, + double* ferr, double* berr, std::complex* work, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZPTSVX( &fact, &n, &nrhs, d, e, df, ef, b, &ldb, x, &ldx, &rcond, + ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to ptsvx. +// +template< typename Value, typename Enable = void > +struct ptsvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct ptsvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename WORK > + static std::ptrdiff_t invoke( const char fact, const VectorD& d, + const VectorE& e, VectorDF& df, VectorEF& ef, const MatrixB& b, + MatrixX& x, real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorEF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorEF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size(d) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size(d)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size(d)) ); + BOOST_ASSERT( fact == 'F' || fact == 'N' ); + return detail::ptsvx( fact, bindings::size(d), + bindings::size_column(b), bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(df), + bindings::begin_value(ef), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), rcond, bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const VectorD& d, + const VectorE& e, VectorDF& df, VectorEF& ef, const MatrixB& b, + MatrixX& x, real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size(d) ) ); + return invoke( fact, d, e, df, ef, b, x, rcond, ferr, berr, + workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const VectorD& d, + const VectorE& e, VectorDF& df, VectorEF& ef, const MatrixB& b, + MatrixX& x, real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( fact, d, e, df, ef, b, x, rcond, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct ptsvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename WORK, + typename RWORK > + static std::ptrdiff_t invoke( const char fact, const VectorD& d, + const VectorE& e, VectorDF& df, VectorEF& ef, const MatrixB& b, + MatrixX& x, real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorDF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorE >::type >::type, + typename remove_const< typename bindings::value_type< + VectorEF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorE >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorE >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorDF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorEF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(d) >= bindings::size(d) ); + BOOST_ASSERT( bindings::size(d) >= 0 ); + BOOST_ASSERT( bindings::size(e) >= bindings::size(d)-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size(d) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size(d) )); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size(d)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size(d)) ); + BOOST_ASSERT( fact == 'F' || fact == 'N' ); + return detail::ptsvx( fact, bindings::size(d), + bindings::size_column(b), bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(df), + bindings::begin_value(ef), bindings::begin_value(b), + bindings::stride_major(b), bindings::begin_value(x), + bindings::stride_major(x), rcond, bindings::begin_value(ferr), + bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const VectorD& d, + const VectorE& e, VectorDF& df, VectorEF& ef, const MatrixB& b, + MatrixX& x, real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size(d) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size(d) ) ); + return invoke( fact, d, e, df, ef, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const VectorD& d, + const VectorE& e, VectorDF& df, VectorEF& ef, const MatrixB& b, + MatrixX& x, real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( fact, d, e, df, ef, b, x, rcond, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the ptsvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for ptsvx. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +ptsvx( const char fact, const VectorD& d, const VectorE& e, VectorDF& df, + VectorEF& ef, const MatrixB& b, MatrixX& x, typename remove_imaginary< + typename bindings::value_type< VectorE >::type >::type& rcond, + VectorFERR& ferr, VectorBERR& berr, Workspace work ) { + return ptsvx_impl< typename bindings::value_type< + VectorE >::type >::invoke( fact, d, e, df, ef, b, x, rcond, ferr, + berr, work ); +} + +// +// Overloaded function for ptsvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename VectorDF, + typename VectorEF, typename MatrixB, typename MatrixX, + typename VectorFERR, typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +ptsvx( const char fact, const VectorD& d, const VectorE& e, VectorDF& df, + VectorEF& ef, const MatrixB& b, MatrixX& x, typename remove_imaginary< + typename bindings::value_type< VectorE >::type >::type& rcond, + VectorFERR& ferr, VectorBERR& berr ) { + return ptsvx_impl< typename bindings::value_type< + VectorE >::type >::invoke( fact, d, e, df, ef, b, x, rcond, ferr, + berr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/sbev.hpp b/sdk/boost/numeric/bindings/lapack/driver/sbev.hpp new file mode 100644 index 0000000..ca78d3d --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/sbev.hpp @@ -0,0 +1,216 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SBEV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SBEV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sbev is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbev( const char jobz, const UpLo, const fortran_int_t n, + const fortran_int_t kd, float* ab, const fortran_int_t ldab, float* w, + float* z, const fortran_int_t ldz, float* work ) { + fortran_int_t info(0); + LAPACK_SSBEV( &jobz, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, w, + z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbev( const char jobz, const UpLo, const fortran_int_t n, + const fortran_int_t kd, double* ab, const fortran_int_t ldab, + double* w, double* z, const fortran_int_t ldz, double* work ) { + fortran_int_t info(0); + LAPACK_DSBEV( &jobz, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, w, + z, &ldz, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sbev. +// +template< typename Value > +struct sbev_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorW, typename MatrixZ, + typename WORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::sbev( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + return invoke( jobz, ab, w, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( jobz, ab, w, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,3*n-2); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sbev_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sbev. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename VectorW, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sbev( const char jobz, MatrixAB& ab, VectorW& w, MatrixZ& z, + Workspace work ) { + return sbev_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, w, z, work ); +} + +// +// Overloaded function for sbev. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename VectorW, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +sbev( const char jobz, MatrixAB& ab, VectorW& w, MatrixZ& z ) { + return sbev_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, w, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/sbevd.hpp b/sdk/boost/numeric/bindings/lapack/driver/sbevd.hpp new file mode 100644 index 0000000..f0ad8b8 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/sbevd.hpp @@ -0,0 +1,259 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SBEVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SBEVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sbevd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbevd( const char jobz, const UpLo, + const fortran_int_t n, const fortran_int_t kd, float* ab, + const fortran_int_t ldab, float* w, float* z, const fortran_int_t ldz, + float* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSBEVD( &jobz, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, + w, z, &ldz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbevd( const char jobz, const UpLo, + const fortran_int_t n, const fortran_int_t kd, double* ab, + const fortran_int_t ldab, double* w, double* z, + const fortran_int_t ldz, double* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSBEVD( &jobz, &lapack_option< UpLo >::value, &n, &kd, ab, &ldab, + w, z, &ldz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sbevd. +// +template< typename Value > +struct sbevd_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename VectorW, typename MatrixZ, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::sbevd( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( jobz, + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(ab) ) ); + return invoke( jobz, ab, w, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::sbevd( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, ab, w, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return 2*n; + else + return 1 + 5*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sbevd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sbevd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename VectorW, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sbevd( const char jobz, MatrixAB& ab, VectorW& w, MatrixZ& z, + Workspace work ) { + return sbevd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, w, z, work ); +} + +// +// Overloaded function for sbevd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename VectorW, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +sbevd( const char jobz, MatrixAB& ab, VectorW& w, MatrixZ& z ) { + return sbevd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, w, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/sbevx.hpp b/sdk/boost/numeric/bindings/lapack/driver/sbevx.hpp new file mode 100644 index 0000000..38a7125 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/sbevx.hpp @@ -0,0 +1,286 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SBEVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SBEVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sbevx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, const fortran_int_t kd, float* ab, + const fortran_int_t ldab, float* q, const fortran_int_t ldq, + const float vl, const float vu, const fortran_int_t il, + const fortran_int_t iu, const float abstol, fortran_int_t& m, + float* w, float* z, const fortran_int_t ldz, float* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSBEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, &kd, ab, + &ldab, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, + iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, const fortran_int_t kd, double* ab, + const fortran_int_t ldab, double* q, const fortran_int_t ldq, + const double vl, const double vu, const fortran_int_t il, + const fortran_int_t iu, const double abstol, fortran_int_t& m, + double* w, double* z, const fortran_int_t ldz, double* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSBEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, &kd, ab, + &ldab, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, + iwork, ifail, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sbevx. +// +template< typename Value > +struct sbevx_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixQ, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixQ& q, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(ab) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(q) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ab)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::sbevx( jobz, range, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(q), + bindings::stride_major(q), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixQ, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixQ& q, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ab) ) ); + return invoke( jobz, range, ab, q, vl, vu, il, iu, abstol, m, w, z, + ifail, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixQ, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixQ& q, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( jobz, range, ab, q, vl, vu, il, iu, abstol, m, w, z, + ifail, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 7*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sbevx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sbevx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixQ, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sbevx( const char jobz, const char range, MatrixAB& ab, MatrixQ& q, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, Workspace work ) { + return sbevx_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, range, ab, q, vl, vu, il, iu, + abstol, m, w, z, ifail, work ); +} + +// +// Overloaded function for sbevx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixQ, typename VectorW, + typename MatrixZ, typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +sbevx( const char jobz, const char range, MatrixAB& ab, MatrixQ& q, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail ) { + return sbevx_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, range, ab, q, vl, vu, il, iu, + abstol, m, w, z, ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/sbgv.hpp b/sdk/boost/numeric/bindings/lapack/driver/sbgv.hpp new file mode 100644 index 0000000..930822c --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/sbgv.hpp @@ -0,0 +1,236 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SBGV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SBGV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sbgv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbgv( const char jobz, const UpLo, const fortran_int_t n, + const fortran_int_t ka, const fortran_int_t kb, float* ab, + const fortran_int_t ldab, float* bb, const fortran_int_t ldbb, + float* w, float* z, const fortran_int_t ldz, float* work ) { + fortran_int_t info(0); + LAPACK_SSBGV( &jobz, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, w, z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbgv( const char jobz, const UpLo, const fortran_int_t n, + const fortran_int_t ka, const fortran_int_t kb, double* ab, + const fortran_int_t ldab, double* bb, const fortran_int_t ldbb, + double* w, double* z, const fortran_int_t ldz, double* work ) { + fortran_int_t info(0); + LAPACK_DSBGV( &jobz, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, w, z, &ldz, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sbgv. +// +template< typename Value > +struct sbgv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ, typename WORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::bandwidth(bb, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(bb) == 1 || + bindings::stride_minor(bb) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(bb) >= bindings::bandwidth(bb, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::sbgv( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + return invoke( jobz, ab, bb, w, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( jobz, ab, bb, w, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sbgv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sbgv. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sbgv( const char jobz, MatrixAB& ab, MatrixBB& bb, VectorW& w, + MatrixZ& z, Workspace work ) { + return sbgv_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, bb, w, z, work ); +} + +// +// Overloaded function for sbgv. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +sbgv( const char jobz, MatrixAB& ab, MatrixBB& bb, VectorW& w, + MatrixZ& z ) { + return sbgv_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, bb, w, z, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/sbgvd.hpp b/sdk/boost/numeric/bindings/lapack/driver/sbgvd.hpp new file mode 100644 index 0000000..37c3a87 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/sbgvd.hpp @@ -0,0 +1,283 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SBGVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SBGVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sbgvd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbgvd( const char jobz, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + float* ab, const fortran_int_t ldab, float* bb, + const fortran_int_t ldbb, float* w, float* z, const fortran_int_t ldz, + float* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSBGVD( &jobz, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, w, z, &ldz, work, &lwork, iwork, &liwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbgvd( const char jobz, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + double* ab, const fortran_int_t ldab, double* bb, + const fortran_int_t ldbb, double* w, double* z, + const fortran_int_t ldz, double* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSBGVD( &jobz, &lapack_option< UpLo >::value, &n, &ka, &kb, ab, + &ldab, bb, &ldbb, w, z, &ldz, work, &lwork, iwork, &liwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sbgvd. +// +template< typename Value > +struct sbgvd_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::bandwidth(bb, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobz, bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(bb) == 1 || + bindings::stride_minor(bb) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(bb) >= bindings::bandwidth(bb, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::sbgvd( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( jobz, + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(ab) ) ); + return invoke( jobz, ab, bb, w, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAB& ab, MatrixBB& bb, + VectorW& w, MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::sbgvd( jobz, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, ab, bb, w, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return 3*n; + else + return 1 + 5*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sbgvd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sbgvd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sbgvd( const char jobz, MatrixAB& ab, MatrixBB& bb, VectorW& w, + MatrixZ& z, Workspace work ) { + return sbgvd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, bb, w, z, work ); +} + +// +// Overloaded function for sbgvd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixBB, typename VectorW, + typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +sbgvd( const char jobz, MatrixAB& ab, MatrixBB& bb, VectorW& w, + MatrixZ& z ) { + return sbgvd_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, ab, bb, w, z, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/sbgvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/sbgvx.hpp new file mode 100644 index 0000000..c18eb3a --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/sbgvx.hpp @@ -0,0 +1,302 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SBGVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SBGVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sbgvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbgvx( const char jobz, const char range, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + float* ab, const fortran_int_t ldab, float* bb, + const fortran_int_t ldbb, float* q, const fortran_int_t ldq, + const float vl, const float vu, const fortran_int_t il, + const fortran_int_t iu, const float abstol, fortran_int_t& m, + float* w, float* z, const fortran_int_t ldz, float* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSBGVX( &jobz, &range, &lapack_option< UpLo >::value, &n, &ka, &kb, + ab, &ldab, bb, &ldbb, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, + z, &ldz, work, iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sbgvx( const char jobz, const char range, const UpLo, + const fortran_int_t n, const fortran_int_t ka, const fortran_int_t kb, + double* ab, const fortran_int_t ldab, double* bb, + const fortran_int_t ldbb, double* q, const fortran_int_t ldq, + const double vl, const double vu, const fortran_int_t il, + const fortran_int_t iu, const double abstol, fortran_int_t& m, + double* w, double* z, const fortran_int_t ldz, double* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSBGVX( &jobz, &range, &lapack_option< UpLo >::value, &n, &ka, &kb, + ab, &ldab, bb, &ldbb, q, &ldq, &vl, &vu, &il, &iu, &abstol, &m, w, + z, &ldz, work, iwork, ifail, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sbgvx. +// +template< typename Value > +struct sbgvx_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAB, typename MatrixBB, typename MatrixQ, + typename VectorW, typename MatrixZ, typename VectorIFAIL, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixBB& bb, MatrixQ& q, const real_type vl, + const real_type vu, const fortran_int_t il, + const fortran_int_t iu, const real_type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixQ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAB >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixQ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::bandwidth(ab, uplo()) >= 0 ); + BOOST_ASSERT( bindings::bandwidth(bb, uplo()) >= 0 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ab) )); + BOOST_ASSERT( bindings::size_column(ab) >= 0 ); + BOOST_ASSERT( bindings::size_minor(ab) == 1 || + bindings::stride_minor(ab) == 1 ); + BOOST_ASSERT( bindings::size_minor(bb) == 1 || + bindings::stride_minor(bb) == 1 ); + BOOST_ASSERT( bindings::size_minor(q) == 1 || + bindings::stride_minor(q) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(ab) >= bindings::bandwidth(ab, + uplo())+1 ); + BOOST_ASSERT( bindings::stride_major(bb) >= bindings::bandwidth(bb, + uplo())+1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::sbgvx( jobz, range, uplo(), bindings::size_column(ab), + bindings::bandwidth(ab, uplo()), bindings::bandwidth(bb, + uplo()), bindings::begin_value(ab), + bindings::stride_major(ab), bindings::begin_value(bb), + bindings::stride_major(bb), bindings::begin_value(q), + bindings::stride_major(q), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAB, typename MatrixBB, typename MatrixQ, + typename VectorW, typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixBB& bb, MatrixQ& q, const real_type vl, + const real_type vu, const fortran_int_t il, + const fortran_int_t iu, const real_type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ab) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ab) ) ); + return invoke( jobz, range, ab, bb, q, vl, vu, il, iu, abstol, m, w, + z, ifail, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAB, typename MatrixBB, typename MatrixQ, + typename VectorW, typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAB& ab, MatrixBB& bb, MatrixQ& q, const real_type vl, + const real_type vu, const fortran_int_t il, + const fortran_int_t iu, const real_type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAB >::type uplo; + return invoke( jobz, range, ab, bb, q, vl, vu, il, iu, abstol, m, w, + z, ifail, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 7*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sbgvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sbgvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAB, typename MatrixBB, typename MatrixQ, + typename VectorW, typename MatrixZ, typename VectorIFAIL, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sbgvx( const char jobz, const char range, MatrixAB& ab, MatrixBB& bb, + MatrixQ& q, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + Workspace work ) { + return sbgvx_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, range, ab, bb, q, vl, vu, il, + iu, abstol, m, w, z, ifail, work ); +} + +// +// Overloaded function for sbgvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAB, typename MatrixBB, typename MatrixQ, + typename VectorW, typename MatrixZ, typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +sbgvx( const char jobz, const char range, MatrixAB& ab, MatrixBB& bb, + MatrixQ& q, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixAB >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixAB >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail ) { + return sbgvx_impl< typename bindings::value_type< + MatrixAB >::type >::invoke( jobz, range, ab, bb, q, vl, vu, il, + iu, abstol, m, w, z, ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/spev.hpp b/sdk/boost/numeric/bindings/lapack/driver/spev.hpp new file mode 100644 index 0000000..5d8b5d4 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/spev.hpp @@ -0,0 +1,207 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPEV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPEV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for spev is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spev( const char jobz, const UpLo, const fortran_int_t n, + float* ap, float* w, float* z, const fortran_int_t ldz, float* work ) { + fortran_int_t info(0); + LAPACK_SSPEV( &jobz, &lapack_option< UpLo >::value, &n, ap, w, z, &ldz, + work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spev( const char jobz, const UpLo, const fortran_int_t n, + double* ap, double* w, double* z, const fortran_int_t ldz, + double* work ) { + fortran_int_t info(0); + LAPACK_DSPEV( &jobz, &lapack_option< UpLo >::value, &n, ap, w, z, &ldz, + work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to spev. +// +template< typename Value > +struct spev_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename WORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::spev( jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + return invoke( jobz, ap, w, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( jobz, ap, w, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the spev_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for spev. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +spev( const char jobz, MatrixAP& ap, VectorW& w, MatrixZ& z, + Workspace work ) { + return spev_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( jobz, ap, w, z, work ); +} + +// +// Overloaded function for spev. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename VectorW, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +spev( const char jobz, MatrixAP& ap, VectorW& w, MatrixZ& z ) { + return spev_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( jobz, ap, w, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/spevd.hpp b/sdk/boost/numeric/bindings/lapack/driver/spevd.hpp new file mode 100644 index 0000000..81082f7 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/spevd.hpp @@ -0,0 +1,248 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPEVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPEVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for spevd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spevd( const char jobz, const UpLo, + const fortran_int_t n, float* ap, float* w, float* z, + const fortran_int_t ldz, float* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSPEVD( &jobz, &lapack_option< UpLo >::value, &n, ap, w, z, &ldz, + work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spevd( const char jobz, const UpLo, + const fortran_int_t n, double* ap, double* w, double* z, + const fortran_int_t ldz, double* work, const fortran_int_t lwork, + fortran_int_t* iwork, const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSPEVD( &jobz, &lapack_option< UpLo >::value, &n, ap, w, z, &ldz, + work, &lwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to spevd. +// +template< typename Value > +struct spevd_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::spevd( jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( jobz, + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(ap) ) ); + return invoke( jobz, ap, w, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, MatrixAP& ap, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::spevd( jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, ap, w, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return 2*n; + else + return 1 + 6*n + n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the spevd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for spevd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +spevd( const char jobz, MatrixAP& ap, VectorW& w, MatrixZ& z, + Workspace work ) { + return spevd_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( jobz, ap, w, z, work ); +} + +// +// Overloaded function for spevd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename VectorW, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +spevd( const char jobz, MatrixAP& ap, VectorW& w, MatrixZ& z ) { + return spevd_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( jobz, ap, w, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/spevx.hpp b/sdk/boost/numeric/bindings/lapack/driver/spevx.hpp new file mode 100644 index 0000000..dcd23ef --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/spevx.hpp @@ -0,0 +1,261 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPEVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPEVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for spevx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, float* ap, const float vl, const float vu, + const fortran_int_t il, const fortran_int_t iu, const float abstol, + fortran_int_t& m, float* w, float* z, const fortran_int_t ldz, + float* work, fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSPEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, ap, &vl, + &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, iwork, ifail, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, double* ap, const double vl, const double vu, + const fortran_int_t il, const fortran_int_t iu, const double abstol, + fortran_int_t& m, double* w, double* z, const fortran_int_t ldz, + double* work, fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSPEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, ap, &vl, + &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, iwork, ifail, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to spevx. +// +template< typename Value > +struct spevx_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename VectorIFAIL, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAP& ap, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::spevx( jobz, range, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAP& ap, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( jobz, range, ap, vl, vu, il, iu, abstol, m, w, z, + ifail, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixAP& ap, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( jobz, range, ap, vl, vu, il, iu, abstol, m, w, z, + ifail, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 8*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the spevx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for spevx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename VectorIFAIL, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +spevx( const char jobz, const char range, MatrixAP& ap, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, Workspace work ) { + return spevx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( jobz, range, ap, vl, vu, il, iu, + abstol, m, w, z, ifail, work ); +} + +// +// Overloaded function for spevx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename VectorW, typename MatrixZ, + typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +spevx( const char jobz, const char range, MatrixAP& ap, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail ) { + return spevx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( jobz, range, ap, vl, vu, il, iu, + abstol, m, w, z, ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/spgv.hpp b/sdk/boost/numeric/bindings/lapack/driver/spgv.hpp new file mode 100644 index 0000000..521524b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/spgv.hpp @@ -0,0 +1,222 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPGV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPGV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for spgv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spgv( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, float* ap, float* bp, float* w, + float* z, const fortran_int_t ldz, float* work ) { + fortran_int_t info(0); + LAPACK_SSPGV( &itype, &jobz, &lapack_option< UpLo >::value, &n, ap, bp, w, + z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spgv( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, double* ap, double* bp, double* w, + double* z, const fortran_int_t ldz, double* work ) { + fortran_int_t info(0); + LAPACK_DSPGV( &itype, &jobz, &lapack_option< UpLo >::value, &n, ap, bp, w, + z, &ldz, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to spgv. +// +template< typename Value > +struct spgv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename WORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::spgv( itype, jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(bp), + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + return invoke( itype, jobz, ap, bp, w, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( itype, jobz, ap, bp, w, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the spgv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for spgv. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +spgv( const fortran_int_t itype, const char jobz, MatrixAP& ap, + MatrixBP& bp, VectorW& w, MatrixZ& z, Workspace work ) { + return spgv_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( itype, jobz, ap, bp, w, z, work ); +} + +// +// Overloaded function for spgv. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +spgv( const fortran_int_t itype, const char jobz, MatrixAP& ap, + MatrixBP& bp, VectorW& w, MatrixZ& z ) { + return spgv_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( itype, jobz, ap, bp, w, z, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/spgvd.hpp b/sdk/boost/numeric/bindings/lapack/driver/spgvd.hpp new file mode 100644 index 0000000..4f3fce9 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/spgvd.hpp @@ -0,0 +1,267 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPGVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPGVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for spgvd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spgvd( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, float* ap, float* bp, float* w, + float* z, const fortran_int_t ldz, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSPGVD( &itype, &jobz, &lapack_option< UpLo >::value, &n, ap, bp, + w, z, &ldz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spgvd( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, double* ap, double* bp, double* w, + double* z, const fortran_int_t ldz, double* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSPGVD( &itype, &jobz, &lapack_option< UpLo >::value, &n, ap, bp, + w, z, &ldz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to spgvd. +// +template< typename Value > +struct spgvd_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobz, bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::spgvd( itype, jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(bp), + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( jobz, + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(ap) ) ); + return invoke( itype, jobz, ap, bp, w, z, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixAP& ap, MatrixBP& bp, VectorW& w, + MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::spgvd( itype, jobz, uplo(), bindings::size_column(ap), + bindings::begin_value(ap), bindings::begin_value(bp), + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), &opt_size_work, -1, + &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( itype, jobz, ap, bp, w, z, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return 2*n; + else + return 1 + 6*n + n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the spgvd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for spgvd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +spgvd( const fortran_int_t itype, const char jobz, MatrixAP& ap, + MatrixBP& bp, VectorW& w, MatrixZ& z, Workspace work ) { + return spgvd_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( itype, jobz, ap, bp, w, z, work ); +} + +// +// Overloaded function for spgvd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +spgvd( const fortran_int_t itype, const char jobz, MatrixAP& ap, + MatrixBP& bp, VectorW& w, MatrixZ& z ) { + return spgvd_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( itype, jobz, ap, bp, w, z, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/spgvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/spgvx.hpp new file mode 100644 index 0000000..fa09c5f --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/spgvx.hpp @@ -0,0 +1,275 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPGVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPGVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for spgvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spgvx( const fortran_int_t itype, const char jobz, + const char range, const UpLo, const fortran_int_t n, float* ap, + float* bp, const float vl, const float vu, const fortran_int_t il, + const fortran_int_t iu, const float abstol, fortran_int_t& m, + float* w, float* z, const fortran_int_t ldz, float* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSPGVX( &itype, &jobz, &range, &lapack_option< UpLo >::value, &n, + ap, bp, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, iwork, + ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spgvx( const fortran_int_t itype, const char jobz, + const char range, const UpLo, const fortran_int_t n, double* ap, + double* bp, const double vl, const double vu, const fortran_int_t il, + const fortran_int_t iu, const double abstol, fortran_int_t& m, + double* w, double* z, const fortran_int_t ldz, double* work, + fortran_int_t* iwork, fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSPGVX( &itype, &jobz, &range, &lapack_option< UpLo >::value, &n, + ap, bp, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, iwork, + ifail, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to spgvx. +// +template< typename Value > +struct spgvx_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixAP& ap, MatrixBP& bp, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixBP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixBP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(ap) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::spgvx( itype, jobz, range, uplo(), + bindings::size_column(ap), bindings::begin_value(ap), + bindings::begin_value(bp), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixAP& ap, MatrixBP& bp, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( itype, jobz, range, ap, bp, vl, vu, il, iu, abstol, m, + w, z, ifail, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixAP& ap, MatrixBP& bp, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( itype, jobz, range, ap, bp, vl, vu, il, iu, abstol, m, + w, z, ifail, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 8*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the spgvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for spgvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +spgvx( const fortran_int_t itype, const char jobz, const char range, + MatrixAP& ap, MatrixBP& bp, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + Workspace work ) { + return spgvx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( itype, jobz, range, ap, bp, vl, vu, + il, iu, abstol, m, w, z, ifail, work ); +} + +// +// Overloaded function for spgvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename MatrixBP, typename VectorW, + typename MatrixZ, typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +spgvx( const fortran_int_t itype, const char jobz, const char range, + MatrixAP& ap, MatrixBP& bp, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixAP >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail ) { + return spgvx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( itype, jobz, range, ap, bp, vl, vu, + il, iu, abstol, m, w, z, ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/spsv.hpp b/sdk/boost/numeric/bindings/lapack/driver/spsv.hpp new file mode 100644 index 0000000..c273ef3 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/spsv.hpp @@ -0,0 +1,176 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPSV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for spsv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spsv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, float* ap, fortran_int_t* ipiv, float* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_SSPSV( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spsv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, double* ap, fortran_int_t* ipiv, double* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_DSPSV( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spsv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* ap, + fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_CSPSV( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, &ldb, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spsv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* ap, + fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb ) { + fortran_int_t info(0); + LAPACK_ZSPSV( &lapack_option< UpLo >::value, &n, &nrhs, ap, ipiv, b, &ldb, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to spsv. +// +template< typename Value > +struct spsv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( MatrixAP& ap, VectorIPIV& ipiv, MatrixB& b ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + return detail::spsv( uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(ipiv), bindings::begin_value(b), + bindings::stride_major(b) ); + } + +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the spsv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for spsv. Its overload differs for +// +template< typename MatrixAP, typename VectorIPIV, typename MatrixB > +inline std::ptrdiff_t spsv( MatrixAP& ap, VectorIPIV& ipiv, MatrixB& b ) { + return spsv_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( ap, ipiv, b ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/spsvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/spsvx.hpp new file mode 100644 index 0000000..adce7af --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/spsvx.hpp @@ -0,0 +1,457 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPSVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SPSVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for spsvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, const float* ap, + float* afp, fortran_int_t* ipiv, const float* b, + const fortran_int_t ldb, float* x, const fortran_int_t ldx, + float& rcond, float* ferr, float* berr, float* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SSPSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, + ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, const double* ap, + double* afp, fortran_int_t* ipiv, const double* b, + const fortran_int_t ldb, double* x, const fortran_int_t ldx, + double& rcond, double* ferr, double* berr, double* work, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DSPSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, + ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* ap, std::complex* afp, + fortran_int_t* ipiv, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, float& rcond, float* ferr, float* berr, + std::complex* work, float* rwork ) { + fortran_int_t info(0); + LAPACK_CSPSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, + ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t spsvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* ap, std::complex* afp, + fortran_int_t* ipiv, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, double& rcond, double* ferr, double* berr, + std::complex* work, double* rwork ) { + fortran_int_t info(0); + LAPACK_ZSPSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, ap, afp, + ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to spsvx. +// +template< typename Value, typename Enable = void > +struct spsvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct spsvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char fact, const MatrixAP& ap, + MatrixAFP& afp, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAFP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( fact == 'F' || fact == 'N' ); + return detail::spsvx( fact, uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(afp), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixAP& ap, + MatrixAFP& afp, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(ap) ) ); + return invoke( fact, ap, afp, ipiv, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixAP& ap, + MatrixAFP& afp, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( fact, ap, afp, ipiv, b, x, rcond, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 3*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct spsvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char fact, const MatrixAP& ap, + MatrixAFP& afp, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAFP >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixAP >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAFP >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(ap) )); + BOOST_ASSERT( bindings::size_column(ap) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(ap)) ); + BOOST_ASSERT( fact == 'F' || fact == 'N' ); + return detail::spsvx( fact, uplo(), bindings::size_column(ap), + bindings::size_column(b), bindings::begin_value(ap), + bindings::begin_value(afp), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixAP& ap, + MatrixAFP& afp, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(ap) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(ap) ) ); + return invoke( fact, ap, afp, ipiv, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixAP& ap, + MatrixAFP& afp, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixAP >::type uplo; + return invoke( fact, ap, afp, ipiv, b, x, rcond, ferr, berr, + minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 2*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the spsvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for spsvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +spsvx( const char fact, const MatrixAP& ap, MatrixAFP& afp, + VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type& rcond, VectorFERR& ferr, VectorBERR& berr, + Workspace work ) { + return spsvx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( fact, ap, afp, ipiv, b, x, rcond, + ferr, berr, work ); +} + +// +// Overloaded function for spsvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixAP, typename MatrixAFP, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +spsvx( const char fact, const MatrixAP& ap, MatrixAFP& afp, + VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + typename remove_imaginary< typename bindings::value_type< + MatrixAP >::type >::type& rcond, VectorFERR& ferr, VectorBERR& berr ) { + return spsvx_impl< typename bindings::value_type< + MatrixAP >::type >::invoke( fact, ap, afp, ipiv, b, x, rcond, + ferr, berr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/stev.hpp b/sdk/boost/numeric/bindings/lapack/driver/stev.hpp new file mode 100644 index 0000000..4a556a8 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/stev.hpp @@ -0,0 +1,200 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_STEV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_STEV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for stev is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t stev( const char jobz, const fortran_int_t n, float* d, + float* e, float* z, const fortran_int_t ldz, float* work ) { + fortran_int_t info(0); + LAPACK_SSTEV( &jobz, &n, d, e, z, &ldz, work, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t stev( const char jobz, const fortran_int_t n, double* d, + double* e, double* z, const fortran_int_t ldz, double* work ) { + fortran_int_t info(0); + LAPACK_DSTEV( &jobz, &n, d, e, z, &ldz, work, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to stev. +// +template< typename Value > +struct stev_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixZ, + typename WORK > + static std::ptrdiff_t invoke( const char jobz, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixZ& z, detail::workspace1< + WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(e) >= n-1 ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( n >= 0 ); + return detail::stev( jobz, n, bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( n ) ); + return invoke( jobz, n, d, e, z, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( jobz, n, d, e, z, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 2*n-2 ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the stev_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for stev. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +stev( const char jobz, const fortran_int_t n, VectorD& d, + VectorE& e, MatrixZ& z, Workspace work ) { + return stev_impl< typename bindings::value_type< + VectorD >::type >::invoke( jobz, n, d, e, z, work ); +} + +// +// Overloaded function for stev. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +stev( const char jobz, const fortran_int_t n, VectorD& d, + VectorE& e, MatrixZ& z ) { + return stev_impl< typename bindings::value_type< + VectorD >::type >::invoke( jobz, n, d, e, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/stevd.hpp b/sdk/boost/numeric/bindings/lapack/driver/stevd.hpp new file mode 100644 index 0000000..b90dd39 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/stevd.hpp @@ -0,0 +1,241 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_STEVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_STEVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for stevd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t stevd( const char jobz, const fortran_int_t n, float* d, + float* e, float* z, const fortran_int_t ldz, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSTEVD( &jobz, &n, d, e, z, &ldz, work, &lwork, iwork, &liwork, + &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t stevd( const char jobz, const fortran_int_t n, double* d, + double* e, double* z, const fortran_int_t ldz, double* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSTEVD( &jobz, &n, d, e, z, &ldz, work, &lwork, iwork, &liwork, + &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to stevd. +// +template< typename Value > +struct stevd_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename MatrixZ, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixZ& z, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_ASSERT( bindings::size(e) >= n-1 ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, n )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobz, n )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( n >= 0 ); + return detail::stevd( jobz, n, bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixZ& z, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( jobz, + n ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, n ) ); + return invoke( jobz, n, d, e, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename MatrixZ > + static std::ptrdiff_t invoke( const char jobz, const fortran_int_t n, + VectorD& d, VectorE& e, MatrixZ& z, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::stevd( jobz, n, bindings::begin_value(d), + bindings::begin_value(e), bindings::begin_value(z), + bindings::stride_major(z), &opt_size_work, -1, + &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, n, d, e, z, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 1 + 4*n + n*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the stevd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for stevd. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename MatrixZ, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +stevd( const char jobz, const fortran_int_t n, VectorD& d, + VectorE& e, MatrixZ& z, Workspace work ) { + return stevd_impl< typename bindings::value_type< + VectorD >::type >::invoke( jobz, n, d, e, z, work ); +} + +// +// Overloaded function for stevd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename MatrixZ > +inline typename boost::disable_if< detail::is_workspace< MatrixZ >, + std::ptrdiff_t >::type +stevd( const char jobz, const fortran_int_t n, VectorD& d, + VectorE& e, MatrixZ& z ) { + return stevd_impl< typename bindings::value_type< + VectorD >::type >::invoke( jobz, n, d, e, z, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/stevr.hpp b/sdk/boost/numeric/bindings/lapack/driver/stevr.hpp new file mode 100644 index 0000000..81d6cc8 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/stevr.hpp @@ -0,0 +1,282 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_STEVR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_STEVR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for stevr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t stevr( const char jobz, const char range, + const fortran_int_t n, float* d, float* e, const float vl, + const float vu, const fortran_int_t il, const fortran_int_t iu, + const float abstol, fortran_int_t& m, float* w, float* z, + const fortran_int_t ldz, fortran_int_t* isuppz, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSTEVR( &jobz, &range, &n, d, e, &vl, &vu, &il, &iu, &abstol, &m, + w, z, &ldz, isuppz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t stevr( const char jobz, const char range, + const fortran_int_t n, double* d, double* e, const double vl, + const double vu, const fortran_int_t il, const fortran_int_t iu, + const double abstol, fortran_int_t& m, double* w, double* z, + const fortran_int_t ldz, fortran_int_t* isuppz, double* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSTEVR( &jobz, &range, &n, d, e, &vl, &vu, &il, &iu, &abstol, &m, + w, z, &ldz, isuppz, work, &lwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to stevr. +// +template< typename Value > +struct stevr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorISUPPZ >::value) ); + BOOST_ASSERT( bindings::size(d) >= n ); + BOOST_ASSERT( bindings::size(e) >= std::max< std::ptrdiff_t >(1,n-1) ); + BOOST_ASSERT( bindings::size(w) >= n ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( n >= 0 ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::stevr( jobz, range, n, bindings::begin_value(d), + bindings::begin_value(e), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), bindings::begin_value(isuppz), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( n ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n ) ); + return invoke( jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z, + isuppz, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::stevr( jobz, range, n, bindings::begin_value(d), + bindings::begin_value(e), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), bindings::begin_value(isuppz), + &opt_size_work, -1, &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z, + isuppz, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 20*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 10*n ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the stevr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for stevr. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +stevr( const char jobz, const char range, const fortran_int_t n, + VectorD& d, VectorE& e, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorISUPPZ& isuppz, + Workspace work ) { + return stevr_impl< typename bindings::value_type< + VectorD >::type >::invoke( jobz, range, n, d, e, vl, vu, il, iu, + abstol, m, w, z, isuppz, work ); +} + +// +// Overloaded function for stevr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorISUPPZ > +inline typename boost::disable_if< detail::is_workspace< VectorISUPPZ >, + std::ptrdiff_t >::type +stevr( const char jobz, const char range, const fortran_int_t n, + VectorD& d, VectorE& e, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorISUPPZ& isuppz ) { + return stevr_impl< typename bindings::value_type< + VectorD >::type >::invoke( jobz, range, n, d, e, vl, vu, il, iu, + abstol, m, w, z, isuppz, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/stevx.hpp b/sdk/boost/numeric/bindings/lapack/driver/stevx.hpp new file mode 100644 index 0000000..85e4e00 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/stevx.hpp @@ -0,0 +1,267 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_STEVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_STEVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for stevx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +inline std::ptrdiff_t stevx( const char jobz, const char range, + const fortran_int_t n, float* d, float* e, const float vl, + const float vu, const fortran_int_t il, const fortran_int_t iu, + const float abstol, fortran_int_t& m, float* w, float* z, + const fortran_int_t ldz, float* work, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSTEVX( &jobz, &range, &n, d, e, &vl, &vu, &il, &iu, &abstol, &m, + w, z, &ldz, work, iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +inline std::ptrdiff_t stevx( const char jobz, const char range, + const fortran_int_t n, double* d, double* e, const double vl, + const double vu, const fortran_int_t il, const fortran_int_t iu, + const double abstol, fortran_int_t& m, double* w, double* z, + const fortran_int_t ldz, double* work, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSTEVX( &jobz, &range, &n, d, e, &vl, &vu, &il, &iu, &abstol, &m, + w, z, &ldz, work, iwork, ifail, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to stevx. +// +template< typename Value > +struct stevx_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorE >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorD >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorD >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorE >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(d) >= n ); + BOOST_ASSERT( bindings::size(e) >= std::max< std::ptrdiff_t >(1,n-1) ); + BOOST_ASSERT( bindings::size(w) >= n ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( n )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( n )); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( n >= 0 ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::stevx( jobz, range, n, bindings::begin_value(d), + bindings::begin_value(e), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + bindings::detail::array< real_type > tmp_work( min_size_work( n ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( n ) ); + return invoke( jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z, + ifail, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + const fortran_int_t n, VectorD& d, VectorE& e, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + return invoke( jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z, + ifail, minimal_workspace() ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return 5*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the stevx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for stevx. Its overload differs for +// * User-defined workspace +// +template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +stevx( const char jobz, const char range, const fortran_int_t n, + VectorD& d, VectorE& e, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + Workspace work ) { + return stevx_impl< typename bindings::value_type< + VectorD >::type >::invoke( jobz, range, n, d, e, vl, vu, il, iu, + abstol, m, w, z, ifail, work ); +} + +// +// Overloaded function for stevx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename VectorD, typename VectorE, typename VectorW, + typename MatrixZ, typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +stevx( const char jobz, const char range, const fortran_int_t n, + VectorD& d, VectorE& e, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + VectorD >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< VectorD >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail ) { + return stevx_impl< typename bindings::value_type< + VectorD >::type >::invoke( jobz, range, n, d, e, vl, vu, il, iu, + abstol, m, w, z, ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/syev.hpp b/sdk/boost/numeric/bindings/lapack/driver/syev.hpp new file mode 100644 index 0000000..da8ce43 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/syev.hpp @@ -0,0 +1,210 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYEV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYEV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for syev is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t syev( const char jobz, const UpLo, const fortran_int_t n, + float* a, const fortran_int_t lda, float* w, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SSYEV( &jobz, &lapack_option< UpLo >::value, &n, a, &lda, w, work, + &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t syev( const char jobz, const UpLo, const fortran_int_t n, + double* a, const fortran_int_t lda, double* w, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DSYEV( &jobz, &lapack_option< UpLo >::value, &n, a, &lda, w, work, + &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to syev. +// +template< typename Value > +struct syev_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename WORK > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::syev( jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( jobz, a, w, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + detail::syev( jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobz, a, w, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,3*n-1); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the syev_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for syev. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorW, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +syev( const char jobz, MatrixA& a, VectorW& w, Workspace work ) { + return syev_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, a, w, work ); +} + +// +// Overloaded function for syev. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorW > +inline typename boost::disable_if< detail::is_workspace< VectorW >, + std::ptrdiff_t >::type +syev( const char jobz, MatrixA& a, VectorW& w ) { + return syev_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, a, w, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/syevd.hpp b/sdk/boost/numeric/bindings/lapack/driver/syevd.hpp new file mode 100644 index 0000000..8f2be13 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/syevd.hpp @@ -0,0 +1,243 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYEVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYEVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for syevd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t syevd( const char jobz, const UpLo, + const fortran_int_t n, float* a, const fortran_int_t lda, float* w, + float* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSYEVD( &jobz, &lapack_option< UpLo >::value, &n, a, &lda, w, work, + &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t syevd( const char jobz, const UpLo, + const fortran_int_t n, double* a, const fortran_int_t lda, double* w, + double* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSYEVD( &jobz, &lapack_option< UpLo >::value, &n, a, &lda, w, work, + &lwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to syevd. +// +template< typename Value > +struct syevd_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::syevd( jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( jobz, + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(a) ) ); + return invoke( jobz, a, w, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW > + static std::ptrdiff_t invoke( const char jobz, MatrixA& a, VectorW& w, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::syevd( jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(w), &opt_size_work, -1, &opt_size_iwork, + -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, a, w, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return 2*n + 1; + else + return 1 + 6*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the syevd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for syevd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorW, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +syevd( const char jobz, MatrixA& a, VectorW& w, Workspace work ) { + return syevd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, a, w, work ); +} + +// +// Overloaded function for syevd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorW > +inline typename boost::disable_if< detail::is_workspace< VectorW >, + std::ptrdiff_t >::type +syevd( const char jobz, MatrixA& a, VectorW& w ) { + return syevd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, a, w, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/syevr.hpp b/sdk/boost/numeric/bindings/lapack/driver/syevr.hpp new file mode 100644 index 0000000..8aa8231 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/syevr.hpp @@ -0,0 +1,286 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYEVR_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYEVR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for syevr is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t syevr( const char jobz, const char range, const UpLo, + const fortran_int_t n, float* a, const fortran_int_t lda, + const float vl, const float vu, const fortran_int_t il, + const fortran_int_t iu, const float abstol, fortran_int_t& m, + float* w, float* z, const fortran_int_t ldz, fortran_int_t* isuppz, + float* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSYEVR( &jobz, &range, &lapack_option< UpLo >::value, &n, a, &lda, + &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, isuppz, work, &lwork, + iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t syevr( const char jobz, const char range, const UpLo, + const fortran_int_t n, double* a, const fortran_int_t lda, + const double vl, const double vu, const fortran_int_t il, + const fortran_int_t iu, const double abstol, fortran_int_t& m, + double* w, double* z, const fortran_int_t ldz, fortran_int_t* isuppz, + double* work, const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSYEVR( &jobz, &range, &lapack_option< UpLo >::value, &n, a, &lda, + &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, isuppz, work, &lwork, + iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to syevr. +// +template< typename Value > +struct syevr_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorISUPPZ, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorISUPPZ >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::syevr( jobz, range, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), vl, vu, + il, iu, abstol, m, bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(isuppz), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( jobz, range, a, vl, vu, il, iu, abstol, m, w, z, + isuppz, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorISUPPZ > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::syevr( jobz, range, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), vl, vu, + il, iu, abstol, m, bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(isuppz), &opt_size_work, -1, + &opt_size_iwork, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( jobz, range, a, vl, vu, il, iu, abstol, m, w, z, + isuppz, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 26*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 10*n ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the syevr_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for syevr. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorISUPPZ, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +syevr( const char jobz, const char range, MatrixA& a, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz, Workspace work ) { + return syevr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, range, a, vl, vu, il, iu, abstol, + m, w, z, isuppz, work ); +} + +// +// Overloaded function for syevr. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorISUPPZ > +inline typename boost::disable_if< detail::is_workspace< VectorISUPPZ >, + std::ptrdiff_t >::type +syevr( const char jobz, const char range, MatrixA& a, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorISUPPZ& isuppz ) { + return syevr_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, range, a, vl, vu, il, iu, abstol, + m, w, z, isuppz, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/syevx.hpp b/sdk/boost/numeric/bindings/lapack/driver/syevx.hpp new file mode 100644 index 0000000..7cf96f9 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/syevx.hpp @@ -0,0 +1,287 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYEVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYEVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for syevx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t syevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, float* a, const fortran_int_t lda, + const float vl, const float vu, const fortran_int_t il, + const fortran_int_t iu, const float abstol, fortran_int_t& m, + float* w, float* z, const fortran_int_t ldz, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSYEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, a, &lda, + &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, &lwork, iwork, + ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t syevx( const char jobz, const char range, const UpLo, + const fortran_int_t n, double* a, const fortran_int_t lda, + const double vl, const double vu, const fortran_int_t il, + const fortran_int_t iu, const double abstol, fortran_int_t& m, + double* w, double* z, const fortran_int_t ldz, double* work, + const fortran_int_t lwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSYEVX( &jobz, &range, &lapack_option< UpLo >::value, &n, a, &lda, + &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, work, &lwork, iwork, + ifail, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to syevx. +// +template< typename Value > +struct syevx_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorIFAIL, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::syevx( jobz, range, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), vl, vu, + il, iu, abstol, m, bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( jobz, range, a, vl, vu, il, iu, abstol, m, w, z, ifail, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorIFAIL > + static std::ptrdiff_t invoke( const char jobz, const char range, + MatrixA& a, const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + detail::syevx( jobz, range, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), vl, vu, + il, iu, abstol, m, bindings::begin_value(w), + bindings::begin_value(z), bindings::stride_major(z), + &opt_size_work, -1, bindings::begin_value(tmp_iwork), + bindings::begin_value(ifail) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( jobz, range, a, vl, vu, il, iu, abstol, m, w, z, ifail, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else + return 8*n; + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the syevx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for syevx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorIFAIL, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +syevx( const char jobz, const char range, MatrixA& a, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, Workspace work ) { + return syevx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, range, a, vl, vu, il, iu, abstol, + m, w, z, ifail, work ); +} + +// +// Overloaded function for syevx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorW, typename MatrixZ, + typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +syevx( const char jobz, const char range, MatrixA& a, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type vl, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type vu, + const fortran_int_t il, const fortran_int_t iu, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail ) { + return syevx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( jobz, range, a, vl, vu, il, iu, abstol, + m, w, z, ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/sygv.hpp b/sdk/boost/numeric/bindings/lapack/driver/sygv.hpp new file mode 100644 index 0000000..30f439b --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/sygv.hpp @@ -0,0 +1,232 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYGV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYGV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sygv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sygv( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, float* a, const fortran_int_t lda, + float* b, const fortran_int_t ldb, float* w, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SSYGV( &itype, &jobz, &lapack_option< UpLo >::value, &n, a, &lda, + b, &ldb, w, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sygv( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, double* a, const fortran_int_t lda, + double* b, const fortran_int_t ldb, double* w, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DSYGV( &itype, &jobz, &lapack_option< UpLo >::value, &n, a, &lda, + b, &ldb, w, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sygv. +// +template< typename Value > +struct sygv_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename WORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::sygv( itype, jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(w), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorW > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + return invoke( itype, jobz, a, b, w, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorW > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + detail::sygv( itype, jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(w), &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( itype, jobz, a, b, w, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 3*n-1 ); + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sygv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sygv. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorW, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sygv( const fortran_int_t itype, const char jobz, MatrixA& a, + MatrixB& b, VectorW& w, Workspace work ) { + return sygv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, jobz, a, b, w, work ); +} + +// +// Overloaded function for sygv. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorW > +inline typename boost::disable_if< detail::is_workspace< VectorW >, + std::ptrdiff_t >::type +sygv( const fortran_int_t itype, const char jobz, MatrixA& a, + MatrixB& b, VectorW& w ) { + return sygv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, jobz, a, b, w, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/sygvd.hpp b/sdk/boost/numeric/bindings/lapack/driver/sygvd.hpp new file mode 100644 index 0000000..cc9573f --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/sygvd.hpp @@ -0,0 +1,266 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYGVD_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYGVD_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sygvd is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sygvd( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, float* a, const fortran_int_t lda, + float* b, const fortran_int_t ldb, float* w, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_SSYGVD( &itype, &jobz, &lapack_option< UpLo >::value, &n, a, &lda, + b, &ldb, w, work, &lwork, iwork, &liwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sygvd( const fortran_int_t itype, const char jobz, + const UpLo, const fortran_int_t n, double* a, const fortran_int_t lda, + double* b, const fortran_int_t ldb, double* w, double* work, + const fortran_int_t lwork, fortran_int_t* iwork, + const fortran_int_t liwork ) { + fortran_int_t info(0); + LAPACK_DSYGVD( &itype, &jobz, &lapack_option< UpLo >::value, &n, a, &lda, + b, &ldb, w, work, &lwork, iwork, &liwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sygvd. +// +template< typename Value > +struct sygvd_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( jobz, bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + return detail::sygvd( itype, jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(w), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::size(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorW > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( jobz, + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( jobz, bindings::size_column(a) ) ); + return invoke( itype, jobz, a, b, w, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorW > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, MatrixA& a, MatrixB& b, VectorW& w, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + fortran_int_t opt_size_iwork; + detail::sygvd( itype, jobz, uplo(), bindings::size_column(a), + bindings::begin_value(a), bindings::stride_major(a), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(w), &opt_size_work, -1, &opt_size_iwork, + -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + opt_size_iwork ); + return invoke( itype, jobz, a, b, w, workspace( tmp_work, + tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const char jobz, + const std::ptrdiff_t n ) { + if ( n < 2 ) + return 1; + else { + if ( jobz == 'N' ) + return 2*n + 1; + else + return 1 + 6*n + 2*n*n; + } + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const char jobz, + const std::ptrdiff_t n ) { + if ( jobz == 'N' || n < 2 ) + return 1; + else + return 3 + 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sygvd_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sygvd. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorW, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sygvd( const fortran_int_t itype, const char jobz, MatrixA& a, + MatrixB& b, VectorW& w, Workspace work ) { + return sygvd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, jobz, a, b, w, work ); +} + +// +// Overloaded function for sygvd. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorW > +inline typename boost::disable_if< detail::is_workspace< VectorW >, + std::ptrdiff_t >::type +sygvd( const fortran_int_t itype, const char jobz, MatrixA& a, + MatrixB& b, VectorW& w ) { + return sygvd_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, jobz, a, b, w, + optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/sygvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/sygvx.hpp new file mode 100644 index 0000000..e6db0f9 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/sygvx.hpp @@ -0,0 +1,305 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYGVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYGVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sygvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sygvx( const fortran_int_t itype, const char jobz, + const char range, const UpLo, const fortran_int_t n, float* a, + const fortran_int_t lda, float* b, const fortran_int_t ldb, + const float vl, const float vu, const fortran_int_t il, + const fortran_int_t iu, const float abstol, fortran_int_t& m, + float* w, float* z, const fortran_int_t ldz, float* work, + const fortran_int_t lwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_SSYGVX( &itype, &jobz, &range, &lapack_option< UpLo >::value, &n, + a, &lda, b, &ldb, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, + work, &lwork, iwork, ifail, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sygvx( const fortran_int_t itype, const char jobz, + const char range, const UpLo, const fortran_int_t n, double* a, + const fortran_int_t lda, double* b, const fortran_int_t ldb, + const double vl, const double vu, const fortran_int_t il, + const fortran_int_t iu, const double abstol, fortran_int_t& m, + double* w, double* z, const fortran_int_t ldz, double* work, + const fortran_int_t lwork, fortran_int_t* iwork, + fortran_int_t* ifail ) { + fortran_int_t info(0); + LAPACK_DSYGVX( &itype, &jobz, &range, &lapack_option< UpLo >::value, &n, + a, &lda, b, &ldb, &vl, &vu, &il, &iu, &abstol, &m, w, z, &ldz, + work, &lwork, iwork, ifail, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sygvx. +// +template< typename Value > +struct sygvx_impl { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename WORK, + typename IWORK > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixA& a, MatrixB& b, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, detail::workspace2< WORK, + IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorW >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixZ >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorW >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixZ >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIFAIL >::value) ); + BOOST_ASSERT( bindings::size(w) >= bindings::size_column(a) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(z) == 1 || + bindings::stride_minor(z) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( jobz == 'N' || jobz == 'V' ); + BOOST_ASSERT( range == 'A' || range == 'V' || range == 'I' ); + return detail::sygvx( itype, jobz, range, uplo(), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())), + bindings::begin_value(ifail) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixA& a, MatrixB& b, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( itype, jobz, range, a, b, vl, vu, il, iu, abstol, m, w, + z, ifail, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixB, typename VectorW, + typename MatrixZ, typename VectorIFAIL > + static std::ptrdiff_t invoke( const fortran_int_t itype, + const char jobz, const char range, MatrixA& a, MatrixB& b, + const real_type vl, const real_type vu, + const fortran_int_t il, const fortran_int_t iu, + const real_type abstol, fortran_int_t& m, VectorW& w, + MatrixZ& z, VectorIFAIL& ifail, optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + detail::sygvx( itype, jobz, range, uplo(), + bindings::size_column(a), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(b), + bindings::stride_major(b), vl, vu, il, iu, abstol, m, + bindings::begin_value(w), bindings::begin_value(z), + bindings::stride_major(z), &opt_size_work, -1, + bindings::begin_value(tmp_iwork), + bindings::begin_value(ifail) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( itype, jobz, range, a, b, vl, vu, il, iu, abstol, m, w, + z, ifail, workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >(1,8*n); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return 5*n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sygvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sygvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixB, typename VectorW, + typename MatrixZ, typename VectorIFAIL, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sygvx( const fortran_int_t itype, const char jobz, const char range, + MatrixA& a, MatrixB& b, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail, + Workspace work ) { + return sygvx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, jobz, range, a, b, vl, vu, il, + iu, abstol, m, w, z, ifail, work ); +} + +// +// Overloaded function for sygvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixB, typename VectorW, + typename MatrixZ, typename VectorIFAIL > +inline typename boost::disable_if< detail::is_workspace< VectorIFAIL >, + std::ptrdiff_t >::type +sygvx( const fortran_int_t itype, const char jobz, const char range, + MatrixA& a, MatrixB& b, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type vl, + const typename remove_imaginary< typename bindings::value_type< + MatrixA >::type >::type vu, const fortran_int_t il, + const fortran_int_t iu, const typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type abstol, + fortran_int_t& m, VectorW& w, MatrixZ& z, VectorIFAIL& ifail ) { + return sygvx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( itype, jobz, range, a, b, vl, vu, il, + iu, abstol, m, w, z, ifail, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/sysv.hpp b/sdk/boost/numeric/bindings/lapack/driver/sysv.hpp new file mode 100644 index 0000000..6632865 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/sysv.hpp @@ -0,0 +1,362 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYSV_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYSV_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sysv is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sysv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, float* a, const fortran_int_t lda, + fortran_int_t* ipiv, float* b, const fortran_int_t ldb, float* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_SSYSV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sysv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, double* a, const fortran_int_t lda, + fortran_int_t* ipiv, double* b, const fortran_int_t ldb, double* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_DSYSV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sysv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_CSYSV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, work, &lwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sysv( const UpLo, const fortran_int_t n, + const fortran_int_t nrhs, std::complex* a, + const fortran_int_t lda, fortran_int_t* ipiv, std::complex* b, + const fortran_int_t ldb, std::complex* work, + const fortran_int_t lwork ) { + fortran_int_t info(0); + LAPACK_ZSYSV( &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, ipiv, b, + &ldb, work, &lwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sysv. +// +template< typename Value, typename Enable = void > +struct sysv_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct sysv_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work()); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::sysv( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work() ); + return invoke( a, ipiv, b, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + detail::sysv( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + &opt_size_work, -1 ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, ipiv, b, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work() { + return 1; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct sysv_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename WORK > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, + detail::workspace1< WORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixB >::value) ); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work()); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + return detail::sysv( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work() ); + return invoke( a, ipiv, b, workspace( tmp_work ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename VectorIPIV, typename MatrixB > + static std::ptrdiff_t invoke( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + detail::sysv( uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + &opt_size_work, -1 ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( a, ipiv, b, workspace( tmp_work ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work() { + return 1; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sysv_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sysv. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename VectorIPIV, typename MatrixB, + typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sysv( MatrixA& a, VectorIPIV& ipiv, MatrixB& b, Workspace work ) { + return sysv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, b, work ); +} + +// +// Overloaded function for sysv. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename VectorIPIV, typename MatrixB > +inline typename boost::disable_if< detail::is_workspace< MatrixB >, + std::ptrdiff_t >::type +sysv( MatrixA& a, VectorIPIV& ipiv, MatrixB& b ) { + return sysv_impl< typename bindings::value_type< + MatrixA >::type >::invoke( a, ipiv, b, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/driver/sysvx.hpp b/sdk/boost/numeric/bindings/lapack/driver/sysvx.hpp new file mode 100644 index 0000000..9d72c69 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/driver/sysvx.hpp @@ -0,0 +1,516 @@ +// +// Copyright (c) 2002--2010 +// Toon Knapen, Karl Meerbergen, Kresimir Fresl, +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// THIS FILE IS AUTOMATICALLY GENERATED +// PLEASE DO NOT EDIT! +// + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYSVX_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_DRIVER_SYSVX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// The LAPACK-backend for sysvx is the netlib-compatible backend. +// +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + +// +// The detail namespace contains value-type-overloaded functions that +// dispatch to the appropriate back-end LAPACK-routine. +// +namespace detail { + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * float value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sysvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, const float* a, + const fortran_int_t lda, float* af, const fortran_int_t ldaf, + fortran_int_t* ipiv, const float* b, const fortran_int_t ldb, + float* x, const fortran_int_t ldx, float& rcond, float* ferr, + float* berr, float* work, const fortran_int_t lwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_SSYSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, + af, &ldaf, ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, + &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * double value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sysvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, const double* a, + const fortran_int_t lda, double* af, const fortran_int_t ldaf, + fortran_int_t* ipiv, const double* b, const fortran_int_t ldb, + double* x, const fortran_int_t ldx, double& rcond, double* ferr, + double* berr, double* work, const fortran_int_t lwork, + fortran_int_t* iwork ) { + fortran_int_t info(0); + LAPACK_DSYSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, + af, &ldaf, ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, + &lwork, iwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sysvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* a, const fortran_int_t lda, + std::complex* af, const fortran_int_t ldaf, + fortran_int_t* ipiv, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, float& rcond, float* ferr, float* berr, + std::complex* work, const fortran_int_t lwork, float* rwork ) { + fortran_int_t info(0); + LAPACK_CSYSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, + af, &ldaf, ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, + &lwork, rwork, &info ); + return info; +} + +// +// Overloaded function for dispatching to +// * netlib-compatible LAPACK backend (the default), and +// * complex value-type. +// +template< typename UpLo > +inline std::ptrdiff_t sysvx( const char fact, const UpLo, + const fortran_int_t n, const fortran_int_t nrhs, + const std::complex* a, const fortran_int_t lda, + std::complex* af, const fortran_int_t ldaf, + fortran_int_t* ipiv, const std::complex* b, + const fortran_int_t ldb, std::complex* x, + const fortran_int_t ldx, double& rcond, double* ferr, double* berr, + std::complex* work, const fortran_int_t lwork, + double* rwork ) { + fortran_int_t info(0); + LAPACK_ZSYSVX( &fact, &lapack_option< UpLo >::value, &n, &nrhs, a, &lda, + af, &ldaf, ipiv, b, &ldb, x, &ldx, &rcond, ferr, berr, work, + &lwork, rwork, &info ); + return info; +} + +} // namespace detail + +// +// Value-type based template class. Use this class if you need a type +// for dispatching to sysvx. +// +template< typename Value, typename Enable = void > +struct sysvx_impl {}; + +// +// This implementation is enabled if Value is a real type. +// +template< typename Value > +struct sysvx_impl< Value, typename boost::enable_if< is_real< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename IWORK > + static std::ptrdiff_t invoke( const char fact, const MatrixA& a, + MatrixAF& af, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, IWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorFERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(fortran_int_t())) >= + min_size_iwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( fact == 'F' || fact == 'N' ); + return detail::sysvx( fact, uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(real_type())), + bindings::size(work.select(real_type())), + bindings::begin_value(work.select(fortran_int_t())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixA& a, + MatrixAF& af, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< real_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + return invoke( fact, a, af, ipiv, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixA& a, + MatrixAF& af, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + real_type opt_size_work; + bindings::detail::array< fortran_int_t > tmp_iwork( + min_size_iwork( bindings::size_column(a) ) ); + detail::sysvx( fact, uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + &opt_size_work, -1, bindings::begin_value(tmp_iwork) ); + bindings::detail::array< real_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( fact, a, af, ipiv, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_iwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 3*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array iwork. + // + static std::ptrdiff_t min_size_iwork( const std::ptrdiff_t n ) { + return n; + } +}; + +// +// This implementation is enabled if Value is a complex type. +// +template< typename Value > +struct sysvx_impl< Value, typename boost::enable_if< is_complex< Value > >::type > { + + typedef Value value_type; + typedef typename remove_imaginary< Value >::type real_type; + + // + // Static member function for user-defined workspaces, that + // * Deduces the required arguments for dispatching to LAPACK, and + // * Asserts that most arguments make sense. + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename WORK, typename RWORK > + static std::ptrdiff_t invoke( const char fact, const MatrixA& a, + MatrixAF& af, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + detail::workspace2< WORK, RWORK > work ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixA >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixB >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_column_major< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< VectorFERR >::type >::type, + typename remove_const< typename bindings::value_type< + VectorBERR >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixAF >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixB >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (boost::is_same< typename remove_const< + typename bindings::value_type< MatrixA >::type >::type, + typename remove_const< typename bindings::value_type< + MatrixX >::type >::type >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixAF >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorIPIV >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< MatrixX >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorFERR >::value) ); + BOOST_STATIC_ASSERT( (bindings::is_mutable< VectorBERR >::value) ); + BOOST_ASSERT( bindings::size(berr) >= bindings::size_column(b) ); + BOOST_ASSERT( bindings::size(work.select(real_type())) >= + min_size_rwork( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size(work.select(value_type())) >= + min_size_work( bindings::size_column(a) )); + BOOST_ASSERT( bindings::size_column(a) >= 0 ); + BOOST_ASSERT( bindings::size_column(b) >= 0 ); + BOOST_ASSERT( bindings::size_minor(a) == 1 || + bindings::stride_minor(a) == 1 ); + BOOST_ASSERT( bindings::size_minor(af) == 1 || + bindings::stride_minor(af) == 1 ); + BOOST_ASSERT( bindings::size_minor(b) == 1 || + bindings::stride_minor(b) == 1 ); + BOOST_ASSERT( bindings::size_minor(x) == 1 || + bindings::stride_minor(x) == 1 ); + BOOST_ASSERT( bindings::stride_major(a) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(af) >= std::max< + std::ptrdiff_t >(1,bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(b) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( bindings::stride_major(x) >= std::max< std::ptrdiff_t >(1, + bindings::size_column(a)) ); + BOOST_ASSERT( fact == 'F' || fact == 'N' ); + return detail::sysvx( fact, uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + bindings::begin_value(work.select(value_type())), + bindings::size(work.select(value_type())), + bindings::begin_value(work.select(real_type())) ); + } + + // + // Static member function that + // * Figures out the minimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member function + // * Enables the unblocked algorithm (BLAS level 2) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixA& a, + MatrixAF& af, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + minimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + bindings::detail::array< value_type > tmp_work( min_size_work( + bindings::size_column(a) ) ); + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + return invoke( fact, a, af, ipiv, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that + // * Figures out the optimal workspace requirements, and passes + // the results to the user-defined workspace overload of the + // invoke static member + // * Enables the blocked algorithm (BLAS level 3) + // + template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > + static std::ptrdiff_t invoke( const char fact, const MatrixA& a, + MatrixAF& af, VectorIPIV& ipiv, const MatrixB& b, MatrixX& x, + real_type& rcond, VectorFERR& ferr, VectorBERR& berr, + optimal_workspace ) { + namespace bindings = ::boost::numeric::bindings; + typedef typename result_of::uplo_tag< MatrixA >::type uplo; + value_type opt_size_work; + bindings::detail::array< real_type > tmp_rwork( min_size_rwork( + bindings::size_column(a) ) ); + detail::sysvx( fact, uplo(), bindings::size_column(a), + bindings::size_column(b), bindings::begin_value(a), + bindings::stride_major(a), bindings::begin_value(af), + bindings::stride_major(af), bindings::begin_value(ipiv), + bindings::begin_value(b), bindings::stride_major(b), + bindings::begin_value(x), bindings::stride_major(x), rcond, + bindings::begin_value(ferr), bindings::begin_value(berr), + &opt_size_work, -1, bindings::begin_value(tmp_rwork) ); + bindings::detail::array< value_type > tmp_work( + traits::detail::to_int( opt_size_work ) ); + return invoke( fact, a, af, ipiv, b, x, rcond, ferr, berr, + workspace( tmp_work, tmp_rwork ) ); + } + + // + // Static member function that returns the minimum size of + // workspace-array work. + // + static std::ptrdiff_t min_size_work( const std::ptrdiff_t n ) { + return std::max< std::ptrdiff_t >( 1, 2*n ); + } + + // + // Static member function that returns the minimum size of + // workspace-array rwork. + // + static std::ptrdiff_t min_size_rwork( const std::ptrdiff_t n ) { + return n; + } +}; + + +// +// Functions for direct use. These functions are overloaded for temporaries, +// so that wrapped types can still be passed and used for write-access. In +// addition, if applicable, they are overloaded for user-defined workspaces. +// Calls to these functions are passed to the sysvx_impl classes. In the +// documentation, most overloads are collapsed to avoid a large number of +// prototypes which are very similar. +// + +// +// Overloaded function for sysvx. Its overload differs for +// * User-defined workspace +// +template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR, typename Workspace > +inline typename boost::enable_if< detail::is_workspace< Workspace >, + std::ptrdiff_t >::type +sysvx( const char fact, const MatrixA& a, MatrixAF& af, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond, + VectorFERR& ferr, VectorBERR& berr, Workspace work ) { + return sysvx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( fact, a, af, ipiv, b, x, rcond, ferr, + berr, work ); +} + +// +// Overloaded function for sysvx. Its overload differs for +// * Default workspace-type (optimal) +// +template< typename MatrixA, typename MatrixAF, typename VectorIPIV, + typename MatrixB, typename MatrixX, typename VectorFERR, + typename VectorBERR > +inline typename boost::disable_if< detail::is_workspace< VectorBERR >, + std::ptrdiff_t >::type +sysvx( const char fact, const MatrixA& a, MatrixAF& af, VectorIPIV& ipiv, + const MatrixB& b, MatrixX& x, typename remove_imaginary< + typename bindings::value_type< MatrixA >::type >::type& rcond, + VectorFERR& ferr, VectorBERR& berr ) { + return sysvx_impl< typename bindings::value_type< + MatrixA >::type >::invoke( fact, a, af, ipiv, b, x, rcond, ferr, + berr, optimal_workspace() ); +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lapack/workspace.hpp b/sdk/boost/numeric/bindings/lapack/workspace.hpp new file mode 100644 index 0000000..fa0d954 --- /dev/null +++ b/sdk/boost/numeric/bindings/lapack/workspace.hpp @@ -0,0 +1,202 @@ +/* + * + * Copyright (c) Karl Meerbergen & Kresimir Fresl 2003 + * + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + * + * KF acknowledges the support of the Faculty of Civil Engineering, + * University of Zagreb, Croatia. + * + */ + +#ifndef BOOST_NUMERIC_BINDINGS_LAPACK_WORKSPACE_HPP +#define BOOST_NUMERIC_BINDINGS_LAPACK_WORKSPACE_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace lapack { + + /* + * Organization of workspace in Lapack. + * We allow one of the following arguments in a number of Lapack functions + * - minimal_workspace() : the function allocates the minimum workspace required for the function + * - optimal_workspace() : the function allocates the amount of workspace that allows optimal + * execution. + * - workspace( work ) : the function uses the workspace array in work. + * - workspace( rwork, work ) : the function uses a real array rwork and a compolex array work as + * workspace. (There are Lapack functions for complex matrices + * that require two workarrays) + * */ + + + + // Four classes are introduced to distinguish between the different type of memory allocations + + struct minimal_workspace {} ; + + struct optimal_workspace {} ; + + namespace detail { + + template + class workspace1 { + public: + workspace1(W& w) + : w_( w ) + {} + + public: + typedef typename bindings::value_type< W>::type value_type ; + W& select( value_type const& ) { return w_ ; } + + private: + W& w_ ; + }; // struct workspace1 + + template + class workspace2 { + public: + workspace2(W& w, WRI& wri) + : w_(w) + , wri_(wri) + {} + + public: + typedef typename bindings::value_type< W>::type w_value_type ; + W& select( w_value_type const& ) { return w_ ; } + + typedef typename bindings::value_type< WRI>::type wri_value_type ; + WRI& select( wri_value_type const& ) { return wri_ ; } + + private: + W& w_ ; + WRI& wri_ ; + }; // struct workspace2 + + template + class workspace3 { + public: + workspace3(W& w, WR& wr, WI& wi) + : w_(w) + , wr_(wr) + , wi_(wi) + {} + + public: + typedef typename bindings::value_type< W>::type w_value_type ; + W& select( w_value_type const& ) { return w_ ; } + + typedef typename bindings::value_type< WR>::type wr_value_type ; + WR& select( wr_value_type const& ) { return wr_ ; } + + typedef typename bindings::value_type< WI>::type wi_value_type ; + WI& select( wi_value_type const& ) { return wi_ ; } + + private: + W& w_ ; + WR& wr_ ; + WI& wi_ ; + }; // struct workspace3 + + template + class workspace4 { + public: + workspace4(W& w, WR& wr, WI& wi, WB& wb) + : w_(w) + , wr_(wr) + , wi_(wi) + , wb_(wb) + {} + + public: + typedef typename bindings::value_type< W>::type w_value_type ; + W& select( w_value_type const& ) { return w_ ; } + + typedef typename bindings::value_type< WR>::type wr_value_type ; + WR& select( wr_value_type const& ) { return wr_ ; } + + typedef typename bindings::value_type< WI>::type wi_value_type ; + WI& select( wi_value_type const& ) { return wi_ ; } + + typedef typename bindings::value_type< WB>::type wb_value_type ; + WB& select( wb_value_type const& ) { return wb_ ; } + + private: + W& w_ ; + WR& wr_ ; + WI& wi_ ; + WB& wb_ ; + }; // struct workspace4 + + } + + template + detail::workspace1 workspace(W& w) { + return detail::workspace1(w) ; + } // workspace() + + // + // Two situations: + // Real valued: workspace( real array, integer array ) + // Complex valued: workspace( complex array, real array ) + // + template + detail::workspace2 workspace(W& w, WRI& wri) { + return detail::workspace2(w, wri) ; + } // workspace() + + // + // Complex valued: workspace( complex array, real array, integer array ) + // + template + detail::workspace3 workspace(W& w, WR& wr, WI& wi) { + return detail::workspace3(w, wr, wi) ; + } // workspace() + + // + // Complex valued: workspace( complex array, real array, integer array, bool array ) + // + template + detail::workspace4 workspace(W& w, WR& wr, WI& wi, WB& wb) { + return detail::workspace4(w, wr, wi, wb) ; + } // workspace() + + +namespace detail { + +template< typename T > +struct is_workspace: mpl::false_ {}; + +template<> +struct is_workspace< minimal_workspace >: mpl::true_ {}; + +template<> +struct is_workspace< optimal_workspace >: mpl::true_ {}; + +template< typename T > +struct is_workspace< workspace1 >: mpl::true_ {}; + +template< typename T1, typename T2 > +struct is_workspace< workspace2 >: mpl::true_ {}; + +template< typename T1, typename T2, typename T3 > +struct is_workspace< workspace3 >: mpl::true_ {}; + +template< typename T1, typename T2, typename T3, typename T4 > +struct is_workspace< workspace4 >: mpl::true_ {}; + +} + +} // namespace lapack +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/lower.hpp b/sdk/boost/numeric/bindings/lower.hpp new file mode 100644 index 0000000..516bef5 --- /dev/null +++ b/sdk/boost/numeric/bindings/lower.hpp @@ -0,0 +1,45 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_LOWER_HPP +#define BOOST_NUMERIC_BINDINGS_LOWER_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace result_of { + +template< typename T > +struct lower { + typedef detail::basic_wrapper< + T, + mpl::pair< tag::matrix_type, tag::triangular >, + mpl::pair< tag::data_side, tag::lower > + > type; +}; + +} // namespace result_of + +template< typename T > +typename result_of::lower< T >::type const lower( T& underlying ) { + return typename result_of::lower< T >::type( underlying ); +} + +template< typename T > +typename result_of::lower< const T >::type const lower( const T& underlying ) { + return typename result_of::lower< const T >::type( underlying ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/min_rank.hpp b/sdk/boost/numeric/bindings/min_rank.hpp new file mode 100644 index 0000000..31533e6 --- /dev/null +++ b/sdk/boost/numeric/bindings/min_rank.hpp @@ -0,0 +1,26 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_MIN_RANK_HPP +#define BOOST_NUMERIC_BINDINGS_MIN_RANK_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +int min_rank( T const& t ) { +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/mtl/compressed2D.hpp b/sdk/boost/numeric/bindings/mtl/compressed2D.hpp new file mode 100644 index 0000000..5abcd0e --- /dev/null +++ b/sdk/boost/numeric/bindings/mtl/compressed2D.hpp @@ -0,0 +1,88 @@ +// +// Copyright (c) 2009--2010 +// Thomas Klimpel and Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_MTL_COMPRESSED2D_HPP +#define BOOST_NUMERIC_BINDINGS_MTL_COMPRESSED2D_HPP + +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Parameters, typename Id, typename Enable > +struct adaptor< mtl::compressed2D< T, Parameters >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef typename copy_const< + Id, + //typename Id::index_type + //typename Id::size_type // (Seems to be the actually used index_type) + std::ptrdiff_t // (Seems to be an actual usable type for bindings purposes) + >::type index_type; + typedef typename convert_to< + tag::data_order, + typename Parameters::orientation + >::type data_order; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::index_type, index_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::size_type<2>, std::ptrdiff_t >, + mpl::pair< tag::matrix_type, tag::general >, + mpl::pair< tag::data_structure, tag::compressed_sparse >, + mpl::pair< tag::data_order, data_order >, + mpl::pair< tag::index_base, mpl::int_<0> > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.num_rows(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.num_cols(); + } + + static value_type* begin_value( Id& id ) { + return id.address_data(); + } + + static value_type* end_value( Id& id ) { + return id.address_data() + id.nnz(); + } + + static index_type* begin_compressed_index_major( Id& id ) { + return reinterpret_cast(id.address_major()); + } + + static index_type* end_compressed_index_major( Id& id ) { + return reinterpret_cast(id.address_major() + id.dim1() + 1); + } + + static index_type* begin_index_minor( Id& id ) { + return reinterpret_cast(id.address_minor()); + } + + static index_type* end_index_minor( Id& id ) { + return reinterpret_cast(id.address_minor() + id.nnz()); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/mtl/dense2D.hpp b/sdk/boost/numeric/bindings/mtl/dense2D.hpp new file mode 100644 index 0000000..cecb037 --- /dev/null +++ b/sdk/boost/numeric/bindings/mtl/dense2D.hpp @@ -0,0 +1,98 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_MTL_DENSE2D_HPP +#define BOOST_NUMERIC_BINDINGS_MTL_DENSE2D_HPP + +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename Dimensions, int N > +struct mtl_matrix_size_type { + typedef std::ptrdiff_t type; +}; + +template< std::size_t Rows, std::size_t Cols > +struct mtl_matrix_size_type< mtl::fixed::dimensions< Rows, Cols >, 1 > { + typedef mpl::int_< Rows > type; +}; + +template< std::size_t Rows, std::size_t Cols > +struct mtl_matrix_size_type< mtl::fixed::dimensions< Rows, Cols >, 2 > { + typedef mpl::int_< Cols > type; +}; + +template< typename T, typename Parameters, typename Id, typename Enable > +struct adaptor< mtl::dense2D< T, Parameters >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef typename convert_to< + tag::data_order, + typename Parameters::orientation + >::type data_order; + typedef typename mtl_matrix_size_type< + typename Parameters::dimensions, + 1 + >::type size_type1; + typedef typename mtl_matrix_size_type< + typename Parameters::dimensions, + 2 + >::type size_type2; + + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, size_type1 >, + mpl::pair< tag::size_type<2>, size_type2 >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::data_order, data_order >, + mpl::pair< tag::stride_type<1>, + typename if_row_major< data_order, size_type2, tag::contiguous >::type >, + mpl::pair< tag::stride_type<2>, + typename if_row_major< data_order, tag::contiguous, size_type1 >::type > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.num_rows(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.num_cols(); + } + + static value_type* begin_value( Id& id ) { + return id.elements(); + } + + static value_type* end_value( Id& id ) { + return id.elements() + id.used_memory(); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return id.num_cols(); + } + + static std::ptrdiff_t stride2( const Id& id ) { + return id.num_rows(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/mtl/dense_vector.hpp b/sdk/boost/numeric/bindings/mtl/dense_vector.hpp new file mode 100644 index 0000000..13371f4 --- /dev/null +++ b/sdk/boost/numeric/bindings/mtl/dense_vector.hpp @@ -0,0 +1,71 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_MTL_DENSE_VECTOR_HPP +#define BOOST_NUMERIC_BINDINGS_MTL_DENSE_VECTOR_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename Dimension > +struct mtl_vector_size_type { + typedef std::ptrdiff_t type; +}; + +template< std::size_t Size > +struct mtl_vector_size_type< mtl::vector::fixed::dimension< Size > > { + typedef mpl::int_< Size > type; +}; + +template< typename T, typename Parameters, typename Id, typename Enable > +struct adaptor< mtl::dense_vector< T, Parameters >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef typename convert_to< + tag::data_order, + typename Parameters::orientation + >::type data_order; + typedef typename mtl_vector_size_type< + typename Parameters::dimension + >::type size_type1; + + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, size_type1 >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::data_order, data_order >, + mpl::pair< tag::stride_type<1>, tag::contiguous > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static value_type* begin_value( Id& id ) { + return id.begin(); + } + + static value_type* end_value( Id& id ) { + return id.end(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/mtl/detail/convert_to.hpp b/sdk/boost/numeric/bindings/mtl/detail/convert_to.hpp new file mode 100644 index 0000000..1aabbfc --- /dev/null +++ b/sdk/boost/numeric/bindings/mtl/detail/convert_to.hpp @@ -0,0 +1,36 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_MTL_DETAIL_CONVERT_TO_HPP +#define BOOST_NUMERIC_BINDINGS_MTL_DETAIL_CONVERT_TO_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template<> +struct convert_to< bindings::tag::data_order, mtl::tag::row_major > { + typedef bindings::tag::row_major type; +}; + +template<> +struct convert_to< bindings::tag::data_order, mtl::tag::col_major > { + typedef bindings::tag::column_major type; +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/mumps/4.6.4/cmumps_c.hpp b/sdk/boost/numeric/bindings/mumps/4.6.4/cmumps_c.hpp new file mode 100644 index 0000000..72077b8 --- /dev/null +++ b/sdk/boost/numeric/bindings/mumps/4.6.4/cmumps_c.hpp @@ -0,0 +1,118 @@ +#ifndef BOOST_NUMERIC_BINDINGS_MUMPS_464_CMUMPS_C_HPP +#define BOOST_NUMERIC_BINDINGS_MUMPS_464_CMUMPS_C_HPP + +/* + + THIS FILE IS PART OF MUMPS VERSION 4.6.4 + This Version was built on Thu Jan 11 13:32:35 2007 + + + This version of MUMPS is provided to you free of charge. It is public + domain, based on public domain software developed during the Esprit IV + European project PARASOL (1996-1999) by CERFACS, ENSEEIHT-IRIT and RAL. + Since this first public domain version in 1999, the developments are + supported by the following institutions: CERFACS, ENSEEIHT-IRIT, and + INRIA. + + Main contributors are Patrick Amestoy, Iain Duff, Abdou Guermouche, + Jacko Koster, Jean-Yves L'Excellent, and Stephane Pralet. + + Up-to-date copies of the MUMPS package can be obtained + from the Web pages http://www.enseeiht.fr/apo/MUMPS/ + or http://graal.ens-lyon.fr/MUMPS + + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + + User documentation of any code that uses this software can + include this complete notice. You can acknowledge (using + references [1], [2], and [3] the contribution of this package + in any scientific publication dependent upon the use of the + package. You shall use reasonable endeavours to notify + the authors of the package of this publication. + + [1] P. R. Amestoy, I. S. Duff and J.-Y. L'Excellent, + Multifrontal parallel distributed symmetric and unsymmetric solvers, + in Comput. Methods in Appl. Mech. Eng., 184, 501-520 (2000). + + [2] P. R. Amestoy, I. S. Duff, J. Koster and J.-Y. L'Excellent, + A fully asynchronous multifrontal solver using distributed dynamic + scheduling, SIAM Journal of Matrix Analysis and Applications, + Vol 23, No 1, pp 15-41 (2001). + + [3] P. R. Amestoy and A. Guermouche and J.-Y. L'Excellent and + S. Pralet, Hybrid scheduling for the parallel solution of linear + systems. Parallel Computing Vol 32 (2), pp 136-156 (2006). + +*/ +/* $Id: cmumps_c.hpp 39206 2007-09-12 06:58:12Z karlmeerbergen $ */ +/* Mostly written in march 2002 (JYL) */ + +// This file is modified by Karl Meerbergen for C++ users + +/* Complex datatypes */ +typedef struct {float r,i;} mumps_complex; + +/* Next line defines CMUMPS_INT, CMUMPS_DOUBLE and CMUMPS_DOUBLE2 */ +#include "cmumps_prec.h" +/* + * Definition of the (simplified) + * MUMPS C structure + */ +typedef struct + { + CMUMPS_INT sym, par, job; + CMUMPS_INT comm_fortran; /* Fortran communicator */ + CMUMPS_INT icntl[40]; + CMUMPS_DOUBLE2 cntl[5]; + CMUMPS_INT n; + + CMUMPS_INT nz_alloc; /* used in matlab interface to decide if + we free + malloc when we have large variation */ + + /* Assembled entry */ + CMUMPS_INT nz; CMUMPS_INT *irn; CMUMPS_INT *jcn; CMUMPS_DOUBLE *a; + /* Distributed entry */ + CMUMPS_INT nz_loc; CMUMPS_INT *irn_loc; CMUMPS_INT *jcn_loc; CMUMPS_DOUBLE *a_loc; + /* Element entry */ + CMUMPS_INT nelt; CMUMPS_INT *eltptr; CMUMPS_INT *eltvar; CMUMPS_DOUBLE *a_elt; + + /* Ordering, if given by user */ + CMUMPS_INT *perm_in; + + /* Orderings returned to user */ + /* symmetric permutation */ + CMUMPS_INT *sym_perm; + /* column permutation */ + CMUMPS_INT *uns_perm; + + /* Scaling (input only in this version) */ + CMUMPS_DOUBLE *colsca; CMUMPS_DOUBLE *rowsca; + /* RHS, solution, ouptput data and statistics */ + CMUMPS_DOUBLE *rhs, *rhs_sparse, *sol_loc; + CMUMPS_INT *irhs_sparse, *irhs_ptr, *isol_loc; + CMUMPS_INT nrhs, lrhs, nz_rhs, lsol_loc; + CMUMPS_INT schur_mloc, schur_nloc, schur_lld; + CMUMPS_INT mblock, nblock, nprow, npcol; + CMUMPS_INT info[40],infog[40]; + CMUMPS_DOUBLE2 rinfo[20], rinfog[20]; + /* Null space */ + CMUMPS_INT deficiency; CMUMPS_DOUBLE * nullspace; CMUMPS_INT * mapping; + /* Schur */ + CMUMPS_INT size_schur; CMUMPS_INT *listvar_schur; CMUMPS_DOUBLE *schur; + /* Internal parameters */ + CMUMPS_INT instance_number; + /* For out-of-core */ + char ooc_tmpdir[151]; + char ooc_prefix[151]; + } CMUMPS_STRUC_C; + + +extern "C" { + void cmumps_c(CMUMPS_STRUC_C * cmumps_par); +} + +#endif + diff --git a/sdk/boost/numeric/bindings/mumps/4.6.4/dmumps_c.hpp b/sdk/boost/numeric/bindings/mumps/4.6.4/dmumps_c.hpp new file mode 100644 index 0000000..ebde123 --- /dev/null +++ b/sdk/boost/numeric/bindings/mumps/4.6.4/dmumps_c.hpp @@ -0,0 +1,125 @@ +#ifndef BOOST_NUMERIC_BINDINGS_MUMPS_464_DMUMPS_C_HPP +#define BOOST_NUMERIC_BINDINGS_MUMPS_464_DMUMPS_C_HPP + +/* + + THIS FILE IS PART OF MUMPS VERSION 4.6.4 + This Version was built on Thu Jan 11 13:32:35 2007 + + + This version of MUMPS is provided to you free of charge. It is public + domain, based on public domain software developed during the Esprit IV + European project PARASOL (1996-1999) by CERFACS, ENSEEIHT-IRIT and RAL. + Since this first public domain version in 1999, the developments are + supported by the following institutions: CERFACS, ENSEEIHT-IRIT, and + INRIA. + + Main contributors are Patrick Amestoy, Iain Duff, Abdou Guermouche, + Jacko Koster, Jean-Yves L'Excellent, and Stephane Pralet. + + Up-to-date copies of the MUMPS package can be obtained + from the Web pages http://www.enseeiht.fr/apo/MUMPS/ + or http://graal.ens-lyon.fr/MUMPS + + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + + User documentation of any code that uses this software can + include this complete notice. You can acknowledge (using + references [1], [2], and [3] the contribution of this package + in any scientific publication dependent upon the use of the + package. You shall use reasonable endeavours to notify + the authors of the package of this publication. + + [1] P. R. Amestoy, I. S. Duff and J.-Y. L'Excellent, + Multifrontal parallel distributed symmetric and unsymmetric solvers, + in Comput. Methods in Appl. Mech. Eng., 184, 501-520 (2000). + + [2] P. R. Amestoy, I. S. Duff, J. Koster and J.-Y. L'Excellent, + A fully asynchronous multifrontal solver using distributed dynamic + scheduling, SIAM Journal of Matrix Analysis and Applications, + Vol 23, No 1, pp 15-41 (2001). + + [3] P. R. Amestoy and A. Guermouche and J.-Y. L'Excellent and + S. Pralet, Hybrid scheduling for the parallel solution of linear + systems. Parallel Computing Vol 32 (2), pp 136-156 (2006). + +*/ +/* $Id: dmumps_c.hpp 39206 2007-09-12 06:58:12Z karlmeerbergen $ */ +/* Mostly written in march 2002 (JYL) */ + +// This file is modified by Karl Meerbergen for C++ users + +/* Complex datatypes */ + +/* Next line defines DMUMPS_INT, DMUMPS_DOUBLE and DMUMPS_DOUBLE2 */ +#include "dmumps_prec.h" +/* + * Definition of the (simplified) + * MUMPS C structure + */ +typedef struct + { + DMUMPS_INT sym, par, job; + DMUMPS_INT comm_fortran; /* Fortran communicator */ + DMUMPS_INT icntl[40]; + DMUMPS_DOUBLE2 cntl[5]; + DMUMPS_INT n; + + DMUMPS_INT nz_alloc; /* used in matlab interface to decide if + we free + malloc when we have large variation */ + + /* Assembled entry */ + DMUMPS_INT nz; DMUMPS_INT *irn; DMUMPS_INT *jcn; DMUMPS_DOUBLE *a; + /* Distributed entry */ + DMUMPS_INT nz_loc; DMUMPS_INT *irn_loc; DMUMPS_INT *jcn_loc; DMUMPS_DOUBLE *a_loc; + /* Element entry */ + DMUMPS_INT nelt; DMUMPS_INT *eltptr; DMUMPS_INT *eltvar; DMUMPS_DOUBLE *a_elt; + + /* Ordering, if given by user */ + DMUMPS_INT *perm_in; + + /* Orderings returned to user */ + /* symmetric permutation */ + DMUMPS_INT *sym_perm; + /* column permutation */ + DMUMPS_INT *uns_perm; + + /* Scaling (input only in this version) */ + DMUMPS_DOUBLE *colsca; DMUMPS_DOUBLE *rowsca; + /* RHS, solution, ouptput data and statistics */ + DMUMPS_DOUBLE *rhs, *rhs_sparse, *sol_loc; + DMUMPS_INT *irhs_sparse, *irhs_ptr, *isol_loc; + DMUMPS_INT nrhs, lrhs, nz_rhs, lsol_loc; + DMUMPS_INT schur_mloc, schur_nloc, schur_lld; + DMUMPS_INT mblock, nblock, nprow, npcol; + DMUMPS_INT info[40],infog[40]; + DMUMPS_DOUBLE2 rinfo[20], rinfog[20]; + /* Null space */ + DMUMPS_INT deficiency; DMUMPS_DOUBLE * nullspace; DMUMPS_INT * mapping; + /* Schur */ + DMUMPS_INT size_schur; DMUMPS_INT *listvar_schur; DMUMPS_DOUBLE *schur; + /* Internal parameters */ + DMUMPS_INT instance_number; + /* For out-of-core */ + char ooc_tmpdir[151]; + char ooc_prefix[151]; + } DMUMPS_STRUC_C; + + +#define MUMPS_CALL +#if defined(_WIN32) +/* + * Next line May be needed depending on your Windows environment: + * #define MUMPS_CALL __stdcall + */ +#endif + +extern "C" { +void dmumps_c(DMUMPS_STRUC_C * dmumps_par); +} + +#endif + diff --git a/sdk/boost/numeric/bindings/mumps/4.6.4/smumps_c.hpp b/sdk/boost/numeric/bindings/mumps/4.6.4/smumps_c.hpp new file mode 100644 index 0000000..41212e2 --- /dev/null +++ b/sdk/boost/numeric/bindings/mumps/4.6.4/smumps_c.hpp @@ -0,0 +1,117 @@ +#ifndef BOOST_NUMERIC_BINDINGS_MUMPS_464_SMUMPS_C_HPP +#define BOOST_NUMERIC_BINDINGS_MUMPS_464_SMUMPS_C_HPP + +/* + + THIS FILE IS PART OF MUMPS VERSION 4.6.4 + This Version was built on Thu Jan 11 13:32:35 2007 + + + This version of MUMPS is provided to you free of charge. It is public + domain, based on public domain software developed during the Esprit IV + European project PARASOL (1996-1999) by CERFACS, ENSEEIHT-IRIT and RAL. + Since this first public domain version in 1999, the developments are + supported by the following institutions: CERFACS, ENSEEIHT-IRIT, and + INRIA. + + Main contributors are Patrick Amestoy, Iain Duff, Abdou Guermouche, + Jacko Koster, Jean-Yves L'Excellent, and Stephane Pralet. + + Up-to-date copies of the MUMPS package can be obtained + from the Web pages http://www.enseeiht.fr/apo/MUMPS/ + or http://graal.ens-lyon.fr/MUMPS + + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + + User documentation of any code that uses this software can + include this complete notice. You can acknowledge (using + references [1], [2], and [3] the contribution of this package + in any scientific publication dependent upon the use of the + package. You shall use reasonable endeavours to notify + the authors of the package of this publication. + + [1] P. R. Amestoy, I. S. Duff and J.-Y. L'Excellent, + Multifrontal parallel distributed symmetric and unsymmetric solvers, + in Comput. Methods in Appl. Mech. Eng., 184, 501-520 (2000). + + [2] P. R. Amestoy, I. S. Duff, J. Koster and J.-Y. L'Excellent, + A fully asynchronous multifrontal solver using distributed dynamic + scheduling, SIAM Journal of Matrix Analysis and Applications, + Vol 23, No 1, pp 15-41 (2001). + + [3] P. R. Amestoy and A. Guermouche and J.-Y. L'Excellent and + S. Pralet, Hybrid scheduling for the parallel solution of linear + systems. Parallel Computing Vol 32 (2), pp 136-156 (2006). + +*/ +/* $Id: smumps_c.hpp 39206 2007-09-12 06:58:12Z karlmeerbergen $ */ +/* Mostly written in march 2002 (JYL) */ + +// This file is modified by Karl Meerbergen for C++ users + +/* Complex datatypes */ + +/* Next line defines SMUMPS_INT, SMUMPS_DOUBLE and SMUMPS_DOUBLE2 */ +#include +/* + * Definition of the (simplified) + * MUMPS C structure + */ +typedef struct + { + SMUMPS_INT sym, par, job; + SMUMPS_INT comm_fortran; /* Fortran communicator */ + SMUMPS_INT icntl[40]; + SMUMPS_DOUBLE2 cntl[5]; + SMUMPS_INT n; + + SMUMPS_INT nz_alloc; /* used in matlab interface to decide if + we free + malloc when we have large variation */ + + /* Assembled entry */ + SMUMPS_INT nz; SMUMPS_INT *irn; SMUMPS_INT *jcn; SMUMPS_DOUBLE *a; + /* Distributed entry */ + SMUMPS_INT nz_loc; SMUMPS_INT *irn_loc; SMUMPS_INT *jcn_loc; SMUMPS_DOUBLE *a_loc; + /* Element entry */ + SMUMPS_INT nelt; SMUMPS_INT *eltptr; SMUMPS_INT *eltvar; SMUMPS_DOUBLE *a_elt; + + /* Ordering, if given by user */ + SMUMPS_INT *perm_in; + + /* Orderings returned to user */ + /* symmetric permutation */ + SMUMPS_INT *sym_perm; + /* column permutation */ + SMUMPS_INT *uns_perm; + + /* Scaling (input only in this version) */ + SMUMPS_DOUBLE *colsca; SMUMPS_DOUBLE *rowsca; + /* RHS, solution, ouptput data and statistics */ + SMUMPS_DOUBLE *rhs, *rhs_sparse, *sol_loc; + SMUMPS_INT *irhs_sparse, *irhs_ptr, *isol_loc; + SMUMPS_INT nrhs, lrhs, nz_rhs, lsol_loc; + SMUMPS_INT schur_mloc, schur_nloc, schur_lld; + SMUMPS_INT mblock, nblock, nprow, npcol; + SMUMPS_INT info[40],infog[40]; + SMUMPS_DOUBLE2 rinfo[20], rinfog[20]; + /* Null space */ + SMUMPS_INT deficiency; SMUMPS_DOUBLE * nullspace; SMUMPS_INT * mapping; + /* Schur */ + SMUMPS_INT size_schur; SMUMPS_INT *listvar_schur; SMUMPS_DOUBLE *schur; + /* Internal parameters */ + SMUMPS_INT instance_number; + /* For out-of-core */ + char ooc_tmpdir[151]; + char ooc_prefix[151]; + } SMUMPS_STRUC_C; + + +extern "C" { +void smumps_c(SMUMPS_STRUC_C * smumps_par); +} + +#endif + diff --git a/sdk/boost/numeric/bindings/mumps/4.6.4/zmumps_c.hpp b/sdk/boost/numeric/bindings/mumps/4.6.4/zmumps_c.hpp new file mode 100644 index 0000000..7777591 --- /dev/null +++ b/sdk/boost/numeric/bindings/mumps/4.6.4/zmumps_c.hpp @@ -0,0 +1,118 @@ +#ifndef BOOST_NUMERIC_BINDINGS_MUMPS_464_ZMUMPS_C_HPP +#define BOOST_NUMERIC_BINDINGS_MUMPS_464_ZMUMPS_C_HPP + +/* + + THIS FILE IS PART OF MUMPS VERSION 4.6.4 + This Version was built on Thu Jan 11 13:32:35 2007 + + + This version of MUMPS is provided to you free of charge. It is public + domain, based on public domain software developed during the Esprit IV + European project PARASOL (1996-1999) by CERFACS, ENSEEIHT-IRIT and RAL. + Since this first public domain version in 1999, the developments are + supported by the following institutions: CERFACS, ENSEEIHT-IRIT, and + INRIA. + + Main contributors are Patrick Amestoy, Iain Duff, Abdou Guermouche, + Jacko Koster, Jean-Yves L'Excellent, and Stephane Pralet. + + Up-to-date copies of the MUMPS package can be obtained + from the Web pages http://www.enseeiht.fr/apo/MUMPS/ + or http://graal.ens-lyon.fr/MUMPS + + + THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + + + User documentation of any code that uses this software can + include this complete notice. You can acknowledge (using + references [1], [2], and [3] the contribution of this package + in any scientific publication dependent upon the use of the + package. You shall use reasonable endeavours to notify + the authors of the package of this publication. + + [1] P. R. Amestoy, I. S. Duff and J.-Y. L'Excellent, + Multifrontal parallel distributed symmetric and unsymmetric solvers, + in Comput. Methods in Appl. Mech. Eng., 184, 501-520 (2000). + + [2] P. R. Amestoy, I. S. Duff, J. Koster and J.-Y. L'Excellent, + A fully asynchronous multifrontal solver using distributed dynamic + scheduling, SIAM Journal of Matrix Analysis and Applications, + Vol 23, No 1, pp 15-41 (2001). + + [3] P. R. Amestoy and A. Guermouche and J.-Y. L'Excellent and + S. Pralet, Hybrid scheduling for the parallel solution of linear + systems. Parallel Computing Vol 32 (2), pp 136-156 (2006). + +*/ +/* $Id: zmumps_c.hpp 39206 2007-09-12 06:58:12Z karlmeerbergen $ */ +/* Mostly written in march 2002 (JYL) */ + +// This file is modified by Karl Meerbergen for C++ users + +/* Complex datatypes */ +typedef struct {double r,i;} mumps_double_complex; + +/* Next line defines ZMUMPS_INT, ZMUMPS_DOUBLE and ZMUMPS_DOUBLE2 */ +#include "zmumps_prec.h" +/* + * Definition of the (simplified) + * MUMPS C structure + */ +typedef struct + { + ZMUMPS_INT sym, par, job; + ZMUMPS_INT comm_fortran; /* Fortran communicator */ + ZMUMPS_INT icntl[40]; + ZMUMPS_DOUBLE2 cntl[5]; + ZMUMPS_INT n; + + ZMUMPS_INT nz_alloc; /* used in matlab interface to decide if + we free + malloc when we have large variation */ + + /* Assembled entry */ + ZMUMPS_INT nz; ZMUMPS_INT *irn; ZMUMPS_INT *jcn; ZMUMPS_DOUBLE *a; + /* Distributed entry */ + ZMUMPS_INT nz_loc; ZMUMPS_INT *irn_loc; ZMUMPS_INT *jcn_loc; ZMUMPS_DOUBLE *a_loc; + /* Element entry */ + ZMUMPS_INT nelt; ZMUMPS_INT *eltptr; ZMUMPS_INT *eltvar; ZMUMPS_DOUBLE *a_elt; + + /* Ordering, if given by user */ + ZMUMPS_INT *perm_in; + + /* Orderings returned to user */ + /* symmetric permutation */ + ZMUMPS_INT *sym_perm; + /* column permutation */ + ZMUMPS_INT *uns_perm; + + /* Scaling (input only in this version) */ + ZMUMPS_DOUBLE *colsca; ZMUMPS_DOUBLE *rowsca; + /* RHS, solution, ouptput data and statistics */ + ZMUMPS_DOUBLE *rhs, *rhs_sparse, *sol_loc; + ZMUMPS_INT *irhs_sparse, *irhs_ptr, *isol_loc; + ZMUMPS_INT nrhs, lrhs, nz_rhs, lsol_loc; + ZMUMPS_INT schur_mloc, schur_nloc, schur_lld; + ZMUMPS_INT mblock, nblock, nprow, npcol; + ZMUMPS_INT info[40],infog[40]; + ZMUMPS_DOUBLE2 rinfo[20], rinfog[20]; + /* Null space */ + ZMUMPS_INT deficiency; ZMUMPS_DOUBLE * nullspace; ZMUMPS_INT * mapping; + /* Schur */ + ZMUMPS_INT size_schur; ZMUMPS_INT *listvar_schur; ZMUMPS_DOUBLE *schur; + /* Internal parameters */ + ZMUMPS_INT instance_number; + /* For out-of-core */ + char ooc_tmpdir[151]; + char ooc_prefix[151]; + } ZMUMPS_STRUC_C; + + +extern "C" { +void zmumps_c(ZMUMPS_STRUC_C * zmumps_par); +} + +#endif + diff --git a/sdk/boost/numeric/bindings/mumps/mumps_driver.hpp b/sdk/boost/numeric/bindings/mumps/mumps_driver.hpp new file mode 100644 index 0000000..92482cd --- /dev/null +++ b/sdk/boost/numeric/bindings/mumps/mumps_driver.hpp @@ -0,0 +1,14 @@ +// +// Copyright Karl Meerbergen 2007 +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_MUMPS_MUMPS_DRIVER_HPP +#define BOOST_NUMERIC_BINDINGS_MUMPS_MUMPS_DRIVER_HPP + +#include + +#endif diff --git a/sdk/boost/numeric/bindings/mumps/mumps_driver_4_6_4.hpp b/sdk/boost/numeric/bindings/mumps/mumps_driver_4_6_4.hpp new file mode 100644 index 0000000..ade3349 --- /dev/null +++ b/sdk/boost/numeric/bindings/mumps/mumps_driver_4_6_4.hpp @@ -0,0 +1,264 @@ +// +// Copyright Karl Meerbergen 2007 +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_MUMPS_MUMPS_DRIVER_4_6_4_HPP +#define BOOST_NUMERIC_BINDINGS_MUMPS_MUMPS_DRIVER_4_6_4_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// This file contains a C++ driver for MUMPS +// +// The templated class mumps is a wrapper for the corresponding C struct. +// The class contains constructor and destructor that call mumps with JOB=-1 and JOB=-2 +// respectively. +// +// The function driver() calls MUMPS. The user must set the parameters of the data manually. +// +// The following functions are very helpful in this respect, since they extract pointer and size +// data using the Boost Bindings. +// +// void matrix_integer_data() : to set the integer data of the matrix. +// void matrix_value_data() : to set the values of the matrix. +// void rhs_sol_value_data() : to set the right-hand side and solution vectors in the case of a dense solution vector. +// + +namespace boost { namespace numeric { namespace bindings { namespace mumps { + + namespace detail { + // + // Type and Driver + // + template + struct mumps_type { + } ; + + template + struct mumps_call { + } ; + + template + struct mumps_internal_value_type { + typedef T type ; + } ; + + // + // Specialization for float + // + + template <> + struct mumps_type< float > { + typedef SMUMPS_STRUC_C type ; + } ; + + template <> + struct mumps_call< float > { + void operator() ( SMUMPS_STRUC_C& struc ) const { + smumps_c( &struc ) ; + } + } ; + + // + // Specialization for double + // + + template <> + struct mumps_type< double > { + typedef DMUMPS_STRUC_C type ; + } ; + + template <> + struct mumps_call< double > { + void operator() ( DMUMPS_STRUC_C& struc ) const { + dmumps_c( &struc ) ; + } + } ; + + // + // Specialization for complex + // + + template <> + struct mumps_type< std::complex< float > > { + typedef CMUMPS_STRUC_C type ; + } ; + + template <> + struct mumps_call< std::complex< float > > { + void operator() ( CMUMPS_STRUC_C& struc ) const { + cmumps_c( &struc ) ; + } + } ; + + template <> + struct mumps_internal_value_type< std::complex > { + typedef mumps_complex type ; + } ; + + // + // Specialization for complex + // + + template <> + struct mumps_type< std::complex< double > > { + typedef ZMUMPS_STRUC_C type ; + } ; + + template <> + struct mumps_call< std::complex< double > > { + void operator() ( ZMUMPS_STRUC_C& struc ) const { + zmumps_c( &struc ) ; + } + } ; + + template <> + struct mumps_internal_value_type< std::complex > { + typedef mumps_double_complex type ; + } ; + + // + // Symmetry map + // + + template + struct mumps_sym { + } ; + + template <> + struct mumps_sym< bindings::tag::symmetric > { + static int const value = 2 ; + } ; + + template <> + struct mumps_sym< bindings::tag::general > { + static int const value = 0 ; + } ; + + // + // Get index pointers + // + template + void indices( bindings::tag::row_major, int*& rows, int*& cols, M const& m ) { + rows = const_cast( bindings::begin_index_major( m ) ) ; + cols = const_cast( bindings::begin_index_minor( m ) ) ; + } + + template + void indices( bindings::tag::column_major, int*& rows, int*& cols, M const& m ) { + cols = const_cast( bindings::begin_index_major( m ) ) ; + rows = const_cast( bindings::begin_index_minor( m ) ) ; + } + + // Pointer Cast + float* cast_2_mumps( float* p ) { return p ; } + double* cast_2_mumps( double* p ) { return p ; } + mumps_double_complex* cast_2_mumps( std::complex* p ) { return reinterpret_cast( p ) ; } + mumps_complex* cast_2_mumps( std::complex* p ) { return reinterpret_cast( p ) ; } + } // namespace detail + + + + // + // Generic MUMPS data for any value_type + // + template + struct mumps + : detail::mumps_type< typename bindings::value_type::type >::type + { + typedef typename bindings::value_type::type value_type ; + typedef typename detail::mumps_type< typename bindings::value_type::type >::type c_struct_type ; + + // + // Initialize MUMPS solver + // Pass a communicator (comm=-987654 means choose default) + // Pass 'par': default = 1: host is involved in factorization + // + mumps( int comm_fortran=-987654, int par=1 ) + { + this->job = -1 ; + this->par = par ; + this->comm_fortran = comm_fortran ; + this->sym = detail::mumps_sym< typename bindings::detail::property_at::type >::value ; + detail::mumps_call() ( *this ) ; + } + + // Destroy the solver + ~mumps() { + this->job = -2 ; + detail::mumps_call() ( *this ) ; + } + } ; + + + // + // Copy the matrix integer data (matrix order, structure) to the MUMPS struct + // + template + void matrix_integer_data( mumps& data, M& m ) { + typedef typename bindings::result_of::index_base::type index_b ; + BOOST_STATIC_ASSERT(index_b::value == 1) ; + data.n = bindings::size_row( m ) ; + assert( bindings::size_column( m ) == data.n ) ; + + data.nz = bindings::end_value( m ) - bindings::begin_value( m ) ; + detail::indices( bindings::data_order(m), data.irn, data.jcn, m ) ; + + data.nz_loc = bindings::end_value( m ) - bindings::begin_value( m ) ; + detail::indices( bindings::data_order(m), data.irn_loc, data.jcn_loc, m ) ; + } // matrix_integer_data() + + + // + // Copy the values pointer to the MUMPS struct + // + template + void matrix_value_data( mumps& data, M& m ) { + data.a = detail::cast_2_mumps( bindings::begin_value( m ) ) ; + data.a_loc = detail::cast_2_mumps( bindings::begin_value( m ) ) ; + } // matrix_value_data() + + + // + // Copy the right-hand side / solution pointer to the MUMPS struct + // in case of a dense undistributed right-hand side and solution. + // + template + void rhs_sol_value_data( mumps& data, X& x ) { + data.rhs = detail::cast_2_mumps( bindings::begin_value( x ) ) ; + data.nrhs = bindings::size_column( x ) ; + data.lrhs = bindings::stride_major( x ) ; + } // matrix_rhs_sol_value_data() + + + // + // Call the MUMPS driver for the given MUMPS struct. + // + template + int driver( mumps& data ) { + assert( data.job>=1 ? data.irn!=0 : true ) ; + assert( data.job>=1 ? data.jcn!=0 : true ) ; + assert( data.job>=2 ? data.a!=0 : true ) ; + assert( data.job>=3 ? data.rhs!=0 : true ) ; + detail::mumps_call() ( static_cast::c_struct_type&>( data ) ) ; + return data.info[0] ; + } // driver() + +} } } } // namespace boost::numeric::bindings::mumps + +#endif diff --git a/sdk/boost/numeric/bindings/mumps/mumps_driver_4_8_0.hpp b/sdk/boost/numeric/bindings/mumps/mumps_driver_4_8_0.hpp new file mode 100644 index 0000000..1624c9a --- /dev/null +++ b/sdk/boost/numeric/bindings/mumps/mumps_driver_4_8_0.hpp @@ -0,0 +1,271 @@ +// +// Copyright Karl Meerbergen 2008 +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_MUMPS_MUMPS_DRIVER_4_8_0_HPP +#define BOOST_NUMERIC_BINDINGS_MUMPS_MUMPS_DRIVER_4_8_0_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// This file contains a C++ driver for MUMPS +// +// The templated class mumps is a wrapper for the corresponding C struct. +// The class contains constructor and destructor that call mumps with JOB=-1 and JOB=-2 +// respectively. +// +// The function driver() calls MUMPS. The user must set the parameters of the data manually. +// +// The following functions are very helpful in this respect, since they extract pointer and size +// data using the Boost Bindings. +// +// void matrix_integer_data() : to set the integer data of the matrix. +// void matrix_value_data() : to set the values of the matrix. +// void rhs_sol_value_data() : to set the right-hand side and solution vectors in the case of a dense solution vector. +// + +namespace boost { namespace numeric { namespace bindings { namespace mumps { + + namespace detail { + // + // Type and Driver + // + template + struct mumps_type { + } ; + + template + struct mumps_call { + } ; + + template + struct mumps_internal_value_type { + typedef T type ; + } ; + + // + // Specialization for float + // + + template <> + struct mumps_type< float > { + typedef SMUMPS_STRUC_C type ; + } ; + + template <> + struct mumps_call< float > { + void operator() ( SMUMPS_STRUC_C& struc ) const { + smumps_c( &struc ) ; + } + } ; + + // + // Specialization for double + // + + template <> + struct mumps_type< double > { + typedef DMUMPS_STRUC_C type ; + } ; + + template <> + struct mumps_call< double > { + void operator() ( DMUMPS_STRUC_C& struc ) const { + dmumps_c( &struc ) ; + } + } ; + + // + // Specialization for complex + // + + template <> + struct mumps_type< std::complex< float > > { + typedef CMUMPS_STRUC_C type ; + } ; + + template <> + struct mumps_call< std::complex< float > > { + void operator() ( CMUMPS_STRUC_C& struc ) const { + cmumps_c( &struc ) ; + } + } ; + + template <> + struct mumps_internal_value_type< std::complex > { + typedef mumps_complex type ; + } ; + + // + // Specialization for complex + // + + template <> + struct mumps_type< std::complex< double > > { + typedef ZMUMPS_STRUC_C type ; + } ; + + template <> + struct mumps_call< std::complex< double > > { + void operator() ( ZMUMPS_STRUC_C& struc ) const { + zmumps_c( &struc ) ; + } + } ; + + template <> + struct mumps_internal_value_type< std::complex > { + typedef mumps_double_complex type ; + } ; + + // + // Symmetry map + // + + template + struct mumps_sym { + } ; + + template <> + struct mumps_sym< bindings::tag::symmetric > { + static int const value = 2 ; + } ; + + template <> + struct mumps_sym< bindings::tag::general > { + static int const value = 0 ; + } ; + + // + // Get index pointers + // + template + void indices( bindings::tag::row_major, int*& rows, int*& cols, M const& m ) { + rows = const_cast( bindings::begin_index_major( m ) ) ; + cols = const_cast( bindings::begin_index_minor( m ) ) ; + } + + template + void indices( bindings::tag::column_major, int*& rows, int*& cols, M const& m ) { + cols = const_cast( bindings::begin_index_major( m ) ) ; + rows = const_cast( bindings::begin_index_minor( m ) ) ; + } + + // Pointer Cast + float* cast_2_mumps( float* p ) { return p ; } + double* cast_2_mumps( double* p ) { return p ; } + mumps_double_complex* cast_2_mumps( std::complex* p ) { return reinterpret_cast( p ) ; } + mumps_complex* cast_2_mumps( std::complex* p ) { return reinterpret_cast( p ) ; } + } // namespace detail + + + + // + // Generic MUMPS data for any value_type + // + template + class mumps + : public detail::mumps_type< typename bindings::value_type::type >::type + { + public: + typedef typename bindings::value_type::type value_type ; + typedef typename detail::mumps_type< typename bindings::value_type::type >::type c_struct_type ; + + // + // Initialize MUMPS solver + // Pass a communicator (comm=-987654 means choose default) + // Pass 'par': default = 1: host is involved in factorization + // + mumps( int comm_fortran=-987654, int par=1 ) + { + this->job = -1 ; + this->par = par ; + this->comm_fortran = comm_fortran ; + this->sym = detail::mumps_sym< typename bindings::detail::property_at::type >::value ; + detail::mumps_call() ( *this ) ; + } + + // Destroy the solver + ~mumps() { + this->job = -2 ; + detail::mumps_call() ( *this ) ; + } + + private: + // Disable assignment and Copy Constructor + mumps& operator=( mumps const& that ) { return *this ; } + + mumps( mumps const& that ) {} + } ; + + + // + // Copy the matrix integer data (matrix order, structure) to the MUMPS struct + // + template + void matrix_integer_data( mumps& data, M& m ) { + typedef typename bindings::result_of::index_base::type index_b ; + BOOST_STATIC_ASSERT(index_b::value == 1) ; + data.n = bindings::size_row( m ) ; + assert( bindings::size_column( m ) == data.n ) ; + + data.nz = bindings::end_value( m ) - bindings::begin_value( m ) ; + detail::indices( bindings::data_order(m), data.irn, data.jcn, m ) ; + + data.nz_loc = bindings::end_value( m ) - bindings::begin_value( m ) ; + detail::indices( bindings::data_order(m), data.irn_loc, data.jcn_loc, m ) ; + } // matrix_integer_data() + + + // + // Copy the values pointer to the MUMPS struct + // + template + void matrix_value_data( mumps& data, M& m ) { + data.a = detail::cast_2_mumps( bindings::begin_value( m ) ) ; + data.a_loc = detail::cast_2_mumps( bindings::begin_value( m ) ) ; + } // matrix_value_data() + + + // + // Copy the right-hand side / solution pointer to the MUMPS struct + // in case of a dense undistributed right-hand side and solution. + // + template + void rhs_sol_value_data( mumps& data, X& x ) { + data.rhs = detail::cast_2_mumps( bindings::begin_value( x ) ) ; + data.nrhs = bindings::size_column( x ) ; + data.lrhs = bindings::stride_major( x ) ; + } // matrix_rhs_sol_value_data() + + + // + // Call the MUMPS driver for the given MUMPS struct. + // + template + int driver( mumps& data ) { + assert( data.job>=1 ? data.irn!=0 : true ) ; + assert( data.job>=1 ? data.jcn!=0 : true ) ; + assert( data.job>=2 ? data.a!=0 : true ) ; + assert( data.job==3 || data.job==5 ? data.rhs!=0 : true ) ; + detail::mumps_call() ( static_cast::c_struct_type&>( data ) ) ; + return data.info[0] ; + } // driver() + +} } } } // namespace boost::numeric::bindings::mumps + +#endif diff --git a/sdk/boost/numeric/bindings/noop.hpp b/sdk/boost/numeric/bindings/noop.hpp new file mode 100644 index 0000000..e6c24d8 --- /dev/null +++ b/sdk/boost/numeric/bindings/noop.hpp @@ -0,0 +1,61 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_NOOP_HPP +#define BOOST_NUMERIC_BINDINGS_NOOP_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T > +struct noop_wrapper: + adaptable_type< noop_wrapper >, + reference_wrapper { + noop_wrapper( T& t ): reference_wrapper( t ) {} +}; + +template< typename T, typename Id, typename Enable > +struct adaptor< noop_wrapper, Id, Enable >: + basic_unwrapper< T, Id > { + + typedef typename property_map_of< T >::type property_map; + +}; + +} // namespace detail + +namespace result_of { + +template< typename T > +struct noop { + typedef detail::noop_wrapper type; +}; + +} // namespace result_of + +template< typename T > +detail::noop_wrapper const noop( T& underlying ) { + return detail::noop_wrapper( underlying ); +} + +template< typename T > +detail::noop_wrapper const noop( const T& underlying ) { + return detail::noop_wrapper( underlying ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/num_columns.hpp b/sdk/boost/numeric/bindings/num_columns.hpp new file mode 100644 index 0000000..ad553de --- /dev/null +++ b/sdk/boost/numeric/bindings/num_columns.hpp @@ -0,0 +1,35 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_NUM_COLUMNS_HPP +#define BOOST_NUMERIC_BINDINGS_NUM_COLUMNS_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace result_of { + +template< typename T > +struct num_columns { + typedef typename result_of::size2::type type; +}; + +} // namespace result_of + +template< typename T > +inline typename result_of::num_columns::type num_columns( const T& t ) { + return size2( t ); +} + +} // bindings +} // numeric +} // boost + +#endif diff --git a/sdk/boost/numeric/bindings/num_rows.hpp b/sdk/boost/numeric/bindings/num_rows.hpp new file mode 100644 index 0000000..30bbc7f --- /dev/null +++ b/sdk/boost/numeric/bindings/num_rows.hpp @@ -0,0 +1,35 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_NUM_ROWS_HPP +#define BOOST_NUMERIC_BINDINGS_NUM_ROWS_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace result_of { + +template< typename T > +struct num_rows { + typedef typename result_of::size1::type type; +}; + +} // namespace result_of + +template< typename T > +inline typename result_of::num_rows::type num_rows( const T& t ) { + return size1( t ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/rank.hpp b/sdk/boost/numeric/bindings/rank.hpp new file mode 100644 index 0000000..d7c5994 --- /dev/null +++ b/sdk/boost/numeric/bindings/rank.hpp @@ -0,0 +1,25 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_RANK_HPP +#define BOOST_NUMERIC_BINDINGS_RANK_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +struct rank: mpl::int_< detail::property_at< T, tag::entity >::type::value > {}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/remove_imaginary.hpp b/sdk/boost/numeric/bindings/remove_imaginary.hpp new file mode 100644 index 0000000..6403578 --- /dev/null +++ b/sdk/boost/numeric/bindings/remove_imaginary.hpp @@ -0,0 +1,37 @@ +// +// Copyright (c) 2009 by Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_REMOVE_IMAGINARY_HPP +#define BOOST_NUMERIC_BINDINGS_REMOVE_IMAGINARY_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +struct remove_imaginary { + typedef T type; +}; + +template< typename T > +struct remove_imaginary< std::complex > { + typedef T type; +}; + +template< typename T > +struct remove_imaginary< const std::complex > { + typedef const T type; +}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/row.hpp b/sdk/boost/numeric/bindings/row.hpp new file mode 100644 index 0000000..f923224 --- /dev/null +++ b/sdk/boost/numeric/bindings/row.hpp @@ -0,0 +1,100 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_ROW_HPP +#define BOOST_NUMERIC_BINDINGS_ROW_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T > +struct row_wrapper: + adaptable_type< row_wrapper >, + reference_wrapper { + + row_wrapper( T& t, std::size_t index ): + reference_wrapper(t), + m_index( index ) {} + + std::size_t m_index; +}; + +template< typename T, typename Id, typename Enable > +struct adaptor< row_wrapper, Id, Enable > { + + typedef typename bindings::value_type< T>::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, typename result_of::size2::type >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, typename result_of::stride2::type > + > property_map; + + static typename result_of::size2::type size1( const Id& id ) { + return bindings::size2( id.get() ); + } + + static typename result_of::begin_value< T >::type begin_value( Id& id ) { + return bindings::begin_value( id.get() ) + + offset( id.get(), id.m_index, 0 ); + } + + static typename result_of::end_value< T >::type end_value( Id& id ) { + return bindings::begin_value( id.get() ) + + offset( id.get(), id.m_index, size1(id) ); + } + + static typename result_of::stride2::type stride1( const Id& id ) { + return bindings::stride2( id.get() ); + } + +}; + +} // namespace detail + +namespace result_of { + +template< typename T > +struct row { + typedef detail::row_wrapper type; +}; + +} // namespace result_of + +template< typename T > +detail::row_wrapper const row( T& underlying, std::size_t index ) { + return detail::row_wrapper( underlying, index ); +} + +template< typename T > +detail::row_wrapper const row( const T& underlying, std::size_t index ) { + return detail::row_wrapper( underlying, index ); +} + +template< int N, typename T > +void row( const T& underlying ) { + +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/size.hpp b/sdk/boost/numeric/bindings/size.hpp new file mode 100644 index 0000000..6a552b1 --- /dev/null +++ b/sdk/boost/numeric/bindings/size.hpp @@ -0,0 +1,155 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_SIZE_HPP +#define BOOST_NUMERIC_BINDINGS_SIZE_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename AddressingIndex, typename Enable = void > +struct size_impl { + + typedef typename tag::size_type< AddressingIndex::value > key_type; + typedef typename result_of_get< T, key_type >::type result_type; + + static result_type invoke( const T& t ) { + return get< key_type >( t ); + } + +}; + +template< typename T, typename AddressingIndex > +struct size_impl< T, AddressingIndex, + typename boost::enable_if< typename mpl::and_< + mpl::greater< AddressingIndex, rank >, + is_same_at< T, tag::size_type<1>, std::ptrdiff_t > + >::type >::type > { + + typedef std::ptrdiff_t result_type; + + static result_type invoke( const T& t ) { + return std::min< std::ptrdiff_t >( size_impl >::invoke(t), 1 ); + } + +}; + +template< typename T, typename AddressingIndex > +struct size_impl< T, AddressingIndex, + typename boost::enable_if< typename mpl::and_< + mpl::greater< AddressingIndex, rank >, + mpl::not_< is_same_at< T, tag::size_type<1>, std::ptrdiff_t > > + >::type >::type > { + + typedef typename mpl::min< + typename detail::property_at< T, tag::size_type<1> >::type, + mpl::int_<1> + >::type result_type; + + static result_type invoke( const T& t ) { + return result_type(); + } + +}; + +} // namespace detail + + +namespace result_of { + +template< typename T, typename Tag = tag::addressing_index<1> > +struct size { + BOOST_STATIC_ASSERT( (is_tag::value) ); + typedef typename detail::size_impl< T, Tag >::result_type type; +}; + +} // namespace result_of + +// +// Overloads for free template functions size( x, tag ), +// +template< typename T, typename Tag > +inline typename result_of::size< const T, Tag >::type +size( const T& t, Tag ) { + return detail::size_impl< const T, Tag >::invoke( t ); +} + +// Overloads for free template function size( x ) +// Valid for types with rank <= 1 (scalars, vectors) +// In theory, we could provide overloads for matrices here, too, +// if their minimal_rank is at most 1. + +template< typename T > +typename boost::enable_if< mpl::less< rank, mpl::int_<2> >, + typename result_of::size< const T >::type >::type +size( const T& t ) { + return detail::size_impl< const T, tag::addressing_index<1> >::invoke( t ); +} + +#define GENERATE_SIZE_INDEX( z, which, unused ) \ +GENERATE_FUNCTIONS( size, which, tag::addressing_index ) + +BOOST_PP_REPEAT_FROM_TO(1,3,GENERATE_SIZE_INDEX,~) + +GENERATE_FUNCTIONS( size, _row, tag::addressing_index<1> ) +GENERATE_FUNCTIONS( size, _column, tag::addressing_index<2> ) +GENERATE_FUNCTIONS( size, _major, typename addressing_index_major::type ) +GENERATE_FUNCTIONS( size, _minor, typename addressing_index_minor::type ) + +// +// Overloads for free template functions size_row( x, tag ), +// Here, tag is assumed to be either one of +// tag::transpose, tag::no_transpose, or tag::conjugate +// +namespace result_of { + +template< typename T, typename TransTag > +struct size_row_op { + typedef typename size< + T, + typename addressing_index_trans< tag::addressing_index<1>, TransTag >::type + >::type type; +}; + +template< typename T, typename TransTag > +struct size_column_op { + typedef typename size< T, + typename addressing_index_trans< tag::addressing_index<2>, TransTag >::type >::type type; +}; + +} // namespace result_of + +template< typename T, typename Tag > +inline typename result_of::size_row_op< const T, Tag >::type +size_row_op( const T& t, Tag ) { + return bindings::size( t, typename addressing_index_trans< tag::addressing_index<1>, Tag >::type() ); +} + +template< typename T, typename Tag > +inline typename result_of::size_row_op< const T, Tag >::type +size_column_op( const T& t, Tag ) { + return bindings::size( t, typename addressing_index_trans< tag::addressing_index<2>, Tag >::type() ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/std.hpp b/sdk/boost/numeric/bindings/std.hpp new file mode 100644 index 0000000..86e1bf6 --- /dev/null +++ b/sdk/boost/numeric/bindings/std.hpp @@ -0,0 +1,15 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_STD_HPP +#define BOOST_NUMERIC_BINDINGS_STD_HPP + +#include +#include + +#endif diff --git a/sdk/boost/numeric/bindings/std/valarray.hpp b/sdk/boost/numeric/bindings/std/valarray.hpp new file mode 100644 index 0000000..e919db3 --- /dev/null +++ b/sdk/boost/numeric/bindings/std/valarray.hpp @@ -0,0 +1,51 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_STD_VALARRAY_HPP +#define BOOST_NUMERIC_BINDINGS_STD_VALARRAY_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Id, typename Enable > +struct adaptor< std::valarray< T >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, tag::contiguous > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static value_type* begin_value( Id& id ) { + return &const_cast< std::valarray< T >& >( id )[0]; + } + + static value_type* end_value( Id& id ) { + return &const_cast< std::valarray< T >& >( id )[0] + id.size(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/std/vector.hpp b/sdk/boost/numeric/bindings/std/vector.hpp new file mode 100644 index 0000000..484569c --- /dev/null +++ b/sdk/boost/numeric/bindings/std/vector.hpp @@ -0,0 +1,51 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_STD_VECTOR_HPP +#define BOOST_NUMERIC_BINDINGS_STD_VECTOR_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Alloc, typename Id, typename Enable > +struct adaptor< std::vector< T, Alloc >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, tag::contiguous > + > property_map; + + static std::ptrdiff_t size1( const Id& t ) { + return t.size(); + } + + static value_type* begin_value( Id& t ) { + return &t.front(); + } + + static value_type* end_value( Id& t ) { + return &t.front() + t.size(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/stride.hpp b/sdk/boost/numeric/bindings/stride.hpp new file mode 100644 index 0000000..f1f1a13 --- /dev/null +++ b/sdk/boost/numeric/bindings/stride.hpp @@ -0,0 +1,210 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_STRIDE_HPP +#define BOOST_NUMERIC_BINDINGS_STRIDE_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename AddressingIndex, typename Enable = void > +struct stride_impl { + + typedef tag::stride_type< AddressingIndex::value > key_type; + typedef typename result_of_get< T, key_type >::type result_type; + + static result_type invoke( const T& t ) { + return get< key_type >( t ); + } + +}; + +// +// Strides for ranks outside the scope of the object are fixed at +// the dot product of its existing sizes and strides. +// +// Object rank result of strideN(), with N > rank +// scalar 0 1 +// vector 1 size1 * stride1 +// matrix 2 size1 * stride1 + size2 * stride2 +// tensor N sum_i( size_i, stride_i ) (dot( size, stride)) +// +// Iff size_i and stride_i are integral constants, results will be known at +// compile time. Otherwise, the result_type will be std::ptrdiff_t. +// +template< typename T, typename AddressingIndex > +struct stride_impl< T, AddressingIndex, + typename boost::enable_if< + mpl::equal_to< rank, tag::scalar > + >::type > { + + typedef typename mpl::int_<1> result_type; + + static result_type invoke( const T& t ) { + return result_type(); + } + +}; + + +template< typename T, typename State, typename AddressingIndex > +struct fold_stride_size { + + typedef tag::addressing_index< AddressingIndex::value > index_type; + typedef typename result_of::size< T, index_type >::type size_type; + typedef typename stride_impl< T, index_type >::result_type stride_type; + + typedef typename mpl::if_< + mpl::or_< + is_same< State, std::ptrdiff_t >, + is_same< size_type, std::ptrdiff_t >, + is_same< stride_type, std::ptrdiff_t > + >, + std::ptrdiff_t, + mpl::plus< + State, + mpl::times< + size_type, + stride_type + > + > + >::type type; + +}; + +// +// If Result isn't a ptrdiff_t, just invoke the integral constant +// and return that. Otherwise, runtime stuff is involved, so we'll +// have to evaluate sum_i( size_i, stride_i ). +// +template< typename T, typename Result, int AddressingIndex > +struct apply_fold { + static Result invoke( const T& t ) { + return Result(); + } +}; + +template< typename T, int AddressingIndex > +struct apply_fold< T, std::ptrdiff_t, AddressingIndex > { + + static std::ptrdiff_t invoke( const T& t ) { + return size( t, tag::addressing_index< AddressingIndex >() ) * + stride_impl< T, tag::addressing_index< AddressingIndex > >::invoke( t ) + + apply_fold< T, std::ptrdiff_t, AddressingIndex-1 >::invoke( t ); + } + +}; + +template< typename T > +struct apply_fold< T, std::ptrdiff_t, 0 > { + + static std::ptrdiff_t invoke( const T& ) { + return 0; + } + +}; + + +// Could be made generic for dimensions > 2, +// but not enough time right now + + +template< typename T, typename AddressingIndex > +struct stride_impl< T, AddressingIndex, + typename boost::enable_if< + mpl::and_< + mpl::greater< rank, tag::scalar >, + mpl::greater< AddressingIndex, rank > + > + >::type > { + + typedef mpl::range_c< int, 1, rank::value+1 > index_range; + typedef typename mpl::fold< + index_range, + mpl::int_< 0 >, + fold_stride_size< + T, + mpl::_1, + mpl::_2 + > + >::type result_type; + + static result_type invoke( const T& t ) { + return apply_fold< T, result_type, rank::value >::invoke( t ); + } + + +}; + +} // namespace detail + +namespace result_of { + +template< typename T, typename Tag = tag::addressing_index<1> > +struct stride { + BOOST_STATIC_ASSERT( (is_tag::value) ); + typedef typename detail::stride_impl< T, Tag >::result_type type; +}; + +} // namespace result_of + + +// +// Overloads for free template functions stride( x, tag ), +// +template< typename T, typename Tag > +inline typename result_of::stride< const T, Tag >::type +stride( const T& t, Tag ) { + return detail::stride_impl< const T, Tag >::invoke( t ); +} + +// Overloads for free template functions stride( x ) +// Valid for types with rank <= 1 (scalars, vectors) +// In theory, we could provide overloads for matrices here, too, +// if their minimal_rank is at most 1. + +template< typename T > +inline typename +boost::enable_if< + mpl::less< rank, mpl::int_<2> >, + typename result_of::stride< const T, tag::addressing_index<1> >::type +>::type +stride( const T& t ) { + return detail::stride_impl >::invoke( t ); +} + + +#define GENERATE_STRIDE_INDEX( z, which, unused ) \ +GENERATE_FUNCTIONS( stride, which, tag::addressing_index ) + +BOOST_PP_REPEAT_FROM_TO(1,3,GENERATE_STRIDE_INDEX,~) + +GENERATE_FUNCTIONS( stride, _row, tag::addressing_index<1> ) +GENERATE_FUNCTIONS( stride, _column, tag::addressing_index<2> ) +GENERATE_FUNCTIONS( stride, _major, typename addressing_index_major::type ) +GENERATE_FUNCTIONS( stride, _minor, typename addressing_index_minor::type ) + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/symm.hpp b/sdk/boost/numeric/bindings/symm.hpp new file mode 100644 index 0000000..61587c5 --- /dev/null +++ b/sdk/boost/numeric/bindings/symm.hpp @@ -0,0 +1,44 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_SYMM_HPP +#define BOOST_NUMERIC_BINDINGS_SYMM_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace result_of { + +template< typename T > +struct symm { + typedef detail::basic_wrapper< + T, + mpl::pair< tag::matrix_type, tag::symmetric > + > type; +}; + +} // namespace result_of + +template< typename T > +typename result_of::symm< T >::type const symm( T& underlying ) { + return typename result_of::symm< T >::type( underlying ); +} + +template< typename T > +typename result_of::symm< const T >::type const symm( const T& underlying ) { + return typename result_of::symm< const T >::type( underlying ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/tag.hpp b/sdk/boost/numeric/bindings/tag.hpp new file mode 100644 index 0000000..7e3652e --- /dev/null +++ b/sdk/boost/numeric/bindings/tag.hpp @@ -0,0 +1,126 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_TAG_HPP +#define BOOST_NUMERIC_BINDINGS_TAG_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +struct is_tag: mpl::bool_ {}; + +#define ADD_TAG( tag_name ) \ +\ +namespace tag { \ +struct tag_name {}; \ +} \ +\ +template<> \ +struct is_tag< tag::tag_name >: \ + mpl::bool_< true > {}; + + +#define ADD_INT_TEMPLATE_TAG( tag_name ) \ +\ +namespace tag { \ +template< int N >\ +struct tag_name: mpl::int_< N > {}; \ +} \ +template< int N > \ +struct is_tag< tag::tag_name >: mpl::bool_< true > {}; + + +#define ADD_TAG_ALIAS( tag_name, other_tag_name ) \ +\ +namespace tag { \ +struct tag_name: other_tag_name {}; \ +} \ +\ +template<> \ +struct is_tag< tag::tag_name >: \ + mpl::bool_< true > {}; + +ADD_TAG( index_type ) +ADD_TAG( value_type ) +ADD_TAG( value ) +ADD_TAG( value_transform ) + +ADD_TAG( entity ) +ADD_TAG( matrix_type ) + +ADD_TAG( data_structure ) +ADD_TAG( data_order ) +ADD_TAG( data_side ) + +ADD_INT_TEMPLATE_TAG( tensor ) +ADD_INT_TEMPLATE_TAG( size_type ) +ADD_INT_TEMPLATE_TAG( stride_type ) +ADD_INT_TEMPLATE_TAG( bandwidth_type ) +ADD_INT_TEMPLATE_TAG( addressing_index ) + +// Supported data structures +ADD_TAG( linear_array ) +ADD_TAG( triangular_array ) +ADD_TAG( band_array ) +ADD_TAG( compressed_sparse ) +ADD_TAG( coordinate_sparse ) + +ADD_TAG( structure ) +ADD_TAG( general ) +ADD_TAG( triangular ) +ADD_TAG( unit_triangular ) +ADD_TAG( symmetric ) +ADD_TAG( hermitian ) +ADD_TAG( band ) + +ADD_TAG( num_strides ) + +ADD_TAG( row_major ) +ADD_TAG( column_major ) + +ADD_TAG( upper ) +ADD_TAG( lower ) +ADD_TAG( unit_upper ) +ADD_TAG( unit_lower ) + +// BLAS Options +ADD_TAG( no_transpose ) +ADD_TAG( transpose ) +ADD_TAG( conjugate ) + +ADD_TAG( unit ) +ADD_TAG( non_unit ) +ADD_TAG( left ) +ADD_TAG( right ) +ADD_TAG( both ) + +// Sparse matrix +ADD_TAG( index_major ) +ADD_TAG( compressed_index_major ) +ADD_TAG( index_minor ) +ADD_TAG( index_base ) + +namespace tag { + +typedef tensor<0> scalar; +typedef tensor<1> vector; +typedef tensor<2> matrix; +typedef mpl::int_<1> contiguous; + +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/traits/detail/utils.hpp b/sdk/boost/numeric/bindings/traits/detail/utils.hpp new file mode 100644 index 0000000..21143f2 --- /dev/null +++ b/sdk/boost/numeric/bindings/traits/detail/utils.hpp @@ -0,0 +1,63 @@ +/* + * + * Copyright (c) Kresimir Fresl 2003 + * + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + * + * Author acknowledges the support of the Faculty of Civil Engineering, + * University of Zagreb, Croatia. + * + */ + +#ifndef BOOST_NUMERIC_BINDINGS_TRAITS_DETAIL_UTILS_HPP +#define BOOST_NUMERIC_BINDINGS_TRAITS_DETAIL_UTILS_HPP + +#include +#include + +namespace boost { namespace numeric { namespace bindings { namespace traits { + + namespace detail { + + // complex array => real & imaginary arrays + template + void disentangle (CIt c, CIt c_end, RIt rr, RIt ri) { + for (; c != c_end; ++c, ++rr, ++ri) { + *rr = traits::real (*c); + *ri = traits::imag (*c); + } + } + // real & imaginary arrays => complex array + template + void interlace (RIt r, RIt r_end, RIt ri, CIt c) { + typedef typename std::iterator_traits::value_type cmplx_t; +#ifdef BOOST_NUMERIC_BINDINGS_BY_THE_BOOK + for (; r != r_end; ++r, ++ri, ++c) + *c = cmplx_t (*r, *ri); +#else + typedef typename type_traits::real_type real_t; + real_t *cp = reinterpret_cast (&*c); + for (; r != r_end; ++r, ++ri) { + *cp = *r; ++cp; + *cp = *ri; ++cp; + } +#endif + } + + // converts real/complex to std::ptrdiff_t + inline std::ptrdiff_t to_int (float f) { return static_cast (f); } + inline std::ptrdiff_t to_int (double d) { return static_cast (d); } + inline std::ptrdiff_t to_int (traits::complex_f const& cf) { + return static_cast (traits::real (cf)); + } + inline std::ptrdiff_t to_int (traits::complex_d const& cd) { + return static_cast (traits::real (cd)); + } + + } + +}}}} + +#endif diff --git a/sdk/boost/numeric/bindings/traits/type.h b/sdk/boost/numeric/bindings/traits/type.h new file mode 100644 index 0000000..6de3773 --- /dev/null +++ b/sdk/boost/numeric/bindings/traits/type.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2000,2001,2002,2003 Si-Lab b.v.b.a. and Toon Knapen + * + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + * + */ + +#ifndef BOOST_NUMERIC_BINDINGS_TRAITS_TYPE_H +#define BOOST_NUMERIC_BINDINGS_TRAITS_TYPE_H + +/* + * This header defines the C types that will be mapped to + * COMPLEX and COMPLEX*16 of Fortran + */ + +#ifndef BOOST_NUMERIC_BINDINGS_USE_COMPLEX_STRUCT + +#if defined(__GNUC__) +typedef _Complex float fcomplex_t ; +typedef _Complex double dcomplex_t ; +#else +#include +typedef std::complex fcomplex_t ; +typedef std::complex dcomplex_t ; +#endif + +#else + +typedef +union { + float cmplx[2] ; + double align_struct_ ; +} fcomplex_t ; + +typedef +struct { + double cmplx[2] ; +} dcomplex_t ; + +#endif /* BOOST_NUMERIC_BINDINGS_USE_COMPLEX_STRUCT */ + +#endif /* BOOST_NUMERIC_BINDINGS_TRAITS_TYPE_H */ diff --git a/sdk/boost/numeric/bindings/traits/type.hpp b/sdk/boost/numeric/bindings/traits/type.hpp new file mode 100644 index 0000000..073b924 --- /dev/null +++ b/sdk/boost/numeric/bindings/traits/type.hpp @@ -0,0 +1,34 @@ +#ifndef boost_numeric_bindings_type_hpp +#define boost_numeric_bindings_type_hpp + +// This header provides typedefs to float complex and double complex. +// This makes it possible to redefine the complex class being used. + +#include + +namespace boost { namespace numeric { namespace bindings { namespace traits { + + /* The types for single and double precision complex numbers. + * You can use your own types if you define + * BOOST_NUMERIC_BINDINGS_USE_CUSTOM_COMPLEX_TYPE. + * Note that these types must have the same memory layout as the + * corresponding FORTRAN types. + * For that reason you can even use a different type in each translation + * unit and the resulting binary will still work! + */ +#ifndef BOOST_NUMERIC_BINDINGS_USE_CUSTOM_COMPLEX_TYPE + typedef std::complex< float > complex_f ; + typedef std::complex< double > complex_d ; +#endif + + template + T real (std::complex const& c) { return std::real (c); } + template + T imag (std::complex const& c) { return std::imag (c); } + + + struct null_t {}; + +}}}} + +#endif // boost_numeric_bindings_type_hpp diff --git a/sdk/boost/numeric/bindings/traits/type_traits.hpp b/sdk/boost/numeric/bindings/traits/type_traits.hpp new file mode 100644 index 0000000..edd3cd2 --- /dev/null +++ b/sdk/boost/numeric/bindings/traits/type_traits.hpp @@ -0,0 +1,64 @@ +/* + * + * Copyright (c) Kresimir Fresl and Toon Knapen 2002, 2003 + * + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + * + * First author acknowledges the support of the Faculty of Civil Engineering, + * University of Zagreb, Croatia. + * + */ + +#ifndef BOOST_NUMERIC_BINDINGS_TRAITS_TYPE_TRAITS_HPP +#define BOOST_NUMERIC_BINDINGS_TRAITS_TYPE_TRAITS_HPP + +#include +#include + +namespace boost { namespace numeric { namespace bindings { namespace traits { + + template + struct type_traits { + }; + template<> + struct type_traits { + typedef float type; + typedef float real_type; + }; + template<> + struct type_traits { + typedef double type; + typedef double real_type; + }; + template<> + struct type_traits { + typedef complex_f type; + typedef float real_type; + }; + template<> + struct type_traits { + typedef complex_d type; + typedef double real_type; + }; + + + inline const fcomplex_t* complex_ptr(const complex_f* c) { return reinterpret_cast( c ) ; } + inline const dcomplex_t* complex_ptr(const complex_d* c) { return reinterpret_cast( c ) ; } + + inline fcomplex_t* complex_ptr( complex_f* c) { return reinterpret_cast< fcomplex_t*>( c ) ; } + inline dcomplex_t* complex_ptr( complex_d* c) { return reinterpret_cast< dcomplex_t*>( c ) ; } + + template< typename Type > + inline void* void_ptr( Type* p) { return static_cast( p ); } + template< typename Type > + inline const void* void_ptr( const Type* p) { return static_cast( p ); } + + inline complex_f complex_ret(const fcomplex_t& ret) { return reinterpret_cast( ret ) ; } + inline complex_d complex_ret(const dcomplex_t& ret) { return reinterpret_cast( ret ) ; } + +}}}} + +#endif // BOOST_NUMERIC_BINDINGS_TRAITS_TYPE_TRAITS_HPP + diff --git a/sdk/boost/numeric/bindings/trans.hpp b/sdk/boost/numeric/bindings/trans.hpp new file mode 100644 index 0000000..e27151b --- /dev/null +++ b/sdk/boost/numeric/bindings/trans.hpp @@ -0,0 +1,173 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_TRANS_HPP +#define BOOST_NUMERIC_BINDINGS_TRANS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Conj > +struct trans_wrapper: reference_wrapper { + trans_wrapper( T& t ): reference_wrapper( t ) {} +}; + +// +// In case of linear storage +// +template< typename T, typename Conj, typename Id, typename Enable > +struct adaptor< trans_wrapper, Id, Enable > { + + typedef typename property_map_of< T >::type prop_of_T; + typedef typename property_insert< T, + + // upgrade to at least a matrix + mpl::pair< + tag::entity, + tag::tensor< mpl::max< tag::matrix, rank< T > >::type::value > + >, + + // size1 <-> size2 + mpl::pair< tag::size_type<1>, typename result_of::size2< T >::type >, + mpl::pair< tag::size_type<2>, typename result_of::size1< T >::type >, + + // row_major <-> column_major + mpl::pair< + tag::data_order, + typename mpl::if_< + is_column_major< T >, + tag::row_major, + tag::column_major >::type + >, + + // Conjugate transform (if passed by template argument) + Conj, + + // If T has a linear array, or has a band array + // flip strides, stride1 <-> stride2 + typename mpl::if_< mpl::or_< has_linear_array< T >, has_band_array< T > >, + mpl::pair< tag::stride_type<1>, typename result_of::stride2< T >::type >, + mpl::void_ + >::type, + typename mpl::if_< mpl::or_< has_linear_array< T >, has_band_array< T > >, + mpl::pair< tag::stride_type<2>, typename result_of::stride1< T >::type >, + mpl::void_ + >::type, + + // If T has a band array + // flip bandwidths, bandwidth1 <-> bandwidth2 + typename mpl::if_< has_band_array< T >, + mpl::pair< tag::bandwidth_type<1>, typename result_of::bandwidth2< T >::type >, + mpl::void_ + >::type, + typename mpl::if_< has_band_array< T >, + mpl::pair< tag::bandwidth_type<2>, typename result_of::bandwidth1< T >::type >, + mpl::void_ + >::type, + + // If a data_side tag is present: + // upper <-> lower + typename mpl::if_< + mpl::has_key< prop_of_T, tag::data_side >, + typename mpl::if_< + is_same< + typename mpl::at< prop_of_T, tag::data_side >::type, + tag::upper + >, + mpl::pair< tag::data_side, tag::lower >, + mpl::pair< tag::data_side, tag::upper > + >::type, + mpl::void_ + >::type + + >::type property_map; + + // Flip size1/size2 + static typename result_of::size2< T >::type size1( const Id& id ) { + return bindings::size2( id.get() ); + } + + static typename result_of::size1< T >::type size2( const Id& id ) { + return bindings::size1( id.get() ); + } + + // Value array access + static typename result_of::begin_value< T >::type begin_value( Id& id ) { + return bindings::begin_value( id.get() ); + } + + static typename result_of::end_value< T >::type end_value( Id& id ) { + return bindings::end_value( id.get() ); + } + + // Linear array storage transpose + // Flip stride1/stride2 + static typename result_of::stride2< T >::type stride1( const Id& id ) { + return bindings::stride2( id.get() ); + } + + static typename result_of::stride1< T >::type stride2( const Id& id ) { + return bindings::stride1( id.get() ); + } + + // Banded matrix transpose + // Flip bandwidth1/bandwidth2 + static typename result_of::bandwidth2< T >::type bandwidth1( const Id& id ) { + return bindings::bandwidth2( id.get() ); + } + + static typename result_of::bandwidth1< T >::type bandwidth2( const Id& id ) { + return bindings::bandwidth1( id.get() ); + } + +}; + +} // namespace detail + +namespace result_of { + +template< typename T > +struct trans { + typedef detail::trans_wrapper type; +}; + +} + +template< typename T > +typename result_of::trans::type const trans( T& underlying ) { + return detail::trans_wrapper( underlying ); +} + +template< typename T > +typename result_of::trans::type const trans( const T& underlying ) { + return detail::trans_wrapper( underlying ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/trans_tag.hpp b/sdk/boost/numeric/bindings/trans_tag.hpp new file mode 100644 index 0000000..b63231c --- /dev/null +++ b/sdk/boost/numeric/bindings/trans_tag.hpp @@ -0,0 +1,89 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_TRANS_TAG_HPP +#define BOOST_NUMERIC_BINDINGS_TRANS_TAG_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename LibraryOrder, typename DataOrder, typename ValueTransform > +struct trans_tag_impl { + // If your program complains about this part, this probably + // means that you are trying to use row_major matrices where you + // should use column_major matrices. E.g., for ublas, use + // matrix< double, column_major > instead of matrix< double > + // to fix this. +}; + +template<> +struct trans_tag_impl< tag::column_major, tag::column_major, mpl::void_ > { + typedef tag::no_transpose type; +}; + +template<> +struct trans_tag_impl< tag::column_major, tag::row_major, mpl::void_ > { + typedef tag::transpose type; +}; + +template<> +struct trans_tag_impl< tag::column_major, tag::row_major, tag::conjugate > { + typedef tag::conjugate type; +}; + +template<> +struct trans_tag_impl< tag::row_major, tag::row_major, mpl::void_ > { + typedef tag::no_transpose type; +}; + +template<> +struct trans_tag_impl< tag::row_major, tag::column_major, mpl::void_ > { + typedef tag::transpose type; +}; + +template<> +struct trans_tag_impl< tag::row_major, tag::column_major, tag::conjugate > { + typedef tag::conjugate type; +}; + +} // namespace detail + +namespace result_of { + +template< typename T, typename Order > +struct trans_tag { + typedef typename detail::trans_tag_impl< Order, + typename result_of::data_order::type, + typename detail::property_at< T, tag::value_transform >::type >::type type; +}; + +} // namespace result_of + +// +// trans_tag will output tags that are compatible with BLAS and LAPACK, either one +// of tag::transpose, tag::no_transpose, or tag::conjugate. +// It needs an library-orientation (Order) before it can make a decision about whether +// a tranpose is in order. Consult the various cases above to see what kind of +// tag is being generated in what kind of situation. +// +template< typename T, typename Order > +typename result_of::trans_tag< T, Order >::type trans_tag( const T& t, Order ) { + return result_of::trans_tag< T, Order >::type(); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas.hpp b/sdk/boost/numeric/bindings/ublas.hpp new file mode 100644 index 0000000..a58b6ed --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas.hpp @@ -0,0 +1,27 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/banded.hpp b/sdk/boost/numeric/bindings/ublas/banded.hpp new file mode 100644 index 0000000..1252836 --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/banded.hpp @@ -0,0 +1,121 @@ +// +// Copyright (c) 2002 Kresimir Fresl +// Copyright (c) 2010 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_BANDED_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_BANDED_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename F, typename A, typename Id, typename Enable > +struct adaptor< ublas::banded_matrix< T, F, A >, Id, Enable > { + + // The ublas banded row_major format corresponds to the LAPACK band format. + // LAPACK is column_major; so we flip the data order reported by uBLAS. + typedef typename copy_const< Id, T >::type value_type; + typedef typename if_row_major< + typename convert_to< tag::data_order, F >::type, + tag::column_major, + tag::row_major + >::type data_order; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::size_type<2>, std::ptrdiff_t >, + mpl::pair< tag::matrix_type, tag::band >, + mpl::pair< tag::data_structure, tag::band_array >, + mpl::pair< tag::data_order, data_order >, + mpl::pair< tag::bandwidth_type<1>, std::ptrdiff_t >, + mpl::pair< tag::bandwidth_type<2>, std::ptrdiff_t >, + mpl::pair< tag::stride_type<1>, + typename if_row_major< data_order, std::ptrdiff_t, tag::contiguous >::type >, + mpl::pair< tag::stride_type<2>, + typename if_row_major< data_order, tag::contiguous, std::ptrdiff_t >::type > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size1(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.size2(); + } + + static value_type* begin_value( Id& id ) { + return bindings::begin_value( id.data() ); + } + + static value_type* end_value( Id& id ) { + return bindings::end_value( id.data() ); + } + + // A.k.a. left half-bandwidth + static std::ptrdiff_t bandwidth1( const Id& id ) { + return id.lower(); + } + + // A.k.a. right half-bandwidth + static std::ptrdiff_t bandwidth2( const Id& id ) { + return id.upper(); + } + + // These strides are over the band array structure; not over + // the band matrix representation of this structure + static std::ptrdiff_t stride1( const Id& id ) { + return id.lower() + id.upper() + 1; + } + + static std::ptrdiff_t stride2( const Id& id ) { + return id.lower() + id.upper() + 1; + } + +}; + + +template< typename T, typename Id, typename Enable > +struct adaptor< ublas::banded_adaptor< T >, Id, Enable >: + basic_ublas_adaptor< + T, + Id, + mpl::pair< tag::matrix_type, tag::band >, + mpl::pair< tag::bandwidth_type<1>, std::ptrdiff_t >, + mpl::pair< tag::bandwidth_type<2>, std::ptrdiff_t > + > { + + // A.k.a. left half-bandwidth + static std::ptrdiff_t bandwidth1( const Id& id ) { + return id.lower(); + } + + // A.k.a. right half-bandwidth + static std::ptrdiff_t bandwidth2( const Id& id ) { + return id.upper(); + } + +}; + +} // detail +} // bindings +} // numeric +} // boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/detail/basic_ublas_adaptor.hpp b/sdk/boost/numeric/bindings/ublas/detail/basic_ublas_adaptor.hpp new file mode 100644 index 0000000..f51e2ef --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/detail/basic_ublas_adaptor.hpp @@ -0,0 +1,60 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_DETAIL_BASIC_UBLAS_ADAPTOR_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_DETAIL_BASIC_UBLAS_ADAPTOR_HPP + +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Id, typename P1 = mpl::void_, + typename P2 = mpl::void_, typename P3 = mpl::void_ > +struct basic_ublas_adaptor { + + typedef typename copy_const< Id, T >::type adapted_type; + typedef typename property_insert< adapted_type, P1, P2, P3 >::type property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size1(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.size2(); + } + + static typename result_of::begin_value< adapted_type >::type begin_value( Id& id ) { + return bindings::begin_value( id.data() ); + } + + static typename result_of::end_value< adapted_type >::type end_value( Id& id ) { + return bindings::end_value( id.data() ); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return bindings::stride1( id.data() ); + } + + static std::ptrdiff_t stride2( const Id& id ) { + return bindings::stride2( id.data() ); + } + +}; + +} // detail +} // bindings +} // numeric +} // boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/detail/convert_to.hpp b/sdk/boost/numeric/bindings/ublas/detail/convert_to.hpp new file mode 100644 index 0000000..e3331e8 --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/detail/convert_to.hpp @@ -0,0 +1,76 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_DETAIL_CONVERT_TO_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_DETAIL_CONVERT_TO_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template<> +struct convert_to< tag::data_order, ublas::row_major > { + typedef tag::row_major type; +}; + +template<> +struct convert_to< tag::data_order, ublas::column_major > { + typedef tag::column_major type; +}; + +template<> +struct convert_to< tag::matrix_type, ublas::lower > { + typedef tag::triangular type; +}; + +template<> +struct convert_to< tag::matrix_type, ublas::upper > { + typedef tag::triangular type; +}; + +template<> +struct convert_to< tag::matrix_type, ublas::unit_lower > { + typedef tag::unit_triangular type; +}; + +template<> +struct convert_to< tag::matrix_type, ublas::unit_upper > { + typedef tag::unit_triangular type; +}; + +template<> +struct convert_to< tag::data_side, ublas::lower > { + typedef tag::lower type; +}; + +template<> +struct convert_to< tag::data_side, ublas::upper > { + typedef tag::upper type; +}; + +template<> +struct convert_to< tag::data_side, ublas::unit_lower > { + typedef tag::lower type; +}; + +template<> +struct convert_to< tag::data_side, ublas::unit_upper > { + typedef tag::upper type; +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/hermitian.hpp b/sdk/boost/numeric/bindings/ublas/hermitian.hpp new file mode 100644 index 0000000..9395eaf --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/hermitian.hpp @@ -0,0 +1,86 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_HERMITIAN_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_HERMITIAN_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename F1, typename F2, typename A, typename Id, typename Enable > +struct adaptor< ublas::hermitian_matrix< T, F1, F2, A >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::size_type<2>, std::ptrdiff_t >, + mpl::pair< tag::matrix_type, tag::hermitian >, + mpl::pair< tag::data_structure, tag::triangular_array >, + mpl::pair< tag::data_side, typename convert_to< tag::data_side, F1 >::type >, + mpl::pair< tag::data_order, typename convert_to< tag::data_order, F2 >::type > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size1(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.size2(); + } + + static value_type* begin_value( Id& id ) { + return bindings::begin_value( id.data() ); + } + + static value_type* end_value( Id& id ) { + return bindings::end_value( id.data() ); + } + +}; + +template< typename T, typename F, typename Id, typename Enable > +struct adaptor< ublas::hermitian_adaptor< T, F >, Id, Enable >: + basic_ublas_adaptor< + T, + Id, + mpl::pair< tag::matrix_type, tag::hermitian >, + mpl::pair< tag::data_side, typename convert_to< tag::data_side, F >::type > + > { + + typedef typename convert_to< tag::data_side, F >::type data_side; + + static std::ptrdiff_t bandwidth1( const Id& id ) { + return bindings::bandwidth( id.data(), data_side() ); + } + + static std::ptrdiff_t bandwidth2( const Id& id ) { + return bindings::bandwidth( id.data(), data_side() ); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/matrix.hpp b/sdk/boost/numeric/bindings/ublas/matrix.hpp new file mode 100644 index 0000000..bcf71aa --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/matrix.hpp @@ -0,0 +1,148 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_MATRIX_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_MATRIX_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename F, typename A, typename Id, typename Enable > +struct adaptor< ::boost::numeric::ublas::matrix< T, F, A >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef typename convert_to< tag::data_order, F >::type data_order; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::size_type<2>, std::ptrdiff_t >, + mpl::pair< tag::matrix_type, tag::general >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::data_order, data_order >, + mpl::pair< tag::stride_type<1>, + typename if_row_major< data_order, std::ptrdiff_t, tag::contiguous >::type >, + mpl::pair< tag::stride_type<2>, + typename if_row_major< data_order, tag::contiguous, std::ptrdiff_t >::type > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size1(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.size2(); + } + + static value_type* begin_value( Id& id ) { + return bindings::begin_value( id.data() ); + } + + static value_type* end_value( Id& id ) { + return bindings::end_value( id.data() ); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return id.size2(); + } + + static std::ptrdiff_t stride2( const Id& id ) { + return id.size1(); + } + +}; + +template< typename T, std::size_t M, std::size_t N, typename F, typename Id, typename Enable > +struct adaptor< ::boost::numeric::ublas::bounded_matrix< T, M, N, F >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef typename convert_to< tag::data_order, F >::type data_order; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::size_type<2>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::data_order, data_order >, + mpl::pair< tag::stride_type<1>, + typename if_row_major< data_order, mpl::int_, tag::contiguous >::type >, + mpl::pair< tag::stride_type<2>, + typename if_row_major< data_order, tag::contiguous, mpl::int_ >::type > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size1(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.size2(); + } + + static value_type* begin_value( Id& id ) { + return bindings::begin_value( id.data() ); + } + + static value_type* end_value( Id& id ) { + return bindings::end_value( id.data() ); + } + +}; + +template< typename T, std::size_t M, std::size_t N, typename Id, typename Enable > +struct adaptor< ::boost::numeric::ublas::c_matrix< T, M, N >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::size_type<2>, std::ptrdiff_t >, + mpl::pair< tag::matrix_type, tag::general >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::data_order, tag::row_major >, + mpl::pair< tag::stride_type<1>, mpl::int_ >, + mpl::pair< tag::stride_type<2>, tag::contiguous > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size1(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.size2(); + } + + static value_type* begin_value( Id& id ) { + return id.data(); + } + + static value_type* end_value( Id& id ) { + return id.data() + offset( id, id.size1(), id.size2() ); + } + +}; + + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/matrix_expression.hpp b/sdk/boost/numeric/bindings/ublas/matrix_expression.hpp new file mode 100644 index 0000000..6d07dc7 --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/matrix_expression.hpp @@ -0,0 +1,126 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_MATRIX_EXPRESSION_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_MATRIX_EXPRESSION_HPP + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Id, typename Enable > +struct adaptor< boost::numeric::ublas::matrix_reference< T >, Id, Enable > { + + typedef typename copy_const< Id, T >::type adapted_type; + typedef typename property_map_of< adapted_type >::type property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size1(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.size2(); + } + + static typename result_of::begin_value< adapted_type >::type begin_value( Id& id ) { + return bindings::begin_value( id.expression() ); + } + + static typename result_of::end_value< adapted_type >::type end_value( Id& id ) { + return bindings::end_value( id.expression() ); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return bindings::stride1( id.expression() ); + } + + static std::ptrdiff_t stride2( const Id& id ) { + return bindings::stride2( id.expression() ); + } + + static std::ptrdiff_t bandwidth1( const Id& id ) { + return bindings::bandwidth1( id.expression() ); + } + + static std::ptrdiff_t bandwidth2( const Id& id ) { + return bindings::bandwidth2( id.expression() ); + } + +}; + +template< typename T, typename U, typename Id, typename Enable > +struct adaptor< boost::numeric::ublas::matrix_unary2< T, U >, Id, Enable > { + + typedef typename copy_const< Id, T >::type adapted_type; + typedef typename property_map_of< adapted_type >::type map; + + typedef mpl::map< + mpl::pair::type>, + mpl::pair::type>, + mpl::pair, typename mpl::at >::type>, + mpl::pair, typename mpl::at >::type>, + mpl::pair::type>, + + mpl::pair::type, + tag::row_major>, + tag::column_major, + tag::row_major + >::type>, + + mpl::pair, typename mpl::at >:: type>, + mpl::pair, typename mpl::at >:: type> + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size1(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.size2(); + } + + static typename result_of::begin_value< adapted_type >::type + begin_value( Id& id ) { + return bindings::begin_value( id.expression() ); + } + + static typename result_of::end_value< adapted_type >::type + end_value( Id& id ) { + return bindings::end_value( id.expression() ); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return bindings::stride2( id.expression() ); + } + + static std::ptrdiff_t stride2( const Id& id ) { + return bindings::stride1( id.expression() ); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/matrix_proxy.hpp b/sdk/boost/numeric/bindings/ublas/matrix_proxy.hpp new file mode 100644 index 0000000..eb5e010 --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/matrix_proxy.hpp @@ -0,0 +1,244 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_MATRIX_PROXY_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_MATRIX_PROXY_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Id, typename Enable > +struct adaptor< ublas::matrix_range< T >, Id, Enable > { + + typedef typename copy_const< Id, T >::type adapted_type; + typedef typename property_map_of< adapted_type >::type property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size1(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.size2(); + } + + static typename result_of::begin_value< adapted_type >::type begin_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id.data(), id.start1(), id.start2() ); + } + + static typename result_of::end_value< adapted_type >::type end_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id.data(), id.start1() + id.size1(), id.start2() + id.size2() ); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return bindings::stride1( id.data() ); + } + + static std::ptrdiff_t stride2( const Id& id ) { + return bindings::stride2( id.data() ); + } + + static std::ptrdiff_t bandwidth1( const Id& id ) { + return bindings::bandwidth1( id.data() ); + } + + static std::ptrdiff_t bandwidth2( const Id& id ) { + return bindings::bandwidth2( id.data() ); + } + +}; + + +template< typename T, typename Id, typename Enable > +struct adaptor< ublas::matrix_slice< T >, Id, Enable > { + + typedef typename copy_const< Id, T >::type adapted_type; + typedef typename property_map_of< adapted_type >::type property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size1(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.size2(); + } + + static typename result_of::begin_value< adapted_type >::type begin_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id.data(), id.start1(), id.start2() ); + } + + static typename result_of::end_value< adapted_type >::type end_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id.data(), id.start1() + id.size1(), id.start2() + id.size2() ); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return id.stride1(); + } + + static std::ptrdiff_t stride2( const Id& id ) { + return id.stride2(); + } + + static std::ptrdiff_t bandwidth1( const Id& id ) { + return bindings::bandwidth1( id.data() ); + } + + static std::ptrdiff_t bandwidth2( const Id& id ) { + return bindings::bandwidth2( id.data() ); + } + +}; + + +template< typename T, typename Id, typename Enable > +struct adaptor< ublas::matrix_column< T >, Id, Enable > { + + typedef typename copy_const< Id, typename bindings::value_type< T>::type >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + // TODO in case of column major, this could be contiguous + mpl::pair< tag::stride_type<1>, std::ptrdiff_t > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static value_type* begin_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id.data(), 0, id.index() ); + } + + static value_type* end_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id.data(), bindings::size(id), id.index() ); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return bindings::stride1( id.data() ); + } + +}; + + +template< typename T, typename Id, typename Enable > +struct adaptor< ublas::matrix_row< T >, Id, Enable > { + + typedef typename copy_const< Id, typename bindings::value_type< T>::type >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + // TODO in case of row major, this could be contiguous + mpl::pair< tag::stride_type<1>, std::ptrdiff_t > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static value_type* begin_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id.data(), id.index(), 0 ); + } + + static value_type* end_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id.data(), id.index(), bindings::size(id) ); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return bindings::stride2( id.data() ); + } + +}; + +template< typename T, typename Id, typename Enable > +struct adaptor< ublas::matrix_vector_range< T >, Id, Enable > { + + typedef typename copy_const< Id, T >::type adapted_type; + typedef typename property_insert< adapted_type, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::stride_type<1>, std::ptrdiff_t > + >::type property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static typename result_of::begin_value< adapted_type >::type begin_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id.data(), id.start1(), id.start2() ); + } + + static typename result_of::end_value< adapted_type >::type end_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id.data(), id.start1() + id.size1(), id.start2() + id.size2() ); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return bindings::stride1( id.data() ) + bindings::stride2( id.data() ); + } + +}; + +template< typename T, typename Id, typename Enable > +struct adaptor< ublas::matrix_vector_slice< T >, Id, Enable > { + + typedef typename copy_const< Id, T >::type adapted_type; + typedef typename property_insert< adapted_type, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::stride_type<1>, std::ptrdiff_t > + >::type property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static typename result_of::begin_value< adapted_type >::type begin_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id.data(), id.start1(), id.start2() ); + } + + static typename result_of::end_value< adapted_type >::type end_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id.data(), id.start1() + id.size1(), id.start2() + id.size2() ); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return id.stride1() * bindings::stride1( id.data() ) + + id.stride2() * bindings::stride2( id.data() ); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/matrix_sparse.hpp b/sdk/boost/numeric/bindings/ublas/matrix_sparse.hpp new file mode 100644 index 0000000..1701220 --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/matrix_sparse.hpp @@ -0,0 +1,135 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_MATRIX_SPARSE_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_MATRIX_SPARSE_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename F, std::size_t IB, typename IA, typename TA, typename Id, typename Enable > +struct adaptor< ublas::compressed_matrix< T, F, IB, IA, TA >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef typename copy_const< Id, typename bindings::value_type::type >::type index_type; + typedef typename convert_to< tag::data_order, F >::type data_order; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::index_type, index_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::size_type<2>, std::ptrdiff_t >, + mpl::pair< tag::matrix_type, tag::general >, + mpl::pair< tag::data_structure, tag::compressed_sparse >, + mpl::pair< tag::data_order, data_order >, + mpl::pair< tag::index_base, mpl::int_ > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size1(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.size2(); + } + + static value_type* begin_value( Id& id ) { + return bindings::begin_value( id.value_data() ); + } + + static value_type* end_value( Id& id ) { + return bindings::begin_value( id.value_data() ) + id.nnz(); + } + + static index_type* begin_compressed_index_major( Id& id ) { + return bindings::begin_value( id.index1_data() ); + } + + static index_type* end_compressed_index_major( Id& id ) { + return bindings::end_value( id.index1_data() ); + } + + static index_type* begin_index_minor( Id& id ) { + return bindings::begin_value( id.index2_data() ); + } + + static index_type* end_index_minor( Id& id ) { + return bindings::begin_value( id.index2_data() ) + id.nnz(); + } + +}; + +template< typename T, typename F, std::size_t IB, typename IA, typename TA, typename Id, typename Enable > +struct adaptor< ublas::coordinate_matrix< T, F, IB, IA, TA >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef typename copy_const< Id, typename bindings::value_type::type >::type index_type; + typedef typename convert_to< tag::data_order, F >::type data_order; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::index_type, index_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::size_type<2>, std::ptrdiff_t >, + mpl::pair< tag::matrix_type, tag::general >, + mpl::pair< tag::data_structure, tag::coordinate_sparse >, + mpl::pair< tag::data_order, data_order >, + mpl::pair< tag::index_base, mpl::int_ > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size1(); + } + + static std::ptrdiff_t size2( const Id& id ) { + return id.size2(); + } + + static value_type* begin_value( Id& id ) { + return bindings::begin_value( id.value_data() ); + } + + static value_type* end_value( Id& id ) { + return bindings::begin_value( id.value_data() ) + id.nnz(); + } + + static index_type* begin_index_major( Id& id ) { + return bindings::begin_value( id.index1_data() ); + } + + static index_type* end_index_major( Id& id ) { + return bindings::begin_value( id.index1_data() ) + id.nnz(); + } + + static index_type* begin_index_minor( Id& id ) { + return bindings::begin_value( id.index2_data() ); + } + + static index_type* end_index_minor( Id& id ) { + return bindings::begin_value( id.index2_data() ) + id.nnz(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/scalar_vector.hpp b/sdk/boost/numeric/bindings/ublas/scalar_vector.hpp new file mode 100644 index 0000000..d454c18 --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/scalar_vector.hpp @@ -0,0 +1,51 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_SCALAR_VECTOR_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_SCALAR_VECTOR_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Alloc, typename Id, typename Enable > +struct adaptor< ublas::scalar_vector< T, Alloc >, Id, Enable > { + + typedef typename add_const< T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, mpl::int_<0> > + > property_map; + + static std::ptrdiff_t size1( const Id& t ) { + return t.size(); + } + + static value_type* begin_value( Id& t ) { + return t.find_element( 0 ); + } + + static value_type* end_value( Id& t ) { + return t.find_element( 0 ) + 1; + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/storage.hpp b/sdk/boost/numeric/bindings/ublas/storage.hpp new file mode 100644 index 0000000..dfdc1bd --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/storage.hpp @@ -0,0 +1,53 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// Copyright (c) 2011 Andrey Asadchev +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_STORAGE_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_STORAGE_HPP + +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Id > +struct adaptor< T, Id, typename boost::enable_if< boost::is_base_of< ublas::storage_array, T> >::type > { + + typedef typename copy_const< Id, typename T::value_type >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, tag::contiguous > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static value_type* begin_value( Id& id ) { + return id.begin(); + } + + static value_type* end_value( Id& id ) { + return id.end(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/symmetric.hpp b/sdk/boost/numeric/bindings/ublas/symmetric.hpp new file mode 100644 index 0000000..1d3f64e --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/symmetric.hpp @@ -0,0 +1,86 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_SYMMETRIC_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_SYMMETRIC_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename F1, typename F2, typename A, typename Id, typename Enable > +struct adaptor< ublas::symmetric_matrix< T, F1, F2, A >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::size_type<2>, std::ptrdiff_t >, + mpl::pair< tag::matrix_type, tag::symmetric >, + mpl::pair< tag::data_structure, tag::triangular_array >, + mpl::pair< tag::data_side, typename convert_to< tag::data_side, F1 >::type >, + mpl::pair< tag::data_order, typename convert_to< tag::data_order, F2 >::type > + > property_map; + + static std::ptrdiff_t size1( const Id& t ) { + return t.size1(); + } + + static std::ptrdiff_t size2( const Id& t ) { + return t.size2(); + } + + static value_type* begin_value( Id& t ) { + return bindings::begin_value( t.data() ); + } + + static value_type* end_value( Id& t ) { + return bindings::end_value( t.data() ); + } + +}; + +template< typename T, typename F, typename Id, typename Enable > +struct adaptor< ublas::symmetric_adaptor< T, F >, Id, Enable >: + basic_ublas_adaptor< + T, + Id, + mpl::pair< tag::matrix_type, tag::symmetric >, + mpl::pair< tag::data_side, typename convert_to< tag::data_side, F >::type > + > { + + typedef typename convert_to< tag::data_side, F >::type data_side; + + static std::ptrdiff_t bandwidth1( const Id& id ) { + return bindings::bandwidth( id.data(), data_side() ); + } + + static std::ptrdiff_t bandwidth2( const Id& id ) { + return bindings::bandwidth( id.data(), data_side() ); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/triangular.hpp b/sdk/boost/numeric/bindings/ublas/triangular.hpp new file mode 100644 index 0000000..66bb3fd --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/triangular.hpp @@ -0,0 +1,73 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_TRIANGULAR_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_TRIANGULAR_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename F1, typename F2, typename A, typename Id, typename Enable > +struct adaptor< ublas::triangular_matrix< T, F1, F2, A >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::matrix >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::size_type<2>, std::ptrdiff_t >, + mpl::pair< tag::matrix_type, typename convert_to< tag::matrix_type, F1 >::type >, + mpl::pair< tag::data_structure, tag::triangular_array >, + mpl::pair< tag::data_side, typename convert_to< tag::data_side, F1 >::type >, + mpl::pair< tag::data_order, typename convert_to< tag::data_order, F2 >::type > + > property_map; + + static std::ptrdiff_t size1( const Id& t ) { + return t.size1(); + } + + static std::ptrdiff_t size2( const Id& t ) { + return t.size2(); + } + + static value_type* begin_value( Id& t ) { + return bindings::begin_value( t.data() ); + } + + static value_type* end_value( Id& t ) { + return bindings::end_value( t.data() ); + } + +}; + +template< typename T, typename F, typename Id, typename Enable > +struct adaptor< ublas::triangular_adaptor< T, F >, Id, Enable >: + basic_ublas_adaptor< + T, + Id, + mpl::pair< tag::matrix_type, typename convert_to< tag::matrix_type, F >::type >, + mpl::pair< tag::data_side, typename convert_to< tag::data_side, F >::type > + > {}; + +} // detail +} // bindings +} // numeric +} // boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/vector.hpp b/sdk/boost/numeric/bindings/ublas/vector.hpp new file mode 100644 index 0000000..b278268 --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/vector.hpp @@ -0,0 +1,107 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_VECTOR_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_VECTOR_HPP + +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Alloc, typename Id, typename Enable > +struct adaptor< ublas::vector< T, Alloc >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, tag::contiguous > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static value_type* begin_value( Id& id ) { + return bindings::begin_value( id.data() ); + } + + static value_type* end_value( Id& id ) { + return bindings::end_value( id.data() ); + } + +}; + +template< typename T, std::size_t N, typename Id, typename Enable > +struct adaptor< ublas::bounded_vector< T, N >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, tag::contiguous > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static value_type* begin_value( Id& id ) { + return bindings::begin_value( id.data() ); + } + + static value_type* end_value( Id& id ) { + return bindings::end_value( id.data() ); + } + +}; + +template< typename T, std::size_t N, typename Id, typename Enable > +struct adaptor< ublas::c_vector< T, N >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, tag::contiguous > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static value_type* begin_value( Id& id ) { + return id.data(); + } + + static value_type* end_value( Id& id ) { + return id.data() + id.size(); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/vector_expression.hpp b/sdk/boost/numeric/bindings/ublas/vector_expression.hpp new file mode 100644 index 0000000..7c89f22 --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/vector_expression.hpp @@ -0,0 +1,54 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_VECTOR_EXPRESSION_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_VECTOR_EXPRESSION_HPP + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Id, typename Enable > +struct adaptor< ublas::vector_reference< T >, Id, Enable > { + + typedef typename copy_const< Id, T >::type adapted_type; + typedef typename property_map_of< adapted_type >::type property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static typename result_of::begin_value< adapted_type >::type begin_value( Id& id ) { + return bindings::begin_value( id.expression() ); + } + + static typename result_of::end_value< adapted_type >::type end_value( Id& id ) { + return bindings::end_value( id.expression() ); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return bindings::stride1( id.expression() ); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/vector_proxy.hpp b/sdk/boost/numeric/bindings/ublas/vector_proxy.hpp new file mode 100644 index 0000000..fadbdd4 --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/vector_proxy.hpp @@ -0,0 +1,81 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_VECTOR_PROXY_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_VECTOR_PROXY_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, typename Id, typename Enable > +struct adaptor< ublas::vector_range< T >, Id, Enable > { + + typedef typename copy_const< Id, T >::type adapted_type; + typedef typename property_map_of< adapted_type >::type property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static typename result_of::begin_value< adapted_type >::type begin_value( Id& id ) { + return bindings::begin_value( id.data() ) + id.start() * stride1( id ); + } + + static typename result_of::end_value< adapted_type >::type end_value( Id& id ) { + return bindings::begin_value( id.data() ) + id.size() * stride1( id ); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return bindings::stride1( id.data() ); + } + +}; + +template< typename T, typename Id, typename Enable > +struct adaptor< ublas::vector_slice< T >, Id, Enable > { + + typedef typename copy_const< Id, T >::type adapted_type; + typedef typename property_map_of< adapted_type >::type property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.size(); + } + + static typename result_of::begin_value< adapted_type >::type begin_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id, id.start() ); + } + + static typename result_of::end_value< adapted_type >::type end_value( Id& id ) { + return bindings::begin_value( id.data() ) + + offset( id, id.start() + id.size() ); + } + + static std::ptrdiff_t stride1( const Id& id ) { + return bindings::stride1( id.data() ); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/ublas/vector_sparse.hpp b/sdk/boost/numeric/bindings/ublas/vector_sparse.hpp new file mode 100644 index 0000000..60ad5ca --- /dev/null +++ b/sdk/boost/numeric/bindings/ublas/vector_sparse.hpp @@ -0,0 +1,53 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_VECTOR_SPARSE_HPP +#define BOOST_NUMERIC_BINDINGS_UBLAS_VECTOR_SPARSE_HPP + +#include +#include +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T, std::size_t IB, typename IA, typename TA, typename Id, typename Enable > +struct adaptor< ublas::compressed_vector< T, IB, IA, TA >, Id, Enable > { + + typedef typename copy_const< Id, T >::type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::compressed_sparse > + > property_map; + + static std::ptrdiff_t size1( const Id& t ) { + return t.size(); + } + +// static void index_data( Id& t ) { +// // t.index_data(); +// } +// + + static value_type* begin_value( Id& t ) { + return bindings::begin_value( t.value_data() ); + } + +}; + +} // namespace detail +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/umfpack/umfpack.hpp b/sdk/boost/numeric/bindings/umfpack/umfpack.hpp new file mode 100644 index 0000000..47d906a --- /dev/null +++ b/sdk/boost/numeric/bindings/umfpack/umfpack.hpp @@ -0,0 +1,1053 @@ +/* + * + * Copyright (c) Kresimir Fresl 2003 + * + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + * + * Author acknowledges the support of the Faculty of Civil Engineering, + * University of Zagreb, Croatia. + * + */ + +/* for UMFPACK Copyright, License and Availability see umfpack_inc.hpp */ + + +#ifndef BOOST_NUMERIC_BINDINGS_UMFPACK_HPP +#define BOOST_NUMERIC_BINDINGS_UMFPACK_HPP + + +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace boost { namespace numeric { namespace bindings { namespace umfpack { + + template + void check_umfpack_structure() + { + BOOST_STATIC_ASSERT((boost::is_same< + typename bindings::detail::property_at< MatrA, tag::matrix_type >::type, + tag::general + >::value)); + BOOST_STATIC_ASSERT((boost::is_same< + typename bindings::result_of::data_order::type, + tag::column_major + >::value)); + typedef typename bindings::result_of::index_base::type index_b; + BOOST_STATIC_ASSERT(index_b::value == 0); + typedef typename bindings::detail::property_at< + MatrA, tag::data_structure >::type storage_f; + BOOST_STATIC_ASSERT( + (boost::is_same::value || + boost::is_same::value )); + } + + template + struct symbolic_type : private noncopyable { + void *ptr; + symbolic_type():ptr(0){} + ~symbolic_type() { + if (ptr) + detail::free_symbolic (T(), 0, &ptr); + } + void free() { + if (ptr) + detail::free_symbolic (T(), 0, &ptr); + ptr = 0; + } + }; + + template + void free (symbolic_type& s) { s.free(); } + + template + struct numeric_type : private noncopyable { + void *ptr; + numeric_type():ptr(0){} + ~numeric_type() { + if (ptr) + detail::free_numeric (T(), 0, &ptr); + } + void free() { + if (ptr) + detail::free_numeric (T(), 0, &ptr); + ptr = 0; + } + }; + + template + void free (numeric_type& n) { n.free(); } + + + template + struct control_type : private noncopyable { + double ptr[UMFPACK_CONTROL]; + control_type() { detail::defaults (T(), 0, ptr); } + double operator[] (int i) const { return ptr[i]; } + double& operator[] (int i) { return ptr[i]; } + void defaults() { detail::defaults (T(), 0, ptr); } + }; + + template + void defaults (control_type& c) { c.defaults(); } + + template + struct info_type : private noncopyable { + double ptr[UMFPACK_INFO]; + double operator[] (int i) const { return ptr[i]; } + double& operator[] (int i) { return ptr[i]; } + }; + + + ///////////////////////////////////// + // solving system of linear equations + ///////////////////////////////////// + + + // symbolic + /* + * Given nonzero pattern of a sparse matrix A in column-oriented form, + * umfpack_*_symbolic performs a column pre-ordering to reduce fill-in + * (using COLAMD or AMD) and a symbolic factorisation. This is required + * before the matrix can be numerically factorised with umfpack_*_numeric. + */ + namespace detail { + + template + inline + int symbolic (tag::compressed_sparse, + MatrA const& A, void **Symbolic, + double const* Control = 0, double* Info = 0) + { + return detail::symbolic (bindings::size_row (A), + bindings::size_column (A), + bindings::begin_compressed_index_major (A), + bindings::begin_index_minor (A), + bindings::begin_value (A), + Symbolic, Control, Info); + } + + template + inline + int symbolic (tag::compressed_sparse, + MatrA const& A, QVec const& Qinit, void **Symbolic, + double const* Control = 0, double* Info = 0) + { +#ifdef CHECK_TEST_COVERAGE + typedef typename MatrA::not_yet_tested i_m_still_here; +#endif + return detail::qsymbolic (bindings::size_row (A), + bindings::size_column (A), + bindings::begin_compressed_index_major (A), + bindings::begin_index_minor (A), + bindings::begin_value (A), + bindings::begin_value (Qinit), + Symbolic, Control, Info); + } + + template + inline + int symbolic (tag::coordinate_sparse, + MatrA const& A, void **Symbolic, + double const* Control = 0, double* Info = 0) + { + int n_row = bindings::size_row (A); + int n_col = bindings::size_column (A); + int nnz = bindings::end_value (A) - bindings::begin_value (A); + + typedef typename bindings::value_type::type val_t; + + int const* Ti = bindings::begin_index_minor (A); + int const* Tj = bindings::begin_index_major (A); + bindings::detail::array Ap (n_col+1); + if (!Ap.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Ai (nnz); + if (!Ai.valid()) return UMFPACK_ERROR_out_of_memory; + + int status = detail::triplet_to_col (n_row, n_col, nnz, + Ti, Tj, static_cast (0), + Ap.storage(), Ai.storage(), + static_cast (0), 0); + if (status != UMFPACK_OK) return status; + + return detail::symbolic (n_row, n_col, + Ap.storage(), Ai.storage(), + bindings::begin_value (A), + Symbolic, Control, Info); + } + + template + inline + int symbolic (tag::coordinate_sparse, + MatrA const& A, QVec const& Qinit, void **Symbolic, + double const* Control = 0, double* Info = 0) + { +#ifdef CHECK_TEST_COVERAGE + typedef typename MatrA::not_yet_tested i_m_still_here; +#endif + int n_row = bindings::size_row (A); + int n_col = bindings::size_column (A); + int nnz = bindings::end_value (A) - bindings::begin_value (A); + + typedef typename bindings::value_type::type val_t; + + int const* Ti = bindings::begin_index_minor (A); + int const* Tj = bindings::begin_index_major (A); + bindings::detail::array Ap (n_col+1); + if (!Ap.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Ai (nnz); + if (!Ai.valid()) return UMFPACK_ERROR_out_of_memory; + + int status = detail::triplet_to_col (n_row, n_col, nnz, + Ti, Tj, static_cast (0), + Ap.storage(), Ai.storage(), + static_cast (0), 0); + if (status != UMFPACK_OK) return status; + + return detail::qsymbolic (n_row, n_col, + Ap.storage(), Ai.storage(), + bindings::begin_value (A), + bindings::begin_value (Qinit), + Symbolic, Control, Info); + } + + } // detail + + template + inline + int symbolic (MatrA const& A, + symbolic_type< + typename bindings::value_type::type + >& Symbolic, + double const* Control = 0, double* Info = 0) + { +#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK + check_umfpack_structure(); +#endif + typedef typename bindings::detail::property_at< + MatrA, tag::data_structure >::type storage_f; + + return detail::symbolic (storage_f(), A, &Symbolic.ptr, Control, Info); + } + + template + inline + int symbolic (MatrA const& A, + symbolic_type< + typename bindings::value_type::type + >& Symbolic, + control_type< + typename bindings::value_type::type + > const& Control, + info_type< + typename bindings::value_type::type + >& Info) + { + return symbolic (A, Symbolic, Control.ptr, Info.ptr); + } + + template + inline + int symbolic (MatrA const& A, + symbolic_type< + typename bindings::value_type::type + >& Symbolic, + control_type< + typename bindings::value_type::type + > const& Control) + { + return symbolic (A, Symbolic, Control.ptr); + } + + template + inline + int symbolic (MatrA const& A, QVec const& Qinit, + symbolic_type< + typename bindings::value_type::type + >& Symbolic, + double const* Control = 0, double* Info = 0) + { +#ifdef CHECK_TEST_COVERAGE + typedef typename MatrA::not_yet_tested i_m_still_here; +#endif +#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK + check_umfpack_structure(); +#endif + typedef typename bindings::detail::property_at< + MatrA, tag::data_structure >::type storage_f; + + assert (bindings::size_column (A) == bindings::size (Qinit)); + + return detail::symbolic (storage_f(), A, Qinit, + &Symbolic.ptr, Control, Info); + } + + template + inline + int symbolic (MatrA const& A, QVec const& Qinit, + symbolic_type< + typename bindings::value_type::type + >& Symbolic, + control_type< + typename bindings::value_type::type + > const& Control, + info_type< + typename bindings::value_type::type + >& Info) + { + return symbolic (A, Qinit, Symbolic, Control.ptr, Info.ptr); + } + + template + inline + int symbolic (MatrA const& A, QVec const& Qinit, + symbolic_type< + typename bindings::value_type::type + >& Symbolic, + control_type< + typename bindings::value_type::type + > const& Control) + { + return symbolic (A, Qinit, Symbolic, Control.ptr); + } + + + // numeric + /* + * Given a sparse matrix A in column-oriented form, and a symbolic analysis + * computed by umfpack_*_*symbolic, the umfpack_*_numeric routine performs + * the numerical factorisation, PAQ=LU, PRAQ=LU, or P(R\A)Q=LU, where P + * and Q are permutation matrices (represented as permutation vectors), + * R is the row scaling, L is unit-lower triangular, and U is upper + * triangular. This is required before the system Ax=b (or other related + * linear systems) can be solved. + */ + namespace detail { + + template + inline + int numeric (tag::compressed_sparse, MatrA const& A, + void *Symbolic, void** Numeric, + double const* Control = 0, double* Info = 0) + { + return detail::numeric (bindings::size_row (A), + bindings::size_column (A), + bindings::begin_compressed_index_major (A), + bindings::begin_index_minor (A), + bindings::begin_value (A), + Symbolic, Numeric, Control, Info); + } + + template + inline + int numeric (tag::coordinate_sparse, MatrA const& A, + void *Symbolic, void** Numeric, + double const* Control = 0, double* Info = 0) + { + int n_row = bindings::size_row (A); + int n_col = bindings::size_column (A); + int nnz = bindings::end_value (A) - bindings::begin_value (A); + + typedef typename bindings::value_type::type val_t; + + int const* Ti = bindings::begin_index_minor (A); + int const* Tj = bindings::begin_index_major (A); + bindings::detail::array Ap (n_col+1); + if (!Ap.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Ai (nnz); + if (!Ai.valid()) return UMFPACK_ERROR_out_of_memory; + + int status = detail::triplet_to_col (n_row, n_col, nnz, + Ti, Tj, static_cast (0), + Ap.storage(), Ai.storage(), + static_cast (0), 0); + if (status != UMFPACK_OK) return status; + + return detail::numeric (n_row, n_col, + Ap.storage(), Ai.storage(), + bindings::begin_value (A), + Symbolic, Numeric, Control, Info); + } + + } // detail + + template + inline + int numeric (MatrA const& A, + symbolic_type< + typename bindings::value_type::type + > const& Symbolic, + numeric_type< + typename bindings::value_type::type + >& Numeric, + double const* Control = 0, double* Info = 0) + { +#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK + check_umfpack_structure(); +#endif + typedef typename bindings::detail::property_at< + MatrA, tag::data_structure >::type storage_f; + + return detail::numeric (storage_f(), A, + Symbolic.ptr, &Numeric.ptr, Control, Info); + } + + template + inline + int numeric (MatrA const& A, + symbolic_type< + typename bindings::value_type::type + > const& Symbolic, + numeric_type< + typename bindings::value_type::type + >& Numeric, + control_type< + typename bindings::value_type::type + > const& Control, + info_type< + typename bindings::value_type::type + >& Info) + + { + // g++ (3.2) is unable to distinguish + // function numeric() and namespace boost::numeric ;o) + return umfpack::numeric (A, Symbolic, Numeric, Control.ptr, Info.ptr); + } + + template + inline + int numeric (MatrA const& A, + symbolic_type< + typename bindings::value_type::type + > const& Symbolic, + numeric_type< + typename bindings::value_type::type + >& Numeric, + control_type< + typename bindings::value_type::type + > const& Control) + { + return umfpack::numeric (A, Symbolic, Numeric, Control.ptr); + } + + + // factor + /* + * symbolic and numeric + */ + namespace detail { + + template + inline + int factor (tag::compressed_sparse, MatrA const& A, + void** Numeric, double const* Control = 0, double* Info = 0) + { +#ifdef CHECK_TEST_COVERAGE + typedef typename MatrA::not_yet_tested i_m_still_here; +#endif + symbolic_type::type> + Symbolic; + + int status; + status = detail::symbolic (bindings::size_row (A), + bindings::size_column (A), + bindings::begin_compressed_index_major (A), + bindings::begin_index_minor (A), + bindings::begin_value (A), + &Symbolic.ptr, Control, Info); + if (status != UMFPACK_OK) return status; + + return detail::numeric (bindings::size_row (A), + bindings::size_column (A), + bindings::begin_compressed_index_major (A), + bindings::begin_index_minor (A), + bindings::begin_value (A), + Symbolic.ptr, Numeric, Control, Info); + } + + template + inline + int factor (tag::coordinate_sparse, MatrA const& A, + void** Numeric, double const* Control = 0, double* Info = 0) + { +#ifdef CHECK_TEST_COVERAGE + typedef typename MatrA::not_yet_tested i_m_still_here; +#endif + int n_row = bindings::size_row (A); + int n_col = bindings::size_column (A); + int nnz = bindings::end_value (A) - bindings::begin_value (A); + + typedef typename bindings::value_type::type val_t; + + int const* Ti = bindings::begin_index_minor (A); + int const* Tj = bindings::begin_index_major (A); + bindings::detail::array Ap (n_col+1); + if (!Ap.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Ai (nnz); + if (!Ai.valid()) return UMFPACK_ERROR_out_of_memory; + + int status = detail::triplet_to_col (n_row, n_col, nnz, + Ti, Tj, static_cast (0), + Ap.storage(), Ai.storage(), + static_cast (0), 0); + if (status != UMFPACK_OK) return status; + + symbolic_type::type> + Symbolic; + + status = detail::symbolic (n_row, n_col, + Ap.storage(), Ai.storage(), + bindings::begin_value (A), + &Symbolic.ptr, Control, Info); + if (status != UMFPACK_OK) return status; + + return detail::numeric (n_row, n_col, + Ap.storage(), Ai.storage(), + bindings::begin_value (A), + Symbolic.ptr, Numeric, Control, Info); + } + + } // detail + + template + inline + int factor (MatrA const& A, + numeric_type< + typename bindings::value_type::type + >& Numeric, + double const* Control = 0, double* Info = 0) + { +#ifdef CHECK_TEST_COVERAGE + typedef typename MatrA::not_yet_tested i_m_still_here; +#endif +#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK + check_umfpack_structure(); +#endif + typedef typename bindings::detail::property_at< + MatrA, tag::data_structure >::type storage_f; + + return detail::factor (storage_f(), A, &Numeric.ptr, Control, Info); + } + + template + inline + int factor (MatrA const& A, + numeric_type< + typename bindings::value_type::type + >& Numeric, + control_type< + typename bindings::value_type::type + > const& Control, + info_type< + typename bindings::value_type::type + >& Info) + { + return factor (A, Numeric, Control.ptr, Info.ptr); + } + + template + inline + int factor (MatrA const& A, + numeric_type< + typename bindings::value_type::type + >& Numeric, + control_type< + typename bindings::value_type::type + > const& Control) + { + return factor (A, Numeric, Control.ptr); + } + + + // solve + /* + * Given LU factors computed by umfpack_*_numeric and the right-hand-side, + * B, solve a linear system for the solution X. Iterative refinement is + * optionally performed. Only square systems are handled. + */ + namespace detail { + + template + inline + int solve (tag::compressed_sparse, int sys, + MatrA const& A, VecX& X, VecB const& B, + void *Numeric, double const* Control = 0, double* Info = 0) + { + return detail::solve (sys, bindings::size_row (A), + bindings::begin_compressed_index_major (A), + bindings::begin_index_minor (A), + bindings::begin_value (A), + bindings::begin_value (X), + bindings::begin_value (B), + Numeric, Control, Info); + } + + template + inline + int solve (tag::coordinate_sparse, int sys, + MatrA const& A, VecX& X, VecB const& B, + void *Numeric, double const* Control = 0, double* Info = 0) + { + + int n = bindings::size_row (A); + int nnz = bindings::end_value (A) - bindings::begin_value (A); + + typedef typename bindings::value_type::type val_t; + + int const* Ti = bindings::begin_index_minor (A); + int const* Tj = bindings::begin_index_major (A); + bindings::detail::array Ap (n+1); + if (!Ap.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Ai (nnz); + if (!Ai.valid()) return UMFPACK_ERROR_out_of_memory; + + int status = detail::triplet_to_col (n, n, nnz, + Ti, Tj, static_cast (0), + Ap.storage(), Ai.storage(), + static_cast (0), 0); + if (status != UMFPACK_OK) return status; + + return detail::solve (sys, n, Ap.storage(), Ai.storage(), + bindings::begin_value (A), + bindings::begin_value (X), + bindings::begin_value (B), + Numeric, Control, Info); + } + + } // detail + + template + inline + int solve (int sys, MatrA const& A, VecX& X, VecB const& B, + numeric_type< + typename bindings::value_type::type + > const& Numeric, + double const* Control = 0, double* Info = 0) + { +#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK + check_umfpack_structure(); +#endif + typedef typename bindings::detail::property_at< + MatrA, tag::data_structure >::type storage_f; + + assert (bindings::size_row (A) == bindings::size_row (A)); + assert (bindings::size_column (A) == bindings::size (X)); + assert (bindings::size_column (A) == bindings::size (B)); + + return detail::solve (storage_f(), sys, A, X, B, + Numeric.ptr, Control, Info); + } + + template + inline + int solve (int sys, MatrA const& A, VecX& X, VecB const& B, + numeric_type< + typename bindings::value_type::type + > const& Numeric, + control_type< + typename bindings::value_type::type + > const& Control, + info_type< + typename bindings::value_type::type + >& Info) + { + return solve (sys, A, X, B, Numeric, Control.ptr, Info.ptr); + } + + template + inline + int solve (int sys, MatrA const& A, VecX& X, VecB const& B, + numeric_type< + typename bindings::value_type::type + > const& Numeric, + control_type< + typename bindings::value_type::type + > const& Control) + { + return solve (sys, A, X, B, Numeric, Control.ptr); + } + + template + inline + int solve (MatrA const& A, VecX& X, VecB const& B, + numeric_type< + typename bindings::value_type::type + > const& Numeric, + double const* Control = 0, double* Info = 0) + { + return solve (UMFPACK_A, A, X, B, Numeric, Control, Info); + } + + template + inline + int solve (MatrA const& A, VecX& X, VecB const& B, + numeric_type< + typename bindings::value_type::type + > const& Numeric, + control_type< + typename bindings::value_type::type + > const& Control, + info_type< + typename bindings::value_type::type + >& Info) + { + return solve (UMFPACK_A, A, X, B, Numeric, + Control.ptr, Info.ptr); + } + + template + inline + int solve (MatrA const& A, VecX& X, VecB const& B, + numeric_type< + typename bindings::value_type::type + > const& Numeric, + control_type< + typename bindings::value_type::type + > const& Control) + { + return solve (UMFPACK_A, A, X, B, Numeric, Control.ptr); + } + + + // umf_solve + /* + * symbolic, numeric and solve + */ + namespace detail { + + template + inline + int umf_solve (tag::compressed_sparse, + MatrA const& A, VecX& X, VecB const& B, + double const* Control = 0, double* Info = 0) + { +#ifdef CHECK_TEST_COVERAGE + typedef typename MatrA::not_yet_tested i_m_still_here; +#endif + symbolic_type::type> + Symbolic; + numeric_type::type> + Numeric; + + int status; + status = detail::symbolic (bindings::size_row (A), + bindings::size_column (A), + bindings::begin_compressed_index_major (A), + bindings::begin_index_minor (A), + bindings::begin_value (A), + &Symbolic.ptr, Control, Info); + if (status != UMFPACK_OK) return status; + + status = detail::numeric (bindings::size_row (A), + bindings::size_column (A), + bindings::begin_compressed_index_major (A), + bindings::begin_index_minor (A), + bindings::begin_value (A), + Symbolic.ptr, &Numeric.ptr, Control, Info); + if (status != UMFPACK_OK) return status; + + return detail::solve (UMFPACK_A, bindings::size_row (A), + bindings::begin_compressed_index_major (A), + bindings::begin_index_minor (A), + bindings::begin_value (A), + bindings::begin_value (X), + bindings::begin_value (B), + Numeric.ptr, Control, Info); + } + + template + inline + int umf_solve (tag::coordinate_sparse, + MatrA const& A, VecX& X, VecB const& B, + double const* Control = 0, double* Info = 0) + { +#ifdef CHECK_TEST_COVERAGE + typedef typename MatrAA::not_yet_tested i_m_still_here; +#endif + int n_row = bindings::size_row (A); + int n_col = bindings::size_column (A); + int nnz = bindings::end_value (A) - bindings::begin_value (A); + + typedef typename bindings::value_type::type val_t; + + int const* Ti = bindings::begin_index_minor (A); + int const* Tj = bindings::begin_index_major (A); + bindings::detail::array Ap (n_col+1); + if (!Ap.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Ai (nnz); + if (!Ai.valid()) return UMFPACK_ERROR_out_of_memory; + + int status = detail::triplet_to_col (n_row, n_col, nnz, + Ti, Tj, static_cast (0), + Ap.storage(), Ai.storage(), + static_cast (0), 0); + if (status != UMFPACK_OK) return status; + + symbolic_type::type> + Symbolic; + numeric_type::type> + Numeric; + + status = detail::symbolic (n_row, n_col, + Ap.storage(), Ai.storage(), + bindings::begin_value (A), + &Symbolic.ptr, Control, Info); + if (status != UMFPACK_OK) return status; + + status = detail::numeric (n_row, n_col, + Ap.storage(), Ai.storage(), + bindings::begin_value (A), + Symbolic.ptr, &Numeric.ptr, Control, Info); + if (status != UMFPACK_OK) return status; + + return detail::solve (UMFPACK_A, n_row, Ap.storage(), Ai.storage(), + bindings::begin_value (A), + bindings::begin_value (X), + bindings::begin_value (B), + Numeric.ptr, Control, Info); + } + + } // detail + + template + inline + int umf_solve (MatrA const& A, VecX& X, VecB const& B, + double const* Control = 0, double* Info = 0) + { +#ifdef CHECK_TEST_COVERAGE + typedef typename MatrA::not_yet_tested i_m_still_here; +#endif +#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK + check_umfpack_structure(); +#endif + typedef typename bindings::detail::property_at< + MatrA, tag::data_structure >::type storage_f; + + assert (bindings::size_row (A) == bindings::size_row (A)); + assert (bindings::size_column (A) == bindings::size (X)); + assert (bindings::size_column (A) == bindings::size (B)); + + return detail::umf_solve (storage_f(), A, X, B, Control, Info); + } + + template + inline + int umf_solve (MatrA const& A, VecX& X, VecB const& B, + control_type< + typename bindings::value_type::type + > const& Control, + info_type< + typename bindings::value_type::type + >& Info) + { + return umf_solve (A, X, B, Control.ptr, Info.ptr); + } + + template + inline + int umf_solve (MatrA const& A, VecX& X, VecB const& B, + control_type< + typename bindings::value_type::type + > const& Control) + { + return umf_solve (A, X, B, Control.ptr); + } + + + /////////////////////// + // matrix manipulations + /////////////////////// + + + // scale + + template + inline + int scale (VecX& X, VecB const& B, + numeric_type< + typename bindings::value_type::type + > const& Numeric) + { + return detail::scale (bindings::size (B), + bindings::begin_value (X), + bindings::begin_value (B), + Numeric.ptr); + } + + + //////////// + // reporting + //////////// + + + // report status + + template + inline + void report_status (control_type const& Control, int status) { + detail::report_status (T(), 0, Control.ptr, status); + } + +#if 0 + template + inline + void report_status (int printing_level, int status) { + control_type Control; + Control[UMFPACK_PRL] = printing_level; + detail::report_status (T(), 0, Control.ptr, status); + } + template + inline + void report_status (int status) { + control_type Control; + detail::report_status (T(), 0, Control.ptr, status); + } +#endif + + + // report control + + template + inline + void report_control (control_type const& Control) { + detail::report_control (T(), 0, Control.ptr); + } + + + // report info + + template + inline + void report_info (control_type const& Control, info_type const& Info) { + detail::report_info (T(), 0, Control.ptr, Info.ptr); + } + +#if 0 + template + inline + void report_info (int printing_level, info_type const& Info) { + control_type Control; + Control[UMFPACK_PRL] = printing_level; + detail::report_info (T(), 0, Control.ptr, Info.ptr); + } + template + inline + void report_info (info_type const& Info) { + control_type Control; + detail::report_info (T(), 0, Control.ptr, Info.ptr); + } +#endif + + + // report matrix (compressed column and coordinate) + + namespace detail { + + template + inline + int report_matrix (tag::compressed_sparse, MatrA const& A, + double const* Control) + { + return detail::report_matrix (bindings::size_row (A), + bindings::size_column (A), + bindings::begin_compressed_index_major (A), + bindings::begin_index_minor (A), + bindings::begin_value (A), + 1, Control); + } + + template + inline + int report_matrix (tag::coordinate_sparse, MatrA const& A, + double const* Control) + { + return detail::report_triplet (bindings::size_row (A), + bindings::size_column (A), + bindings::end_value (A) - bindings::begin_value (A), + bindings::begin_index_major (A), + bindings::begin_index_minor (A), + bindings::begin_value (A), + Control); + } + + } // detail + + template + inline + int report_matrix (MatrA const& A, + control_type< + typename bindings::value_type::type + > const& Control) + { +#ifndef BOOST_NUMERIC_BINDINGS_NO_STRUCTURE_CHECK + check_umfpack_structure(); +#endif + typedef typename bindings::detail::property_at< + MatrA, tag::data_structure >::type storage_f; + + return detail::report_matrix (storage_f(), A, Control.ptr); + } + + + // report vector + + template + inline + int report_vector (VecX const& X, + control_type< + typename bindings::value_type::type + > const& Control) + { + return detail::report_vector (bindings::size (X), + bindings::begin_value (X), + Control.ptr); + } + + + // report numeric + + template + inline + int report_numeric (numeric_type const& Numeric, + control_type const& Control) + { + return detail::report_numeric (T(), 0, Numeric.ptr, Control.ptr); + } + + + // report symbolic + + template + inline + int report_symbolic (symbolic_type const& Symbolic, + control_type const& Control) + { + return detail::report_symbolic (T(), 0, Symbolic.ptr, Control.ptr); + } + + + // report permutation vector + + template + inline + int report_permutation (VecP const& Perm, control_type const& Control) { +#ifdef CHECK_TEST_COVERAGE + typedef typename T::not_yet_tested i_m_still_here; +#endif + return detail::report_perm (T(), 0, + bindings::begin_value (Perm), + Control.ptr); + } + + +}}}} + +#endif // BOOST_NUMERIC_BINDINGS_UMFPACK_HPP diff --git a/sdk/boost/numeric/bindings/umfpack/umfpack_inc.hpp b/sdk/boost/numeric/bindings/umfpack/umfpack_inc.hpp new file mode 100644 index 0000000..01dd0d8 --- /dev/null +++ b/sdk/boost/numeric/bindings/umfpack/umfpack_inc.hpp @@ -0,0 +1,59 @@ +/* + * + * Copyright (c) Kresimir Fresl 2003 + * + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + * + * Author acknowledges the support of the Faculty of Civil Engineering, + * University of Zagreb, Croatia. + * + */ + + +/***********************************************************************/ +/* UMFPACK Copyright, License and Availability */ +/***********************************************************************/ +/* + * + * UMFPACK Version 4.1 (Apr. 30, 2003), Copyright (c) 2003 by Timothy A. + * Davis. All Rights Reserved. + * + * UMFPACK License: + * + * Your use or distribution of UMFPACK or any modified version of + * UMFPACK implies that you agree to this License. + * + * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY + * EXPRESSED OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + * + * Permission is hereby granted to use or copy this program, provided + * that the Copyright, this License, and the Availability of the original + * version is retained on all copies. User documentation of any code that + * uses UMFPACK or any modified version of UMFPACK code must cite the + * Copyright, this License, the Availability note, and "Used by permission." + * Permission to modify the code and to distribute modified code is granted, + * provided the Copyright, this License, and the Availability note are + * retained, and a notice that the code was modified is included. This + * software was developed with support from the National Science Foundation, + * and is provided to you free of charge. + * + * Availability: + * + * http://www.cise.ufl.edu/research/sparse/umfpack + * + */ + + +/* Used by permission. */ + + +#ifndef BOOST_NUMERIC_BINDINGS_UMFPACK_INC_H +#define BOOST_NUMERIC_BINDINGS_UMFPACK_INC_H + +extern "C" { +#include +} + +#endif diff --git a/sdk/boost/numeric/bindings/umfpack/umfpack_overloads.hpp b/sdk/boost/numeric/bindings/umfpack/umfpack_overloads.hpp new file mode 100644 index 0000000..833e104 --- /dev/null +++ b/sdk/boost/numeric/bindings/umfpack/umfpack_overloads.hpp @@ -0,0 +1,472 @@ +/* + * + * Copyright (c) Kresimir Fresl 2003 + * + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + * + * Author acknowledges the support of the Faculty of Civil Engineering, + * University of Zagreb, Croatia. + * + */ + +/* for UMFPACK Copyright, License and Availability see umfpack_inc.hpp */ + + +#ifndef BOOST_NUMERIC_BINDINGS_UMFPACK_OVERLOADS_HPP +#define BOOST_NUMERIC_BINDINGS_UMFPACK_OVERLOADS_HPP + +#include +#include +#include +#include + +namespace boost { namespace numeric { namespace bindings { + + namespace umfpack { namespace detail { + + //////////////////////////// + // UMFPACK primary routines: + //////////////////////////// + + // symbolic + + inline + int symbolic (int n_row, int n_col, + int const* Ap, int const* Ai, double const* Ax, + void **Symbolic, double const* Control, double* Info) + { + return umfpack_di_symbolic (n_row, n_col, Ap, Ai, Ax, + Symbolic, Control, Info); + } + + inline + int symbolic (int n_row, int n_col, + int const* Ap, int const* Ai, traits::complex_d const* Ax, + void **Symbolic, double const* Control, double* Info) + { + int nnz = Ap[n_col]; + bindings::detail::array Axr (nnz); + if (!Axr.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Axi (nnz); + if (!Axi.valid()) return UMFPACK_ERROR_out_of_memory; + traits::detail::disentangle (Ax, Ax+nnz, + Axr.storage(), Axi.storage()); + return umfpack_zi_symbolic (n_row, n_col, Ap, Ai, + Axr.storage(), Axi.storage(), + Symbolic, Control, Info); + } + + + // numeric + + inline + int numeric (int, int, + int const* Ap, int const* Ai, double const* Ax, + void *Symbolic, void **Numeric, + double const* Control, double* Info) + { + return umfpack_di_numeric (Ap, Ai, Ax, Symbolic, Numeric, Control, Info); + } + + inline + int numeric (int, int n_col, + int const* Ap, int const* Ai, traits::complex_d const* Ax, + void *Symbolic, void **Numeric, + double const* Control, double* Info) + { + int nnz = Ap[n_col]; + bindings::detail::array Axr (nnz); + if (!Axr.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Axi (nnz); + if (!Axi.valid()) return UMFPACK_ERROR_out_of_memory; + traits::detail::disentangle (Ax, Ax+nnz, + Axr.storage(), Axi.storage()); + return umfpack_zi_numeric (Ap, Ai, Axr.storage(), Axi.storage(), + Symbolic, Numeric, Control, Info); + } + + + // solve + + inline + int solve (int sys, int, + int const* Ap, int const* Ai, double const* Ax, + double* X, double const* B, void *Numeric, + double const* Control, double* Info) + { + return umfpack_di_solve (sys, Ap, Ai, Ax, X, B, Numeric, Control, Info); + } + + inline + int solve (int sys, int n, + int const* Ap, int const* Ai, traits::complex_d const* Ax, + traits::complex_d* X, traits::complex_d const* B, + void *Numeric, double const* Control, double* Info) + { + int nnz = Ap[n]; + bindings::detail::array Axr (nnz); + if (!Axr.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Axi (nnz); + if (!Axi.valid()) return UMFPACK_ERROR_out_of_memory; + traits::detail::disentangle (Ax, Ax+nnz, + Axr.storage(), Axi.storage()); + bindings::detail::array Br (n); + if (!Br.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Bi (n); + if (!Bi.valid()) return UMFPACK_ERROR_out_of_memory; + traits::detail::disentangle (B, B+n, + Br.storage(), Bi.storage()); + bindings::detail::array Xr (n); + if (!Xr.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Xi (n); + if (!Xi.valid()) return UMFPACK_ERROR_out_of_memory; + + int status = umfpack_zi_solve (sys, Ap, Ai, + Axr.storage(), Axi.storage(), + Xr.storage(), Xi.storage(), + Br.storage(), Bi.storage(), + Numeric, Control, Info); + if (status != UMFPACK_OK) return status; + traits::detail::interlace (Xr.storage(), Xr.storage() + n, + Xi.storage(), X); + return status; + } + + + // free_symbolic + + inline + void free_symbolic (double, int, void **Symbolic) { + umfpack_di_free_symbolic (Symbolic); + } + inline + void free_symbolic (traits::complex_d const&, int, void **Symbolic) { + umfpack_zi_free_symbolic (Symbolic); + } + + + // free_numeric + + inline + void free_numeric (double, int, void **Numeric) { + umfpack_di_free_numeric (Numeric); + } + inline + void free_numeric (traits::complex_d const&, int, void **Numeric) { + umfpack_zi_free_numeric (Numeric); + } + + + //////////////////////////////// + // UMFPACK alternative routines: + //////////////////////////////// + + // default control + + inline + void defaults (double, int, double* Control) { + umfpack_di_defaults (Control); + } + inline + void defaults (traits::complex_d const&, int, double* Control) { + umfpack_zi_defaults (Control); + } + + + // symbolic with specified column preordering + + inline + int qsymbolic (int n_row, int n_col, + int const* Ap, int const* Ai, double const* Ax, + int const* Qinit, + void **Symbolic, double const* Control, double* Info) + { + return umfpack_di_qsymbolic (n_row, n_col, Ap, Ai, Ax, Qinit, + Symbolic, Control, Info); + } + + inline + int qsymbolic (int n_row, int n_col, + int const* Ap, int const* Ai, traits::complex_d const* Ax, + int const* Qinit, + void **Symbolic, double const* Control, double* Info) + { + int nnz = Ap[n_col]; + bindings::detail::array Axr (nnz); + if (!Axr.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Axi (nnz); + if (!Axi.valid()) return UMFPACK_ERROR_out_of_memory; + traits::detail::disentangle (Ax, Ax+nnz, + Axr.storage(), Axi.storage()); + return umfpack_zi_qsymbolic (n_row, n_col, Ap, Ai, + Axr.storage(), Axi.storage(), + Qinit, Symbolic, Control, Info); + } + + + /////////////////////////////////////// + // UMFPACK matrix manipulation routines + /////////////////////////////////////// + + // triplet (coordinate) to compressed column + + inline + int triplet_to_col (int n_row, int n_col, int nz, + int const* Ti, int const* Tj, double const* Tx, + int* Ap, int* Ai, double* Ax, int* Map) + { + return umfpack_di_triplet_to_col (n_row, n_col, nz, + Ti, Tj, Tx, + Ap, Ai, Ax, Map); + } + + inline + int triplet_to_col (int n_row, int n_col, int nz, + int const* Ti, int const* Tj, + traits::complex_d const* Tx, + int* Ap, int* Ai, traits::complex_d* Ax, + int* Map) + { + assert (Tx == 0 && Ax == 0 || Tx != 0 && Ax != 0); + double *Txr = 0, *Txi = 0; + if (Tx != 0) { + bindings::detail::array ATxr (nz); + if (!ATxr.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array ATxi (nz); + if (!ATxi.valid()) return UMFPACK_ERROR_out_of_memory; + Txr = ATxr.storage(); + Txi = ATxi.storage(); + traits::detail::disentangle (Tx, Tx+nz, Txr, Txi); + } + double *Axr = 0, *Axi = 0; + if (Ax != 0) { + bindings::detail::array AAxr (nz); + if (!AAxr.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array AAxi (nz); + if (!AAxi.valid()) return UMFPACK_ERROR_out_of_memory; + Axr = AAxr.storage(); + Axi = AAxi.storage(); + } + int status; + status = umfpack_zi_triplet_to_col (n_row, n_col, nz, + Ti, Tj, Txr, Txi, + Ap, Ai, Axr, Axi, Map); + if (Ax != 0) { + if (status != UMFPACK_OK) return status; + traits::detail::interlace (Axr, Axr + nz, Axi, Ax); + } + return status; + } + + + // scale + + inline + int scale (int, double* X, double const* B, void* Numeric) { + return umfpack_di_scale (X, B, Numeric); + } + + inline + int scale (int n, traits::complex_d* X, + traits::complex_d const* B, void* Numeric) + { + bindings::detail::array Br (n); + if (!Br.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Bi (n); + if (!Bi.valid()) return UMFPACK_ERROR_out_of_memory; + traits::detail::disentangle (B, B+n, + Br.storage(), Bi.storage()); + bindings::detail::array Xr (n); + if (!Xr.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Xi (n); + if (!Xi.valid()) return UMFPACK_ERROR_out_of_memory; + + int status = umfpack_zi_scale (Xr.storage(), Xi.storage(), + Br.storage(), Bi.storage(), + Numeric); + if (status != UMFPACK_OK) return status; + traits::detail::interlace (Xr.storage(), Xr.storage() + n, + Xi.storage(), X); + return status; + } + + + ////////////////////////////// + // UMFPACK reporting routines: + ////////////////////////////// + + // report status + + inline + void report_status (double, int, double const* Control, int status) { + umfpack_di_report_status (Control, status); + } + inline + void report_status (traits::complex_d const&, int, + double const* Control, int status) + { + umfpack_zi_report_status (Control, status); + } + + + // report control + + inline + void report_control (double, int, double const* Control) { + umfpack_di_report_control (Control); + } + inline + void + report_control (traits::complex_d const&, int, double const* Control) { + umfpack_zi_report_control (Control); + } + + + // report info + + inline + void report_info (double, int, double const* Control, double const* Info) { + umfpack_di_report_info (Control, Info); + } + inline + void report_info (traits::complex_d const&, int, + double const* Control, double const* Info) + { + umfpack_zi_report_info (Control, Info); + } + + + // report matrix + + inline + int report_matrix (int n_row, int n_col, + int const* Ap, int const* Ai, double const* Ax, + int col_form, double const* Control) + { + return umfpack_di_report_matrix (n_row, n_col, Ap, Ai, Ax, + col_form, Control); + } + + inline + int report_matrix (int n_row, int n_col, + int const* Ap, int const* Ai, + traits::complex_d const* Ax, + int col_form, double const* Control) + { + int nnz = Ap[n_col]; + bindings::detail::array Axr (nnz); + if (!Axr.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Axi (nnz); + if (!Axi.valid()) return UMFPACK_ERROR_out_of_memory; + traits::detail::disentangle (Ax, Ax+nnz, + Axr.storage(), Axi.storage()); + return umfpack_zi_report_matrix (n_row, n_col, Ap, Ai, + Axr.storage(), Axi.storage(), + col_form, Control); + } + + + // report triplet (coordinate) + + inline + int report_triplet (int n_row, int n_col, int nz, + int const* Ti, int const* Tj, double const* Tx, + double const* Control) + { + return umfpack_di_report_triplet (n_row, n_col, nz, Ti, Tj, Tx, Control); + } + + inline + int report_triplet (int n_row, int n_col, int nz, + int const* Ti, int const* Tj, + traits::complex_d const* Tx, + double const* Control) + { + bindings::detail::array Txr (nz); + if (!Txr.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Txi (nz); + if (!Txi.valid()) return UMFPACK_ERROR_out_of_memory; + traits::detail::disentangle (Tx, Tx+nz, + Txr.storage(), Txi.storage()); + return umfpack_zi_report_triplet (n_row, n_col, nz, Ti, Tj, + Txr.storage(), Txi.storage(), + Control); + } + + + // report vector + + inline + int report_vector (int n, double const* X, double const* Control) { + return umfpack_di_report_vector (n, X, Control); + } + + inline + int report_vector (int n, traits::complex_d const* X, + double const* Control) + { +#if 0 + // see UMFPACK v 4.1 User Guide + bindings::detail::array Xr (n); + if (!Xr.valid()) return UMFPACK_ERROR_out_of_memory; + bindings::detail::array Xi (n); + if (!Xi.valid()) return UMFPACK_ERROR_out_of_memory; + traits::detail::disentangle (X, X+n, + Xr.storage(), Xi.storage()); + return umfpack_zi_report_vector (n, Xr.storage(), Xi.storage(), Control); +#endif + return umfpack_zi_report_vector (n, + reinterpret_cast (X), + reinterpret_cast (0), + Control); + } + + + // report numeric + + inline + int report_numeric (double, int, void* Numeric, double const* Control) { + return umfpack_di_report_numeric (Numeric, Control); + } + inline + int report_numeric (traits::complex_d const&, int, + void* Numeric, double const* Control) + { + return umfpack_zi_report_numeric (Numeric, Control); + } + + + // report symbolic + + inline + int report_symbolic (double, int, void* Symbolic, double const* Control) { + return umfpack_di_report_symbolic (Symbolic, Control); + } + inline + int report_symbolic (traits::complex_d const&, int, + void* Symbolic, double const* Control) + { + return umfpack_zi_report_symbolic (Symbolic, Control); + } + + + // report permutation vector + + inline + int report_perm (double, int, int np, + int const* Perm, double const* Control) { + return umfpack_di_report_perm (np, Perm, Control); + } + inline + int report_perm (traits::complex_d const&, int, int np, + int const* Perm, double const* Control) { + return umfpack_zi_report_perm (np, Perm, Control); + } + + }} + +}}} + +#endif // BOOST_NUMERIC_BINDINGS_UMFPACK_OVERLOADS_HPP diff --git a/sdk/boost/numeric/bindings/unit_lower.hpp b/sdk/boost/numeric/bindings/unit_lower.hpp new file mode 100644 index 0000000..30a3629 --- /dev/null +++ b/sdk/boost/numeric/bindings/unit_lower.hpp @@ -0,0 +1,45 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UNIT_LOWER_HPP +#define BOOST_NUMERIC_BINDINGS_UNIT_LOWER_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace result_of { + +template< typename T > +struct unit_lower { + typedef detail::basic_wrapper< + T, + mpl::pair< tag::matrix_type, tag::unit_triangular >, + mpl::pair< tag::data_side, tag::lower > + > type; +}; + +} // namespace result_of + +template< typename T > +typename result_of::unit_lower< T >::type const unit_lower( T& underlying ) { + return typename result_of::unit_lower< T >::type( underlying ); +} + +template< typename T > +typename result_of::unit_lower< const T >::type const unit_lower( const T& underlying ) { + return typename result_of::unit_lower< const T >::type( underlying ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/unit_upper.hpp b/sdk/boost/numeric/bindings/unit_upper.hpp new file mode 100644 index 0000000..a7cc71a --- /dev/null +++ b/sdk/boost/numeric/bindings/unit_upper.hpp @@ -0,0 +1,45 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UNIT_UPPER_HPP +#define BOOST_NUMERIC_BINDINGS_UNIT_UPPER_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace result_of { + +template< typename T > +struct unit_upper { + typedef detail::basic_wrapper< + T, + mpl::pair< tag::matrix_type, tag::unit_triangular >, + mpl::pair< tag::data_side, tag::upper > + > type; +}; + +} // namespace result_of + +template< typename T > +typename result_of::unit_upper< T >::type const unit_upper( T& underlying ) { + return typename result_of::unit_upper< T >::type( underlying ); +} + +template< typename T > +typename result_of::unit_upper< const T >::type const unit_upper( const T& underlying ) { + return typename result_of::unit_upper< const T >::type( underlying ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/uplo_tag.hpp b/sdk/boost/numeric/bindings/uplo_tag.hpp new file mode 100644 index 0000000..e726b07 --- /dev/null +++ b/sdk/boost/numeric/bindings/uplo_tag.hpp @@ -0,0 +1,77 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UPLO_TAG_HPP +#define BOOST_NUMERIC_BINDINGS_UPLO_TAG_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename DataSide, typename TransTag > +struct uplo_tag_impl { + // If your program complains about this part, this probably + // means that you are trying to use row_major matrices where you + // should use column_major matrices. +}; + +template<> +struct uplo_tag_impl< tag::upper, tag::no_transpose > { + typedef tag::upper type; +}; + +template< typename TransTag > +struct uplo_tag_impl< tag::upper, TransTag > { + typedef tag::lower type; +}; + +template<> +struct uplo_tag_impl< tag::lower, tag::no_transpose > { + typedef tag::lower type; +}; + +template< typename TransTag > +struct uplo_tag_impl< tag::lower, TransTag > { + typedef tag::upper type; +}; + +} // namespace detail + +namespace result_of { + +template< typename T, typename Trans = tag::no_transpose > +struct uplo_tag { + typedef typename detail::uplo_tag_impl< + typename detail::property_at< T, tag::data_side >::type, + Trans + >::type type; +}; + +} // namespace result_of + +// +// uplo_tag will output tags that are compatible with BLAS and LAPACK, either one +// of tag::transpose, tag::no_transpose, or tag::conjugate. +// It needs an library-orientation (Trans) before it can make a decision about whether +// a tranpose is in order. Consult the various cases above to see what kind of +// tag is being generated in what kind of situation. +// +template< typename T, typename Trans > +typename result_of::uplo_tag< T, Trans >::type uplo_tag( const T& t, Trans ) { + return result_of::uplo_tag< T, Trans >::type(); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/upper.hpp b/sdk/boost/numeric/bindings/upper.hpp new file mode 100644 index 0000000..196b0e7 --- /dev/null +++ b/sdk/boost/numeric/bindings/upper.hpp @@ -0,0 +1,45 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_UPPER_HPP +#define BOOST_NUMERIC_BINDINGS_UPPER_HPP + +#include +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace result_of { + +template< typename T > +struct upper { + typedef detail::basic_wrapper< + T, + mpl::pair< tag::matrix_type, tag::triangular >, + mpl::pair< tag::data_side, tag::upper > + > type; +}; + +} // namespace result_of + +template< typename T > +typename result_of::upper< T >::type const upper( T& underlying ) { + return typename result_of::upper< T >::type( underlying ); +} + +template< typename T > +typename result_of::upper< const T >::type const upper( const T& underlying ) { + return typename result_of::upper< const T >::type( underlying ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/value_type.hpp b/sdk/boost/numeric/bindings/value_type.hpp new file mode 100644 index 0000000..545a14b --- /dev/null +++ b/sdk/boost/numeric/bindings/value_type.hpp @@ -0,0 +1,27 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_VALUE_TYPE_HPP +#define BOOST_NUMERIC_BINDINGS_VALUE_TYPE_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { + +template< typename T > +struct value_type { + typedef typename detail::property_at< T, tag::value_type >::type type; +}; + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/vector_view.hpp b/sdk/boost/numeric/bindings/vector_view.hpp new file mode 100644 index 0000000..f48ed09 --- /dev/null +++ b/sdk/boost/numeric/bindings/vector_view.hpp @@ -0,0 +1,83 @@ +// +// Copyright (c) 2009 Rutger ter Borg +// Copyright (c) 2010 Thomas Klimpel +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_VECTOR_VIEW_HPP +#define BOOST_NUMERIC_BINDINGS_VECTOR_VIEW_HPP + +#include + +namespace boost { +namespace numeric { +namespace bindings { +namespace detail { + +template< typename T > +struct vector_view_wrapper: + adaptable_type< vector_view_wrapper > { + typedef T value_type; + + vector_view_wrapper( T* t, std::size_t size ): + m_t( t ), + m_size( size ) {} + T* m_t; + std::size_t m_size; +}; + +template< typename T, typename Id, typename Enable > +struct adaptor< vector_view_wrapper, Id, Enable > { + + typedef typename Id::value_type value_type; + typedef mpl::map< + mpl::pair< tag::value_type, value_type >, + mpl::pair< tag::entity, tag::vector >, + mpl::pair< tag::size_type<1>, std::ptrdiff_t >, + mpl::pair< tag::data_structure, tag::linear_array >, + mpl::pair< tag::stride_type<1>, tag::contiguous > + > property_map; + + static std::ptrdiff_t size1( const Id& id ) { + return id.m_size; + } + + static value_type* begin_value( Id& id ) { + return id.m_t; + } + + static value_type* end_value( Id& id ) { + return id.m_t + id.m_size; + } + +}; + +} // namespace detail + +namespace result_of { + +template< typename T > +struct vector_view { + typedef detail::vector_view_wrapper type; +}; + +} // namespace result_of + +template< typename T > +detail::vector_view_wrapper const vector_view( T* t, std::size_t size ) { + return detail::vector_view_wrapper( t, size ); +} + +template< typename T > +detail::vector_view_wrapper const vector_view( const T* t, std::size_t size ) { + return detail::vector_view_wrapper( t, size ); +} + +} // namespace bindings +} // namespace numeric +} // namespace boost + +#endif diff --git a/sdk/boost/numeric/bindings/views.hpp b/sdk/boost/numeric/bindings/views.hpp new file mode 100644 index 0000000..20e3973 --- /dev/null +++ b/sdk/boost/numeric/bindings/views.hpp @@ -0,0 +1,26 @@ +// +// Copyright (c) 2010 Thomas Klimpel +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef BOOST_NUMERIC_BINDINGS_WRAPPER_HPP +#define BOOST_NUMERIC_BINDINGS_WRAPPER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif + diff --git a/sdk/buddy-2.4/AUTHORS b/sdk/buddy-2.4/AUTHORS new file mode 100644 index 0000000..8af5ba6 --- /dev/null +++ b/sdk/buddy-2.4/AUTHORS @@ -0,0 +1,11 @@ +Jorn Lind-Nielsen - Original Developer +Alan Mishchenko +Gerd Behrmann +Henrik Hulgaard +Henrik Reif Andersen +Jacob Lichtenberg +Ken Larsen +Nicola Soranzo +Nikolaj Bjorner +Alexandre Duret-Lutz +Haim Cohen diff --git a/sdk/buddy-2.4/CHANGES b/sdk/buddy-2.4/CHANGES new file mode 100644 index 0000000..e69de29 diff --git a/sdk/buddy-2.4/CMakeLists.txt b/sdk/buddy-2.4/CMakeLists.txt new file mode 100644 index 0000000..b2eeae0 --- /dev/null +++ b/sdk/buddy-2.4/CMakeLists.txt @@ -0,0 +1,26 @@ +# This file is part of EPOCH. +# File: CMakeLists.txt +# Author: Xavier Pucel +# Contact: xavier.pucel@onera.fr +# +# EPOCH is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# EPOCH is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with EPOCH. If not, see . + +INCLUDE(ExternalProject) + +ExternalProject_Add(buddy-2.4 + PREFIX ${CMAKE_BINARY_DIR}/sdk/buddy-2.4 + SOURCE_DIR ${CMAKE_SOURCE_DIR}/sdk/buddy-2.4/src + CONFIGURE_COMMAND ${CMAKE_SOURCE_DIR}/sdk/buddy-2.4/configure --prefix=${CMAKE_BINARY_DIR}/sdk/buddy-2.4 --silent + BUILD_COMMAND make install +) diff --git a/sdk/buddy-2.4/ChangeLog b/sdk/buddy-2.4/ChangeLog new file mode 100644 index 0000000..4291462 --- /dev/null +++ b/sdk/buddy-2.4/ChangeLog @@ -0,0 +1,218 @@ +2004-07-22 haimcohen + + * NEWS 1.2, ChangeLog 1.4: *** empty log message *** + + * examples/solitare/Makefile.am 1.3, examples/solitare/expected 1.2, examples/solitare/runtest 1.2: + Solitare will not be included in the regression since it takes too much time to run + +2004-07-21 haimcohen + + * ChangeLog 1.3, examples/bddcalc/expected 1.2: + *** empty log message *** + + * src/depend.inf 1.2: + we do not need this file anymore since autotools are being used + + * examples/solitare/Makefile.am 1.2: readme was added to distribution + + * doc/Makefile.am 1.2: buddy.ps and tech.txt were added to distribution + +2004-07-14 haimcohen + + * ChangeLog 1.2, tools/.cvsignore 1.1: *** empty log message *** + + * examples/solitare/expected 1.1: + This file is empty in purpose. The solitare test takes too much memory + than I can afford. Until I generate this file somehow, the solitare + test should not be run. + + * examples/milner/expected 1.1: *** empty log message *** + + * examples/queen/expected 1.1, examples/bddcalc/expected 1.1, examples/bddtest/expected 1.1, examples/cmilner/expected 1.1, examples/fdd/expected 1.1, examples/money/expected 1.1, examples/adder/expected 1.1: + These files are part of the new regression suite. Each file contains + the expected result of a test. + + * examples/cmilner/Makefile.am 1.1, examples/fdd/Makefile.am 1.1, examples/milner/Makefile.am 1.1, examples/money/Makefile.am 1.1, examples/queen/Makefile.am 1.1, examples/solitare/Makefile.am 1.1: + Added to support autotools + + * examples/fdd/makefile 1.2, examples/milner/makefile 1.2, examples/money/makefile 1.2, examples/queen/makefile 1.2, examples/solitare/makefile 1.2, examples/adder/makefile 1.2, examples/bddtest/makefile 1.2, examples/cmilner/makefile 1.2: + We don't need the makefles anymore since we are using autotools now, + thanks to Alexandre's contribution. + + * examples/bddcalc/lexer.lxx 1.1, examples/bddcalc/parser.yxx 1.1, examples/bddcalc/parser_.h 1.1, examples/bddcalc/lexer.l 1.2, examples/bddcalc/makefile 1.3, examples/bddcalc/parser.h 1.2, examples/bddcalc/parser.y 1.3: + *** empty log message *** + + * examples/runregression 1.1: + +2004-07-13 haimcohen + + * examples/fdd/runtest 1.1, examples/money/runtest 1.1, examples/queen/runtest 1.1, examples/solitare/runtest 1.1: + A simple script to run a regression test and generate output + + * examples/milner/runtest 1.1: *** empty log message *** + + * examples/adder/runtest 1.1, examples/bddcalc/runtest 1.1, examples/bddtest/runtest 1.1, examples/cmilner/runtest 1.1: + A simple script to run a regression test and generate output + + * examples/Makefile.am 1.1, examples/Makefile.def 1.1, examples/adder/Makefile.am 1.1, examples/bddcalc/Makefile.am 1.1, examples/bddtest/Makefile.am 1.1: + Support for autotools + + * examples/solitare/.cvsignore 1.1, examples/.cvsignore 1.1, examples/adder/.cvsignore 1.1, examples/bddcalc/.cvsignore 1.1, examples/bddtest/.cvsignore 1.1, examples/cmilner/.cvsignore 1.1, examples/fdd/.cvsignore 1.1, examples/milner/.cvsignore 1.1, examples/money/.cvsignore 1.1, examples/queen/.cvsignore 1.1: + *** empty log message *** + + * src/kernel.c 1.2: Changed the returned BuDDy version format. + + * src/kernel.h 1.2: + The default value DEFAULT_CLOCK is now defined in the file instead of in the makefile. It can be changed using parameter to configure. By Alexandre. + + * src/.cvsignore 1.1, src/Makefile.am 1.1, src/makefile 1.2: + for autoconf support + +2004-07-12 haimcohen + + * doc/makefile 1.2, doc/.cvsignore 1.1: *** empty log message *** + + * doc/tech.txt 1.1: From the original BuDDy distribution + + * doc/Makefile.am 1.1: Added to enable autoconf + + * m4/debug.m4 1.1: *** empty log message *** + + * README 1.3: Modified to exaplin how to use configure. By Alexandre. + + * config 1.2, makefile 1.2, .cvsignore 1.1: *** empty log message *** + + * CHANGES 1.2: + Empty file - autoconf require CHANGES file. Changes will appear in the NEWS file, and changes for developers will be in the ChangeLog. + + * AUTHORS 1.1, ChangeLog 1.1, Makefile.am 1.1, NEWS 1.1, README.CVS 1.1, configure.ac 1.1: + Added for configure support + +2004-07-02 haimcohen + + * examples/bddcalc/makefile 1.2: + tokens.h was added to the 'clean' target as it is generated by yacc + + * examples/bddcalc/parser.y 1.2: + Tokens were separated by spaces instead of commas to comply with POSIX standard. + Patch was supplied by Alexandre Duret-Lutz + +2004-07-01 haimcohen + + * examples/bddcalc/parser.hxx 1.2, examples/bddcalc/tokens.h 1.2: + File removed since it did not have to be in CVS from the beginning - this file is generated by yacc. + +2004-06-25 haimcohen + + * README 1.2: Change Haim Cohens Email to the one in Source Forge + + * src/depend.inf 1.1.1.1, src/makefile 1.1.1.1, src/tree.c 1.1.1.1: + Initial import + + * src/depend.inf 1.1, src/makefile 1.1, src/tree.c 1.1: New file. + + * src/reorder.c 1.1.1.1: Initial import + + * src/reorder.c 1.1: New file. + + * src/prime.h 1.1.1.1: Initial import + + * src/prime.h 1.1: New file. + + * src/prime.c 1.1.1.1: Initial import + + * src/prime.c 1.1: New file. + + * src/kernel.c 1.1.1.1, src/kernel.h 1.1.1.1, src/pairs.c 1.1.1.1: + Initial import + + * src/kernel.c 1.1, src/kernel.h 1.1, src/pairs.c 1.1: New file. + + * src/imatrix.c 1.1.1.1, src/imatrix.h 1.1.1.1: Initial import + + * src/imatrix.c 1.1, src/imatrix.h 1.1: New file. + + * src/fdd.c 1.1.1.1, src/fdd.h 1.1.1.1: Initial import + + * src/fdd.c 1.1, src/fdd.h 1.1: New file. + + * src/cppext.cxx 1.1.1.1: Initial import + + * src/cppext.cxx 1.1: New file. + + * src/bvec.c 1.1.1.1, src/bvec.h 1.1.1.1, src/cache.c 1.1.1.1, src/cache.h 1.1.1.1: + Initial import + + * src/bvec.c 1.1, src/bvec.h 1.1, src/cache.c 1.1, src/cache.h 1.1: + New file. + + * src/bddtest.cxx 1.1.1.1, src/bddtree.h 1.1.1.1: Initial import + + * src/bddtest.cxx 1.1, src/bddtree.h 1.1: New file. + + * src/bddop.c 1.1.1.1: Initial import + + * src/bddop.c 1.1: New file. + + * src/bddio.c 1.1.1.1: Initial import + + * src/bddio.c 1.1: New file. + + * src/bdd.h 1.1.1.1: Initial import + + * src/bdd.h 1.1: New file. + + * examples/bddcalc/examples/c3540.cal 1.1.1.1, examples/bddcalc/examples/c432.cal 1.1.1.1: + Initial import + + * examples/bddcalc/examples/c3540.cal 1.1, examples/bddcalc/examples/c432.cal 1.1: + New file. + + * examples/bddcalc/examples/c1355.cal 1.1.1.1, examples/bddcalc/examples/c499.cal 1.1.1.1: + Initial import + + * examples/bddcalc/examples/c1355.cal 1.1, examples/bddcalc/examples/c499.cal 1.1: + New file. + + * examples/bddcalc/examples/c1908.cal 1.1.1.1, examples/bddcalc/examples/c2670.cal 1.1.1.1, examples/bddcalc/examples/readme 1.1.1.1: + Initial import + + * examples/bddcalc/examples/c1908.cal 1.1, examples/bddcalc/examples/c2670.cal 1.1, examples/bddcalc/examples/readme 1.1: + New file. + + * examples/bddcalc/parser.hxx 1.1.1.1, examples/bddcalc/slist.h 1.1.1.1, examples/bddcalc/tokens.h 1.1.1.1: + Initial import + + * examples/bddcalc/parser.hxx 1.1, examples/bddcalc/slist.h 1.1, examples/bddcalc/tokens.h 1.1: + New file. + + * examples/bddcalc/parser.y 1.1.1.1, examples/bddcalc/readme 1.1.1.1: + Initial import + + * examples/bddcalc/parser.y 1.1, examples/bddcalc/readme 1.1: New file. + + * examples/bddcalc/parser.h 1.1.1.1: Initial import + + * examples/bddcalc/parser.h 1.1: New file. + + * examples/adder/adder.cxx 1.1.1.1, examples/adder/makefile 1.1.1.1, examples/bddcalc/example.cal 1.1.1.1, examples/bddcalc/hashtbl.cxx 1.1.1.1, examples/bddcalc/hashtbl.h 1.1.1.1, examples/bddcalc/lexer.l 1.1.1.1, examples/bddcalc/makefile 1.1.1.1, examples/bddtest/bddtest.cxx 1.1.1.1, examples/bddtest/makefile 1.1.1.1, examples/cmilner/cmilner.c 1.1.1.1, examples/fdd/fdd.cxx 1.1.1.1, examples/fdd/makefile 1.1.1.1, examples/money/makefile 1.1.1.1, examples/money/money.cxx 1.1.1.1, examples/queen/makefile 1.1.1.1, examples/queen/queen.cxx 1.1.1.1, examples/solitare/makefile 1.1.1.1, examples/solitare/readme 1.1.1.1, examples/solitare/solitare.cxx 1.1.1.1: + Initial import + + * examples/adder/adder.cxx 1.1, examples/adder/makefile 1.1, examples/bddcalc/example.cal 1.1, examples/bddcalc/hashtbl.cxx 1.1, examples/bddcalc/hashtbl.h 1.1, examples/bddcalc/lexer.l 1.1, examples/bddcalc/makefile 1.1, examples/bddtest/bddtest.cxx 1.1, examples/bddtest/makefile 1.1, examples/cmilner/cmilner.c 1.1, examples/fdd/fdd.cxx 1.1, examples/fdd/makefile 1.1, examples/money/makefile 1.1, examples/money/money.cxx 1.1, examples/queen/makefile 1.1, examples/queen/queen.cxx 1.1, examples/solitare/makefile 1.1, examples/solitare/readme 1.1, examples/solitare/solitare.cxx 1.1: + New file. + + * doc/bddnotes.ps 1.1.1.1, doc/makefile 1.1.1.1, examples/cmilner/makefile 1.1.1.1, examples/cmilner/readme 1.1.1.1, examples/milner/makefile 1.1.1.1, examples/milner/milner.cxx 1.1.1.1, examples/milner/readme 1.1.1.1: + Initial import + + * doc/bddnotes.ps 1.1, doc/makefile 1.1, examples/cmilner/makefile 1.1, examples/cmilner/readme 1.1, examples/milner/makefile 1.1, examples/milner/milner.cxx 1.1, examples/milner/readme 1.1: + New file. + + * doc/buddy.ps 1.1.1.1: Initial import + + * doc/buddy.ps 1.1: New file. + + * CHANGES 1.1.1.1, README 1.1.1.1, config 1.1.1.1, makefile 1.1.1.1: + Initial import + + * CHANGES 1.1, README 1.1, config 1.1, makefile 1.1: New file. + diff --git a/sdk/buddy-2.4/Makefile.am b/sdk/buddy-2.4/Makefile.am new file mode 100644 index 0000000..86c0709 --- /dev/null +++ b/sdk/buddy-2.4/Makefile.am @@ -0,0 +1,5 @@ +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = src + +EXTRA_DIST = CHANGES m4/debug.m4 diff --git a/sdk/buddy-2.4/Makefile.in b/sdk/buddy-2.4/Makefile.in new file mode 100644 index 0000000..d88e2c9 --- /dev/null +++ b/sdk/buddy-2.4/Makefile.in @@ -0,0 +1,599 @@ +# Makefile.in generated by automake 1.8.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = . +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(top_srcdir)/configure AUTHORS ChangeLog NEWS \ + tools/config.guess tools/config.sub tools/depcomp \ + tools/install-sh tools/ltmain.sh tools/missing +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/debug.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno configure.status.lineno +mkinstalldirs = $(mkdir_p) +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +ACLOCAL_AMFLAGS = -I m4 +SUBDIRS = src +EXTRA_DIST = CHANGES m4/debug.m4 +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ + cd $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + cd $(top_srcdir) && $(AUTOHEADER) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + mkdir $(distdir) + $(mkdir_p) $(distdir)/m4 $(distdir)/tools + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || mkdir "$(distdir)/$$subdir" \ + || exit 1; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="../$(top_distdir)" \ + distdir="../$(distdir)/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done + -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) +dist-gzip: distdir + $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + $(AMTAR) chof - $(distdir) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-tarZ: distdir + $(AMTAR) chof - $(distdir) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - ;;\ + *.tar.bz2*) \ + bunzip2 -c $(distdir).tar.bz2 | $(AMTAR) xf - ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(AMTAR) xf - ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && cd $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' +distuninstallcheck: + @cd $(distuninstallcheck_dir) \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile config.h +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr \ + distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ + check-am clean clean-generic clean-libtool clean-recursive \ + ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ + dist-shar dist-tarZ dist-zip distcheck distclean \ + distclean-generic distclean-hdr distclean-libtool \ + distclean-recursive distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + maintainer-clean-recursive mostlyclean mostlyclean-generic \ + mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sdk/buddy-2.4/NEWS b/sdk/buddy-2.4/NEWS new file mode 100644 index 0000000..d1db04c --- /dev/null +++ b/sdk/buddy-2.4/NEWS @@ -0,0 +1,200 @@ +---------------------------------------------------------------------------- + User visible changes to BuDDy +---------------------------------------------------------------------------- + ++ means added code +x means bugfix or changed code +- means removed code + +VER 2.4 (July 2004) +------------------- + + Using configure script for the build process. + + Adding runregression script which runs examples and compare to + expected results. + +VER 2.3 (June 2004) +------------------- + + Nothing :-( This is just the first version in SourceForge, + so it deserved its own number. + +VER 2.2 (november 2002) +----------------------- + + Added bvec_ite() for calculating an if-then-else operation on + a boolean vector. + x Fixed some garbage collection problems introduced in version 2.1. + + +VER 2.1 (march 2002) +-------------------- + + Added bdd_allsat() for calculating all possible variable assignments + to a bdd. + x Fixed some wrong garbage collection #defines in kernel.h. If you + haven't experinced any problems using BuDDy, then this should not + be an issue. No bug reports reported for this one - found by code + inspection thanx to Nicola Soranzo. + x Fixed some copy paste errors in the prime number calculation. + This should not be an issue. No bug reports reported for this one + - found by code inspection thanx to Nicola Soranzo. + + +VER 2.0 (march 2001) +-------------------- + x Change the copyright notice to a more acceptable form. + x Speedup changes in bdd_support() + x Rewrote all the prime number calculations in order to get the + copyright right. + + +VER 1.9 (august 2000) +--------------------- + + Added bdd_pathcount + + Added bdd_anodecount + + Added bdd_buildcube, bdd_ibuildcube + x Bugfix in bdd_satcountset and bdd_satcountlnset. This corrects a bug + introduced in version 1.8. + x bug fixes in bdd_constraint and bdd_simplify. Both did calculate a + correct cofactor, but not necessarily a minimal one. Changed the name + of bdd_constraint to bdd_constrain at the same time. + x bug fix in memory allocation for bdd_addvarblock + x Changed functions in bddop.c in order to avoid some compiler warnings. + x Makefile also installs "fdd.h" and "bvec.h". + x Small #include fix in N-Queen example. + x Minor changes in the documentation. + + +VER 1.8 (may 2000) +------------------ + + Bugfix in the kernel: canonicity was not unfortunately not guaranteed + on certain compilers (at least the microsoft visual C compiler) due to a + signed/unsigned bug in kernel.c (and actually not microsofts fault). + + Speedups in the reordering code. + + Added the use of an interaction matrix for variable swapping. + + Added bdd_satoneset + + Added bdd_getallocnum + + Added bdd_setvarorder + + Added bdd_unique, bdd_appuni. + + Added bvec_shlfixed, bvec_shrfixed and changed the prototype for + bvec_shl and bvec_shr. + + Added bvec_mulfixed, bdd_divfixed, bdd_div and changed the + prototype for bvec_mul. + + Added bdd_printstat + + Added new examples: solitare and money + + Forces cache tables to prime-number size. + + Added bdd_clear_error() if anybody needs that. + + Added reorder method WIN3 and WIN3ITE + x Small change in queen.cxx - with a huge impact on runtime! + x Bugfix in reordering. In some cases reordering would go on forever; + first reroder, then retry, then reorder again without resize etc. always + reordering in the same operation. Now at most one reordering is allowed + for each bdd operation. + x Bugfix in C++ printing in Dot format. Wrote zero for one and vice versa. + x Bugfix in the garbage collector. If bdd_setmaxincrease was used, then + BuDDy would call bdd_error prematurely. Not a major bug, but annoying. + x Bugfix in bdd_load. + x Speedup in bdd_satcountset and bdd_satcountlnset + x Updates to the docs. + x Updates to the makefiles + + +VER 1.7 (september 1999) +------------------------ + + Added support for boolean vector operations used in integer arithmetics + + Split "bdd.h" into "bdd.h", "fdd.h" and "bvec.h" + + Added bdd_cachestats + + Added bdd_and, bdd_or, bdd_xor, bdd_impl, bdd_biimpl + (wrappers for bdd_apply). + + Added a BDD calculator for combinatorial circuits as an example. + + Added an example showing the use of the FDD interface. + + Added bdd_autoreorder_times, bdd_getreorder_method, bdd_getreorder_times, + bdd_reorder_probe, bdd_enable_reorder, bdd_disable_reorder, + bdd_var2level, bdd_level2var, bdd_reorder_gain, bdd_swapvar + + Added bdd_file_hook, bdd_strm_hook, fdd_file_hook, fdd_strm_hook + + Added support for dynamic resizing of the operator caches with + the function bdd_setcacheratio. + + Added more documentation. + x Bugfix in reordering code. This would appear when recursive variable + blocks were defined (blocks with sub-blocks). + x Speedup changes in the variable reordering code + x The automatic reordering threshhold function has been changed + x Automatic reordering is now interrupting and restarts bdd operations + x Prototype for bdd_reorder_hook changed. + x Printing of reorder information (verbose level > 0) is changed. + x The threshold for stopping of the iterative reordering methods has + been changed. The reordering now continues until no progress is done + at all (before it would stop when less than 5% where gained). + x Added a few sanity checks to many of the functions. + x Bugfix (parameter checking) in fdd_ithvar. + - bdd_varlevel removed (use bdd_var2level and bdd_level2var). + + +VER 1.6 (november 1998) +----------------------- + + Added bdd_resetpair + + Added bdd_satcountset, bdd_satcountlnset + + Added macro bdd_relprod + + Added fdd_overlapdomain + + Added fdd_domain + x Fixed a bug in bdd_setvarnum and bdd_extvarnum. + x Fixed a bug in bdd_newpair() which would give problems with reordering. + x Speedup changes in bdd_exist, bdd_forall, bdd_appex, bdd_appall + x Speedup changes in bdd_restrict + x Changed bdd_gbc_hook to include both pre and post garbage collection. + + +VER 1.5 (september 1998) +------------------------ + + Added bdd_cofactor + + Added and fixed some error checks in fdd.c + x Fixed a bug in bdd_setvarnum(). + + +VER 1.4 (july 1998) +------------------- + The package just got a name: BuDDy + + Added functions bdd_compose, bdd_veccompose, bdd_ite. + + Added functions bdd_setbddpair, bdd_setbddpairs. + + Added functions bdd_var, bdd_low, bdd_high. + + Added technical documentation in docs/tech.txt + x Overloaded C++ functions are not used any more. This mainly changes + the name of the printing functions in C++. + x Changed datatype names (You'll hate me for this one): + BddPair -> bddPair + BddStat -> bddStat + BddGbcStat -> bddGbcStat + x Added slightly more documentation. + x Some internal changes to the code - should not be visible to users. + + +VER 1.3 (june 1998) +------------------- + x Fixed a few serious bugs in the reordering code + + +VER 1.2 (june 1998) +------------------- + + Added support for dynamic variable reordering + + Added reordering handler (bdd_reorder_hook) + + More added to the docs + x Changed the event handlers (bdd_xxx_hook) + + +VER 1.1 (april 1998) +-------------------- + + Added bdd_varprofile + + Added fdd_scanset + + Mucho better documentation. + + Added Henrik Reif Andersen's BDD notes to the documentation. + + Added BDD_REORDER_RANDOM for test purposes (usefull for others?) + x Fixed a bug in bdd_appex and bdd_appall. + x Fixed a bug in bdd_simplify. + x Speed fixup to fdd_extdomain + x Lots of small (insignificant?) bug fixes in fdd.c. + x bdd_load/save updated to take reordering into account. + x Generalized bdd_restrict to use a BDD variable set. + x Fixed the identifiers for the operator caches. + x The math functions log1p and pow2 has been removed as they didn't + exist on some systems. The same applies to M_LN2. + x New file structure and makefiles. + - Removed bdd_break, bdd_restart1 + + diff --git a/sdk/buddy-2.4/README b/sdk/buddy-2.4/README new file mode 100644 index 0000000..32d64e7 --- /dev/null +++ b/sdk/buddy-2.4/README @@ -0,0 +1,128 @@ +========================================================================== + *** BuDDy *** + Binary Decision Diagrams + Library Package v2.4 +-------------------------------------------------------------------------- + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================== + + +--------------------------------------------------------------------- +--- PREFACE -------------------------------------------------------- +--------------------------------------------------------------------- + +BuDDy was originally developed by Jorn Lind-Nielsen as a part of his +PhD thesis. +After using BuDDy as a BDD library for long time (while getting some +support from Jorn through email), I have been suggested by Jorn to take +ownership of the project and move it to SourceForge. +I invite all users who are interested to participate in the development +to contact me. (I always have desired tasks / features awaiting...) +I hope that BuDDy will prosper under my management. + +Haim Cohen +haimcohen@users.sourceforge.net + +--------------------------------------------------------------------- +--- REQUIREMENTS ---------------------------------------------------- +--------------------------------------------------------------------- + +* A (not too old) C++ compiler. I use g++ 3.3.3 +* A machine that supports 32 bit integers + + +--------------------------------------------------------------------- +--- INSTALLING ------------------------------------------------------ +--------------------------------------------------------------------- + +The following commands should build and install the library. + + ./configure + make + make install + +`./configure' accepts many arguments to tune your installation. +The following options are noteworthy: + + --includedir=/somewhere/include + Specify where header files will be installed. + + --libdir=/somewhere/lib + Specify where libraries will be installed. + + --disable-shared + Do not build the shared library for BuDDy. + + --disable-static + Do not build the static library for BuDDy. + + --enable-swap-count + Count number of fundamental variable swaps (for debugging) + + --enable-cache-stats + Gather statistical information about operator and unique node + caching (for debugging) + +Run `./configure --help' for a complete listing, and see +the INSTALL file for generic instructions. + +Some machines are missing "CLOCKS_PER_SEC". BuDDy will use +a default value of 60 on these. You can overwrite this setting +by setting DEFAULT_CLOCK as follows: + + ./configure CPPFLAGS=-DDEFAULT_CLOCK=1000 + +Part of the BuDDy library needs 64 bit arithmetics. With gnu C++, +Microsoft C++ and KAI C++, and any C99 compiler, this is part of the +language and used by BuDDy. With other compilers BuDDy need to +implement the math it self -- which is a bit slower. If you now of a +64 bit unsigned integer type on your platform then define that in the +BUDDYUINT64 variable. Example: + + ./configure CPPFLAGS=-DBUDDYUINT64="long long" + +Run `make check' to build the examples. +The examples also serve as a regression suite. + +--------------------------------------------------------------------- +--- USING ----------------------------------------------------------- +--------------------------------------------------------------------- + +Assuming that the files "bdd.h" and "libbdd.a" are in directories +"/usr/local/include" and "/usr/local/lib" then the compile command +could be: + + g++ -I/usr/local/include myfile.cc -o myfile -L/usr/local/lib -lbdd + +Your machine may be setup to use the above directories automatically, +so you might be able to do: + + g++ myfile.cc -o myfile -lbdd + + + diff --git a/sdk/buddy-2.4/aclocal.m4 b/sdk/buddy-2.4/aclocal.m4 new file mode 100644 index 0000000..a1e4ae4 --- /dev/null +++ b/sdk/buddy-2.4/aclocal.m4 @@ -0,0 +1,6861 @@ +# generated automatically by aclocal 1.8.5 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- + +# serial 47 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + lt_cv_cc_lib64_suffix=no + if AC_TRY_EVAL(ac_compile); then + case "`/usr/bin/file conftest.$ac_objext`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + lt_cv_cc_lib64_suffix=yes + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + lt_cv_cc_lib64_suffix=yes + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + lt_cv_cc_lib64_suffix=yes + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + lt_cv_cc_lib64_suffix=yes + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + libsuff= + if test "$lt_cv_cc_lib64_suffix" = "yes"; then + libsuff=64 + fi + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} $lt_ld_extra" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} /usr/local/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +#- set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*|x86_64*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that LIBLTDL +# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If +# DIRECTORY is not provided and an installed libltdl is not found, it is +# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' +# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single +# quotes!). If your package is not flat and you're not using automake, +# define top_builddir and top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# -------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# +# Check for any special shared library compilation flags. +# +_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' + ;; + esac +fi +if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then + AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) + _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) + + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +# Report which librarie types wil actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + darwin* | rhapsody*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sco*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDRT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds it's shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi4*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + case "$host_os" in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-flat_namespace -undefined suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + *) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + sco3.2v5*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4.2uw2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv5*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +SED=$lt_cv_path_SED +]) +AC_MSG_RESULT([$SED]) +]) + +# -*- Autoconf -*- +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Generated from amversion.in; do not edit by hand. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.8"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.8.5])]) + +# AM_AUX_DIR_EXPAND + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 6 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]) +fi])]) + +# serial 7 -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +#serial 2 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# This macro actually does too much some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 11 + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.58])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG(AMTAR, tar) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl + +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $1 | $1:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# -*- Autoconf -*- +# Copyright (C) 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + + +# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 4 + +# AM_PROG_LEX +# ----------- +# Autoconf leaves LEX=: if lex or flex can't be found. Change that to a +# "missing" invocation, for better error output. +AC_DEFUN([AM_PROG_LEX], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AM_MISSING_HAS_RUN])dnl +AC_REQUIRE([AC_PROG_LEX])dnl +if test "$LEX" = :; then + LEX=${am_missing_run}flex +fi]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# -*- Autoconf -*- + + +# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# AM_PROG_MKDIR_P +# --------------- +# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. + +# Copyright (C) 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories +# created by `make install' are always world readable, even if the +# installer happens to have an overly restrictive umask (e.g. 077). +# This was a mistake. There are at least two reasons why we must not +# use `-m 0755': +# - it causes special bits like SGID to be ignored, +# - it may be too restrictive (some setups expect 775 directories). +# +# Do not use -m 0755 and let people choose whatever they expect by +# setting umask. +# +# We cannot accept any implementation of `mkdir' that recognizes `-p'. +# Some implementations (such as Solaris 8's) are not thread-safe: if a +# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' +# concurrently, both version can detect that a/ is missing, but only +# one can create it and the other will error out. Consequently we +# restrict ourselves to GNU make (using the --version option ensures +# this.) +AC_DEFUN([AM_PROG_MKDIR_P], +[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # Keeping the `.' argument allows $(mkdir_p) to be used without + # argument. Indeed, we sometimes output rules like + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. + # (`test -n '$(somedir)' && $(mkdir_p) $(somedir)' is a more + # expensive solution, as it forces Make to start a sub-shell.) + mkdir_p='mkdir -p -- .' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi +AC_SUBST([mkdir_p])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# +# Check to make sure that the build environment is sane. +# + +# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# AM_PROG_INSTALL_STRIP + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +m4_include([m4/debug.m4]) diff --git a/sdk/buddy-2.4/autom4te.cache/output.0 b/sdk/buddy-2.4/autom4te.cache/output.0 new file mode 100644 index 0000000..4dd56d7 --- /dev/null +++ b/sdk/buddy-2.4/autom4te.cache/output.0 @@ -0,0 +1,19914 @@ +@%:@! /bin/sh +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.69 for buddy 2.4. +@%:@ +@%:@ +@%:@ Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +@%:@ +@%:@ +@%:@ This configure script is free software; the Free Software Foundation +@%:@ gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in @%:@( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +echo=${ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +tagnames=${tagnames+${tagnames},}CXX + +tagnames=${tagnames+${tagnames},}F77 + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIB@&t@OBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='buddy' +PACKAGE_TARNAME='buddy' +PACKAGE_VERSION='2.4' +PACKAGE_STRING='buddy 2.4' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIB@&t@OBJS +LIBTOOL +ac_ct_F77 +FFLAGS +F77 +CXXCPP +CPP +RANLIB +AR +ECHO +LN_S +EGREP +GREP +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +am__leading_dot +SET_MAKE +AWK +mkdir_p +INSTALL_STRIP_PROGRAM +STRIP +install_sh +AMTAR +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_dependency_tracking +enable_shared +enable_static +enable_fast_install +with_gnu_ld +enable_libtool_lock +with_pic +with_tags +enable_swap_count +enable_cache_stats +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CPP +CXXCPP +F77 +FFLAGS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures buddy 2.4 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + @<:@@S|@ac_default_prefix@:>@ + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + @<:@PREFIX@:>@ + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root @<:@DATAROOTDIR/doc/buddy@:>@ + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of buddy 2.4:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ + --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ + --enable-fast-install@<:@=PKGS@:>@ + optimize for fast installation @<:@default=yes@:>@ + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-swap-count Count number of fundamental variable swaps (for + debugging) + --enable-cache-stats Gather statistical information about operator and + unique node caching (for debugging) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ + --with-pic try to use only PIC/non-PIC objects @<:@default=use + both@:>@ + --with-tags@<:@=TAGS@:>@ include additional configurations @<:@automatic@:>@ + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + CXXCPP C++ preprocessor + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +buddy configure 2.4 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +@%:@ ac_fn_c_try_compile LINENO +@%:@ -------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_compile + +@%:@ ac_fn_cxx_try_compile LINENO +@%:@ ---------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_compile + +@%:@ ac_fn_c_try_link LINENO +@%:@ ----------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_link + +@%:@ ac_fn_c_try_cpp LINENO +@%:@ ---------------------- +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_cpp + +@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using +@%:@ the include files in INCLUDES and setting the cache variable VAR +@%:@ accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_mongrel + +@%:@ ac_fn_c_try_run LINENO +@%:@ ---------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes +@%:@ that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_run + +@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists and can be compiled using the include files in +@%:@ INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_compile + +@%:@ ac_fn_c_check_func LINENO FUNC VAR +@%:@ ---------------------------------- +@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_func + +@%:@ ac_fn_cxx_try_cpp LINENO +@%:@ ------------------------ +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_cpp + +@%:@ ac_fn_cxx_try_link LINENO +@%:@ ------------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_link + +@%:@ ac_fn_cxx_check_func LINENO FUNC VAR +@%:@ ------------------------------------ +@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_cxx_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_cxx_check_func + +@%:@ ac_fn_f77_try_compile LINENO +@%:@ ---------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_f77_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_f77_try_compile + +@%:@ ac_fn_f77_try_link LINENO +@%:@ ------------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_f77_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_f77_try_link +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by buddy $as_me 2.4, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in @%:@(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_aux_dir= +for ac_dir in tools "$srcdir"/tools; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in tools \"$srcdir\"/tools" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +am__api_version="1.8" +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in @%:@(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # Keeping the `.' argument allows $(mkdir_p) to be used without + # argument. Indeed, we sometimes output rules like + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. + # (`test -n '$(somedir)' && $(mkdir_p) $(somedir)' is a more + # expensive solution, as it forces Make to start a sub-shell.) + mkdir_p='mkdir -p -- .' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='buddy' + VERSION='2.4' + + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. + + + + +MAJOR_VERSION=`echo "$VERSION" | sed -e 's/^\([0-9]*\)\.[0-9]*.*$/\1/'` +MINOR_VERSION=`echo "$VERSION" | sed -e 's/^[0-9]*\.\([0-9]*\).*$/\1/'` + +cat >>confdefs.h <<_ACEOF +@%:@define MAJOR_VERSION $MAJOR_VERSION +_ACEOF + + +cat >>confdefs.h <<_ACEOF +@%:@define MINOR_VERSION $MINOR_VERSION +_ACEOF + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $@%:@ != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +@%:@ Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +@%:@ Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + +@%:@ Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + +@%:@ Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${lt_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +SED=$lt_cv_path_SED + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 +$as_echo "$SED" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + + +@%:@ Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD-compatible nm" >&5 +$as_echo_n "checking for BSD-compatible nm... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +NM="$lt_cv_path_NM" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognise dependent libraries" >&5 +$as_echo_n "checking how to recognise dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi4*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump'. + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | kfreebsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*|x86_64*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +@%:@ Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line __oline__ "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + lt_cv_cc_lib64_suffix=no + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case "`/usr/bin/file conftest.$ac_objext`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + lt_cv_cc_lib64_suffix=yes + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + lt_cv_cc_lib64_suffix=yes + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + lt_cv_cc_lib64_suffix=yes + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + lt_cv_cc_lib64_suffix=yes + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + +esac + +need_locks="$enable_libtool_lock" + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $F77" >&5 +$as_echo "$F77" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$F77" && break + done +fi +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_F77="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_F77" >&5 +$as_echo "$ac_ct_F77" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_F77" && break +done + + if test "x$ac_ct_F77" = x; then + F77="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + F77=$ac_ct_F77 + fi +fi + + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran 77 compiler" >&5 +$as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } +if ${ac_cv_f77_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_f77_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_compiler_gnu" >&5 +$as_echo "$ac_cv_f77_compiler_gnu" >&6; } +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5 +$as_echo_n "checking whether $F77 accepts -g... " >&6; } +if ${ac_cv_prog_f77_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + FFLAGS=-g +cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + ac_cv_prog_f77_g=yes +else + ac_cv_prog_f77_g=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_g" >&5 +$as_echo "$ac_cv_prog_f77_g" >&6; } +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +if test $ac_compiler_gnu = yes; then + G77=yes +else + G77= +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi + + + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris* | sysv5*) + symcode='[BDRT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +enable_dlopen=no +enable_win32_dll=no + +@%:@ Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + + +@%:@ Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# +# Check for any special shared library compilation flags. +# +lt_prog_cc_shlib= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + lt_prog_cc_shlib='-belf' + ;; + esac +fi +if test -n "$lt_prog_cc_shlib"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 +$as_echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} + if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +$as_echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} + lt_cv_prog_cc_can_build_shared=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_prog_compiler_static works" >&5 +$as_echo_n "checking if $compiler static flag $lt_prog_compiler_static works... " >&6; } +if ${lt_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_prog_compiler_static" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + else + lt_prog_compiler_static_works=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_static_works" >&5 +$as_echo "$lt_prog_compiler_static_works" >&6; } + +if test x"$lt_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:__oline__: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic='-Kpic' + lt_prog_compiler_static='-dn' + ;; + + solaris*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:__oline__: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works" >&5 +$as_echo "$lt_prog_compiler_pic_works" >&6; } + +if test x"$lt_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:__oline__: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + enable_shared_with_static_runtimes=no + archive_cmds= + archive_expsym_cmds= + old_archive_From_new_cmds= + old_archive_from_expsyms_cmds= + export_dynamic_flag_spec= + whole_archive_flag_spec= + thread_safe_flag_spec= + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_direct=no + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + link_all_deplibs=unknown + hardcode_automatic=no + module_cmds= + module_expsym_cmds= + always_export_symbols=no + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds="$tmp_archive_cmds" + fi + else + ld_shlibs=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec=' ' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + bsdi4*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + archive_cmds_need_lc=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='-all_load $convenience' + link_all_deplibs=yes + else + ld_shlibs=no + fi + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + ia64*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=no + hardcode_shlibpath_var=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + *) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld='-rpath $libdir' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag=' -z text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + libsuff= + if test "$lt_cv_cc_lib64_suffix" = "yes"; then + libsuff=64 + fi + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} $lt_ld_extra" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} /usr/local/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var " || \ + test "X$hardcode_automatic"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# Report which librarie types wil actually be built +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + darwin* | rhapsody*) + if test "$GCC" = yes; then + archive_cmds_need_lc=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + output_verbose_link_cmd='echo' + archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='-all_load $convenience' + link_all_deplibs=yes + else + ld_shlibs=no + fi + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler \ + CC \ + LD \ + lt_prog_compiler_wl \ + lt_prog_compiler_pic \ + lt_prog_compiler_static \ + lt_prog_compiler_no_builtin_flag \ + export_dynamic_flag_spec \ + thread_safe_flag_spec \ + whole_archive_flag_spec \ + enable_shared_with_static_runtimes \ + old_archive_cmds \ + old_archive_from_new_cmds \ + predep_objects \ + postdep_objects \ + predeps \ + postdeps \ + compiler_lib_search_path \ + archive_cmds \ + archive_expsym_cmds \ + postinstall_cmds \ + postuninstall_cmds \ + old_archive_from_expsyms_cmds \ + allow_undefined_flag \ + no_undefined_flag \ + export_symbols_cmds \ + hardcode_libdir_flag_spec \ + hardcode_libdir_flag_spec_ld \ + hardcode_libdir_separator \ + hardcode_automatic \ + module_cmds \ + module_expsym_cmds \ + lt_cv_prog_compiler_c_o \ + exclude_expsyms \ + include_expsyms; do + + case $var in + old_archive_cmds | \ + old_archive_from_new_cmds | \ + archive_cmds | \ + archive_expsym_cmds | \ + module_cmds | \ + module_expsym_cmds | \ + old_archive_from_expsyms_cmds | \ + export_symbols_cmds | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5 +$as_echo "$as_me: creating $ofile" >&6;} + + cat <<__EOF__ >> "$cfgfile" +#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + +@%:@ Check whether --with-tags was given. +if test "${with_tags+set}" = set; then : + withval=$with_tags; tagnames="$withval" +fi + + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: output file \`$ofile' does not exist" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: output file \`$ofile' does not look like a libtool script" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 +$as_echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in + "") ;; + *) as_fn_error $? "invalid tag name: $tagname" "$LINENO" 5 + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + as_fn_error $? "tag name \"$tagname\" already exists" "$LINENO" 5 + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_automatic_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +compiler_CXX=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +else + lt_prog_compiler_no_builtin_flag_CXX= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + +@%:@ Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } +ld_shlibs_CXX=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_CXX=yes + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_CXX=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX=' ' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs_CXX=no + fi + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes; then + archive_cmds_need_lc_CXX=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_CXX='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_CXX='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_CXX='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag_CXX='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_CXX='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_CXX='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='-all_load $convenience' + link_all_deplibs_CXX=yes + else + ld_shlibs_CXX=no + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + freebsd12*) + # C++ shared libraries reported to be fairly broken before switch to ELF + ld_shlibs_CXX=no + ;; + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + gnu*) + ;; + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC) + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_CXX='+b $libdir' + hardcode_libdir_separator_CXX=: + ;; + ia64*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + *) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + archive_cmds_need_lc_CXX=no + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + sco*) + archive_cmds_need_lc_CXX=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.0-5 | solaris2.0-5.*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + archive_cmds_need_lc_CXX=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +GCC_CXX="$GXX" +LD_CXX="$LD" + + +cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. + output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" + + for p in `eval $output_verbose_link_cmd`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" \ + || test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$rm -f confest.$objext + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + +lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + icpc) + # Intel C++ + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_prog_compiler_pic_CXX" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:__oline__: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_CXX=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:__oline__: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_CXX" >&5 +$as_echo "$archive_cmds_need_lc_CXX" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + libsuff= + if test "$lt_cv_cc_lib64_suffix" = "yes"; then + libsuff=64 + fi + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} $lt_ld_extra" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} /usr/local/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || \ + test -n "$runpath_var CXX" || \ + test "X$hardcode_automatic_CXX"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_cxx_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + ac_fn_cxx_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_CXX \ + CC_CXX \ + LD_CXX \ + lt_prog_compiler_wl_CXX \ + lt_prog_compiler_pic_CXX \ + lt_prog_compiler_static_CXX \ + lt_prog_compiler_no_builtin_flag_CXX \ + export_dynamic_flag_spec_CXX \ + thread_safe_flag_spec_CXX \ + whole_archive_flag_spec_CXX \ + enable_shared_with_static_runtimes_CXX \ + old_archive_cmds_CXX \ + old_archive_from_new_cmds_CXX \ + predep_objects_CXX \ + postdep_objects_CXX \ + predeps_CXX \ + postdeps_CXX \ + compiler_lib_search_path_CXX \ + archive_cmds_CXX \ + archive_expsym_cmds_CXX \ + postinstall_cmds_CXX \ + postuninstall_cmds_CXX \ + old_archive_from_expsyms_cmds_CXX \ + allow_undefined_flag_CXX \ + no_undefined_flag_CXX \ + export_symbols_cmds_CXX \ + hardcode_libdir_flag_spec_CXX \ + hardcode_libdir_flag_spec_ld_CXX \ + hardcode_libdir_separator_CXX \ + hardcode_automatic_CXX \ + module_cmds_CXX \ + module_expsym_cmds_CXX \ + lt_cv_prog_compiler_c_o_CXX \ + exclude_expsyms_CXX \ + include_expsyms_CXX; do + + case $var in + old_archive_cmds_CXX | \ + old_archive_from_new_cmds_CXX | \ + archive_cmds_CXX | \ + archive_expsym_cmds_CXX | \ + module_cmds_CXX | \ + module_expsym_cmds_CXX | \ + old_archive_from_expsyms_cmds_CXX | \ + export_symbols_cmds_CXX | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_CXX + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_CXX +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_CXX + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_CXX" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld + + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_flag_spec_ld_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code=" subroutine t\n return\n end\n" + +# Code to be used in simple link tests +lt_simple_link_test_code=" program t\n end\n" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +compiler_F77=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix4* | aix5*) + test "$enable_shared" = yes && enable_static=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + +test "$ld_shlibs_F77" = no && can_build_shared=no + +GCC_F77="$G77" +LD_F77="$LD" + +lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic_F77='-Kpic' + lt_prog_compiler_static_F77='-dn' + ;; + + solaris*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_F77" >&5 +$as_echo "$lt_prog_compiler_pic_F77" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } +if ${lt_prog_compiler_pic_works_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:__oline__: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_F77=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works_F77" >&5 +$as_echo "$lt_prog_compiler_pic_works_F77" >&6; } + +if test x"$lt_prog_compiler_pic_works_F77" = xyes; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:__oline__: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_F77= + enable_shared_with_static_runtimes_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + old_archive_From_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + thread_safe_flag_spec_F77= + hardcode_libdir_flag_spec_F77= + hardcode_libdir_flag_spec_ld_F77= + hardcode_libdir_separator_F77= + hardcode_direct_F77=no + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + link_all_deplibs_F77=unknown + hardcode_automatic_F77=no + module_cmds_F77= + module_expsym_cmds_F77= + always_export_symbols_F77=no + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_F77=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_F77=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds_F77="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds_F77="$tmp_archive_cmds" + fi + else + ld_shlibs_F77=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test "$ld_shlibs_F77" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_F77='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_F77=yes + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' ${wl}-bernotok' + allow_undefined_flag_F77=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_F77=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77=' ' + archive_cmds_need_lc_F77=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_F77=no + ;; + + bsdi4*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_F77=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + archive_cmds_need_lc_F77=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_F77='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_F77='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_F77='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag_F77='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_F77='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_F77='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_F77='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + whole_archive_flag_spec_F77='-all_load $convenience' + link_all_deplibs_F77=yes + else + ld_shlibs_F77=no + fi + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + freebsd1*) + ld_shlibs_F77=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_F77='+b $libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + ia64*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + *) + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + link_all_deplibs_F77=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + openbsd*) + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + hardcode_libdir_separator_F77=: + ;; + + sco3.2v5*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag_F77=' -z text' + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag_F77='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv5*) + no_undefined_flag_F77=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec_F77= + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_F77" >&5 +$as_echo "$ld_shlibs_F77" >&6; } +test "$ld_shlibs_F77" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + archive_cmds_need_lc_F77=no + else + archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_F77" >&5 +$as_echo "$archive_cmds_need_lc_F77" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + libsuff= + if test "$lt_cv_cc_lib64_suffix" = "yes"; then + libsuff=64 + fi + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} $lt_ld_extra" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} /usr/local/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || \ + test -n "$runpath_var F77" || \ + test "X$hardcode_automatic_F77"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_F77" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && + test "$hardcode_minus_L_F77" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_F77" >&5 +$as_echo "$hardcode_action_F77" >&6; } + +if test "$hardcode_action_F77" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_F77 \ + CC_F77 \ + LD_F77 \ + lt_prog_compiler_wl_F77 \ + lt_prog_compiler_pic_F77 \ + lt_prog_compiler_static_F77 \ + lt_prog_compiler_no_builtin_flag_F77 \ + export_dynamic_flag_spec_F77 \ + thread_safe_flag_spec_F77 \ + whole_archive_flag_spec_F77 \ + enable_shared_with_static_runtimes_F77 \ + old_archive_cmds_F77 \ + old_archive_from_new_cmds_F77 \ + predep_objects_F77 \ + postdep_objects_F77 \ + predeps_F77 \ + postdeps_F77 \ + compiler_lib_search_path_F77 \ + archive_cmds_F77 \ + archive_expsym_cmds_F77 \ + postinstall_cmds_F77 \ + postuninstall_cmds_F77 \ + old_archive_from_expsyms_cmds_F77 \ + allow_undefined_flag_F77 \ + no_undefined_flag_F77 \ + export_symbols_cmds_F77 \ + hardcode_libdir_flag_spec_F77 \ + hardcode_libdir_flag_spec_ld_F77 \ + hardcode_libdir_separator_F77 \ + hardcode_automatic_F77 \ + module_cmds_F77 \ + module_expsym_cmds_F77 \ + lt_cv_prog_compiler_c_o_F77 \ + exclude_expsyms_F77 \ + include_expsyms_F77; do + + case $var in + old_archive_cmds_F77 | \ + old_archive_from_new_cmds_F77 | \ + archive_cmds_F77 | \ + archive_expsym_cmds_F77 | \ + module_cmds_F77 | \ + module_expsym_cmds_F77 | \ + old_archive_from_expsyms_cmds_F77 | \ + export_symbols_cmds_F77 | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_F77 + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_F77 +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_F77 + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_F77 + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_F77 + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_F77" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +objext_GCJ=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +compiler_GCJ=$CC + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +archive_cmds_need_lc_GCJ=no + + +lt_prog_compiler_no_builtin_flag_GCJ= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:__oline__: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl_GCJ= +lt_prog_compiler_pic_GCJ= +lt_prog_compiler_static_GCJ= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_static_GCJ='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_GCJ='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_GCJ=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_GCJ=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_GCJ='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + else + lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-static' + ;; + ccc*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic_GCJ='-Kpic' + lt_prog_compiler_static_GCJ='-dn' + ;; + + solaris*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl_GCJ='-Qoption ld ' + lt_prog_compiler_pic_GCJ='-PIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_GCJ='-Kconform_pic' + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic_GCJ='-pic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_GCJ=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_GCJ" >&5 +$as_echo "$lt_prog_compiler_pic_GCJ" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_GCJ"; then + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... " >&6; } +if ${lt_prog_compiler_pic_works_GCJ+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_prog_compiler_pic_works_GCJ=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_GCJ" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:__oline__: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_GCJ=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works_GCJ" >&5 +$as_echo "$lt_prog_compiler_pic_works_GCJ" >&6; } + +if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then + case $lt_prog_compiler_pic_GCJ in + "" | " "*) ;; + *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; + esac +else + lt_prog_compiler_pic_GCJ= + lt_prog_compiler_can_build_shared_GCJ=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_GCJ= + ;; + *) + lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_GCJ+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_GCJ=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:__oline__: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_GCJ=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_GCJ" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_GCJ= + enable_shared_with_static_runtimes_GCJ=no + archive_cmds_GCJ= + archive_expsym_cmds_GCJ= + old_archive_From_new_cmds_GCJ= + old_archive_from_expsyms_cmds_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + thread_safe_flag_spec_GCJ= + hardcode_libdir_flag_spec_GCJ= + hardcode_libdir_flag_spec_ld_GCJ= + hardcode_libdir_separator_GCJ= + hardcode_direct_GCJ=no + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=unsupported + link_all_deplibs_GCJ=unknown + hardcode_automatic_GCJ=no + module_cmds_GCJ= + module_expsym_cmds_GCJ= + always_export_symbols_GCJ=no + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_GCJ= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_GCJ=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_GCJ=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_GCJ=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_GCJ='-L$libdir' + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=no + enable_shared_with_static_runtimes_GCJ=yes + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + sunos4*) + archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds_GCJ="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds_GCJ="$tmp_archive_cmds" + fi + else + ld_shlibs_GCJ=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + + if test "$ld_shlibs_GCJ" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_GCJ= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=yes + archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_GCJ=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_GCJ=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_GCJ='' + hardcode_direct_GCJ=yes + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_GCJ=yes + else + # We have old collect2 + hardcode_direct_GCJ=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_GCJ=yes + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_libdir_separator_GCJ= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_GCJ=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_GCJ='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_GCJ="-z nodefs" + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_GCJ=' ${wl}-bernotok' + allow_undefined_flag_GCJ=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_GCJ=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_GCJ=' ' + archive_cmds_need_lc_GCJ=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_GCJ=no + ;; + + bsdi4*) + export_dynamic_flag_spec_GCJ=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_GCJ=' ' + allow_undefined_flag_GCJ=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_GCJ='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_GCJ=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + archive_cmds_need_lc_GCJ=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_GCJ='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag_GCJ='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_GCJ='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_GCJ='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_GCJ='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct_GCJ=no + hardcode_automatic_GCJ=yes + hardcode_shlibpath_var_GCJ=unsupported + whole_archive_flag_spec_GCJ='-all_load $convenience' + link_all_deplibs_GCJ=yes + else + ld_shlibs_GCJ=no + fi + ;; + + dgux*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + freebsd1*) + ld_shlibs_GCJ=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + ;; + ia64*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + *) + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + link_all_deplibs_GCJ=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + newsos6) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_shlibpath_var_GCJ=no + ;; + + openbsd*) + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + ;; + *) + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + allow_undefined_flag_GCJ=unsupported + archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_GCJ='-rpath $libdir' + fi + hardcode_libdir_separator_GCJ=: + ;; + + sco3.2v5*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag_GCJ=' -z text' + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_shlibpath_var_GCJ=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs_GCJ=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_GCJ='$CC -r -o $output$reload_objs' + hardcode_direct_GCJ=no + ;; + motorola) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4.3*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_GCJ=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag_GCJ='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv5*) + no_undefined_flag_GCJ=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec_GCJ= + hardcode_shlibpath_var_GCJ=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + *) + ld_shlibs_GCJ=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_GCJ" >&5 +$as_echo "$ld_shlibs_GCJ" >&6; } +test "$ld_shlibs_GCJ" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_GCJ" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_GCJ=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_GCJ in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_GCJ + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ + allow_undefined_flag_GCJ= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + archive_cmds_need_lc_GCJ=no + else + archive_cmds_need_lc_GCJ=yes + fi + allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_GCJ" >&5 +$as_echo "$archive_cmds_need_lc_GCJ" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + libsuff= + if test "$lt_cv_cc_lib64_suffix" = "yes"; then + libsuff=64 + fi + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} $lt_ld_extra" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} /usr/local/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_GCJ= +if test -n "$hardcode_libdir_flag_spec_GCJ" || \ + test -n "$runpath_var GCJ" || \ + test "X$hardcode_automatic_GCJ"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_GCJ" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && + test "$hardcode_minus_L_GCJ" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_GCJ=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_GCJ=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_GCJ=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_GCJ" >&5 +$as_echo "$hardcode_action_GCJ" >&6; } + +if test "$hardcode_action_GCJ" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_GCJ \ + CC_GCJ \ + LD_GCJ \ + lt_prog_compiler_wl_GCJ \ + lt_prog_compiler_pic_GCJ \ + lt_prog_compiler_static_GCJ \ + lt_prog_compiler_no_builtin_flag_GCJ \ + export_dynamic_flag_spec_GCJ \ + thread_safe_flag_spec_GCJ \ + whole_archive_flag_spec_GCJ \ + enable_shared_with_static_runtimes_GCJ \ + old_archive_cmds_GCJ \ + old_archive_from_new_cmds_GCJ \ + predep_objects_GCJ \ + postdep_objects_GCJ \ + predeps_GCJ \ + postdeps_GCJ \ + compiler_lib_search_path_GCJ \ + archive_cmds_GCJ \ + archive_expsym_cmds_GCJ \ + postinstall_cmds_GCJ \ + postuninstall_cmds_GCJ \ + old_archive_from_expsyms_cmds_GCJ \ + allow_undefined_flag_GCJ \ + no_undefined_flag_GCJ \ + export_symbols_cmds_GCJ \ + hardcode_libdir_flag_spec_GCJ \ + hardcode_libdir_flag_spec_ld_GCJ \ + hardcode_libdir_separator_GCJ \ + hardcode_automatic_GCJ \ + module_cmds_GCJ \ + module_expsym_cmds_GCJ \ + lt_cv_prog_compiler_c_o_GCJ \ + exclude_expsyms_GCJ \ + include_expsyms_GCJ; do + + case $var in + old_archive_cmds_GCJ | \ + old_archive_from_new_cmds_GCJ | \ + archive_cmds_GCJ | \ + archive_expsym_cmds_GCJ | \ + module_cmds_GCJ | \ + module_expsym_cmds_GCJ | \ + old_archive_from_expsyms_cmds_GCJ | \ + export_symbols_cmds_GCJ | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_GCJ + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_GCJ + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_GCJ + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_GCJ + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_GCJ + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_GCJ +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_GCJ + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_GCJ +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_GCJ +archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_GCJ +module_expsym_cmds=$lt_module_expsym_cmds_GCJ + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_GCJ + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_GCJ + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_GCJ + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_GCJ + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_GCJ + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_GCJ + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_GCJ + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_GCJ + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_GCJ + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_GCJ" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_GCJ + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_GCJ + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_GCJ + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_GCJ + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + RC) + + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +objext_RC=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +compiler_RC=$CC +lt_cv_prog_compiler_c_o_RC=yes + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_RC \ + CC_RC \ + LD_RC \ + lt_prog_compiler_wl_RC \ + lt_prog_compiler_pic_RC \ + lt_prog_compiler_static_RC \ + lt_prog_compiler_no_builtin_flag_RC \ + export_dynamic_flag_spec_RC \ + thread_safe_flag_spec_RC \ + whole_archive_flag_spec_RC \ + enable_shared_with_static_runtimes_RC \ + old_archive_cmds_RC \ + old_archive_from_new_cmds_RC \ + predep_objects_RC \ + postdep_objects_RC \ + predeps_RC \ + postdeps_RC \ + compiler_lib_search_path_RC \ + archive_cmds_RC \ + archive_expsym_cmds_RC \ + postinstall_cmds_RC \ + postuninstall_cmds_RC \ + old_archive_from_expsyms_cmds_RC \ + allow_undefined_flag_RC \ + no_undefined_flag_RC \ + export_symbols_cmds_RC \ + hardcode_libdir_flag_spec_RC \ + hardcode_libdir_flag_spec_ld_RC \ + hardcode_libdir_separator_RC \ + hardcode_automatic_RC \ + module_cmds_RC \ + module_expsym_cmds_RC \ + lt_cv_prog_compiler_c_o_RC \ + exclude_expsyms_RC \ + include_expsyms_RC; do + + case $var in + old_archive_cmds_RC | \ + old_archive_from_new_cmds_RC | \ + archive_cmds_RC | \ + archive_expsym_cmds_RC | \ + module_cmds_RC | \ + module_expsym_cmds_RC | \ + old_archive_from_expsyms_cmds_RC | \ + export_symbols_cmds_RC | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_RC + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_RC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_RC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_RC + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_RC + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_RC +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_RC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_RC +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_RC +archive_expsym_cmds=$lt_archive_expsym_cmds_RC +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_RC +module_expsym_cmds=$lt_module_expsym_cmds_RC + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_RC + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_RC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_RC + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_RC + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_RC + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_RC + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_RC + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_RC + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_RC + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_RC + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_RC + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_RC" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_RC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_RC + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_RC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_RC + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + ;; + + *) + as_fn_error $? "Unsupported tag name: $tagname" "$LINENO" 5 + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + as_fn_error $? "unable to update list of available tagged configurations." "$LINENO" 5 + fi +fi + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Prevent multiple expansion + + + + + + + + + + + + + + + + + + + + + +@%:@ Check whether --enable-swap-count was given. +if test "${enable_swap_count+set}" = set; then : + enableval=$enable_swap_count; +fi + +case $enable_swap_count in + yes) + +$as_echo "@%:@define SWAPCOUNT 1" >>confdefs.h + + ;; +esac + +@%:@ Check whether --enable-cache-stats was given. +if test "${enable_cache_stats+set}" = set; then : + enableval=$enable_cache_stats; +fi + +case $enable_cache_stats in + yes) + +$as_echo "@%:@define CACHESTATS 1" >>confdefs.h + + ;; +esac + + +ac_config_headers="$ac_config_headers config.h" + + +ac_config_files="$ac_config_files Makefile src/Makefile" + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIB@&t@OBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by buddy $as_me 2.4, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +buddy config.status 2.4 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + "$ac_file" | "$ac_file":* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for "$ac_file"" >`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + grep '^DEP_FILES *= *[^ @%:@]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/sdk/buddy-2.4/autom4te.cache/requests b/sdk/buddy-2.4/autom4te.cache/requests new file mode 100644 index 0000000..796f3f0 --- /dev/null +++ b/sdk/buddy-2.4/autom4te.cache/requests @@ -0,0 +1,79 @@ +# This file was generated by Autom4te Fri Oct 23 20:57:39 UTC 2015. +# It contains the lists of macros which have been traced. +# It can be safely removed. + +@request = ( + bless( [ + '0', + 1, + [ + '/usr/share/autoconf' + ], + [ + '/usr/share/autoconf/autoconf/autoconf.m4f', + 'aclocal.m4', + 'configure.ac' + ], + { + 'm4_sinclude' => 1, + 'AC_CONFIG_SUBDIRS' => 1, + 'AH_OUTPUT' => 1, + 'AC_CANONICAL_BUILD' => 1, + 'include' => 1, + 'AM_PROG_F77_C_O' => 1, + 'AM_PROG_FC_C_O' => 1, + 'AC_FC_PP_SRCEXT' => 1, + 'AC_FC_PP_DEFINE' => 1, + 'LT_SUPPORTED_TAG' => 1, + 'LT_CONFIG_LTDL_DIR' => 1, + 'AC_DEFINE_TRACE_LITERAL' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'AM_XGETTEXT_OPTION' => 1, + 'AM_MAINTAINER_MODE' => 1, + '_AM_COND_IF' => 1, + 'AC_FC_SRCEXT' => 1, + 'AM_GNU_GETTEXT' => 1, + 'AC_LIBSOURCE' => 1, + 'AM_NLS' => 1, + 'AM_INIT_AUTOMAKE' => 1, + '_AM_COND_ENDIF' => 1, + 'LT_INIT' => 1, + '_LT_AC_TAGCONFIG' => 1, + 'AC_CANONICAL_SYSTEM' => 1, + 'AC_SUBST' => 1, + 'AM_PROG_MOC' => 1, + 'AM_POT_TOOLS' => 1, + '_m4_warn' => 1, + 'AM_CONDITIONAL' => 1, + 'AM_PROG_LIBTOOL' => 1, + '_AM_MAKEFILE_INCLUDE' => 1, + 'm4_pattern_forbid' => 1, + 'AC_SUBST_TRACE' => 1, + '_AM_COND_ELSE' => 1, + 'AC_FC_FREEFORM' => 1, + 'AM_PATH_GUILE' => 1, + 'AC_INIT' => 1, + 'AM_SILENT_RULES' => 1, + 'AM_PROG_AR' => 1, + 'AM_MAKEFILE_INCLUDE' => 1, + 'AC_CANONICAL_TARGET' => 1, + 'm4_pattern_allow' => 1, + 'AC_CONFIG_AUX_DIR' => 1, + 'AC_REQUIRE_AUX_FILE' => 1, + 'AC_CONFIG_HEADERS' => 1, + 'AC_CONFIG_LINKS' => 1, + 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'AC_CONFIG_LIBOBJ_DIR' => 1, + 'AM_ENABLE_MULTILIB' => 1, + 'AC_CANONICAL_HOST' => 1, + 'AC_CONFIG_FILES' => 1, + 'AC_PROG_LIBTOOL' => 1, + 'AM_PROG_CC_C_O' => 1, + 'AM_PROG_CXX_C_O' => 1, + 'm4_include' => 1, + 'sinclude' => 1 + } + ], 'Autom4te::Request' ) + ); + diff --git a/sdk/buddy-2.4/autom4te.cache/traces.0 b/sdk/buddy-2.4/autom4te.cache/traces.0 new file mode 100644 index 0000000..caf299b --- /dev/null +++ b/sdk/buddy-2.4/autom4te.cache/traces.0 @@ -0,0 +1,712 @@ +m4trace:aclocal.m4:6861: -1- m4_include([m4/debug.m4]) +m4trace:configure.ac:2: -1- AC_INIT([buddy], [2.4]) +m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.ac:2: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.ac:2: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +m4trace:configure.ac:2: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.ac:2: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.ac:2: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.ac:2: -1- AC_SUBST([SHELL]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([SHELL]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^SHELL$]) +m4trace:configure.ac:2: -1- AC_SUBST([PATH_SEPARATOR]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^PATH_SEPARATOR$]) +m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_NAME]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_STRING]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE_URL]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:2: -1- AC_SUBST([exec_prefix], [NONE]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([exec_prefix]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^exec_prefix$]) +m4trace:configure.ac:2: -1- AC_SUBST([prefix], [NONE]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([prefix]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^prefix$]) +m4trace:configure.ac:2: -1- AC_SUBST([program_transform_name], [s,x,x,]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([program_transform_name]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^program_transform_name$]) +m4trace:configure.ac:2: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([bindir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^bindir$]) +m4trace:configure.ac:2: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sbindir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^sbindir$]) +m4trace:configure.ac:2: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([libexecdir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^libexecdir$]) +m4trace:configure.ac:2: -1- AC_SUBST([datarootdir], ['${prefix}/share']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([datarootdir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^datarootdir$]) +m4trace:configure.ac:2: -1- AC_SUBST([datadir], ['${datarootdir}']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([datadir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^datadir$]) +m4trace:configure.ac:2: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sysconfdir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^sysconfdir$]) +m4trace:configure.ac:2: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([sharedstatedir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^sharedstatedir$]) +m4trace:configure.ac:2: -1- AC_SUBST([localstatedir], ['${prefix}/var']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([localstatedir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^localstatedir$]) +m4trace:configure.ac:2: -1- AC_SUBST([runstatedir], ['${localstatedir}/run']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([runstatedir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^runstatedir$]) +m4trace:configure.ac:2: -1- AC_SUBST([includedir], ['${prefix}/include']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([includedir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^includedir$]) +m4trace:configure.ac:2: -1- AC_SUBST([oldincludedir], ['/usr/include']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([oldincludedir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^oldincludedir$]) +m4trace:configure.ac:2: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], + ['${datarootdir}/doc/${PACKAGE_TARNAME}'], + ['${datarootdir}/doc/${PACKAGE}'])]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([docdir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^docdir$]) +m4trace:configure.ac:2: -1- AC_SUBST([infodir], ['${datarootdir}/info']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([infodir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^infodir$]) +m4trace:configure.ac:2: -1- AC_SUBST([htmldir], ['${docdir}']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([htmldir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^htmldir$]) +m4trace:configure.ac:2: -1- AC_SUBST([dvidir], ['${docdir}']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([dvidir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^dvidir$]) +m4trace:configure.ac:2: -1- AC_SUBST([pdfdir], ['${docdir}']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([pdfdir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^pdfdir$]) +m4trace:configure.ac:2: -1- AC_SUBST([psdir], ['${docdir}']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([psdir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^psdir$]) +m4trace:configure.ac:2: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([libdir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^libdir$]) +m4trace:configure.ac:2: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([localedir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^localedir$]) +m4trace:configure.ac:2: -1- AC_SUBST([mandir], ['${datarootdir}/man']) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([mandir]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^mandir$]) +m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ +@%:@undef PACKAGE_NAME]) +m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ +@%:@undef PACKAGE_TARNAME]) +m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ +@%:@undef PACKAGE_VERSION]) +m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ +@%:@undef PACKAGE_STRING]) +m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ +@%:@undef PACKAGE_BUGREPORT]) +m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ +@%:@undef PACKAGE_URL]) +m4trace:configure.ac:2: -1- AC_SUBST([DEFS]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([DEFS]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^DEFS$]) +m4trace:configure.ac:2: -1- AC_SUBST([ECHO_C]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_C]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_C$]) +m4trace:configure.ac:2: -1- AC_SUBST([ECHO_N]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_N]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_N$]) +m4trace:configure.ac:2: -1- AC_SUBST([ECHO_T]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ECHO_T]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^ECHO_T$]) +m4trace:configure.ac:2: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:2: -1- AC_SUBST([build_alias]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([build_alias]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^build_alias$]) +m4trace:configure.ac:2: -1- AC_SUBST([host_alias]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([host_alias]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^host_alias$]) +m4trace:configure.ac:2: -1- AC_SUBST([target_alias]) +m4trace:configure.ac:2: -1- AC_SUBST_TRACE([target_alias]) +m4trace:configure.ac:2: -1- m4_pattern_allow([^target_alias$]) +m4trace:configure.ac:3: -1- AC_CONFIG_AUX_DIR([tools]) +m4trace:configure.ac:4: -1- AM_INIT_AUTOMAKE([foreign nostdinc no-define 1.7.3]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) +m4trace:configure.ac:4: -1- AM_AUTOMAKE_VERSION([1.8.5]) +m4trace:configure.ac:4: -1- AC_REQUIRE_AUX_FILE([install-sh]) +m4trace:configure.ac:4: -1- AC_SUBST([INSTALL_PROGRAM]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) +m4trace:configure.ac:4: -1- AC_SUBST([INSTALL_SCRIPT]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) +m4trace:configure.ac:4: -1- AC_SUBST([INSTALL_DATA]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([INSTALL_DATA]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^INSTALL_DATA$]) +m4trace:configure.ac:4: -1- AC_SUBST([CYGPATH_W]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([CYGPATH_W]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^CYGPATH_W$]) +m4trace:configure.ac:4: -1- _m4_warn([obsolete], [The macro `AC_FOREACH' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:194: AC_FOREACH is expanded from... +aclocal.m4:6749: _AM_SET_OPTIONS is expanded from... +aclocal.m4:6359: AM_INIT_AUTOMAKE is expanded from... +configure.ac:4: the top level]) +m4trace:configure.ac:4: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([PACKAGE]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:4: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([VERSION]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:4: -1- AC_SUBST([ACLOCAL]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([ACLOCAL]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^ACLOCAL$]) +m4trace:configure.ac:4: -1- AC_SUBST([AUTOCONF]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([AUTOCONF]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^AUTOCONF$]) +m4trace:configure.ac:4: -1- AC_SUBST([AUTOMAKE]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([AUTOMAKE]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^AUTOMAKE$]) +m4trace:configure.ac:4: -1- AC_SUBST([AUTOHEADER]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([AUTOHEADER]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^AUTOHEADER$]) +m4trace:configure.ac:4: -1- AC_SUBST([MAKEINFO]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([MAKEINFO]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^MAKEINFO$]) +m4trace:configure.ac:4: -1- AC_SUBST([AMTAR]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([AMTAR]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^AMTAR$]) +m4trace:configure.ac:4: -1- AC_SUBST([install_sh]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([install_sh]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^install_sh$]) +m4trace:configure.ac:4: -1- AC_SUBST([STRIP]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([STRIP]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:4: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) +m4trace:configure.ac:4: -1- AC_SUBST([mkdir_p]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([mkdir_p]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^mkdir_p$]) +m4trace:configure.ac:4: -1- AC_SUBST([AWK]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([AWK]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^AWK$]) +m4trace:configure.ac:4: -1- AC_SUBST([SET_MAKE]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([SET_MAKE]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^SET_MAKE$]) +m4trace:configure.ac:4: -1- AC_SUBST([am__leading_dot]) +m4trace:configure.ac:4: -1- AC_SUBST_TRACE([am__leading_dot]) +m4trace:configure.ac:4: -1- m4_pattern_allow([^am__leading_dot$]) +m4trace:configure.ac:8: -1- AC_DEFINE_TRACE_LITERAL([MAJOR_VERSION]) +m4trace:configure.ac:8: -1- m4_pattern_allow([^MAJOR_VERSION$]) +m4trace:configure.ac:8: -1- AH_OUTPUT([MAJOR_VERSION], [/* BuDDy\'s major version. */ +@%:@undef MAJOR_VERSION]) +m4trace:configure.ac:9: -1- AC_DEFINE_TRACE_LITERAL([MINOR_VERSION]) +m4trace:configure.ac:9: -1- m4_pattern_allow([^MINOR_VERSION$]) +m4trace:configure.ac:9: -1- AH_OUTPUT([MINOR_VERSION], [/* BuDDy\'s minor version. */ +@%:@undef MINOR_VERSION]) +m4trace:configure.ac:11: -1- AC_SUBST([CC]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:11: -1- AC_SUBST([CFLAGS]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([CFLAGS]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^CFLAGS$]) +m4trace:configure.ac:11: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:11: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:11: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:11: -1- AC_SUBST([CC]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:11: -1- AC_SUBST([CC]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:11: -1- AC_SUBST([CC]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:11: -1- AC_SUBST([CC]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:11: -1- AC_SUBST([ac_ct_CC]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([ac_ct_CC]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^ac_ct_CC$]) +m4trace:configure.ac:11: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([EXEEXT]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^EXEEXT$]) +m4trace:configure.ac:11: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([OBJEXT]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^OBJEXT$]) +m4trace:configure.ac:11: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([DEPDIR]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^DEPDIR$]) +m4trace:configure.ac:11: -1- AC_SUBST([am__include]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([am__include]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^am__include$]) +m4trace:configure.ac:11: -1- AC_SUBST([am__quote]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([am__quote]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^am__quote$]) +m4trace:configure.ac:11: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +m4trace:configure.ac:11: -1- AC_SUBST([AMDEP_TRUE]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([AMDEP_TRUE]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^AMDEP_TRUE$]) +m4trace:configure.ac:11: -1- AC_SUBST([AMDEP_FALSE]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([AMDEP_FALSE]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^AMDEP_FALSE$]) +m4trace:configure.ac:11: -1- AC_SUBST([AMDEPBACKSLASH]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) +m4trace:configure.ac:11: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([CCDEPMODE]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^CCDEPMODE$]) +m4trace:configure.ac:11: -1- AM_CONDITIONAL([am__fastdepCC], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:11: -1- AC_SUBST([am__fastdepCC_TRUE]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) +m4trace:configure.ac:11: -1- AC_SUBST([am__fastdepCC_FALSE]) +m4trace:configure.ac:11: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) +m4trace:configure.ac:11: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) +m4trace:configure.ac:16: -1- AC_SUBST([CXX]) +m4trace:configure.ac:16: -1- AC_SUBST_TRACE([CXX]) +m4trace:configure.ac:16: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:16: -1- AC_SUBST([CXXFLAGS]) +m4trace:configure.ac:16: -1- AC_SUBST_TRACE([CXXFLAGS]) +m4trace:configure.ac:16: -1- m4_pattern_allow([^CXXFLAGS$]) +m4trace:configure.ac:16: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.ac:16: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.ac:16: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:16: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:16: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:16: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:16: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:16: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:16: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:16: -1- AC_SUBST([CXX]) +m4trace:configure.ac:16: -1- AC_SUBST_TRACE([CXX]) +m4trace:configure.ac:16: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:16: -1- AC_SUBST([ac_ct_CXX]) +m4trace:configure.ac:16: -1- AC_SUBST_TRACE([ac_ct_CXX]) +m4trace:configure.ac:16: -1- m4_pattern_allow([^ac_ct_CXX$]) +m4trace:configure.ac:16: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type]) +m4trace:configure.ac:16: -1- AC_SUBST_TRACE([CXXDEPMODE]) +m4trace:configure.ac:16: -1- m4_pattern_allow([^CXXDEPMODE$]) +m4trace:configure.ac:16: -1- AM_CONDITIONAL([am__fastdepCXX], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:16: -1- AC_SUBST([am__fastdepCXX_TRUE]) +m4trace:configure.ac:16: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE]) +m4trace:configure.ac:16: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) +m4trace:configure.ac:16: -1- AC_SUBST([am__fastdepCXX_FALSE]) +m4trace:configure.ac:16: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE]) +m4trace:configure.ac:16: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) +m4trace:configure.ac:18: -1- AC_PROG_LIBTOOL +m4trace:configure.ac:18: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +../../lib/autoconf/general.m4:1473: AC_ARG_ENABLE is expanded from... +aclocal.m4:1749: AC_ENABLE_SHARED is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +../../lib/autoconf/general.m4:1473: AC_ARG_ENABLE is expanded from... +aclocal.m4:1788: AC_ENABLE_STATIC is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +../../lib/autoconf/general.m4:1473: AC_ARG_ENABLE is expanded from... +aclocal.m4:1827: AC_ENABLE_FAST_INSTALL is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- AC_CANONICAL_HOST +m4trace:configure.ac:18: -1- AC_CANONICAL_BUILD +m4trace:configure.ac:18: -1- AC_REQUIRE_AUX_FILE([config.sub]) +m4trace:configure.ac:18: -1- AC_REQUIRE_AUX_FILE([config.guess]) +m4trace:configure.ac:18: -1- AC_SUBST([build], [$ac_cv_build]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([build]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^build$]) +m4trace:configure.ac:18: -1- AC_SUBST([build_cpu], [$[1]]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([build_cpu]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^build_cpu$]) +m4trace:configure.ac:18: -1- AC_SUBST([build_vendor], [$[2]]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([build_vendor]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^build_vendor$]) +m4trace:configure.ac:18: -1- AC_SUBST([build_os]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([build_os]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^build_os$]) +m4trace:configure.ac:18: -1- AC_SUBST([host], [$ac_cv_host]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([host]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^host$]) +m4trace:configure.ac:18: -1- AC_SUBST([host_cpu], [$[1]]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([host_cpu]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^host_cpu$]) +m4trace:configure.ac:18: -1- AC_SUBST([host_vendor], [$[2]]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([host_vendor]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^host_vendor$]) +m4trace:configure.ac:18: -1- AC_SUBST([host_os]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([host_os]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^host_os$]) +m4trace:configure.ac:18: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +../../lib/autoconf/general.m4:1492: AC_ARG_WITH is expanded from... +aclocal.m4:1968: AC_PROG_LD is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- AC_SUBST([GREP]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([GREP]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:18: -1- AC_SUBST([EGREP]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([EGREP]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^EGREP$]) +m4trace:configure.ac:18: -1- AC_SUBST([LN_S], [$as_ln_s]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([LN_S]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^LN_S$]) +m4trace:configure.ac:18: -1- AC_SUBST([ECHO]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([ECHO]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^ECHO$]) +m4trace:configure.ac:18: -1- AC_SUBST([AR]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([AR]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^AR$]) +m4trace:configure.ac:18: -1- AC_SUBST([RANLIB]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([RANLIB]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^RANLIB$]) +m4trace:configure.ac:18: -1- AC_SUBST([STRIP]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([STRIP]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:18: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +../../lib/autoconf/general.m4:1473: AC_ARG_ENABLE is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +../../lib/autoconf/general.m4:1492: AC_ARG_WITH is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([syntax], [AC_CACHE_VAL(lt_prog_compiler_static_works, ...): suspicious cache-id, must contain _cv_ to be cached], [../../lib/autoconf/general.m4:2042: AC_CACHE_VAL is expanded from... +../../lib/autoconf/general.m4:2063: AC_CACHE_CHECK is expanded from... +aclocal.m4:605: AC_LIBTOOL_LINKER_OPTION is expanded from... +aclocal.m4:2471: _LT_AC_LANG_C_CONFIG is expanded from... +aclocal.m4:2470: AC_LIBTOOL_LANG_C_CONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([syntax], [AC_CACHE_VAL(lt_prog_compiler_pic_works, ...): suspicious cache-id, must contain _cv_ to be cached], [../../lib/autoconf/general.m4:2042: AC_CACHE_VAL is expanded from... +../../lib/autoconf/general.m4:2063: AC_CACHE_CHECK is expanded from... +aclocal.m4:562: AC_LIBTOOL_COMPILER_OPTION is expanded from... +aclocal.m4:4513: AC_LIBTOOL_PROG_COMPILER_PIC is expanded from... +aclocal.m4:2471: _LT_AC_LANG_C_CONFIG is expanded from... +aclocal.m4:2470: AC_LIBTOOL_LANG_C_CONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:2698: AC_TRY_LINK is expanded from... +../../lib/m4sugar/m4sh.m4:639: AS_IF is expanded from... +../../lib/autoconf/general.m4:2042: AC_CACHE_VAL is expanded from... +../../lib/autoconf/general.m4:2063: AC_CACHE_CHECK is expanded from... +aclocal.m4:427: _LT_AC_LOCK is expanded from... +aclocal.m4:965: AC_LIBTOOL_SYS_HARD_LINK_LOCKS is expanded from... +aclocal.m4:2471: _LT_AC_LANG_C_CONFIG is expanded from... +aclocal.m4:2470: AC_LIBTOOL_LANG_C_CONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([syntax], [AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body], [../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from... +../../lib/autoconf/general.m4:2672: _AC_LINK_IFELSE is expanded from... +../../lib/autoconf/general.m4:2689: AC_LINK_IFELSE is expanded from... +aclocal.m4:247: _LT_AC_SYS_LIBPATH_AIX is expanded from... +aclocal.m4:4975: AC_LIBTOOL_PROG_LD_SHLIBS is expanded from... +aclocal.m4:2471: _LT_AC_LANG_C_CONFIG is expanded from... +aclocal.m4:2470: AC_LIBTOOL_LANG_C_CONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([syntax], [AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body], [../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from... +../../lib/autoconf/general.m4:2672: _AC_LINK_IFELSE is expanded from... +../../lib/autoconf/general.m4:2689: AC_LINK_IFELSE is expanded from... +aclocal.m4:247: _LT_AC_SYS_LIBPATH_AIX is expanded from... +aclocal.m4:4975: AC_LIBTOOL_PROG_LD_SHLIBS is expanded from... +aclocal.m4:2471: _LT_AC_LANG_C_CONFIG is expanded from... +aclocal.m4:2470: AC_LIBTOOL_LANG_C_CONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_DLFCN_H]) +m4trace:configure.ac:18: -1- AC_SUBST([CPP]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CPP]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.ac:18: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:18: -1- AC_SUBST([CPP]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CPP]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.ac:18: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.ac:18: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ +@%:@undef STDC_HEADERS]) +m4trace:configure.ac:18: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_TYPES_H]) +m4trace:configure.ac:18: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_STAT_H]) +m4trace:configure.ac:18: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDLIB_H]) +m4trace:configure.ac:18: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRING_H]) +m4trace:configure.ac:18: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_MEMORY_H]) +m4trace:configure.ac:18: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRINGS_H]) +m4trace:configure.ac:18: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_INTTYPES_H]) +m4trace:configure.ac:18: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDINT_H]) +m4trace:configure.ac:18: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_UNISTD_H]) +m4trace:configure.ac:18: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DLFCN_H]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) +m4trace:configure.ac:18: -1- _LT_AC_TAGCONFIG +m4trace:configure.ac:18: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +../../lib/autoconf/general.m4:1492: AC_ARG_WITH is expanded from... +aclocal.m4:1632: _LT_AC_TAGCONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([obsolete], [back quotes and double quotes must not be escaped in: tag name \"$tagname\" already exists], [aclocal.m4:1632: _LT_AC_TAGCONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- AC_SUBST([CXXCPP]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CXXCPP]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:18: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:18: -1- AC_SUBST([CXXCPP]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([CXXCPP]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:18: -1- _m4_warn([syntax], [AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body], [../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from... +../../lib/autoconf/general.m4:2672: _AC_LINK_IFELSE is expanded from... +../../lib/autoconf/general.m4:2689: AC_LINK_IFELSE is expanded from... +aclocal.m4:247: _LT_AC_SYS_LIBPATH_AIX is expanded from... +aclocal.m4:2612: _LT_AC_LANG_CXX_CONFIG is expanded from... +aclocal.m4:2611: AC_LIBTOOL_LANG_CXX_CONFIG is expanded from... +aclocal.m4:1632: _LT_AC_TAGCONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([syntax], [AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body], [../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from... +../../lib/autoconf/general.m4:2672: _AC_LINK_IFELSE is expanded from... +../../lib/autoconf/general.m4:2689: AC_LINK_IFELSE is expanded from... +aclocal.m4:247: _LT_AC_SYS_LIBPATH_AIX is expanded from... +aclocal.m4:2612: _LT_AC_LANG_CXX_CONFIG is expanded from... +aclocal.m4:2611: AC_LIBTOOL_LANG_CXX_CONFIG is expanded from... +aclocal.m4:1632: _LT_AC_TAGCONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([syntax], [AC_CACHE_VAL(lt_prog_compiler_pic_works_CXX, ...): suspicious cache-id, must contain _cv_ to be cached], [../../lib/autoconf/general.m4:2042: AC_CACHE_VAL is expanded from... +../../lib/autoconf/general.m4:2063: AC_CACHE_CHECK is expanded from... +aclocal.m4:562: AC_LIBTOOL_COMPILER_OPTION is expanded from... +aclocal.m4:4513: AC_LIBTOOL_PROG_COMPILER_PIC is expanded from... +aclocal.m4:2612: _LT_AC_LANG_CXX_CONFIG is expanded from... +aclocal.m4:2611: AC_LIBTOOL_LANG_CXX_CONFIG is expanded from... +aclocal.m4:1632: _LT_AC_TAGCONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- AC_SUBST([F77]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([F77]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^F77$]) +m4trace:configure.ac:18: -1- AC_SUBST([FFLAGS]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([FFLAGS]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^FFLAGS$]) +m4trace:configure.ac:18: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:18: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:18: -1- AC_SUBST([F77]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([F77]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^F77$]) +m4trace:configure.ac:18: -1- AC_SUBST([ac_ct_F77]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([ac_ct_F77]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^ac_ct_F77$]) +m4trace:configure.ac:18: -1- _m4_warn([syntax], [AC_CACHE_VAL(lt_prog_compiler_pic_works_F77, ...): suspicious cache-id, must contain _cv_ to be cached], [../../lib/autoconf/general.m4:2042: AC_CACHE_VAL is expanded from... +../../lib/autoconf/general.m4:2063: AC_CACHE_CHECK is expanded from... +aclocal.m4:562: AC_LIBTOOL_COMPILER_OPTION is expanded from... +aclocal.m4:4513: AC_LIBTOOL_PROG_COMPILER_PIC is expanded from... +aclocal.m4:3638: _LT_AC_LANG_F77_CONFIG is expanded from... +aclocal.m4:3637: AC_LIBTOOL_LANG_F77_CONFIG is expanded from... +aclocal.m4:1632: _LT_AC_TAGCONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([obsolete], [The macro `AC_LANG_SAVE' is obsolete. +You should run autoupdate.], [../../lib/autoconf/lang.m4:125: AC_LANG_SAVE is expanded from... +aclocal.m4:3738: _LT_AC_LANG_GCJ_CONFIG is expanded from... +aclocal.m4:3737: AC_LIBTOOL_LANG_GCJ_CONFIG is expanded from... +aclocal.m4:1632: _LT_AC_TAGCONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([syntax], [AC_CACHE_VAL(lt_prog_compiler_pic_works_GCJ, ...): suspicious cache-id, must contain _cv_ to be cached], [../../lib/autoconf/general.m4:2042: AC_CACHE_VAL is expanded from... +../../lib/autoconf/general.m4:2063: AC_CACHE_CHECK is expanded from... +aclocal.m4:562: AC_LIBTOOL_COMPILER_OPTION is expanded from... +aclocal.m4:4513: AC_LIBTOOL_PROG_COMPILER_PIC is expanded from... +aclocal.m4:3738: _LT_AC_LANG_GCJ_CONFIG is expanded from... +aclocal.m4:3737: AC_LIBTOOL_LANG_GCJ_CONFIG is expanded from... +aclocal.m4:1632: _LT_AC_TAGCONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([syntax], [AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body], [../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from... +../../lib/autoconf/general.m4:2672: _AC_LINK_IFELSE is expanded from... +../../lib/autoconf/general.m4:2689: AC_LINK_IFELSE is expanded from... +aclocal.m4:247: _LT_AC_SYS_LIBPATH_AIX is expanded from... +aclocal.m4:4975: AC_LIBTOOL_PROG_LD_SHLIBS is expanded from... +aclocal.m4:3738: _LT_AC_LANG_GCJ_CONFIG is expanded from... +aclocal.m4:3737: AC_LIBTOOL_LANG_GCJ_CONFIG is expanded from... +aclocal.m4:1632: _LT_AC_TAGCONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([syntax], [AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body], [../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from... +../../lib/autoconf/general.m4:2672: _AC_LINK_IFELSE is expanded from... +../../lib/autoconf/general.m4:2689: AC_LINK_IFELSE is expanded from... +aclocal.m4:247: _LT_AC_SYS_LIBPATH_AIX is expanded from... +aclocal.m4:4975: AC_LIBTOOL_PROG_LD_SHLIBS is expanded from... +aclocal.m4:3738: _LT_AC_LANG_GCJ_CONFIG is expanded from... +aclocal.m4:3737: AC_LIBTOOL_LANG_GCJ_CONFIG is expanded from... +aclocal.m4:1632: _LT_AC_TAGCONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([obsolete], [The macro `AC_LANG_RESTORE' is obsolete. +You should run autoupdate.], [../../lib/autoconf/lang.m4:134: AC_LANG_RESTORE is expanded from... +aclocal.m4:3738: _LT_AC_LANG_GCJ_CONFIG is expanded from... +aclocal.m4:3737: AC_LIBTOOL_LANG_GCJ_CONFIG is expanded from... +aclocal.m4:1632: _LT_AC_TAGCONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([obsolete], [The macro `AC_LANG_SAVE' is obsolete. +You should run autoupdate.], [../../lib/autoconf/lang.m4:125: AC_LANG_SAVE is expanded from... +aclocal.m4:3789: _LT_AC_LANG_RC_CONFIG is expanded from... +aclocal.m4:3788: AC_LIBTOOL_LANG_RC_CONFIG is expanded from... +aclocal.m4:1632: _LT_AC_TAGCONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- _m4_warn([obsolete], [The macro `AC_LANG_RESTORE' is obsolete. +You should run autoupdate.], [../../lib/autoconf/lang.m4:134: AC_LANG_RESTORE is expanded from... +aclocal.m4:3789: _LT_AC_LANG_RC_CONFIG is expanded from... +aclocal.m4:3788: AC_LIBTOOL_LANG_RC_CONFIG is expanded from... +aclocal.m4:1632: _LT_AC_TAGCONFIG is expanded from... +aclocal.m4:86: AC_LIBTOOL_SETUP is expanded from... +aclocal.m4:66: _AC_PROG_LIBTOOL is expanded from... +aclocal.m4:31: AC_PROG_LIBTOOL is expanded from... +configure.ac:18: the top level]) +m4trace:configure.ac:18: -1- AC_SUBST([LIBTOOL]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([LIBTOOL]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^LIBTOOL$]) +m4trace:configure.ac:20: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +../../lib/autoconf/general.m4:1473: AC_ARG_ENABLE is expanded from... +m4/debug.m4:1: buddy_DEBUG_FLAGS is expanded from... +configure.ac:20: the top level]) +m4trace:configure.ac:20: -1- AC_DEFINE_TRACE_LITERAL([SWAPCOUNT]) +m4trace:configure.ac:20: -1- m4_pattern_allow([^SWAPCOUNT$]) +m4trace:configure.ac:20: -1- AH_OUTPUT([SWAPCOUNT], [/* Define to 1 to count number of fundamental variable swaps (for debugging). + */ +@%:@undef SWAPCOUNT]) +m4trace:configure.ac:20: -1- _m4_warn([obsolete], [The macro `AC_HELP_STRING' is obsolete. +You should run autoupdate.], [../../lib/autoconf/general.m4:207: AC_HELP_STRING is expanded from... +../../lib/autoconf/general.m4:1473: AC_ARG_ENABLE is expanded from... +m4/debug.m4:1: buddy_DEBUG_FLAGS is expanded from... +configure.ac:20: the top level]) +m4trace:configure.ac:20: -1- AC_DEFINE_TRACE_LITERAL([CACHESTATS]) +m4trace:configure.ac:20: -1- m4_pattern_allow([^CACHESTATS$]) +m4trace:configure.ac:20: -1- AH_OUTPUT([CACHESTATS], [/* Defube to 1 to gather statistical information about operator and unique + node caching (for debugging). */ +@%:@undef CACHESTATS]) +m4trace:configure.ac:22: -1- AC_CONFIG_HEADERS([config.h]) +m4trace:configure.ac:24: -1- AC_CONFIG_FILES([ + Makefile + src/Makefile +]) +m4trace:configure.ac:29: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) +m4trace:configure.ac:29: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) +m4trace:configure.ac:29: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +m4trace:configure.ac:29: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) +m4trace:configure.ac:29: -1- AC_SUBST_TRACE([LTLIBOBJS]) +m4trace:configure.ac:29: -1- m4_pattern_allow([^LTLIBOBJS$]) +m4trace:configure.ac:29: -1- AC_SUBST_TRACE([top_builddir]) +m4trace:configure.ac:29: -1- AC_SUBST_TRACE([top_build_prefix]) +m4trace:configure.ac:29: -1- AC_SUBST_TRACE([srcdir]) +m4trace:configure.ac:29: -1- AC_SUBST_TRACE([abs_srcdir]) +m4trace:configure.ac:29: -1- AC_SUBST_TRACE([top_srcdir]) +m4trace:configure.ac:29: -1- AC_SUBST_TRACE([abs_top_srcdir]) +m4trace:configure.ac:29: -1- AC_SUBST_TRACE([builddir]) +m4trace:configure.ac:29: -1- AC_SUBST_TRACE([abs_builddir]) +m4trace:configure.ac:29: -1- AC_SUBST_TRACE([abs_top_builddir]) +m4trace:configure.ac:29: -1- AC_SUBST_TRACE([INSTALL]) diff --git a/sdk/buddy-2.4/config.h.in b/sdk/buddy-2.4/config.h.in new file mode 100644 index 0000000..78ed6d7 --- /dev/null +++ b/sdk/buddy-2.4/config.h.in @@ -0,0 +1,66 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Defube to 1 to gather statistical information about operator and unique + node caching (for debugging). */ +#undef CACHESTATS + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* BuDDy's major version. */ +#undef MAJOR_VERSION + +/* BuDDy's minor version. */ +#undef MINOR_VERSION + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 to count number of fundamental variable swaps (for debugging). + */ +#undef SWAPCOUNT diff --git a/sdk/buddy-2.4/configure b/sdk/buddy-2.4/configure new file mode 100644 index 0000000..5ff78bc --- /dev/null +++ b/sdk/buddy-2.4/configure @@ -0,0 +1,19914 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for buddy 2.4. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +echo=${ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +tagnames=${tagnames+${tagnames},}CXX + +tagnames=${tagnames+${tagnames},}F77 + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='buddy' +PACKAGE_TARNAME='buddy' +PACKAGE_VERSION='2.4' +PACKAGE_STRING='buddy 2.4' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +LIBTOOL +ac_ct_F77 +FFLAGS +F77 +CXXCPP +CPP +RANLIB +AR +ECHO +LN_S +EGREP +GREP +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +am__leading_dot +SET_MAKE +AWK +mkdir_p +INSTALL_STRIP_PROGRAM +STRIP +install_sh +AMTAR +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_dependency_tracking +enable_shared +enable_static +enable_fast_install +with_gnu_ld +enable_libtool_lock +with_pic +with_tags +enable_swap_count +enable_cache_stats +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CPP +CXXCPP +F77 +FFLAGS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures buddy 2.4 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/buddy] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of buddy 2.4:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-swap-count Count number of fundamental variable swaps (for + debugging) + --enable-cache-stats Gather statistical information about operator and + unique node caching (for debugging) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-tags[=TAGS] include additional configurations [automatic] + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + CXXCPP C++ preprocessor + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +buddy configure 2.4 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_cxx_check_func LINENO FUNC VAR +# ------------------------------------ +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_cxx_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_cxx_check_func + +# ac_fn_f77_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_f77_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_f77_try_compile + +# ac_fn_f77_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_f77_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_f77_try_link +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by buddy $as_me 2.4, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_aux_dir= +for ac_dir in tools "$srcdir"/tools; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in tools \"$srcdir\"/tools" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +am__api_version="1.8" +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # Keeping the `.' argument allows $(mkdir_p) to be used without + # argument. Indeed, we sometimes output rules like + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. + # (`test -n '$(somedir)' && $(mkdir_p) $(somedir)' is a more + # expensive solution, as it forces Make to start a sub-shell.) + mkdir_p='mkdir -p -- .' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='buddy' + VERSION='2.4' + + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. + + + + +MAJOR_VERSION=`echo "$VERSION" | sed -e 's/^\([0-9]*\)\.[0-9]*.*$/\1/'` +MINOR_VERSION=`echo "$VERSION" | sed -e 's/^[0-9]*\.\([0-9]*\).*$/\1/'` + +cat >>confdefs.h <<_ACEOF +#define MAJOR_VERSION $MAJOR_VERSION +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define MINOR_VERSION $MINOR_VERSION +_ACEOF + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +# Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + +# Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${lt_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && break + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +SED=$lt_cv_path_SED + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 +$as_echo "$SED" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD-compatible nm" >&5 +$as_echo_n "checking for BSD-compatible nm... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/${ac_tool_prefix}nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + esac + fi + done + IFS="$lt_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +NM="$lt_cv_path_NM" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognise dependent libraries" >&5 +$as_echo_n "checking how to recognise dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi4*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump'. + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | kfreebsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case "$host_cpu" in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha*|hppa*|i*86|ia64*|m68*|mips*|powerpc*|sparc*|s390*|sh*|x86_64*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 5144 "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + lt_cv_cc_lib64_suffix=no + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case "`/usr/bin/file conftest.$ac_objext`" in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + lt_cv_cc_lib64_suffix=yes + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + lt_cv_cc_lib64_suffix=yes + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + lt_cv_cc_lib64_suffix=yes + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + lt_cv_cc_lib64_suffix=yes + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + +esac + +need_locks="$enable_libtool_lock" + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $F77" >&5 +$as_echo "$F77" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$F77" && break + done +fi +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_F77="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_F77" >&5 +$as_echo "$ac_ct_F77" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_F77" && break +done + + if test "x$ac_ct_F77" = x; then + F77="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + F77=$ac_ct_F77 + fi +fi + + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran 77 compiler" >&5 +$as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } +if ${ac_cv_f77_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat > conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_f77_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_compiler_gnu" >&5 +$as_echo "$ac_cv_f77_compiler_gnu" >&6; } +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5 +$as_echo_n "checking whether $F77 accepts -g... " >&6; } +if ${ac_cv_prog_f77_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + FFLAGS=-g +cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_compile "$LINENO"; then : + ac_cv_prog_f77_g=yes +else + ac_cv_prog_f77_g=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_g" >&5 +$as_echo "$ac_cv_prog_f77_g" >&6; } +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +if test $ac_compiler_gnu = yes; then + G77=yes +else + G77= +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while (test "X"`$CONFIG_SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi + + + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris* | sysv5*) + symcode='[BDRT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +enable_dlopen=no +enable_win32_dll=no + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# +# Check for any special shared library compilation flags. +# +lt_prog_cc_shlib= +if test "$GCC" = no; then + case $host_os in + sco3.2v5*) + lt_prog_cc_shlib='-belf' + ;; + esac +fi +if test -n "$lt_prog_cc_shlib"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 +$as_echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} + if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +$as_echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} + lt_cv_prog_cc_can_build_shared=no + fi +fi + + +# +# Check to make sure the static flag actually works. +# +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_prog_compiler_static works" >&5 +$as_echo_n "checking if $compiler static flag $lt_prog_compiler_static works... " >&6; } +if ${lt_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_prog_compiler_static" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + else + lt_prog_compiler_static_works=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_static_works" >&5 +$as_echo "$lt_prog_compiler_static_works" >&6; } + +if test x"$lt_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:6833: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:6837: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic='-Kpic' + lt_prog_compiler_static='-dn' + ;; + + solaris*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:7066: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:7070: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works" >&5 +$as_echo "$lt_prog_compiler_pic_works" >&6; } + +if test x"$lt_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:7126: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:7130: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + enable_shared_with_static_runtimes=no + archive_cmds= + archive_expsym_cmds= + old_archive_From_new_cmds= + old_archive_from_expsyms_cmds= + export_dynamic_flag_spec= + whole_archive_flag_spec= + thread_safe_flag_spec= + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_direct=no + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + link_all_deplibs=unknown + hardcode_automatic=no + module_cmds= + module_expsym_cmds= + always_export_symbols=no + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds="$tmp_archive_cmds" + fi + else + ld_shlibs=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec=' ' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + bsdi4*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + archive_cmds_need_lc=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='-all_load $convenience' + link_all_deplibs=yes + else + ld_shlibs=no + fi + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_libdir_separator=: + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + ia64*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=no + hardcode_shlibpath_var=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + *) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld='-rpath $libdir' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag=' -z text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + libsuff= + if test "$lt_cv_cc_lib64_suffix" = "yes"; then + libsuff=64 + fi + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} $lt_ld_extra" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} /usr/local/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var " || \ + test "X$hardcode_automatic"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# Report which librarie types wil actually be built +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + darwin* | rhapsody*) + if test "$GCC" = yes; then + archive_cmds_need_lc=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + output_verbose_link_cmd='echo' + archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs$compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='-all_load $convenience' + link_all_deplibs=yes + else + ld_shlibs=no + fi + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler \ + CC \ + LD \ + lt_prog_compiler_wl \ + lt_prog_compiler_pic \ + lt_prog_compiler_static \ + lt_prog_compiler_no_builtin_flag \ + export_dynamic_flag_spec \ + thread_safe_flag_spec \ + whole_archive_flag_spec \ + enable_shared_with_static_runtimes \ + old_archive_cmds \ + old_archive_from_new_cmds \ + predep_objects \ + postdep_objects \ + predeps \ + postdeps \ + compiler_lib_search_path \ + archive_cmds \ + archive_expsym_cmds \ + postinstall_cmds \ + postuninstall_cmds \ + old_archive_from_expsyms_cmds \ + allow_undefined_flag \ + no_undefined_flag \ + export_symbols_cmds \ + hardcode_libdir_flag_spec \ + hardcode_libdir_flag_spec_ld \ + hardcode_libdir_separator \ + hardcode_automatic \ + module_cmds \ + module_expsym_cmds \ + lt_cv_prog_compiler_c_o \ + exclude_expsyms \ + include_expsyms; do + + case $var in + old_archive_cmds | \ + old_archive_from_new_cmds | \ + archive_cmds | \ + archive_expsym_cmds | \ + module_cmds | \ + module_expsym_cmds | \ + old_archive_from_expsyms_cmds | \ + export_symbols_cmds | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5 +$as_echo "$as_me: creating $ofile" >&6;} + + cat <<__EOF__ >> "$cfgfile" +#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + +# Check whether --with-tags was given. +if test "${with_tags+set}" = set; then : + withval=$with_tags; tagnames="$withval" +fi + + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: output file \`$ofile' does not exist" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: output file \`$ofile' does not look like a libtool script" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 +$as_echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + fi + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in + "") ;; + *) as_fn_error $? "invalid tag name: $tagname" "$LINENO" 5 + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + as_fn_error $? "tag name \"$tagname\" already exists" "$LINENO" 5 + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && test "X$CXX" != "Xno"; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_automatic_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +# Source file extension for C++ test sources. +ac_ext=cc + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +compiler_CXX=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +else + lt_prog_compiler_no_builtin_flag_CXX= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } +ld_shlibs_CXX=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_CXX=yes + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_CXX=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX=' ' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs_CXX=no + fi + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes; then + archive_cmds_need_lc_CXX=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_CXX='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_CXX='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_CXX='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag_CXX='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_CXX='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_CXX='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='-all_load $convenience' + link_all_deplibs_CXX=yes + else + ld_shlibs_CXX=no + fi + ;; + + dgux*) + case $cc_basename in + ec++) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + freebsd12*) + # C++ shared libraries reported to be fairly broken before switch to ELF + ld_shlibs_CXX=no + ;; + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + gnu*) + ;; + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC) + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_CXX='+b $libdir' + hardcode_libdir_separator_CXX=: + ;; + ia64*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + *) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case "$host_cpu" in + hppa*64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + *) + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC) + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case "$host_cpu" in + ia64*|hppa*64*) + archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + irix5* | irix6*) + case $cc_basename in + CC) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + ;; + linux*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc) + # Intel C++ + with_gnu_ld=yes + archive_cmds_need_lc_CXX=no + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + cxx) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + mvs*) + case $cc_basename in + cxx) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + osf3*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' + ;; + RCC) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ + $rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + sco*) + archive_cmds_need_lc_CXX=no + case $cc_basename in + CC) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.0-5 | solaris2.0-5.*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + archive_cmds_need_lc_CXX=no + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +GCC_CXX="$GXX" +LD_CXX="$LD" + + +cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. + output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" + + for p in `eval $output_verbose_link_cmd`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" \ + || test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$rm -f confest.$objext + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + +lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + icpc) + # Intel C++ + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + cxx) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + sco*) + case $cc_basename in + CC) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + *) + ;; + esac + ;; + solaris*) + case $cc_basename in + CC) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + unixware*) + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_prog_compiler_pic_CXX" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:11153: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:11157: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_CXX=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:11213: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:11217: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_CXX" >&5 +$as_echo "$archive_cmds_need_lc_CXX" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + libsuff= + if test "$lt_cv_cc_lib64_suffix" = "yes"; then + libsuff=64 + fi + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} $lt_ld_extra" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} /usr/local/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || \ + test -n "$runpath_var CXX" || \ + test "X$hardcode_automatic_CXX"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_cxx_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + ac_fn_cxx_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_CXX \ + CC_CXX \ + LD_CXX \ + lt_prog_compiler_wl_CXX \ + lt_prog_compiler_pic_CXX \ + lt_prog_compiler_static_CXX \ + lt_prog_compiler_no_builtin_flag_CXX \ + export_dynamic_flag_spec_CXX \ + thread_safe_flag_spec_CXX \ + whole_archive_flag_spec_CXX \ + enable_shared_with_static_runtimes_CXX \ + old_archive_cmds_CXX \ + old_archive_from_new_cmds_CXX \ + predep_objects_CXX \ + postdep_objects_CXX \ + predeps_CXX \ + postdeps_CXX \ + compiler_lib_search_path_CXX \ + archive_cmds_CXX \ + archive_expsym_cmds_CXX \ + postinstall_cmds_CXX \ + postuninstall_cmds_CXX \ + old_archive_from_expsyms_cmds_CXX \ + allow_undefined_flag_CXX \ + no_undefined_flag_CXX \ + export_symbols_cmds_CXX \ + hardcode_libdir_flag_spec_CXX \ + hardcode_libdir_flag_spec_ld_CXX \ + hardcode_libdir_separator_CXX \ + hardcode_automatic_CXX \ + module_cmds_CXX \ + module_expsym_cmds_CXX \ + lt_cv_prog_compiler_c_o_CXX \ + exclude_expsyms_CXX \ + include_expsyms_CXX; do + + case $var in + old_archive_cmds_CXX | \ + old_archive_from_new_cmds_CXX | \ + archive_cmds_CXX | \ + archive_expsym_cmds_CXX | \ + module_cmds_CXX | \ + module_expsym_cmds_CXX | \ + old_archive_from_expsyms_cmds_CXX | \ + export_symbols_cmds_CXX | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_CXX + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_CXX +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_CXX + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_CXX" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld + + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_flag_spec_ld_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code=" subroutine t\n return\n end\n" + +# Code to be used in simple link tests +lt_simple_link_test_code=" program t\n end\n" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +compiler_F77=$CC +cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix4* | aix5*) + test "$enable_shared" = yes && enable_static=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + +test "$ld_shlibs_F77" = no && can_build_shared=no + +GCC_F77="$G77" +LD_F77="$LD" + +lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic_F77='-Kpic' + lt_prog_compiler_static_F77='-dn' + ;; + + solaris*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_F77" >&5 +$as_echo "$lt_prog_compiler_pic_F77" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } +if ${lt_prog_compiler_pic_works_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:13187: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:13191: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_F77=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works_F77" >&5 +$as_echo "$lt_prog_compiler_pic_works_F77" >&6; } + +if test x"$lt_prog_compiler_pic_works_F77" = xyes; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_F77+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:13247: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:13251: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_F77= + enable_shared_with_static_runtimes_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + old_archive_From_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + thread_safe_flag_spec_F77= + hardcode_libdir_flag_spec_F77= + hardcode_libdir_flag_spec_ld_F77= + hardcode_libdir_separator_F77= + hardcode_direct_F77=no + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + link_all_deplibs_F77=unknown + hardcode_automatic_F77=no + module_cmds_F77= + module_expsym_cmds_F77= + always_export_symbols_F77=no + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_F77=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_F77=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds_F77="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds_F77="$tmp_archive_cmds" + fi + else + ld_shlibs_F77=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test "$ld_shlibs_F77" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_F77='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_F77=yes + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat > conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +if ac_fn_f77_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' ${wl}-bernotok' + allow_undefined_flag_F77=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_F77=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77=' ' + archive_cmds_need_lc_F77=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_F77=no + ;; + + bsdi4*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_F77=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + archive_cmds_need_lc_F77=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_F77='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_F77='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_F77='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag_F77='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_F77='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_F77='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_F77='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + whole_archive_flag_spec_F77='-all_load $convenience' + link_all_deplibs_F77=yes + else + ld_shlibs_F77=no + fi + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + freebsd1*) + ld_shlibs_F77=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_F77='+b $libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + ia64*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + *) + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + link_all_deplibs_F77=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + openbsd*) + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + hardcode_libdir_separator_F77=: + ;; + + sco3.2v5*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag_F77=' -z text' + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag_F77='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv5*) + no_undefined_flag_F77=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec_F77= + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_F77" >&5 +$as_echo "$ld_shlibs_F77" >&6; } +test "$ld_shlibs_F77" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + archive_cmds_need_lc_F77=no + else + archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_F77" >&5 +$as_echo "$archive_cmds_need_lc_F77" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + libsuff= + if test "$lt_cv_cc_lib64_suffix" = "yes"; then + libsuff=64 + fi + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} $lt_ld_extra" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} /usr/local/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || \ + test -n "$runpath_var F77" || \ + test "X$hardcode_automatic_F77"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_F77" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && + test "$hardcode_minus_L_F77" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_F77" >&5 +$as_echo "$hardcode_action_F77" >&6; } + +if test "$hardcode_action_F77" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_F77 \ + CC_F77 \ + LD_F77 \ + lt_prog_compiler_wl_F77 \ + lt_prog_compiler_pic_F77 \ + lt_prog_compiler_static_F77 \ + lt_prog_compiler_no_builtin_flag_F77 \ + export_dynamic_flag_spec_F77 \ + thread_safe_flag_spec_F77 \ + whole_archive_flag_spec_F77 \ + enable_shared_with_static_runtimes_F77 \ + old_archive_cmds_F77 \ + old_archive_from_new_cmds_F77 \ + predep_objects_F77 \ + postdep_objects_F77 \ + predeps_F77 \ + postdeps_F77 \ + compiler_lib_search_path_F77 \ + archive_cmds_F77 \ + archive_expsym_cmds_F77 \ + postinstall_cmds_F77 \ + postuninstall_cmds_F77 \ + old_archive_from_expsyms_cmds_F77 \ + allow_undefined_flag_F77 \ + no_undefined_flag_F77 \ + export_symbols_cmds_F77 \ + hardcode_libdir_flag_spec_F77 \ + hardcode_libdir_flag_spec_ld_F77 \ + hardcode_libdir_separator_F77 \ + hardcode_automatic_F77 \ + module_cmds_F77 \ + module_expsym_cmds_F77 \ + lt_cv_prog_compiler_c_o_F77 \ + exclude_expsyms_F77 \ + include_expsyms_F77; do + + case $var in + old_archive_cmds_F77 | \ + old_archive_from_new_cmds_F77 | \ + archive_cmds_F77 | \ + archive_expsym_cmds_F77 | \ + module_cmds_F77 | \ + module_expsym_cmds_F77 | \ + old_archive_from_expsyms_cmds_F77 | \ + export_symbols_cmds_F77 | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_F77 + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_F77 +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_F77 + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_F77 + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_F77 + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_F77" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +objext_GCJ=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +compiler_GCJ=$CC + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +archive_cmds_need_lc_GCJ=no + + +lt_prog_compiler_no_builtin_flag_GCJ= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15236: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:15240: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl_GCJ= +lt_prog_compiler_pic_GCJ= +lt_prog_compiler_static_GCJ= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_static_GCJ='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_GCJ='-fno-common' + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_GCJ=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_GCJ=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_GCJ='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + else + lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + linux*) + case $CC in + icc* | ecc*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-static' + ;; + ccc*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + sco3.2v5*) + lt_prog_compiler_pic_GCJ='-Kpic' + lt_prog_compiler_static_GCJ='-dn' + ;; + + solaris*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sunos4*) + lt_prog_compiler_wl_GCJ='-Qoption ld ' + lt_prog_compiler_pic_GCJ='-PIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_GCJ='-Kconform_pic' + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + uts4*) + lt_prog_compiler_pic_GCJ='-pic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_GCJ=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_GCJ" >&5 +$as_echo "$lt_prog_compiler_pic_GCJ" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_GCJ"; then + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... " >&6; } +if ${lt_prog_compiler_pic_works_GCJ+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_prog_compiler_pic_works_GCJ=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_GCJ" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15469: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:15473: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s conftest.err; then + lt_prog_compiler_pic_works_GCJ=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_works_GCJ" >&5 +$as_echo "$lt_prog_compiler_pic_works_GCJ" >&6; } + +if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then + case $lt_prog_compiler_pic_GCJ in + "" | " "*) ;; + *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; + esac +else + lt_prog_compiler_pic_GCJ= + lt_prog_compiler_can_build_shared_GCJ=no +fi + +fi +case "$host_os" in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_GCJ= + ;; + *) + lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_GCJ+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_GCJ=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15529: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:15533: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test ! -s out/conftest.err; then + lt_cv_prog_compiler_c_o_GCJ=yes + fi + fi + chmod u+w . + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_GCJ" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_GCJ= + enable_shared_with_static_runtimes_GCJ=no + archive_cmds_GCJ= + archive_expsym_cmds_GCJ= + old_archive_From_new_cmds_GCJ= + old_archive_from_expsyms_cmds_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + thread_safe_flag_spec_GCJ= + hardcode_libdir_flag_spec_GCJ= + hardcode_libdir_flag_spec_ld_GCJ= + hardcode_libdir_separator_GCJ= + hardcode_direct_GCJ=no + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=unsupported + link_all_deplibs_GCJ=unknown + hardcode_automatic_GCJ=no + module_cmds_GCJ= + module_expsym_cmds_GCJ= + always_export_symbols_GCJ=no + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_GCJ= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_GCJ=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_GCJ=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_GCJ=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_GCJ='-L$libdir' + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=no + enable_shared_with_static_runtimes_GCJ=yes + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + sunos4*) + archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_cmds_GCJ="$tmp_archive_cmds" + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ +cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ +$echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + else + archive_expsym_cmds_GCJ="$tmp_archive_cmds" + fi + else + ld_shlibs_GCJ=no + fi + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + + if test "$ld_shlibs_GCJ" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_GCJ= + fi + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=yes + archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_GCJ=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_GCJ=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_GCJ='' + hardcode_direct_GCJ=yes + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + + if test "$GCC" = yes; then + case $host_os in aix4.012|aix4.012.*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_GCJ=yes + else + # We have old collect2 + hardcode_direct_GCJ=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_GCJ=yes + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_libdir_separator_GCJ= + fi + esac + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_GCJ=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_GCJ='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_GCJ="-z nodefs" + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_GCJ=' ${wl}-bernotok' + allow_undefined_flag_GCJ=' ${wl}-berok' + # -bexpall does not export symbols beginning with underscore (_) + always_export_symbols_GCJ=yes + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_GCJ=' ' + archive_cmds_need_lc_GCJ=yes + # This is similar to how AIX traditionally builds it's shared libraries. + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_GCJ=no + ;; + + bsdi4*) + export_dynamic_flag_spec_GCJ=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_GCJ=' ' + allow_undefined_flag_GCJ=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_GCJ='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_GCJ=yes + ;; + + darwin* | rhapsody*) + if test "$GXX" = yes ; then + archive_cmds_need_lc_GCJ=no + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag_GCJ='-undefined suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_GCJ='-flat_namespace -undefined suppress' + ;; + 10.*) + allow_undefined_flag_GCJ='-undefined dynamic_lookup' + ;; + esac + fi + ;; + esac + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_GCJ='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_GCJ='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_GCJ='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + hardcode_direct_GCJ=no + hardcode_automatic_GCJ=yes + hardcode_shlibpath_var_GCJ=unsupported + whole_archive_flag_spec_GCJ='-all_load $convenience' + link_all_deplibs_GCJ=yes + else + ld_shlibs_GCJ=no + fi + ;; + + dgux*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + freebsd1*) + ld_shlibs_GCJ=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu) + archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + ;; + + hpux10* | hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case "$host_cpu" in + hppa*64*|ia64*) + archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' + ;; + *) + archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + ;; + ia64*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + *) + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + link_all_deplibs_GCJ=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + newsos6) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_shlibpath_var_GCJ=no + ;; + + openbsd*) + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + ;; + *) + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + allow_undefined_flag_GCJ=unsupported + archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_GCJ='-rpath $libdir' + fi + hardcode_libdir_separator_GCJ=: + ;; + + sco3.2v5*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='${wl}-Bexport' + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag_GCJ=' -z text' + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_shlibpath_var_GCJ=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs_GCJ=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_GCJ='$CC -r -o $output$reload_objs' + hardcode_direct_GCJ=no + ;; + motorola) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4.3*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_GCJ=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + no_undefined_flag_GCJ='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv5*) + no_undefined_flag_GCJ=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec_GCJ= + hardcode_shlibpath_var_GCJ=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + *) + ld_shlibs_GCJ=no + ;; + esac + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_GCJ" >&5 +$as_echo "$ld_shlibs_GCJ" >&6; } +test "$ld_shlibs_GCJ" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_GCJ" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_GCJ=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_GCJ in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_GCJ + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ + allow_undefined_flag_GCJ= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + archive_cmds_need_lc_GCJ=no + else + archive_cmds_need_lc_GCJ=yes + fi + allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_GCJ" >&5 +$as_echo "$archive_cmds_need_lc_GCJ" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.01* | freebsdelf3.01*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case "$host_cpu" in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + libsuff= + if test "$lt_cv_cc_lib64_suffix" = "yes"; then + libsuff=64 + fi + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} $lt_ld_extra" + sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/X11R6/lib${libsuff} /usr/local/lib${libsuff} $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=yes + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_GCJ= +if test -n "$hardcode_libdir_flag_spec_GCJ" || \ + test -n "$runpath_var GCJ" || \ + test "X$hardcode_automatic_GCJ"="Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_GCJ" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && + test "$hardcode_minus_L_GCJ" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_GCJ=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_GCJ=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_GCJ=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_GCJ" >&5 +$as_echo "$hardcode_action_GCJ" >&6; } + +if test "$hardcode_action_GCJ" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_GCJ \ + CC_GCJ \ + LD_GCJ \ + lt_prog_compiler_wl_GCJ \ + lt_prog_compiler_pic_GCJ \ + lt_prog_compiler_static_GCJ \ + lt_prog_compiler_no_builtin_flag_GCJ \ + export_dynamic_flag_spec_GCJ \ + thread_safe_flag_spec_GCJ \ + whole_archive_flag_spec_GCJ \ + enable_shared_with_static_runtimes_GCJ \ + old_archive_cmds_GCJ \ + old_archive_from_new_cmds_GCJ \ + predep_objects_GCJ \ + postdep_objects_GCJ \ + predeps_GCJ \ + postdeps_GCJ \ + compiler_lib_search_path_GCJ \ + archive_cmds_GCJ \ + archive_expsym_cmds_GCJ \ + postinstall_cmds_GCJ \ + postuninstall_cmds_GCJ \ + old_archive_from_expsyms_cmds_GCJ \ + allow_undefined_flag_GCJ \ + no_undefined_flag_GCJ \ + export_symbols_cmds_GCJ \ + hardcode_libdir_flag_spec_GCJ \ + hardcode_libdir_flag_spec_ld_GCJ \ + hardcode_libdir_separator_GCJ \ + hardcode_automatic_GCJ \ + module_cmds_GCJ \ + module_expsym_cmds_GCJ \ + lt_cv_prog_compiler_c_o_GCJ \ + exclude_expsyms_GCJ \ + include_expsyms_GCJ; do + + case $var in + old_archive_cmds_GCJ | \ + old_archive_from_new_cmds_GCJ | \ + archive_cmds_GCJ | \ + archive_expsym_cmds_GCJ | \ + module_cmds_GCJ | \ + module_expsym_cmds_GCJ | \ + old_archive_from_expsyms_cmds_GCJ | \ + export_symbols_cmds_GCJ | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_GCJ + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_GCJ + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_GCJ + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_GCJ + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_GCJ + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_GCJ +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_GCJ + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_GCJ +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_GCJ +archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_GCJ +module_expsym_cmds=$lt_module_expsym_cmds_GCJ + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_GCJ + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_GCJ + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_GCJ + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_GCJ + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_GCJ + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_GCJ + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_GCJ + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_GCJ + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_GCJ + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_GCJ" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_GCJ + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_GCJ + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_GCJ + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_GCJ + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + RC) + + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +objext_RC=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +compiler_RC=$CC +lt_cv_prog_compiler_c_o_RC=yes + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_RC \ + CC_RC \ + LD_RC \ + lt_prog_compiler_wl_RC \ + lt_prog_compiler_pic_RC \ + lt_prog_compiler_static_RC \ + lt_prog_compiler_no_builtin_flag_RC \ + export_dynamic_flag_spec_RC \ + thread_safe_flag_spec_RC \ + whole_archive_flag_spec_RC \ + enable_shared_with_static_runtimes_RC \ + old_archive_cmds_RC \ + old_archive_from_new_cmds_RC \ + predep_objects_RC \ + postdep_objects_RC \ + predeps_RC \ + postdeps_RC \ + compiler_lib_search_path_RC \ + archive_cmds_RC \ + archive_expsym_cmds_RC \ + postinstall_cmds_RC \ + postuninstall_cmds_RC \ + old_archive_from_expsyms_cmds_RC \ + allow_undefined_flag_RC \ + no_undefined_flag_RC \ + export_symbols_cmds_RC \ + hardcode_libdir_flag_spec_RC \ + hardcode_libdir_flag_spec_ld_RC \ + hardcode_libdir_separator_RC \ + hardcode_automatic_RC \ + module_cmds_RC \ + module_expsym_cmds_RC \ + lt_cv_prog_compiler_c_o_RC \ + exclude_expsyms_RC \ + include_expsyms_RC; do + + case $var in + old_archive_cmds_RC | \ + old_archive_from_new_cmds_RC | \ + archive_cmds_RC | \ + archive_expsym_cmds_RC | \ + module_cmds_RC | \ + module_expsym_cmds_RC | \ + old_archive_from_expsyms_cmds_RC | \ + export_symbols_cmds_RC | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_RC + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# A language-specific compiler. +CC=$lt_compiler_RC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_RC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_RC + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_RC + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_RC +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_RC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_RC +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_RC +archive_expsym_cmds=$lt_archive_expsym_cmds_RC +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_RC +module_expsym_cmds=$lt_module_expsym_cmds_RC + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_RC + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_RC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_RC + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_RC + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_RC + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_RC + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_RC + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_RC + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_RC + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_RC + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_RC + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_RC" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_RC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_RC + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_RC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_RC + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + ;; + + *) + as_fn_error $? "Unsupported tag name: $tagname" "$LINENO" 5 + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + as_fn_error $? "unable to update list of available tagged configurations." "$LINENO" 5 + fi +fi + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Prevent multiple expansion + + + + + + + + + + + + + + + + + + + + + +# Check whether --enable-swap-count was given. +if test "${enable_swap_count+set}" = set; then : + enableval=$enable_swap_count; +fi + +case $enable_swap_count in + yes) + +$as_echo "#define SWAPCOUNT 1" >>confdefs.h + + ;; +esac + +# Check whether --enable-cache-stats was given. +if test "${enable_cache_stats+set}" = set; then : + enableval=$enable_cache_stats; +fi + +case $enable_cache_stats in + yes) + +$as_echo "#define CACHESTATS 1" >>confdefs.h + + ;; +esac + + +ac_config_headers="$ac_config_headers config.h" + + +ac_config_files="$ac_config_files Makefile src/Makefile" + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by buddy $as_me 2.4, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +buddy config.status 2.4 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + "$ac_file" | "$ac_file":* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for "$ac_file"" >`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/sdk/buddy-2.4/configure.ac b/sdk/buddy-2.4/configure.ac new file mode 100644 index 0000000..edb4669 --- /dev/null +++ b/sdk/buddy-2.4/configure.ac @@ -0,0 +1,29 @@ +AC_PREREQ([2.57]) +AC_INIT([buddy], [2.4]) +AC_CONFIG_AUX_DIR([tools]) +AM_INIT_AUTOMAKE([foreign nostdinc no-define 1.7.3]) + +MAJOR_VERSION=`echo "$VERSION" | sed -e 's/^\([[0-9]]*\)\.[[0-9]]*.*$/\1/'` +MINOR_VERSION=`echo "$VERSION" | sed -e 's/^[[0-9]]*\.\([[0-9]]*\).*$/\1/'` +AC_DEFINE_UNQUOTED([MAJOR_VERSION], [$MAJOR_VERSION], [BuDDy's major version.]) +AC_DEFINE_UNQUOTED([MINOR_VERSION], [$MINOR_VERSION], [BuDDy's minor version.]) + +AC_PROG_CC + +dnl AM_PROG_LEX +dnl AC_PROG_YACC + +AC_PROG_CXX + +AC_PROG_LIBTOOL + +buddy_DEBUG_FLAGS + +AC_CONFIG_HEADERS([config.h]) + +AC_CONFIG_FILES([ + Makefile + src/Makefile +]) + +AC_OUTPUT diff --git a/sdk/buddy-2.4/include/bdd.h b/sdk/buddy-2.4/include/bdd.h new file mode 100644 index 0000000..6f55d7a --- /dev/null +++ b/sdk/buddy-2.4/include/bdd.h @@ -0,0 +1,838 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/bdd.h,v 1.1.1.1 2004/06/25 13:22:09 haimcohen Exp $ + FILE: bdd.h + DESCR: C,C++ User interface for the BDD package + AUTH: Jorn Lind + DATE: (C) feb 1997 +*************************************************************************/ + +#ifndef _BDD_H +#define _BDD_H + + /* Allow this headerfile to define C++ constructs if requested */ +#ifdef __cplusplus +#define CPLUSPLUS +#endif + +#include + +/*=== Defined operators for apply calls ================================*/ + +#define bddop_and 0 +#define bddop_xor 1 +#define bddop_or 2 +#define bddop_nand 3 +#define bddop_nor 4 +#define bddop_imp 5 +#define bddop_biimp 6 +#define bddop_diff 7 +#define bddop_less 8 +#define bddop_invimp 9 + + /* Should *not* be used in bdd_apply calls !!! */ +#define bddop_not 10 +#define bddop_simplify 11 + + +/*=== User BDD types ===================================================*/ + +typedef int BDD; + +#ifndef CPLUSPLUS +typedef BDD bdd; +#endif /* CPLUSPLUS */ + + +typedef struct s_bddPair +{ + BDD *result; + int last; + int id; + struct s_bddPair *next; +} bddPair; + + +/*=== Status information ===============================================*/ + +/* +NAME {* bddStat *} +SECTION {* kernel *} +SHORT {* Status information about the bdd package *} +PROTO {* typedef struct s_bddStat +{ + long int produced; + int nodenum; + int maxnodenum; + int freenodes; + int minfreenodes; + int varnum; + int cachesize; + int gbcnum; +} bddStat; *} +DESCR {* The fields are \\[\baselineskip] \begin{tabular}{lp{10cm}} + {\tt produced} & total number of new nodes ever produced \\ + {\tt nodenum} & currently allocated number of bdd nodes \\ + {\tt maxnodenum} & user defined maximum number of bdd nodes \\ + {\tt freenodes} & number of currently free nodes \\ + {\tt minfreenodes} & minimum number of nodes that should be left after a + garbage collection. \\ + {\tt varnum} & number of defined bdd variables \\ + {\tt cachesize} & number of entries in the internal caches \\ + {\tt gbcnum} & number of garbage collections done until now + \end{tabular} *} +ALSO {* bdd\_stats *} +*/ +typedef struct s_bddStat +{ + long int produced; + int nodenum; + int maxnodenum; + int freenodes; + int minfreenodes; + int varnum; + int cachesize; + int gbcnum; +} bddStat; + + +/* +NAME {* bddGbcStat *} +SECTION {* kernel *} +SHORT {* Status information about garbage collections *} +PROTO {* typedef struct s_bddGbcStat +{ + int nodes; + int freenodes; + long time; + long sumtime; + int num; +} bddGbcStat; *} +DESCR {* The fields are \\[\baselineskip] \begin{tabular}{ll} + {\tt nodes} & Total number of allocated nodes in the nodetable \\ + {\tt freenodes} & Number of free nodes in the nodetable \\ + {\tt time} & Time used for garbage collection this time \\ + {\tt sumtime} & Total time used for garbage collection \\ + {\tt num} & number of garbage collections done until now + \end{tabular} *} +ALSO {* bdd\_gbc\_hook *} +*/ +typedef struct s_bddGbcStat +{ + int nodes; + int freenodes; + long time; + long sumtime; + int num; +} bddGbcStat; + + +/* +NAME {* bddCacheStat *} +SECTION {* kernel *} +SHORT {* Status information about cache usage *} +PROTO {* typedef struct s_bddCacheStat +{ + long unsigned int uniqueAccess; + long unsigned int uniqueChain; + long unsigned int uniqueHit; + long unsigned int uniqueMiss; + long unsigned int opHit; + long unsigned int opMiss; + long unsigned int swapCount; +} bddCacheStat; *} +DESCR {* The fields are \\[\baselineskip] \begin{tabular}{ll} + {\bf Name} & {\bf Number of } \\ + uniqueAccess & accesses to the unique node table \\ + uniqueChain & iterations through the cache chains in the unique node table\\ + uniqueHit & entries actually found in the the unique node table \\ + uniqueMiss & entries not found in the the unique node table \\ + opHit & entries found in the operator caches \\ + opMiss & entries not found in the operator caches \\ + swapCount & number of variable swaps in reordering \\ +\end{tabular} *} +ALSO {* bdd\_cachestats *} +*/ +typedef struct s_bddCacheStat +{ + long unsigned int uniqueAccess; + long unsigned int uniqueChain; + long unsigned int uniqueHit; + long unsigned int uniqueMiss; + long unsigned int opHit; + long unsigned int opMiss; + long unsigned int swapCount; +} bddCacheStat; + +/*=== BDD interface prototypes =========================================*/ + +/* +NAME {* bdd\_relprod *} +SECTION {* operator *} +SHORT {* relational product *} +PROTO {* #define bdd_relprod(a,b,var) bdd_appex(a,b,bddop_and,var) *} +DESCR {* Calculates the relational product of {\tt a} and {\tt b} as + {\tt a AND b} with the variables in {\tt var} quantified out + afterwards. *} +RETURN {* The relational product or {\tt bddfalse} on errors. *} +ALSO {* bdd\_appex *} +*/ +#define bdd_relprod(a,b,var) bdd_appex((a),(b),bddop_and,(var)) + + + /* In file "kernel.c" */ + +#ifdef CPLUSPLUS +extern "C" { +#endif + +typedef void (*bddinthandler)(int); +typedef void (*bddgbchandler)(int,bddGbcStat*); +typedef void (*bdd2inthandler)(int,int); +typedef int (*bddsizehandler)(void); +typedef void (*bddfilehandler)(FILE *, int); +typedef void (*bddallsathandler)(char*, int); + +extern bddinthandler bdd_error_hook(bddinthandler); +extern bddgbchandler bdd_gbc_hook(bddgbchandler); +extern bdd2inthandler bdd_resize_hook(bdd2inthandler); +extern bddinthandler bdd_reorder_hook(bddinthandler); +extern bddfilehandler bdd_file_hook(bddfilehandler); + +extern int bdd_init(int, int); +extern void bdd_done(void); +extern int bdd_setvarnum(int); +extern int bdd_extvarnum(int); +extern int bdd_isrunning(void); +extern int bdd_setmaxnodenum(int); +extern int bdd_setmaxincrease(int); +extern int bdd_setminfreenodes(int); +extern int bdd_getnodenum(void); +extern int bdd_getallocnum(void); +extern char* bdd_versionstr(void); +extern int bdd_versionnum(void); +extern void bdd_stats(bddStat *); +extern void bdd_cachestats(bddCacheStat *); +extern void bdd_fprintstat(FILE *); +extern void bdd_printstat(void); +extern void bdd_default_gbchandler(int, bddGbcStat *); +extern void bdd_default_errhandler(int); +extern const char *bdd_errstring(int); +extern void bdd_clear_error(void); +#ifndef CPLUSPLUS +extern BDD bdd_true(void); +extern BDD bdd_false(void); +#endif +extern int bdd_varnum(void); +extern BDD bdd_ithvar(int); +extern BDD bdd_nithvar(int); +extern int bdd_var(BDD); +extern BDD bdd_low(BDD); +extern BDD bdd_high(BDD); +extern int bdd_varlevel(int); +extern BDD bdd_addref(BDD); +extern BDD bdd_delref(BDD); +extern void bdd_gbc(void); +extern int bdd_scanset(BDD, int**, int*); +extern BDD bdd_makeset(int *, int); +extern bddPair* bdd_newpair(void); +extern int bdd_setpair(bddPair*, int, int); +extern int bdd_setpairs(bddPair*, int*, int*, int); +extern int bdd_setbddpair(bddPair*, int, BDD); +extern int bdd_setbddpairs(bddPair*, int*, BDD*, int); +extern void bdd_resetpair(bddPair *); +extern void bdd_freepair(bddPair*); + + /* In bddop.c */ + +extern int bdd_setcacheratio(int); +extern BDD bdd_buildcube(int, int, BDD *); +extern BDD bdd_ibuildcube(int, int, int *); +extern BDD bdd_not(BDD); +extern BDD bdd_apply(BDD, BDD, int); +extern BDD bdd_and(BDD, BDD); +extern BDD bdd_or(BDD, BDD); +extern BDD bdd_xor(BDD, BDD); +extern BDD bdd_imp(BDD, BDD); +extern BDD bdd_biimp(BDD, BDD); +extern BDD bdd_ite(BDD, BDD, BDD); +extern BDD bdd_restrict(BDD, BDD); +extern BDD bdd_constrain(BDD, BDD); +extern BDD bdd_replace(BDD, bddPair*); +extern BDD bdd_compose(BDD, BDD, BDD); +extern BDD bdd_veccompose(BDD, bddPair*); +extern BDD bdd_simplify(BDD, BDD); +extern BDD bdd_exist(BDD, BDD); +extern BDD bdd_project(BDD, BDD); +extern BDD bdd_forall(BDD, BDD); +extern BDD bdd_unique(BDD, BDD); +extern BDD bdd_appex(BDD, BDD, int, BDD); +extern BDD bdd_appall(BDD, BDD, int, BDD); +extern BDD bdd_appuni(BDD, BDD, int, BDD); +extern BDD bdd_support(BDD); +extern BDD bdd_satone(BDD); +extern BDD bdd_satoneset(BDD, BDD, BDD); +extern BDD bdd_fullsatone(BDD); +extern void bdd_allsat(BDD r, bddallsathandler handler); +extern double bdd_satcount(BDD); +extern double bdd_satcountset(BDD, BDD); +extern double bdd_satcountln(BDD); +extern double bdd_satcountlnset(BDD, BDD); +extern int bdd_nodecount(BDD); +extern int bdd_anodecount(BDD *, int); +extern int* bdd_varprofile(BDD); +extern double bdd_pathcount(BDD); + + +/* In file "bddio.c" */ + +extern void bdd_printall(void); +extern void bdd_fprintall(FILE *); +extern void bdd_fprinttable(FILE *, BDD); +extern void bdd_printtable(BDD); +extern void bdd_fprintset(FILE *, BDD); +extern void bdd_printset(BDD); +extern int bdd_fnprintdot(char *, BDD); +extern void bdd_fprintdot(FILE *, BDD); +extern void bdd_printdot(BDD); +extern int bdd_fnsave(char *, BDD); +extern int bdd_save(FILE *, BDD); +extern int bdd_fnload(char *, BDD *); +extern int bdd_load(FILE *ifile, BDD *); + +/* In file reorder.c */ + +extern int bdd_swapvar(int v1, int v2); +extern void bdd_default_reohandler(int); +extern void bdd_reorder(int); +extern int bdd_reorder_gain(void); +extern bddsizehandler bdd_reorder_probe(bddsizehandler); +extern void bdd_clrvarblocks(void); +extern int bdd_addvarblock(BDD, int); +extern int bdd_intaddvarblock(int, int, int); +extern void bdd_varblockall(void); +extern bddfilehandler bdd_blockfile_hook(bddfilehandler); +extern int bdd_autoreorder(int); +extern int bdd_autoreorder_times(int, int); +extern int bdd_var2level(int); +extern int bdd_level2var(int); +extern int bdd_getreorder_times(void); +extern int bdd_getreorder_method(void); +extern void bdd_enable_reorder(void); +extern void bdd_disable_reorder(void); +extern int bdd_reorder_verbose(int); +extern void bdd_setvarorder(int *); +extern void bdd_printorder(void); +extern void bdd_fprintorder(FILE *); + +#ifdef CPLUSPLUS +} +#endif + + +/*=== BDD constants ====================================================*/ + +#ifndef CPLUSPLUS + +extern const BDD bddfalse; +extern const BDD bddtrue; + +#endif /* CPLUSPLUS */ + + +/*=== Reordering algorithms ============================================*/ + +#define BDD_REORDER_NONE 0 +#define BDD_REORDER_WIN2 1 +#define BDD_REORDER_WIN2ITE 2 +#define BDD_REORDER_SIFT 3 +#define BDD_REORDER_SIFTITE 4 +#define BDD_REORDER_WIN3 5 +#define BDD_REORDER_WIN3ITE 6 +#define BDD_REORDER_RANDOM 7 + +#define BDD_REORDER_FREE 0 +#define BDD_REORDER_FIXED 1 + + +/*=== Error codes ======================================================*/ + +#define BDD_MEMORY (-1) /* Out of memory */ +#define BDD_VAR (-2) /* Unknown variable */ +#define BDD_RANGE (-3) /* Variable value out of range (not in domain) */ +#define BDD_DEREF (-4) /* Removing external reference to unknown node */ +#define BDD_RUNNING (-5) /* Called bdd_init() twice whithout bdd_done() */ +#define BDD_FILE (-6) /* Some file operation failed */ +#define BDD_FORMAT (-7) /* Incorrect file format */ +#define BDD_ORDER (-8) /* Vars. not in order for vector based functions */ +#define BDD_BREAK (-9) /* User called break */ +#define BDD_VARNUM (-10) /* Different number of vars. for vector pair */ +#define BDD_NODES (-11) /* Tried to set max. number of nodes to be fewer */ + /* than there already has been allocated */ +#define BDD_OP (-12) /* Unknown operator */ +#define BDD_VARSET (-13) /* Illegal variable set */ +#define BDD_VARBLK (-14) /* Bad variable block operation */ +#define BDD_DECVNUM (-15) /* Trying to decrease the number of variables */ +#define BDD_REPLACE (-16) /* Replacing to already existing variables */ +#define BDD_NODENUM (-17) /* Number of nodes reached user defined maximum */ +#define BDD_ILLBDD (-18) /* Illegal bdd argument */ +#define BDD_SIZE (-19) /* Illegal size argument */ + +#define BVEC_SIZE (-20) /* Mismatch in bitvector size */ +#define BVEC_SHIFT (-21) /* Illegal shift-left/right parameter */ +#define BVEC_DIVZERO (-22) /* Division by zero */ + +#define BDD_ERRNUM 24 + +/************************************************************************* + If this file is included from a C++ compiler then the following + classes, wrappers and hacks are supplied. +*************************************************************************/ +#ifdef CPLUSPLUS +#include + +/*=== User BDD class ===================================================*/ + +class bvec; + +class bdd +{ + public: + + bdd(void) { root=0; } + bdd(const bdd &r) { bdd_addref(root=r.root); } + ~bdd(void) { bdd_delref(root); } + + int id(void) const; + + bdd operator=(const bdd &r); + + bdd operator&(const bdd &r) const; + bdd operator&=(const bdd &r); + bdd operator^(const bdd &r) const; + bdd operator^=(const bdd &r); + bdd operator|(const bdd &r) const; + bdd operator|=(const bdd &r); + bdd operator!(void) const; + bdd operator>>(const bdd &r) const; + bdd operator>>=(const bdd &r); + bdd operator-(const bdd &r) const; + bdd operator-=(const bdd &r); + bdd operator>(const bdd &r) const; + bdd operator<(const bdd &r) const; + bdd operator<<(const bdd &r) const; + bdd operator<<=(const bdd &r); + int operator==(const bdd &r) const; + int operator!=(const bdd &r) const; + +private: + BDD root; + + bdd(BDD r) { bdd_addref(root=r); } + bdd operator=(BDD r); + + friend int bdd_init(int, int); + friend int bdd_setvarnum(int); + friend bdd bdd_true(void); + friend bdd bdd_false(void); + friend bdd bdd_ithvarpp(int); + friend bdd bdd_nithvarpp(int); + friend int bdd_var(const bdd &); + friend bdd bdd_low(const bdd &); + friend bdd bdd_high(const bdd &); + friend int bdd_scanset(const bdd &, int *&, int &); + friend bdd bdd_makesetpp(int *, int); + friend int bdd_setbddpair(bddPair*, int, const bdd &); + friend int bdd_setbddpairs(bddPair*, int*, const bdd *, int); + friend bdd bdd_buildcube(int, int, const bdd *); + friend bdd bdd_ibuildcubepp(int, int, int *); + friend bdd bdd_not(const bdd &); + friend bdd bdd_simplify(const bdd &, const bdd &); + friend bdd bdd_apply(const bdd &, const bdd &, int); + friend bdd bdd_and(const bdd &, const bdd &); + friend bdd bdd_or(const bdd &, const bdd &); + friend bdd bdd_xor(const bdd &, const bdd &); + friend bdd bdd_imp(const bdd &, const bdd &); + friend bdd bdd_biimp(const bdd &, const bdd &); + friend bdd bdd_ite(const bdd &, const bdd &, const bdd &); + friend bdd bdd_restrict(const bdd &, const bdd &); + friend bdd bdd_constrain(const bdd &, const bdd &); + friend bdd bdd_exist(const bdd &, const bdd &); + friend bdd bdd_project(const bdd &, const bdd &); + friend bdd bdd_forall(const bdd &, const bdd &); + friend bdd bdd_unique(const bdd &, const bdd &); + friend bdd bdd_appex(const bdd &, const bdd &, int, const bdd &); + friend bdd bdd_appall(const bdd &, const bdd &, int, const bdd &); + friend bdd bdd_appuni(const bdd &, const bdd &, int, const bdd &); + friend bdd bdd_replace(const bdd &, bddPair*); + friend bdd bdd_compose(const bdd &, const bdd &, int); + friend bdd bdd_veccompose(const bdd &, bddPair*); + friend bdd bdd_support(const bdd &); + friend bdd bdd_satone(const bdd &); + friend bdd bdd_satoneset(const bdd &, const bdd &, const bdd &); + friend bdd bdd_fullsatone(const bdd &); + friend void bdd_allsat(const bdd &r, bddallsathandler handler); + friend double bdd_satcount(const bdd &); + friend double bdd_satcountset(const bdd &, const bdd &); + friend double bdd_satcountln(const bdd &); + friend double bdd_satcountlnset(const bdd &, const bdd &); + friend int bdd_nodecount(const bdd &); + friend int bdd_anodecountpp(const bdd *, int); + friend int* bdd_varprofile(const bdd &); + friend double bdd_pathcount(const bdd &); + + friend void bdd_fprinttable(FILE *, const bdd &); + friend void bdd_printtable(const bdd &); + friend void bdd_fprintset(FILE *, const bdd &); + friend void bdd_printset(const bdd &); + friend void bdd_printdot(const bdd &); + friend int bdd_fnprintdot(char*, const bdd &); + friend void bdd_fprintdot(FILE*, const bdd &); + friend std::ostream &operator<<(std::ostream &, const bdd &); + friend int bdd_fnsave(char*, const bdd &); + friend int bdd_save(FILE*, const bdd &); + friend int bdd_fnload(char*, bdd &); + friend int bdd_load(FILE*, bdd &); + + friend bdd fdd_ithvarpp(int, int); + friend bdd fdd_ithsetpp(int); + friend bdd fdd_domainpp(int); + friend int fdd_scanvar(const bdd &, int); + friend int* fdd_scanallvar(const bdd &); + friend bdd fdd_equalspp(int, int); + friend void fdd_printset(const bdd &); + friend void fdd_fprintset(FILE*, const bdd &); + friend bdd fdd_makesetpp(int*, int); + friend int fdd_scanset(const bdd &, int *&, int &); + + friend int bdd_addvarblock(const bdd &, int); + + friend class bvec; + friend bvec bvec_ite(const bdd& a, const bvec& b, const bvec& c); + friend bvec bvec_shlfixed(const bvec &e, int pos, const bdd &c); + friend bvec bvec_shl(const bvec &left, const bvec &right, const bdd &c); + friend bvec bvec_shrfixed(const bvec &e, int pos, const bdd &c); + friend bvec bvec_shr(const bvec &left, const bvec &right, const bdd &c); + friend bdd bvec_lth(const bvec &left, const bvec &right); + friend bdd bvec_lte(const bvec &left, const bvec &right); + friend bdd bvec_gth(const bvec &left, const bvec &right); + friend bdd bvec_gte(const bvec &left, const bvec &right); + friend bdd bvec_equ(const bvec &left, const bvec &right); + friend bdd bvec_neq(const bvec &left, const bvec &right); +}; + + +/*=== BDD constants ====================================================*/ + +extern const bdd bddfalsepp; +extern const bdd bddtruepp; + +#define bddtrue bddtruepp +#define bddfalse bddfalsepp + +/*=== C++ interface ====================================================*/ + +extern int bdd_cpp_init(int, int); + +inline void bdd_stats(bddStat& s) +{ bdd_stats(&s); } + +inline bdd bdd_ithvarpp(int v) +{ return bdd_ithvar(v); } + +inline bdd bdd_nithvarpp(int v) +{ return bdd_nithvar(v); } + +inline int bdd_var(const bdd &r) +{ return bdd_var(r.root); } + +inline bdd bdd_low(const bdd &r) +{ return bdd_low(r.root); } + +inline bdd bdd_high(const bdd &r) +{ return bdd_high(r.root); } + +inline int bdd_scanset(const bdd &r, int *&v, int &n) +{ return bdd_scanset(r.root, &v, &n); } + +inline bdd bdd_makesetpp(int *v, int n) +{ return bdd(bdd_makeset(v,n)); } + +inline int bdd_setbddpair(bddPair *p, int ov, const bdd &nv) +{ return bdd_setbddpair(p,ov,nv.root); } + + /* In bddop.c */ + +inline bdd bdd_replace(const bdd &r, bddPair *p) +{ return bdd_replace(r.root, p); } + +inline bdd bdd_compose(const bdd &f, const bdd &g, int v) +{ return bdd_compose(f.root, g.root, v); } + +inline bdd bdd_veccompose(const bdd &f, bddPair *p) +{ return bdd_veccompose(f.root, p); } + +inline bdd bdd_restrict(const bdd &r, const bdd &var) +{ return bdd_restrict(r.root, var.root); } + +inline bdd bdd_constrain(const bdd &f, const bdd &c) +{ return bdd_constrain(f.root, c.root); } + +inline bdd bdd_simplify(const bdd &d, const bdd &b) +{ return bdd_simplify(d.root, b.root); } + +inline bdd bdd_ibuildcubepp(int v, int w, int *a) +{ return bdd_ibuildcube(v,w,a); } + +inline bdd bdd_not(const bdd &r) +{ return bdd_not(r.root); } + +inline bdd bdd_apply(const bdd &l, const bdd &r, int op) +{ return bdd_apply(l.root, r.root, op); } + +inline bdd bdd_and(const bdd &l, const bdd &r) +{ return bdd_apply(l.root, r.root, bddop_and); } + +inline bdd bdd_or(const bdd &l, const bdd &r) +{ return bdd_apply(l.root, r.root, bddop_or); } + +inline bdd bdd_xor(const bdd &l, const bdd &r) +{ return bdd_apply(l.root, r.root, bddop_xor); } + +inline bdd bdd_imp(const bdd &l, const bdd &r) +{ return bdd_apply(l.root, r.root, bddop_imp); } + +inline bdd bdd_biimp(const bdd &l, const bdd &r) +{ return bdd_apply(l.root, r.root, bddop_biimp); } + +inline bdd bdd_ite(const bdd &f, const bdd &g, const bdd &h) +{ return bdd_ite(f.root, g.root, h.root); } + +inline bdd bdd_exist(const bdd &r, const bdd &var) +{ return bdd_exist(r.root, var.root); } + +inline bdd bdd_project(const bdd &r, const bdd &var) +{ return bdd_project(r.root, var.root); } + +inline bdd bdd_forall(const bdd &r, const bdd &var) +{ return bdd_forall(r.root, var.root); } + +inline bdd bdd_unique(const bdd &r, const bdd &var) +{ return bdd_unique(r.root, var.root); } + +inline bdd bdd_appex(const bdd &l, const bdd &r, int op, const bdd &var) +{ return bdd_appex(l.root, r.root, op, var.root); } + +inline bdd bdd_appall(const bdd &l, const bdd &r, int op, const bdd &var) +{ return bdd_appall(l.root, r.root, op, var.root); } + +inline bdd bdd_appuni(const bdd &l, const bdd &r, int op, const bdd &var) +{ return bdd_appuni(l.root, r.root, op, var.root); } + +inline bdd bdd_support(const bdd &r) +{ return bdd_support(r.root); } + +inline bdd bdd_satone(const bdd &r) +{ return bdd_satone(r.root); } + +inline bdd bdd_satoneset(const bdd &r, const bdd &var, const bdd &pol) +{ return bdd_satoneset(r.root, var.root, pol.root); } + +inline bdd bdd_fullsatone(const bdd &r) +{ return bdd_fullsatone(r.root); } + +inline void bdd_allsat(const bdd &r, bddallsathandler handler) +{ bdd_allsat(r.root, handler); } + +inline double bdd_satcount(const bdd &r) +{ return bdd_satcount(r.root); } + +inline double bdd_satcountset(const bdd &r, const bdd &varset) +{ return bdd_satcountset(r.root, varset.root); } + +inline double bdd_satcountln(const bdd &r) +{ return bdd_satcountln(r.root); } + +inline double bdd_satcountlnset(const bdd &r, const bdd &varset) +{ return bdd_satcountlnset(r.root, varset.root); } + +inline int bdd_nodecount(const bdd &r) +{ return bdd_nodecount(r.root); } + +inline int* bdd_varprofile(const bdd &r) +{ return bdd_varprofile(r.root); } + +inline double bdd_pathcount(const bdd &r) +{ return bdd_pathcount(r.root); } + + + /* I/O extensions */ + +inline void bdd_fprinttable(FILE *file, const bdd &r) +{ bdd_fprinttable(file, r.root); } + +inline void bdd_printtable(const bdd &r) +{ bdd_printtable(r.root); } + +inline void bdd_fprintset(FILE *file, const bdd &r) +{ bdd_fprintset(file, r.root); } + +inline void bdd_printset(const bdd &r) +{ bdd_printset(r.root); } + +inline void bdd_printdot(const bdd &r) +{ bdd_printdot(r.root); } + +inline void bdd_fprintdot(FILE* ofile, const bdd &r) +{ bdd_fprintdot(ofile, r.root); } + +inline int bdd_fnprintdot(char* fname, const bdd &r) +{ return bdd_fnprintdot(fname, r.root); } + +inline int bdd_fnsave(char *fname, const bdd &r) +{ return bdd_fnsave(fname, r.root); } + +inline int bdd_save(FILE *ofile, const bdd &r) +{ return bdd_save(ofile, r.root); } + +inline int bdd_fnload(char *fname, bdd &r) +{ int lr,e; e=bdd_fnload(fname, &lr); r=bdd(lr); return e; } + +inline int bdd_load(FILE *ifile, bdd &r) +{ int lr,e; e=bdd_load(ifile, &lr); r=bdd(lr); return e; } + +inline int bdd_addvarblock(const bdd &v, int f) +{ return bdd_addvarblock(v.root, f); } + + /* Hack to allow for overloading */ +#define bdd_init bdd_cpp_init +#define bdd_ithvar bdd_ithvarpp +#define bdd_nithvar bdd_nithvarpp +#define bdd_makeset bdd_makesetpp +#define bdd_ibuildcube bdd_ibuildcubepp +#define bdd_anodecount bdd_anodecountpp + +/*=== Inline C++ functions =============================================*/ + +inline int bdd::id(void) const +{ return root; } + +inline bdd bdd::operator&(const bdd &r) const +{ return bdd_apply(*this,r,bddop_and); } + +inline bdd bdd::operator&=(const bdd &r) +{ return (*this=bdd_apply(*this,r,bddop_and)); } + +inline bdd bdd::operator^(const bdd &r) const +{ return bdd_apply(*this,r,bddop_xor); } + +inline bdd bdd::operator^=(const bdd &r) +{ return (*this=bdd_apply(*this,r,bddop_xor)); } + +inline bdd bdd::operator|(const bdd &r) const +{ return bdd_apply(*this,r,bddop_or); } + +inline bdd bdd::operator|=(const bdd &r) +{ return (*this=bdd_apply(*this,r,bddop_or)); } + +inline bdd bdd::operator!(void) const +{ return bdd_not(*this);} + +inline bdd bdd::operator>>(const bdd &r) const +{ return bdd_apply(*this,r,bddop_imp); } + +inline bdd bdd::operator>>=(const bdd &r) +{ return (*this=bdd_apply(*this,r,bddop_imp)); } + +inline bdd bdd::operator-(const bdd &r) const +{ return bdd_apply(*this,r,bddop_diff); } + +inline bdd bdd::operator-=(const bdd &r) +{ return (*this=bdd_apply(*this,r,bddop_diff)); } + +inline bdd bdd::operator>(const bdd &r) const +{ return bdd_apply(*this,r,bddop_diff); } + +inline bdd bdd::operator<(const bdd &r) const +{ return bdd_apply(*this,r,bddop_less); } + +inline bdd bdd::operator<<(const bdd &r) const +{ return bdd_apply(*this,r,bddop_invimp); } + +inline bdd bdd::operator<<=(const bdd &r) +{ return (*this=bdd_apply(*this,r,bddop_invimp)); } + +inline int bdd::operator==(const bdd &r) const +{ return r.root==root; } + +inline int bdd::operator!=(const bdd &r) const +{ return r.root!=root; } + +inline bdd bdd_true(void) +{ return 1; } + +inline bdd bdd_false(void) +{ return 0; } + + +/*=== Iostream printing ================================================*/ + +class bdd_ioformat +{ + public: + bdd_ioformat(int f) { format=f; } + private: + bdd_ioformat(void) { } + int format; + static int curformat; + + friend std::ostream &operator<<(std::ostream &, const bdd_ioformat &); + friend std::ostream &operator<<(std::ostream &, const bdd &); +}; + +std::ostream &operator<<(std::ostream &, const bdd &); +std::ostream &operator<<(std::ostream &, const bdd_ioformat &); + +extern bdd_ioformat bddset; +extern bdd_ioformat bddtable; +extern bdd_ioformat bdddot; +extern bdd_ioformat bddall; +extern bdd_ioformat fddset; + +typedef void (*bddstrmhandler)(std::ostream &, int); + +extern bddstrmhandler bdd_strm_hook(bddstrmhandler); + +#endif /* CPLUSPLUS */ + +#endif /* _BDD_H */ + +/* EOF */ diff --git a/sdk/buddy-2.4/include/bvec.h b/sdk/buddy-2.4/include/bvec.h new file mode 100644 index 0000000..326a2b2 --- /dev/null +++ b/sdk/buddy-2.4/include/bvec.h @@ -0,0 +1,297 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/bvec.h,v 1.1.1.1 2004/06/25 13:22:34 haimcohen Exp $ + FILE: bvec.h + DESCR: Boolean (BDD) vector handling + AUTH: Jorn Lind + DATE: (C) may 1999 +*************************************************************************/ + +#ifndef _BVEC_H +#define _BVEC_H + +#include "fdd.h" + + /* Boolean (BDD) vector */ +/* +NAME {* bvec *} +SECTION {* bvec *} +SHORT {* A boolean vector *} +PROTO {* typedef struct s_bvec +{ + int bitnum; + BDD *bitvec; +} BVEC; + +typedef BVEC bvec; *} +DESCR {* This data structure is used to store boolean vectors. The field + {\tt bitnum} is the number of elements in the vector and the + field {\tt bitvec} contains the actual BDDs in the vector. + The C++ version of {\tt bvec} is documented at the beginning of + this document *} +*/ +typedef struct s_bvec +{ + int bitnum; + BDD *bitvec; +} BVEC; + +#ifndef CPLUSPLUS +typedef BVEC bvec; +#endif + + +#ifdef CPLUSPLUS +extern "C" { +#endif + + /* Prototypes for bvec.c */ +extern BVEC bvec_copy(BVEC v); +extern BVEC bvec_true(int bitnum); +extern BVEC bvec_false(int bitnum); +extern BVEC bvec_con(int bitnum, int val); +extern BVEC bvec_var(int bitnum, int offset, int step); +extern BVEC bvec_varfdd(int var); +extern BVEC bvec_varvec(int bitnum, int *var); +extern BVEC bvec_coerce(int bitnum, BVEC v); +extern int bvec_isconst(BVEC e); +extern int bvec_val(BVEC e); +extern void bvec_free(BVEC v); +extern BVEC bvec_addref(BVEC v); +extern BVEC bvec_delref(BVEC v); +extern BVEC bvec_map1(BVEC a, BDD (*fun)(BDD)); +extern BVEC bvec_map2(BVEC a, BVEC b, BDD (*fun)(BDD,BDD)); +extern BVEC bvec_map3(BVEC a, BVEC b, BVEC c, BDD (*fun)(BDD,BDD,BDD)); +extern BVEC bvec_add(BVEC left, BVEC right); +extern BVEC bvec_sub(BVEC left, BVEC right); +extern BVEC bvec_mulfixed(BVEC e, int c); +extern BVEC bvec_mul(BVEC left, BVEC right); +extern int bvec_divfixed(BVEC e, int c, BVEC *res, BVEC *rem); +extern int bvec_div(BVEC left, BVEC right, BVEC *res, BVEC *rem); +extern BVEC bvec_ite(BDD a, BVEC b, BVEC c); +extern BVEC bvec_shlfixed(BVEC e, int pos, BDD c); +extern BVEC bvec_shl(BVEC l, BVEC r, BDD c); +extern BVEC bvec_shrfixed(BVEC e, int pos, BDD c); +extern BVEC bvec_shr(BVEC l, BVEC r, BDD c); +extern BDD bvec_lth(BVEC left, BVEC right); +extern BDD bvec_lte(BVEC left, BVEC right); +extern BDD bvec_gth(BVEC left, BVEC right); +extern BDD bvec_gte(BVEC left, BVEC right); +extern BDD bvec_equ(BVEC left, BVEC right); +extern BDD bvec_neq(BVEC left, BVEC right); + +#ifdef CPLUSPLUS +} +#endif + + +/************************************************************************* + If this file is included from a C++ compiler then the following + classes, wrappers and hacks are supplied. +*************************************************************************/ +#ifdef CPLUSPLUS + +/*=== User BVEC class ==================================================*/ + +class bvec +{ + public: + + bvec(void) { roots.bitvec=NULL; roots.bitnum=0; } + bvec(int bitnum) { roots=bvec_false(bitnum); } + bvec(int bitnum, int val) { roots=bvec_con(bitnum,val); } + bvec(const bvec &v) { roots=bvec_copy(v.roots); } + ~bvec(void) { bvec_free(roots); } + + void set(int i, const bdd &b); + bdd operator[](int i) const { return roots.bitvec[i]; } + int bitnum(void) const { return roots.bitnum; } + int empty(void) const { return roots.bitnum==0; } + bvec operator=(const bvec &src); + +private: + BVEC roots; + + bvec(const BVEC &v) { roots=v; } /* NOTE: Must be a shallow copy! */ + + friend bvec bvec_truepp(int bitnum); + friend bvec bvec_falsepp(int bitnum); + friend bvec bvec_conpp(int bitnum, int val); + friend bvec bvec_varpp(int bitnum, int offset, int step); + friend bvec bvec_varfddpp(int var); + friend bvec bvec_varvecpp(int bitnum, int *var); + friend bvec bvec_coerce(int bitnum, const bvec &v); + friend int bvec_isconst(const bvec &e); + friend int bvec_val(const bvec &e); + friend bvec bvec_copy(const bvec &v); + friend bvec bvec_map1(const bvec &a, + bdd (*fun)(const bdd &)); + friend bvec bvec_map2(const bvec &a, const bvec &b, + bdd (*fun)(const bdd &, const bdd &)); + friend bvec bvec_map3(const bvec &a, const bvec &b, const bvec &c, + bdd (*fun)(const bdd &, const bdd &, const bdd &)); + friend bvec bvec_add(const bvec &left, const bvec &right); + friend bvec bvec_sub(const bvec &left, const bvec &right); + friend bvec bvec_mulfixed(const bvec &e, int c); + friend bvec bvec_mul(const bvec &left, const bvec &right); + friend int bvec_divfixed(const bvec &e, int c, bvec &res, bvec &rem); + friend int bvec_div(const bvec &l, const bvec &r, bvec &res, bvec &rem); + friend bvec bvec_ite(const bdd& a, const bvec& b, const bvec& c); + friend bvec bvec_shlfixed(const bvec &e, int pos, const bdd &c); + friend bvec bvec_shl(const bvec &left, const bvec &right, const bdd &c); + friend bvec bvec_shrfixed(const bvec &e, int pos, const bdd &c); + friend bvec bvec_shr(const bvec &left, const bvec &right, const bdd &c); + friend bdd bvec_lth(const bvec &left, const bvec &right); + friend bdd bvec_lte(const bvec &left, const bvec &right); + friend bdd bvec_gth(const bvec &left, const bvec &right); + friend bdd bvec_gte(const bvec &left, const bvec &right); + friend bdd bvec_equ(const bvec &left, const bvec &right); + friend bdd bvec_neq(const bvec &left, const bvec &right); + +public: + bvec operator&(const bvec &a) const { return bvec_map2(*this, a, bdd_and); } + bvec operator^(const bvec &a) const { return bvec_map2(*this, a, bdd_xor); } + bvec operator|(const bvec &a) const { return bvec_map2(*this, a, bdd_or); } + bvec operator!(void) const { return bvec_map1(*this, bdd_not); } + bvec operator<<(int a) const { return bvec_shlfixed(*this,a,bddfalse); } + bvec operator<<(const bvec &a) const { return bvec_shl(*this,a,bddfalse); } + bvec operator>>(int a) const { return bvec_shrfixed(*this,a,bddfalse); } + bvec operator>>(const bvec &a) const { return bvec_shr(*this,a,bddfalse); } + bvec operator+(const bvec &a) const { return bvec_add(*this, a); } + bvec operator-(const bvec &a) const { return bvec_sub(*this, a); } + bvec operator*(int a) const { return bvec_mulfixed(*this, a); } + bvec operator*(const bvec a) const { return bvec_mul(*this, a); } + bdd operator<(const bvec &a) const { return bvec_lth(*this, a); } + bdd operator<=(const bvec &a) const { return bvec_lte(*this, a); } + bdd operator>(const bvec &a) const { return bvec_gth(*this, a); } + bdd operator>=(const bvec &a) const { return bvec_gte(*this, a); } + bdd operator==(const bvec &a) const { return bvec_equ(*this, a); } + bdd operator!=(const bvec &a) const { return bvec_neq(*this, a); } +}; + +std::ostream &operator<<(std::ostream &, const bvec &); + +inline bvec bvec_truepp(int bitnum) +{ return bvec_true(bitnum); } + +inline bvec bvec_falsepp(int bitnum) +{ return bvec_false(bitnum); } + +inline bvec bvec_conpp(int bitnum, int val) +{ return bvec_con(bitnum, val); } + +inline bvec bvec_varpp(int bitnum, int offset, int step) +{ return bvec_var(bitnum, offset, step); } + +inline bvec bvec_varfddpp(int var) +{ return bvec_varfdd(var); } + +inline bvec bvec_varvecpp(int bitnum, int *var) +{ return bvec_varvec(bitnum, var); } + +inline bvec bvec_coerce(int bitnum, const bvec &v) +{ return bvec_coerce(bitnum, v.roots); } + +inline int bvec_isconst(const bvec &e) +{ return bvec_isconst(e.roots); } + +inline int bvec_val(const bvec &e) +{ return bvec_val(e.roots); } + +inline bvec bvec_copy(const bvec &v) +{ return bvec_copy(v.roots); } + +inline bvec bvec_add(const bvec &left, const bvec &right) +{ return bvec_add(left.roots, right.roots); } + +inline bvec bvec_sub(const bvec &left, const bvec &right) +{ return bvec_sub(left.roots, right.roots); } + +inline bvec bvec_mulfixed(const bvec &e, int c) +{ return bvec_mulfixed(e.roots, c); } + +inline bvec bvec_mul(const bvec &left, const bvec &right) +{ return bvec_mul(left.roots, right.roots); } + +inline int bvec_divfixed(const bvec &e, int c, bvec &res, bvec &rem) +{ return bvec_divfixed(e.roots, c, &res.roots, &rem.roots); } + +inline int bvec_div(const bvec &l, const bvec &r, bvec &res, bvec &rem) +{ return bvec_div(l.roots, r.roots, &res.roots, &rem.roots); } + +inline bvec bvec_ite(const bdd& a, const bvec& b, const bvec& c) +{ return bvec_ite(a.root, b.roots, c.roots); } + +inline bvec bvec_shlfixed(const bvec &e, int pos, const bdd &c) +{ return bvec_shlfixed(e.roots, pos, c.root); } + +inline bvec bvec_shl(const bvec &left, const bvec &right, const bdd &c) +{ return bvec_shl(left.roots, right.roots, c.root); } + +inline bvec bvec_shrfixed(const bvec &e, int pos, const bdd &c) +{ return bvec_shrfixed(e.roots, pos, c.root); } + +inline bvec bvec_shr(const bvec &left, const bvec &right, const bdd &c) +{ return bvec_shr(left.roots, right.roots, c.root); } + +inline bdd bvec_lth(const bvec &left, const bvec &right) +{ return bvec_lth(left.roots, right.roots); } + +inline bdd bvec_lte(const bvec &left, const bvec &right) +{ return bvec_lte(left.roots, right.roots); } + +inline bdd bvec_gth(const bvec &left, const bvec &right) +{ return bvec_gth(left.roots, right.roots); } + +inline bdd bvec_gte(const bvec &left, const bvec &right) +{ return bvec_gte(left.roots, right.roots); } + +inline bdd bvec_equ(const bvec &left, const bvec &right) +{ return bvec_equ(left.roots, right.roots); } + +inline bdd bvec_neq(const bvec &left, const bvec &right) +{ return bvec_neq(left.roots, right.roots); } + + + /* Hack to allow for overloading */ +#define bvec_var(a,b,c) bvec_varpp(a,b,c) +#define bvec_varfdd(a) bvec_varfddpp(a) +#define bvec_varvec(a,b) bvec_varvecpp(a,b) +#define bvec_true(a) bvec_truepp(a) +#define bvec_false(a) bvec_falsepp(a) +#define bvec_con(a,b) bvec_conpp((a),(b)) + + +#endif /* CPLUSPLUS */ + +#endif /* _BVEC_H */ + +/* EOF */ diff --git a/sdk/buddy-2.4/include/fdd.h b/sdk/buddy-2.4/include/fdd.h new file mode 100644 index 0000000..754ef92 --- /dev/null +++ b/sdk/buddy-2.4/include/fdd.h @@ -0,0 +1,174 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/fdd.h,v 1.1.1.1 2004/06/25 13:22:40 haimcohen Exp $ + FILE: fdd.h + DESCR: Finite domain data with BDDs + AUTH: Jorn Lind + DATE: (C) february 1999 +*************************************************************************/ + +#ifndef _FDD_H +#define _FDD_H + +#include "bdd.h" + + +#ifdef CPLUSPLUS +extern "C" { +#endif + +/* In file fdd.c */ + +extern int fdd_extdomain(int*, int); +extern int fdd_overlapdomain(int, int); +extern int fdd_overlapdomains(int*, int); +extern void fdd_clearall(void); +extern int fdd_domainnum(void); +extern int fdd_domainsize(int); +extern int fdd_varnum(int); +extern int* fdd_vars(int); +extern BDD fdd_ithvar(int, int); +extern int fdd_scanvar(BDD, int); +extern int* fdd_scanallvar(BDD); +extern BDD fdd_ithset(int); +extern BDD fdd_domain(int); +extern BDD fdd_equals(int, int); +extern bddfilehandler fdd_file_hook(bddfilehandler); +#ifdef CPLUSPLUS +extern bddstrmhandler fdd_strm_hook(bddstrmhandler); +#endif +extern void fdd_printset(BDD); +extern void fdd_fprintset(FILE*, BDD); +extern int fdd_scanset(BDD, int**, int*); +extern BDD fdd_makeset(int*, int); +extern int fdd_intaddvarblock(int, int, int); +extern int fdd_setpair(bddPair*, int, int); +extern int fdd_setpairs(bddPair*, int*, int*, int); + +#ifdef CPLUSPLUS +} +#endif + +/************************************************************************* + If this file is included from a C++ compiler then the following + classes, wrappers and hacks are supplied. +*************************************************************************/ +#ifdef CPLUSPLUS + + /* FDD extensions */ + +inline bdd fdd_ithvarpp(int var, int val) +{ return fdd_ithvar(var, val); } + +inline bdd fdd_ithsetpp(int var) +{ return fdd_ithset(var); } + +inline bdd fdd_domainpp(int var) +{ return fdd_domain(var); } + +inline int fdd_scanvar(const bdd &r, int var) +{ return fdd_scanvar(r.root, var); } + +inline int* fdd_scanallvar(const bdd &r) +{ return fdd_scanallvar(r.root); } + +inline bdd fdd_equalspp(int left, int right) +{ return fdd_equals(left, right); } + +inline void fdd_printset(const bdd &r) +{ fdd_printset(r.root); } + +inline void fdd_fprintset(FILE* ofile, const bdd &r) +{ fdd_fprintset(ofile, r.root); } + +inline int fdd_scanset(const bdd &r, int *&v, int &n) +{ return fdd_scanset(r.root, &v, &n); } + +inline bdd fdd_makesetpp(int *v, int n) +{ return fdd_makeset(v,n); } + +#if 0 +inline bdd* fdd_conpp(int bitnum, int var) +{ return fdd_transfer( bitnum, fdd_con(bitnum, var) ); } + +inline bdd* fdd_varpp(int bitnum, int var) +{ return fdd_transfer( bitnum, fdd_var(bitnum, var) ); } + +extern int fdd_isconst(int bitnum, bdd *e); +extern int fdd_val(int bitnum, bdd *e); + +inline bdd* fdd_add(int bitnum, bdd *left, bdd *right) +{ return fdd_termopr(bitnum, left, right,bdd::fddAdd); } + +inline bdd* fdd_sub(int bitnum, bdd *left, bdd *right) +{ return fdd_termopr(bitnum, left, right,bdd::fddSub); } + +inline bdd* fdd_shl(int bitnum, bdd *expr, bdd c) +{ return fdd_shift(bitnum, expr, c, bdd::fddShl); } + +inline bdd* fdd_shr(int bitnum, bdd *expr, bdd c) +{ return fdd_shift(bitnum, expr, c, bdd::fddShr); } + +inline bdd fdd_lth(int bitnum, bdd *left, bdd *right) +{ return fdd_relopr(bitnum, left, right, bdd::fddLth); } + +inline bdd fdd_lte(int bitnum, bdd *left, bdd *right) +{ return fdd_relopr(bitnum, left, right, bdd::fddLte); } + +inline bdd fdd_gth(int bitnum, bdd *left, bdd *right) +{ return fdd_relopr(bitnum, left, right, bdd::fddGth); } + +inline bdd fdd_gte(int bitnum, bdd *left, bdd *right) +{ return fdd_relopr(bitnum, left, right, bdd::fddGte); } + +inline bdd fdd_equ(int bitnum, bdd *left, bdd *right) +{ return fdd_relopr(bitnum, left, right, bdd::fddEqu); } + +inline bdd fdd_neq(int bitnum, bdd *left, bdd *right) +{ return fdd_relopr(bitnum, left, right, bdd::fddNeq); } +#endif + + /* Hacks to allow for overloading of return-types only */ +#define fdd_ithvar fdd_ithvarpp +#define fdd_ithset fdd_ithsetpp +#define fdd_domain fdd_domainpp +#define fdd_equals fdd_equalspp +#define fdd_makeset fdd_makesetpp +#define fdd_con fdd_conpp +#define fdd_var fdd_varpp + + +#endif /* CPLUSPLUS */ + +#endif /* _FDD_H */ + + +/* EOF */ diff --git a/sdk/buddy-2.4/libtool b/sdk/buddy-2.4/libtool new file mode 100644 index 0000000..7faae93 --- /dev/null +++ b/sdk/buddy-2.4/libtool @@ -0,0 +1,7381 @@ +#! /bin/bash + +# libtoolT - Provide generalized library-building support services. +# Generated automatically by (GNU buddy 2.4) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED="/bin/sed" + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="/bin/sed -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# The names of the tagged configurations supported by this script. +available_tags=" CXX F77" + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host ipf0v3330.pf.irt-aese.local: + +# Shell to use when invoking shell scripts. +SHELL="/bin/bash" + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=no + +# Whether or not to optimize for fast installation. +fast_install=yes + +# The host system. +host_alias= +host=x86_64-unknown-linux-gnu + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" +AR_FLAGS="cru" + +# A C compiler. +LTCC="gcc" + +# A language-specific compiler. +CC="gcc" + +# Is the compiler the GNU C compiler? +with_gcc=yes + +# An ERE matcher. +EGREP="/bin/grep -E" + +# The linker used to build libraries. +LD="/usr/bin/ld -m elf_x86_64" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# A symbol stripping program +STRIP="strip" + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=file + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Shared library suffix (normally ".so"). +shrext_cmds='.so' + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC -DPIC" +pic_mode=default + +# What is the maximum length of a command? +max_cmd_len=32768 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Must we lock files when doing compilation ? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=linux + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs\$old_deplibs~\$RANLIB \$oldlib" +old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~ +cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~ +\$echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~ + \$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib" +postinstall_cmds="" +postuninstall_cmds="" + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds="" +module_expsym_cmds="" + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects="" + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps="" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\$MAGIC_CMD" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\(\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into +# a binary during linking. This must work even if $libdir does +# not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=no + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=unknown + +# Compile-time system search path for libraries +sys_lib_search_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64 /usr/local/lib64 include /etc/ld.so.conf.d/*.conf " + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64 include /etc/ld.so.conf.d/*.conf " + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + +# Symbols that must always be exported. +include_expsyms="" + +# ### END LIBTOOL CONFIG + +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 +# Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +basename="s,^.*/,,g" + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# define SED for historic ltconfig's generated by Libtool 1.3 +test -z "$SED" && SED=sed + +# The name of this program: +progname=`echo "$progpath" | $SED $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.6 +TIMESTAMP=" (1.1220.2.95 2004/04/11 05:50:42)" + + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () { + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'` + if test "X$win32_nmres" = "Ximport" ; then + win32_libid_type="x86 archive import" + else + win32_libid_type="x86 archive static" + fi + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $echo $win32_libid_type +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () { + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} +# End of Shell function definitions +##################################### + +# Darwin sucks +#eval std_shrext=\"$shrext_cmds\" + +# And fixing for Darwin sucks for everybody else +if test -z "$shrext_cmds" && test -n "$shrext"; then + eval shrext_cmds=\"$shrext\" +fi +eval std_shrext=\"$shrext_cmds\" + +# This value is evaluated to 32768, so place it here as a compatilibity hack +# because older libtool.m4 didn't define this variable +test -z "$max_cmd_len" && max_cmd_len=32768 + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + $echo + $echo "Copyright (C) 2003 Free Software Foundation, Inc." + $echo "This is free software; see the source for copying conditions. There is NO" + $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit $EXIT_SUCCESS + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $EXIT_SUCCESS + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $EXIT_SUCCESS + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) prevopt="--tag" prev=tag ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + for arg + do + case "$arg_mode" in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$later $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" + continue + ;; + + * ) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + *.java) xform=java ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo $srcfile > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + fi + build_libtool_libs=no + build_old_libs=yes + prefer_static_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + exit $EXIT_FAILURE + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-mingw* | *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + deplibs="$deplibs $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # gcc -m* arguments should be passed to the linker via $compiler_flags + # in order to pass architecture information to the linker + # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo + # but this is not reliable with gcc because gcc may use -mfoo to + # select a different linker, different libraries, etc, while + # -Wl,-mfoo simply passes -mfoo to the linker. + -m*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + if test "$with_gcc" = "yes" ; then + compiler_flags="$compiler_flags $arg" + fi + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # The PATH hackery in wrapper scripts is required on Windows + # in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test "$status" -ne 0 && test ! -d "$output_objdir"; then + exit $status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + esac + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + if test "$deplibs_check_method" != pass_all; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + + # Read the .la file + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; shift + libname=`eval \\$echo \"$libname_spec\"` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5* ) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | $EGREP "bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$deplibs $path" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$2" + number_minor="$3" + number_revision="$4" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor - 1` + age="$number_minor" + revision="$number_minor" + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + [0-9]*) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $revision in + [0-9]*) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $age in + [0-9]*) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + major=`expr $current - $age + 1` + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$echo "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + for path in $notinst_path; do + lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'` + deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'` + dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` + done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name="`expr $a_deplib : '-l\(.*\)'`" + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval $echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + inst_prefix_arg= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + if test -n "$inst_prefix_dir" && (echo "$test_deplib" | grep -- "$inst_prefix_dir" >/dev/null); then + inst_prefix_arg="$test_deplib" + else + tmp_deplibs="$tmp_deplibs $test_deplib" + fi + ;; + esac + done + deplibs="$tmp_deplibs" + if test -n "$inst_prefix_arg"; then + deplibs="$inst_prefix_arg $deplibs" + fi + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + status=$? + if test "$status" -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" + status=$? + if test "$status" -ne 0 && test ! -d "$xdir"; then + exit $status + fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi + + libobjs="$libobjs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$save_output-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$save_output-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$save_output-${k}.$objext + objlist=$obj + len=1 + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadale object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$save_output-${i}.$objext" + done + + $echo "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + status=$? + if test "$status" -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" + status=$? + if test "$status" -ne 0 && test ! -d "$xdir"; then + exit $status + fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi + + reload_conv_objs="$reload_objs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + esac + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$output.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + else + $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + cwrappersource=`$echo ${objdir}/lt-${output}.c` + cwrapper=`$echo ${output}.exe` + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef DIR_SEPARATOR +#define DIR_SEPARATOR '/' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +#define HAVE_DOS_BASED_FILE_SYSTEM +#ifndef DIR_SEPARATOR_2 +#define DIR_SEPARATOR_2 '\\' +#endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +char * basename (const char *name); +char * fnqualify(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup ((char *) basename (argv[0])); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = fnqualify(argv[0]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +char * +basename (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha (name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return (char *) base; +} + +char * +fnqualify(const char *path) +{ + size_t size; + char *p; + char tmp[LT_PATHMAX + 1]; + + assert(path != NULL); + + /* Is it qualified already? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha (path[0]) && path[1] == ':') + return xstrdup (path); +#endif + if (IS_DIR_SEPARATOR (path[0])) + return xstrdup (path); + + /* prepend the current directory */ + /* doesn't handle '~' */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */ + p = XMALLOC(char, size); + sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path); + return p; +} + +char * +strendzap(char *str, const char *pat) +{ + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + $echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $echo \"\$relink_command_output\" >&2 + $rm \"\$progdir/\$file\" + exit $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \$progdir\\\\\$program \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \$progdir/\$program \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit $EXIT_FAILURE + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + status=$? + if test "$status" -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + # Add in members from convenience archives. + for xlib in $addlibs; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" + status=$? + if test "$status" -ne 0 && test ! -d "$xdir"; then + exit $status + fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi + + oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` + done + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + # GNU ar 2.10+ was changed to match POSIX; thus no paths are + # encoded into archives. This makes 'ar r' malfunction in + # this piecewise linking case whenever conflicting object + # names appear in distinct ar calls; check, warn and compensate. + if (for obj in $save_oldobjs + do + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 + $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 + AR_FLAGS=cq + fi + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg="$nonopt" + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest="$arg" + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) prev="-f" ;; + -g) prev="-g" ;; + -m) prev="-m" ;; + -o) prev="-o" ;; + -s) + stripme=" -s" + continue + ;; + -*) ;; + + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest="$arg" + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run eval "$striplib $destdir/$realname" || exit $? + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # To insure that "foo" is sourced, and not "foo.exe", + # finese the cygwin/MSYS system by explicitly sourcing "foo." + # which disallows the automatic-append-.exe behavior. + case $build in + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; + *) wrapperdot=${wrapper} ;; + esac + # If there is no directory component, then add one. + case $file in + */* | *\\*) . ${wrapperdot} ;; + *) . ./${wrapperdot} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # To insure that "foo" is sourced, and not "foo.exe", + # finese the cygwin/MSYS system by explicitly sourcing "foo." + # which disallows the automatic-append-.exe behavior. + case $build in + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; + *) wrapperdot=${wrapper} ;; + esac + # If there is no directory component, then add one. + case $file in + */* | *\\*) . ${wrapperdot} ;; + *) . ./${wrapperdot} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir="/tmp" + test -n "$TMPDIR" && tmpdir="$TMPDIR" + tmpdir="$tmpdir/libtool-$$" + save_umask=`umask` + umask 0077 + if $mkdir "$tmpdir"; then + umask $save_umask + else + umask $save_umask + $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 + continue + fi + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyways + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "----------------------------------------------------------------------" + $echo "Libraries have been installed in:" + for libdir in $libdirs; do + $echo " $libdir" + done + $echo + $echo "If you ever happen to want to link against installed libraries" + $echo "in a given directory, LIBDIR, you must either use libtool, and" + $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + $echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + $echo " during execution" + fi + if test -n "$runpath_var"; then + $echo " - add LIBDIR to the \`$runpath_var' environment variable" + $echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $echo + $echo "See any operating system documentation about shared libraries for" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "----------------------------------------------------------------------" + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if (test -L "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ + || test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + + if test "$mode" = uninstall; then + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + fi + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $EXIT_SUCCESS + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# Libtool was configured on host ipf0v3330.pf.irt-aese.local: + +# Shell to use when invoking shell scripts. +SHELL="/bin/bash" + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=no + +# Whether or not to optimize for fast installation. +fast_install=yes + +# The host system. +host_alias= +host=x86_64-unknown-linux-gnu + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" +AR_FLAGS="cru" + +# A C compiler. +LTCC="gcc" + +# A language-specific compiler. +CC="g++" + +# Is the compiler the GNU C compiler? +with_gcc=yes + +# An ERE matcher. +EGREP="/bin/grep -E" + +# The linker used to build libraries. +LD="/usr/bin/ld -m elf_x86_64" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# A symbol stripping program +STRIP="strip" + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=file + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Shared library suffix (normally ".so"). +shrext_cmds='.so' + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC -DPIC" +pic_mode=default + +# What is the maximum length of a command? +max_cmd_len=32768 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Must we lock files when doing compilation ? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=linux + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs\$old_deplibs~\$RANLIB \$oldlib" +old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-retain-symbols-file \$wl\$export_symbols -o \$lib" +postinstall_cmds="" +postuninstall_cmds="" + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds="" +module_expsym_cmds="" + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects="/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbeginS.o" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects="/usr/lib/gcc/x86_64-linux-gnu/5/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o" + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="-L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.." + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\$MAGIC_CMD" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\(\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into +# a binary during linking. This must work even if $libdir does +# not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var= + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=no + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=unknown + +# Compile-time system search path for libraries +sys_lib_search_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64 /usr/local/lib64 include /etc/ld.so.conf.d/*.conf " + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64 include /etc/ld.so.conf.d/*.conf " + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="" + +# Symbols that must always be exported. +include_expsyms="" + +# ### END LIBTOOL TAG CONFIG: CXX + +# ### BEGIN LIBTOOL TAG CONFIG: F77 + +# Libtool was configured on host ipf0v3330.pf.irt-aese.local: + +# Shell to use when invoking shell scripts. +SHELL="/bin/bash" + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=no + +# Whether or not to optimize for fast installation. +fast_install=yes + +# The host system. +host_alias= +host=x86_64-unknown-linux-gnu + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" +AR_FLAGS="cru" + +# A C compiler. +LTCC="gcc" + +# A language-specific compiler. +CC="f77" + +# Is the compiler the GNU C compiler? +with_gcc=yes + +# An ERE matcher. +EGREP="/bin/grep -E" + +# The linker used to build libraries. +LD="/usr/bin/ld -m elf_x86_64" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# A symbol stripping program +STRIP="strip" + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=file + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Shared library suffix (normally ".so"). +shrext_cmds='.so' + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC" +pic_mode=default + +# What is the maximum length of a command? +max_cmd_len=32768 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Must we lock files when doing compilation ? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag="" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=linux + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs\$old_deplibs~\$RANLIB \$oldlib" +old_postinstall_cmds="\$RANLIB \$oldlib~chmod 644 \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~ +cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~ +\$echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~ + \$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib" +postinstall_cmds="" +postuninstall_cmds="" + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds="" +module_expsym_cmds="" + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects="" + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps="" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\$MAGIC_CMD" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\(\\)\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2\\3 \\3/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into +# a binary during linking. This must work even if $libdir does +# not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=no + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=unknown + +# Compile-time system search path for libraries +sys_lib_search_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64 /usr/local/lib64 include /etc/ld.so.conf.d/*.conf " + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /usr/X11R6/lib64 include /etc/ld.so.conf.d/*.conf " + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + +# Symbols that must always be exported. +include_expsyms="" + +# ### END LIBTOOL TAG CONFIG: F77 + diff --git a/sdk/buddy-2.4/m4/debug.m4 b/sdk/buddy-2.4/m4/debug.m4 new file mode 100644 index 0000000..afc0fb2 --- /dev/null +++ b/sdk/buddy-2.4/m4/debug.m4 @@ -0,0 +1,25 @@ +AC_DEFUN([buddy_DEBUG_FLAGS], +[AC_ARG_ENABLE([swap-count], + [AC_HELP_STRING([--enable-swap-count], + [Count number of fundamental variable swaps (for debugging)])]) +case $enable_swap_count in + yes) + AC_DEFINE([SWAPCOUNT], 1, + [Define to 1 to count number of fundamental variable swaps + (for debugging).]) + ;; +esac + +AC_ARG_ENABLE([cache-stats], + [AC_HELP_STRING([--enable-cache-stats], + [Gather statistical information about operator and unique node caching (for debugging)])]) +case $enable_cache_stats in + yes) + AC_DEFINE([CACHESTATS], 1, + [Defube to 1 to gather statistical information about operator and unique node caching (for debugging).]) + ;; +esac +]) + + + \ No newline at end of file diff --git a/sdk/buddy-2.4/src/Makefile.am b/sdk/buddy-2.4/src/Makefile.am new file mode 100644 index 0000000..210dc9f --- /dev/null +++ b/sdk/buddy-2.4/src/Makefile.am @@ -0,0 +1,31 @@ +AM_CPPFLAGS = -I$(top_builddir) + +include_HEADERS = bdd.h fdd.h bvec.h + +lib_LTLIBRARIES = libbdd.la +libbdd_la_SOURCES = \ + bddio.c \ + bddop.c \ + bddtree.h \ + bvec.c \ + cache.c \ + cache.h \ + cppext.cxx \ + fdd.c \ + imatrix.c \ + imatrix.h \ + kernel.c \ + kernel.h \ + pairs.c \ + prime.c \ + prime.h \ + reorder.c \ + tree.c + +# See the `Updating version info' node of the Libtool manual before +# changing this. +libbdd_la_LDFLAGS = -version-info 0:0:0 + +check_PROGRAMS = bddtest +bddtest_SOURCES = bddtest.cxx +bddtest_LDADD = ./libbdd.la diff --git a/sdk/buddy-2.4/src/Makefile.in b/sdk/buddy-2.4/src/Makefile.in new file mode 100644 index 0000000..3618d1c --- /dev/null +++ b/sdk/buddy-2.4/src/Makefile.in @@ -0,0 +1,566 @@ +# Makefile.in generated by automake 1.8.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +SOURCES = $(libbdd_la_SOURCES) $(bddtest_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +check_PROGRAMS = bddtest$(EXEEXT) +subdir = src +DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/debug.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(mkdir_p) +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" +libLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(lib_LTLIBRARIES) +libbdd_la_LIBADD = +am_libbdd_la_OBJECTS = bddio.lo bddop.lo bvec.lo cache.lo cppext.lo \ + fdd.lo imatrix.lo kernel.lo pairs.lo prime.lo reorder.lo \ + tree.lo +libbdd_la_OBJECTS = $(am_libbdd_la_OBJECTS) +am_bddtest_OBJECTS = bddtest.$(OBJEXT) +bddtest_OBJECTS = $(am_bddtest_OBJECTS) +bddtest_DEPENDENCIES = ./libbdd.la +DEFAULT_INCLUDES = +depcomp = $(SHELL) $(top_srcdir)/tools/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/bddio.Plo ./$(DEPDIR)/bddop.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/bddtest.Po ./$(DEPDIR)/bvec.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/cache.Plo ./$(DEPDIR)/cppext.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/fdd.Plo ./$(DEPDIR)/imatrix.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/kernel.Plo ./$(DEPDIR)/pairs.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/prime.Plo ./$(DEPDIR)/reorder.Plo \ +@AMDEP_TRUE@ ./$(DEPDIR)/tree.Plo +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libbdd_la_SOURCES) $(bddtest_SOURCES) +DIST_SOURCES = $(libbdd_la_SOURCES) $(bddtest_SOURCES) +includeHEADERS_INSTALL = $(INSTALL_HEADER) +HEADERS = $(include_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +YACC = @YACC@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +AM_CPPFLAGS = -I$(top_builddir) +include_HEADERS = bdd.h fdd.h bvec.h +lib_LTLIBRARIES = libbdd.la +libbdd_la_SOURCES = \ + bddio.c \ + bddop.c \ + bddtree.h \ + bvec.c \ + cache.c \ + cache.h \ + cppext.cxx \ + fdd.c \ + imatrix.c \ + imatrix.h \ + kernel.c \ + kernel.h \ + pairs.c \ + prime.c \ + prime.h \ + reorder.c \ + tree.c + + +# See the `Updating version info' node of the Libtool manual before +# changing this. +libbdd_la_LDFLAGS = -version-info 0:0:0 +bddtest_SOURCES = bddtest.cxx +bddtest_LDADD = ./libbdd.la +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .cxx .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + else :; fi; \ + done + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + p="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libbdd.la: $(libbdd_la_OBJECTS) $(libbdd_la_DEPENDENCIES) + $(CXXLINK) -rpath $(libdir) $(libbdd_la_LDFLAGS) $(libbdd_la_OBJECTS) $(libbdd_la_LIBADD) $(LIBS) + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +bddtest$(EXEEXT): $(bddtest_OBJECTS) $(bddtest_DEPENDENCIES) + @rm -f bddtest$(EXEEXT) + $(CXXLINK) $(bddtest_LDFLAGS) $(bddtest_OBJECTS) $(bddtest_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bddio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bddop.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bddtest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bvec.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cppext.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fdd.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imatrix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kernel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pairs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prime.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reorder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +.cxx.o: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cxx.obj: +@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cxx.lo: +@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: +install-includeHEADERS: $(include_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)" + @list='$(include_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ + $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ + done + +uninstall-includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(include_HEADERS)'; for p in $$list; do \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ + rm -f "$(DESTDIR)$(includedir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-includeHEADERS + +install-exec-am: install-libLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-includeHEADERS uninstall-info-am \ + uninstall-libLTLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean \ + clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-includeHEADERS install-info install-info-am \ + install-libLTLIBRARIES install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-includeHEADERS \ + uninstall-info-am uninstall-libLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/sdk/buddy-2.4/src/bdd.h b/sdk/buddy-2.4/src/bdd.h new file mode 100644 index 0000000..6f55d7a --- /dev/null +++ b/sdk/buddy-2.4/src/bdd.h @@ -0,0 +1,838 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/bdd.h,v 1.1.1.1 2004/06/25 13:22:09 haimcohen Exp $ + FILE: bdd.h + DESCR: C,C++ User interface for the BDD package + AUTH: Jorn Lind + DATE: (C) feb 1997 +*************************************************************************/ + +#ifndef _BDD_H +#define _BDD_H + + /* Allow this headerfile to define C++ constructs if requested */ +#ifdef __cplusplus +#define CPLUSPLUS +#endif + +#include + +/*=== Defined operators for apply calls ================================*/ + +#define bddop_and 0 +#define bddop_xor 1 +#define bddop_or 2 +#define bddop_nand 3 +#define bddop_nor 4 +#define bddop_imp 5 +#define bddop_biimp 6 +#define bddop_diff 7 +#define bddop_less 8 +#define bddop_invimp 9 + + /* Should *not* be used in bdd_apply calls !!! */ +#define bddop_not 10 +#define bddop_simplify 11 + + +/*=== User BDD types ===================================================*/ + +typedef int BDD; + +#ifndef CPLUSPLUS +typedef BDD bdd; +#endif /* CPLUSPLUS */ + + +typedef struct s_bddPair +{ + BDD *result; + int last; + int id; + struct s_bddPair *next; +} bddPair; + + +/*=== Status information ===============================================*/ + +/* +NAME {* bddStat *} +SECTION {* kernel *} +SHORT {* Status information about the bdd package *} +PROTO {* typedef struct s_bddStat +{ + long int produced; + int nodenum; + int maxnodenum; + int freenodes; + int minfreenodes; + int varnum; + int cachesize; + int gbcnum; +} bddStat; *} +DESCR {* The fields are \\[\baselineskip] \begin{tabular}{lp{10cm}} + {\tt produced} & total number of new nodes ever produced \\ + {\tt nodenum} & currently allocated number of bdd nodes \\ + {\tt maxnodenum} & user defined maximum number of bdd nodes \\ + {\tt freenodes} & number of currently free nodes \\ + {\tt minfreenodes} & minimum number of nodes that should be left after a + garbage collection. \\ + {\tt varnum} & number of defined bdd variables \\ + {\tt cachesize} & number of entries in the internal caches \\ + {\tt gbcnum} & number of garbage collections done until now + \end{tabular} *} +ALSO {* bdd\_stats *} +*/ +typedef struct s_bddStat +{ + long int produced; + int nodenum; + int maxnodenum; + int freenodes; + int minfreenodes; + int varnum; + int cachesize; + int gbcnum; +} bddStat; + + +/* +NAME {* bddGbcStat *} +SECTION {* kernel *} +SHORT {* Status information about garbage collections *} +PROTO {* typedef struct s_bddGbcStat +{ + int nodes; + int freenodes; + long time; + long sumtime; + int num; +} bddGbcStat; *} +DESCR {* The fields are \\[\baselineskip] \begin{tabular}{ll} + {\tt nodes} & Total number of allocated nodes in the nodetable \\ + {\tt freenodes} & Number of free nodes in the nodetable \\ + {\tt time} & Time used for garbage collection this time \\ + {\tt sumtime} & Total time used for garbage collection \\ + {\tt num} & number of garbage collections done until now + \end{tabular} *} +ALSO {* bdd\_gbc\_hook *} +*/ +typedef struct s_bddGbcStat +{ + int nodes; + int freenodes; + long time; + long sumtime; + int num; +} bddGbcStat; + + +/* +NAME {* bddCacheStat *} +SECTION {* kernel *} +SHORT {* Status information about cache usage *} +PROTO {* typedef struct s_bddCacheStat +{ + long unsigned int uniqueAccess; + long unsigned int uniqueChain; + long unsigned int uniqueHit; + long unsigned int uniqueMiss; + long unsigned int opHit; + long unsigned int opMiss; + long unsigned int swapCount; +} bddCacheStat; *} +DESCR {* The fields are \\[\baselineskip] \begin{tabular}{ll} + {\bf Name} & {\bf Number of } \\ + uniqueAccess & accesses to the unique node table \\ + uniqueChain & iterations through the cache chains in the unique node table\\ + uniqueHit & entries actually found in the the unique node table \\ + uniqueMiss & entries not found in the the unique node table \\ + opHit & entries found in the operator caches \\ + opMiss & entries not found in the operator caches \\ + swapCount & number of variable swaps in reordering \\ +\end{tabular} *} +ALSO {* bdd\_cachestats *} +*/ +typedef struct s_bddCacheStat +{ + long unsigned int uniqueAccess; + long unsigned int uniqueChain; + long unsigned int uniqueHit; + long unsigned int uniqueMiss; + long unsigned int opHit; + long unsigned int opMiss; + long unsigned int swapCount; +} bddCacheStat; + +/*=== BDD interface prototypes =========================================*/ + +/* +NAME {* bdd\_relprod *} +SECTION {* operator *} +SHORT {* relational product *} +PROTO {* #define bdd_relprod(a,b,var) bdd_appex(a,b,bddop_and,var) *} +DESCR {* Calculates the relational product of {\tt a} and {\tt b} as + {\tt a AND b} with the variables in {\tt var} quantified out + afterwards. *} +RETURN {* The relational product or {\tt bddfalse} on errors. *} +ALSO {* bdd\_appex *} +*/ +#define bdd_relprod(a,b,var) bdd_appex((a),(b),bddop_and,(var)) + + + /* In file "kernel.c" */ + +#ifdef CPLUSPLUS +extern "C" { +#endif + +typedef void (*bddinthandler)(int); +typedef void (*bddgbchandler)(int,bddGbcStat*); +typedef void (*bdd2inthandler)(int,int); +typedef int (*bddsizehandler)(void); +typedef void (*bddfilehandler)(FILE *, int); +typedef void (*bddallsathandler)(char*, int); + +extern bddinthandler bdd_error_hook(bddinthandler); +extern bddgbchandler bdd_gbc_hook(bddgbchandler); +extern bdd2inthandler bdd_resize_hook(bdd2inthandler); +extern bddinthandler bdd_reorder_hook(bddinthandler); +extern bddfilehandler bdd_file_hook(bddfilehandler); + +extern int bdd_init(int, int); +extern void bdd_done(void); +extern int bdd_setvarnum(int); +extern int bdd_extvarnum(int); +extern int bdd_isrunning(void); +extern int bdd_setmaxnodenum(int); +extern int bdd_setmaxincrease(int); +extern int bdd_setminfreenodes(int); +extern int bdd_getnodenum(void); +extern int bdd_getallocnum(void); +extern char* bdd_versionstr(void); +extern int bdd_versionnum(void); +extern void bdd_stats(bddStat *); +extern void bdd_cachestats(bddCacheStat *); +extern void bdd_fprintstat(FILE *); +extern void bdd_printstat(void); +extern void bdd_default_gbchandler(int, bddGbcStat *); +extern void bdd_default_errhandler(int); +extern const char *bdd_errstring(int); +extern void bdd_clear_error(void); +#ifndef CPLUSPLUS +extern BDD bdd_true(void); +extern BDD bdd_false(void); +#endif +extern int bdd_varnum(void); +extern BDD bdd_ithvar(int); +extern BDD bdd_nithvar(int); +extern int bdd_var(BDD); +extern BDD bdd_low(BDD); +extern BDD bdd_high(BDD); +extern int bdd_varlevel(int); +extern BDD bdd_addref(BDD); +extern BDD bdd_delref(BDD); +extern void bdd_gbc(void); +extern int bdd_scanset(BDD, int**, int*); +extern BDD bdd_makeset(int *, int); +extern bddPair* bdd_newpair(void); +extern int bdd_setpair(bddPair*, int, int); +extern int bdd_setpairs(bddPair*, int*, int*, int); +extern int bdd_setbddpair(bddPair*, int, BDD); +extern int bdd_setbddpairs(bddPair*, int*, BDD*, int); +extern void bdd_resetpair(bddPair *); +extern void bdd_freepair(bddPair*); + + /* In bddop.c */ + +extern int bdd_setcacheratio(int); +extern BDD bdd_buildcube(int, int, BDD *); +extern BDD bdd_ibuildcube(int, int, int *); +extern BDD bdd_not(BDD); +extern BDD bdd_apply(BDD, BDD, int); +extern BDD bdd_and(BDD, BDD); +extern BDD bdd_or(BDD, BDD); +extern BDD bdd_xor(BDD, BDD); +extern BDD bdd_imp(BDD, BDD); +extern BDD bdd_biimp(BDD, BDD); +extern BDD bdd_ite(BDD, BDD, BDD); +extern BDD bdd_restrict(BDD, BDD); +extern BDD bdd_constrain(BDD, BDD); +extern BDD bdd_replace(BDD, bddPair*); +extern BDD bdd_compose(BDD, BDD, BDD); +extern BDD bdd_veccompose(BDD, bddPair*); +extern BDD bdd_simplify(BDD, BDD); +extern BDD bdd_exist(BDD, BDD); +extern BDD bdd_project(BDD, BDD); +extern BDD bdd_forall(BDD, BDD); +extern BDD bdd_unique(BDD, BDD); +extern BDD bdd_appex(BDD, BDD, int, BDD); +extern BDD bdd_appall(BDD, BDD, int, BDD); +extern BDD bdd_appuni(BDD, BDD, int, BDD); +extern BDD bdd_support(BDD); +extern BDD bdd_satone(BDD); +extern BDD bdd_satoneset(BDD, BDD, BDD); +extern BDD bdd_fullsatone(BDD); +extern void bdd_allsat(BDD r, bddallsathandler handler); +extern double bdd_satcount(BDD); +extern double bdd_satcountset(BDD, BDD); +extern double bdd_satcountln(BDD); +extern double bdd_satcountlnset(BDD, BDD); +extern int bdd_nodecount(BDD); +extern int bdd_anodecount(BDD *, int); +extern int* bdd_varprofile(BDD); +extern double bdd_pathcount(BDD); + + +/* In file "bddio.c" */ + +extern void bdd_printall(void); +extern void bdd_fprintall(FILE *); +extern void bdd_fprinttable(FILE *, BDD); +extern void bdd_printtable(BDD); +extern void bdd_fprintset(FILE *, BDD); +extern void bdd_printset(BDD); +extern int bdd_fnprintdot(char *, BDD); +extern void bdd_fprintdot(FILE *, BDD); +extern void bdd_printdot(BDD); +extern int bdd_fnsave(char *, BDD); +extern int bdd_save(FILE *, BDD); +extern int bdd_fnload(char *, BDD *); +extern int bdd_load(FILE *ifile, BDD *); + +/* In file reorder.c */ + +extern int bdd_swapvar(int v1, int v2); +extern void bdd_default_reohandler(int); +extern void bdd_reorder(int); +extern int bdd_reorder_gain(void); +extern bddsizehandler bdd_reorder_probe(bddsizehandler); +extern void bdd_clrvarblocks(void); +extern int bdd_addvarblock(BDD, int); +extern int bdd_intaddvarblock(int, int, int); +extern void bdd_varblockall(void); +extern bddfilehandler bdd_blockfile_hook(bddfilehandler); +extern int bdd_autoreorder(int); +extern int bdd_autoreorder_times(int, int); +extern int bdd_var2level(int); +extern int bdd_level2var(int); +extern int bdd_getreorder_times(void); +extern int bdd_getreorder_method(void); +extern void bdd_enable_reorder(void); +extern void bdd_disable_reorder(void); +extern int bdd_reorder_verbose(int); +extern void bdd_setvarorder(int *); +extern void bdd_printorder(void); +extern void bdd_fprintorder(FILE *); + +#ifdef CPLUSPLUS +} +#endif + + +/*=== BDD constants ====================================================*/ + +#ifndef CPLUSPLUS + +extern const BDD bddfalse; +extern const BDD bddtrue; + +#endif /* CPLUSPLUS */ + + +/*=== Reordering algorithms ============================================*/ + +#define BDD_REORDER_NONE 0 +#define BDD_REORDER_WIN2 1 +#define BDD_REORDER_WIN2ITE 2 +#define BDD_REORDER_SIFT 3 +#define BDD_REORDER_SIFTITE 4 +#define BDD_REORDER_WIN3 5 +#define BDD_REORDER_WIN3ITE 6 +#define BDD_REORDER_RANDOM 7 + +#define BDD_REORDER_FREE 0 +#define BDD_REORDER_FIXED 1 + + +/*=== Error codes ======================================================*/ + +#define BDD_MEMORY (-1) /* Out of memory */ +#define BDD_VAR (-2) /* Unknown variable */ +#define BDD_RANGE (-3) /* Variable value out of range (not in domain) */ +#define BDD_DEREF (-4) /* Removing external reference to unknown node */ +#define BDD_RUNNING (-5) /* Called bdd_init() twice whithout bdd_done() */ +#define BDD_FILE (-6) /* Some file operation failed */ +#define BDD_FORMAT (-7) /* Incorrect file format */ +#define BDD_ORDER (-8) /* Vars. not in order for vector based functions */ +#define BDD_BREAK (-9) /* User called break */ +#define BDD_VARNUM (-10) /* Different number of vars. for vector pair */ +#define BDD_NODES (-11) /* Tried to set max. number of nodes to be fewer */ + /* than there already has been allocated */ +#define BDD_OP (-12) /* Unknown operator */ +#define BDD_VARSET (-13) /* Illegal variable set */ +#define BDD_VARBLK (-14) /* Bad variable block operation */ +#define BDD_DECVNUM (-15) /* Trying to decrease the number of variables */ +#define BDD_REPLACE (-16) /* Replacing to already existing variables */ +#define BDD_NODENUM (-17) /* Number of nodes reached user defined maximum */ +#define BDD_ILLBDD (-18) /* Illegal bdd argument */ +#define BDD_SIZE (-19) /* Illegal size argument */ + +#define BVEC_SIZE (-20) /* Mismatch in bitvector size */ +#define BVEC_SHIFT (-21) /* Illegal shift-left/right parameter */ +#define BVEC_DIVZERO (-22) /* Division by zero */ + +#define BDD_ERRNUM 24 + +/************************************************************************* + If this file is included from a C++ compiler then the following + classes, wrappers and hacks are supplied. +*************************************************************************/ +#ifdef CPLUSPLUS +#include + +/*=== User BDD class ===================================================*/ + +class bvec; + +class bdd +{ + public: + + bdd(void) { root=0; } + bdd(const bdd &r) { bdd_addref(root=r.root); } + ~bdd(void) { bdd_delref(root); } + + int id(void) const; + + bdd operator=(const bdd &r); + + bdd operator&(const bdd &r) const; + bdd operator&=(const bdd &r); + bdd operator^(const bdd &r) const; + bdd operator^=(const bdd &r); + bdd operator|(const bdd &r) const; + bdd operator|=(const bdd &r); + bdd operator!(void) const; + bdd operator>>(const bdd &r) const; + bdd operator>>=(const bdd &r); + bdd operator-(const bdd &r) const; + bdd operator-=(const bdd &r); + bdd operator>(const bdd &r) const; + bdd operator<(const bdd &r) const; + bdd operator<<(const bdd &r) const; + bdd operator<<=(const bdd &r); + int operator==(const bdd &r) const; + int operator!=(const bdd &r) const; + +private: + BDD root; + + bdd(BDD r) { bdd_addref(root=r); } + bdd operator=(BDD r); + + friend int bdd_init(int, int); + friend int bdd_setvarnum(int); + friend bdd bdd_true(void); + friend bdd bdd_false(void); + friend bdd bdd_ithvarpp(int); + friend bdd bdd_nithvarpp(int); + friend int bdd_var(const bdd &); + friend bdd bdd_low(const bdd &); + friend bdd bdd_high(const bdd &); + friend int bdd_scanset(const bdd &, int *&, int &); + friend bdd bdd_makesetpp(int *, int); + friend int bdd_setbddpair(bddPair*, int, const bdd &); + friend int bdd_setbddpairs(bddPair*, int*, const bdd *, int); + friend bdd bdd_buildcube(int, int, const bdd *); + friend bdd bdd_ibuildcubepp(int, int, int *); + friend bdd bdd_not(const bdd &); + friend bdd bdd_simplify(const bdd &, const bdd &); + friend bdd bdd_apply(const bdd &, const bdd &, int); + friend bdd bdd_and(const bdd &, const bdd &); + friend bdd bdd_or(const bdd &, const bdd &); + friend bdd bdd_xor(const bdd &, const bdd &); + friend bdd bdd_imp(const bdd &, const bdd &); + friend bdd bdd_biimp(const bdd &, const bdd &); + friend bdd bdd_ite(const bdd &, const bdd &, const bdd &); + friend bdd bdd_restrict(const bdd &, const bdd &); + friend bdd bdd_constrain(const bdd &, const bdd &); + friend bdd bdd_exist(const bdd &, const bdd &); + friend bdd bdd_project(const bdd &, const bdd &); + friend bdd bdd_forall(const bdd &, const bdd &); + friend bdd bdd_unique(const bdd &, const bdd &); + friend bdd bdd_appex(const bdd &, const bdd &, int, const bdd &); + friend bdd bdd_appall(const bdd &, const bdd &, int, const bdd &); + friend bdd bdd_appuni(const bdd &, const bdd &, int, const bdd &); + friend bdd bdd_replace(const bdd &, bddPair*); + friend bdd bdd_compose(const bdd &, const bdd &, int); + friend bdd bdd_veccompose(const bdd &, bddPair*); + friend bdd bdd_support(const bdd &); + friend bdd bdd_satone(const bdd &); + friend bdd bdd_satoneset(const bdd &, const bdd &, const bdd &); + friend bdd bdd_fullsatone(const bdd &); + friend void bdd_allsat(const bdd &r, bddallsathandler handler); + friend double bdd_satcount(const bdd &); + friend double bdd_satcountset(const bdd &, const bdd &); + friend double bdd_satcountln(const bdd &); + friend double bdd_satcountlnset(const bdd &, const bdd &); + friend int bdd_nodecount(const bdd &); + friend int bdd_anodecountpp(const bdd *, int); + friend int* bdd_varprofile(const bdd &); + friend double bdd_pathcount(const bdd &); + + friend void bdd_fprinttable(FILE *, const bdd &); + friend void bdd_printtable(const bdd &); + friend void bdd_fprintset(FILE *, const bdd &); + friend void bdd_printset(const bdd &); + friend void bdd_printdot(const bdd &); + friend int bdd_fnprintdot(char*, const bdd &); + friend void bdd_fprintdot(FILE*, const bdd &); + friend std::ostream &operator<<(std::ostream &, const bdd &); + friend int bdd_fnsave(char*, const bdd &); + friend int bdd_save(FILE*, const bdd &); + friend int bdd_fnload(char*, bdd &); + friend int bdd_load(FILE*, bdd &); + + friend bdd fdd_ithvarpp(int, int); + friend bdd fdd_ithsetpp(int); + friend bdd fdd_domainpp(int); + friend int fdd_scanvar(const bdd &, int); + friend int* fdd_scanallvar(const bdd &); + friend bdd fdd_equalspp(int, int); + friend void fdd_printset(const bdd &); + friend void fdd_fprintset(FILE*, const bdd &); + friend bdd fdd_makesetpp(int*, int); + friend int fdd_scanset(const bdd &, int *&, int &); + + friend int bdd_addvarblock(const bdd &, int); + + friend class bvec; + friend bvec bvec_ite(const bdd& a, const bvec& b, const bvec& c); + friend bvec bvec_shlfixed(const bvec &e, int pos, const bdd &c); + friend bvec bvec_shl(const bvec &left, const bvec &right, const bdd &c); + friend bvec bvec_shrfixed(const bvec &e, int pos, const bdd &c); + friend bvec bvec_shr(const bvec &left, const bvec &right, const bdd &c); + friend bdd bvec_lth(const bvec &left, const bvec &right); + friend bdd bvec_lte(const bvec &left, const bvec &right); + friend bdd bvec_gth(const bvec &left, const bvec &right); + friend bdd bvec_gte(const bvec &left, const bvec &right); + friend bdd bvec_equ(const bvec &left, const bvec &right); + friend bdd bvec_neq(const bvec &left, const bvec &right); +}; + + +/*=== BDD constants ====================================================*/ + +extern const bdd bddfalsepp; +extern const bdd bddtruepp; + +#define bddtrue bddtruepp +#define bddfalse bddfalsepp + +/*=== C++ interface ====================================================*/ + +extern int bdd_cpp_init(int, int); + +inline void bdd_stats(bddStat& s) +{ bdd_stats(&s); } + +inline bdd bdd_ithvarpp(int v) +{ return bdd_ithvar(v); } + +inline bdd bdd_nithvarpp(int v) +{ return bdd_nithvar(v); } + +inline int bdd_var(const bdd &r) +{ return bdd_var(r.root); } + +inline bdd bdd_low(const bdd &r) +{ return bdd_low(r.root); } + +inline bdd bdd_high(const bdd &r) +{ return bdd_high(r.root); } + +inline int bdd_scanset(const bdd &r, int *&v, int &n) +{ return bdd_scanset(r.root, &v, &n); } + +inline bdd bdd_makesetpp(int *v, int n) +{ return bdd(bdd_makeset(v,n)); } + +inline int bdd_setbddpair(bddPair *p, int ov, const bdd &nv) +{ return bdd_setbddpair(p,ov,nv.root); } + + /* In bddop.c */ + +inline bdd bdd_replace(const bdd &r, bddPair *p) +{ return bdd_replace(r.root, p); } + +inline bdd bdd_compose(const bdd &f, const bdd &g, int v) +{ return bdd_compose(f.root, g.root, v); } + +inline bdd bdd_veccompose(const bdd &f, bddPair *p) +{ return bdd_veccompose(f.root, p); } + +inline bdd bdd_restrict(const bdd &r, const bdd &var) +{ return bdd_restrict(r.root, var.root); } + +inline bdd bdd_constrain(const bdd &f, const bdd &c) +{ return bdd_constrain(f.root, c.root); } + +inline bdd bdd_simplify(const bdd &d, const bdd &b) +{ return bdd_simplify(d.root, b.root); } + +inline bdd bdd_ibuildcubepp(int v, int w, int *a) +{ return bdd_ibuildcube(v,w,a); } + +inline bdd bdd_not(const bdd &r) +{ return bdd_not(r.root); } + +inline bdd bdd_apply(const bdd &l, const bdd &r, int op) +{ return bdd_apply(l.root, r.root, op); } + +inline bdd bdd_and(const bdd &l, const bdd &r) +{ return bdd_apply(l.root, r.root, bddop_and); } + +inline bdd bdd_or(const bdd &l, const bdd &r) +{ return bdd_apply(l.root, r.root, bddop_or); } + +inline bdd bdd_xor(const bdd &l, const bdd &r) +{ return bdd_apply(l.root, r.root, bddop_xor); } + +inline bdd bdd_imp(const bdd &l, const bdd &r) +{ return bdd_apply(l.root, r.root, bddop_imp); } + +inline bdd bdd_biimp(const bdd &l, const bdd &r) +{ return bdd_apply(l.root, r.root, bddop_biimp); } + +inline bdd bdd_ite(const bdd &f, const bdd &g, const bdd &h) +{ return bdd_ite(f.root, g.root, h.root); } + +inline bdd bdd_exist(const bdd &r, const bdd &var) +{ return bdd_exist(r.root, var.root); } + +inline bdd bdd_project(const bdd &r, const bdd &var) +{ return bdd_project(r.root, var.root); } + +inline bdd bdd_forall(const bdd &r, const bdd &var) +{ return bdd_forall(r.root, var.root); } + +inline bdd bdd_unique(const bdd &r, const bdd &var) +{ return bdd_unique(r.root, var.root); } + +inline bdd bdd_appex(const bdd &l, const bdd &r, int op, const bdd &var) +{ return bdd_appex(l.root, r.root, op, var.root); } + +inline bdd bdd_appall(const bdd &l, const bdd &r, int op, const bdd &var) +{ return bdd_appall(l.root, r.root, op, var.root); } + +inline bdd bdd_appuni(const bdd &l, const bdd &r, int op, const bdd &var) +{ return bdd_appuni(l.root, r.root, op, var.root); } + +inline bdd bdd_support(const bdd &r) +{ return bdd_support(r.root); } + +inline bdd bdd_satone(const bdd &r) +{ return bdd_satone(r.root); } + +inline bdd bdd_satoneset(const bdd &r, const bdd &var, const bdd &pol) +{ return bdd_satoneset(r.root, var.root, pol.root); } + +inline bdd bdd_fullsatone(const bdd &r) +{ return bdd_fullsatone(r.root); } + +inline void bdd_allsat(const bdd &r, bddallsathandler handler) +{ bdd_allsat(r.root, handler); } + +inline double bdd_satcount(const bdd &r) +{ return bdd_satcount(r.root); } + +inline double bdd_satcountset(const bdd &r, const bdd &varset) +{ return bdd_satcountset(r.root, varset.root); } + +inline double bdd_satcountln(const bdd &r) +{ return bdd_satcountln(r.root); } + +inline double bdd_satcountlnset(const bdd &r, const bdd &varset) +{ return bdd_satcountlnset(r.root, varset.root); } + +inline int bdd_nodecount(const bdd &r) +{ return bdd_nodecount(r.root); } + +inline int* bdd_varprofile(const bdd &r) +{ return bdd_varprofile(r.root); } + +inline double bdd_pathcount(const bdd &r) +{ return bdd_pathcount(r.root); } + + + /* I/O extensions */ + +inline void bdd_fprinttable(FILE *file, const bdd &r) +{ bdd_fprinttable(file, r.root); } + +inline void bdd_printtable(const bdd &r) +{ bdd_printtable(r.root); } + +inline void bdd_fprintset(FILE *file, const bdd &r) +{ bdd_fprintset(file, r.root); } + +inline void bdd_printset(const bdd &r) +{ bdd_printset(r.root); } + +inline void bdd_printdot(const bdd &r) +{ bdd_printdot(r.root); } + +inline void bdd_fprintdot(FILE* ofile, const bdd &r) +{ bdd_fprintdot(ofile, r.root); } + +inline int bdd_fnprintdot(char* fname, const bdd &r) +{ return bdd_fnprintdot(fname, r.root); } + +inline int bdd_fnsave(char *fname, const bdd &r) +{ return bdd_fnsave(fname, r.root); } + +inline int bdd_save(FILE *ofile, const bdd &r) +{ return bdd_save(ofile, r.root); } + +inline int bdd_fnload(char *fname, bdd &r) +{ int lr,e; e=bdd_fnload(fname, &lr); r=bdd(lr); return e; } + +inline int bdd_load(FILE *ifile, bdd &r) +{ int lr,e; e=bdd_load(ifile, &lr); r=bdd(lr); return e; } + +inline int bdd_addvarblock(const bdd &v, int f) +{ return bdd_addvarblock(v.root, f); } + + /* Hack to allow for overloading */ +#define bdd_init bdd_cpp_init +#define bdd_ithvar bdd_ithvarpp +#define bdd_nithvar bdd_nithvarpp +#define bdd_makeset bdd_makesetpp +#define bdd_ibuildcube bdd_ibuildcubepp +#define bdd_anodecount bdd_anodecountpp + +/*=== Inline C++ functions =============================================*/ + +inline int bdd::id(void) const +{ return root; } + +inline bdd bdd::operator&(const bdd &r) const +{ return bdd_apply(*this,r,bddop_and); } + +inline bdd bdd::operator&=(const bdd &r) +{ return (*this=bdd_apply(*this,r,bddop_and)); } + +inline bdd bdd::operator^(const bdd &r) const +{ return bdd_apply(*this,r,bddop_xor); } + +inline bdd bdd::operator^=(const bdd &r) +{ return (*this=bdd_apply(*this,r,bddop_xor)); } + +inline bdd bdd::operator|(const bdd &r) const +{ return bdd_apply(*this,r,bddop_or); } + +inline bdd bdd::operator|=(const bdd &r) +{ return (*this=bdd_apply(*this,r,bddop_or)); } + +inline bdd bdd::operator!(void) const +{ return bdd_not(*this);} + +inline bdd bdd::operator>>(const bdd &r) const +{ return bdd_apply(*this,r,bddop_imp); } + +inline bdd bdd::operator>>=(const bdd &r) +{ return (*this=bdd_apply(*this,r,bddop_imp)); } + +inline bdd bdd::operator-(const bdd &r) const +{ return bdd_apply(*this,r,bddop_diff); } + +inline bdd bdd::operator-=(const bdd &r) +{ return (*this=bdd_apply(*this,r,bddop_diff)); } + +inline bdd bdd::operator>(const bdd &r) const +{ return bdd_apply(*this,r,bddop_diff); } + +inline bdd bdd::operator<(const bdd &r) const +{ return bdd_apply(*this,r,bddop_less); } + +inline bdd bdd::operator<<(const bdd &r) const +{ return bdd_apply(*this,r,bddop_invimp); } + +inline bdd bdd::operator<<=(const bdd &r) +{ return (*this=bdd_apply(*this,r,bddop_invimp)); } + +inline int bdd::operator==(const bdd &r) const +{ return r.root==root; } + +inline int bdd::operator!=(const bdd &r) const +{ return r.root!=root; } + +inline bdd bdd_true(void) +{ return 1; } + +inline bdd bdd_false(void) +{ return 0; } + + +/*=== Iostream printing ================================================*/ + +class bdd_ioformat +{ + public: + bdd_ioformat(int f) { format=f; } + private: + bdd_ioformat(void) { } + int format; + static int curformat; + + friend std::ostream &operator<<(std::ostream &, const bdd_ioformat &); + friend std::ostream &operator<<(std::ostream &, const bdd &); +}; + +std::ostream &operator<<(std::ostream &, const bdd &); +std::ostream &operator<<(std::ostream &, const bdd_ioformat &); + +extern bdd_ioformat bddset; +extern bdd_ioformat bddtable; +extern bdd_ioformat bdddot; +extern bdd_ioformat bddall; +extern bdd_ioformat fddset; + +typedef void (*bddstrmhandler)(std::ostream &, int); + +extern bddstrmhandler bdd_strm_hook(bddstrmhandler); + +#endif /* CPLUSPLUS */ + +#endif /* _BDD_H */ + +/* EOF */ diff --git a/sdk/buddy-2.4/src/bddio.c b/sdk/buddy-2.4/src/bddio.c new file mode 100644 index 0000000..b4d4c64 --- /dev/null +++ b/sdk/buddy-2.4/src/bddio.c @@ -0,0 +1,593 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/bddio.c,v 1.1.1.1 2004/06/25 13:22:14 haimcohen Exp $ + FILE: bddio.c + DESCR: File I/O routines for BDD package + AUTH: Jorn Lind + DATE: (C) june 1997 +*************************************************************************/ +#include +#include +#include +#include +#include +#include "kernel.h" + +static void bdd_printset_rec(FILE *, int, int *); +static void bdd_fprintdot_rec(FILE*, BDD); +static int bdd_save_rec(FILE*, int); +static int bdd_loaddata(FILE *); +static int loadhash_get(int); +static void loadhash_add(int, int); + +static bddfilehandler filehandler; + +typedef struct s_LoadHash +{ + int key; + int data; + int first; + int next; +} LoadHash; + +static LoadHash *lh_table; +static int lh_freepos; +static int lh_nodenum; +static int *loadvar2level; + +/*=== PRINTING ========================================================*/ + + +/* +NAME {* bdd\_file\_hook *} +SECTION {* kernel *} +SHORT {* Specifies a printing callback handler *} +PROTO {* bddfilehandler bdd_file_hook(bddfilehandler handler) *} +DESCR {* A printing callback handler for use with BDDs is used to + convert the BDD variable number into something readable by the + end user. Typically the handler will print a string name + instead of the number. A handler could look like this: + \begin{verbatim} +void printhandler(FILE *o, int var) +{ + extern char **names; + fprintf(o, "%s", names[var]); +} +\end{verbatim} + + \noindent + The handler can then be passed to BuDDy like this: + {\tt bdd\_file\_hook(printhandler)}. + + No default handler is supplied. The argument {\tt handler} may be + NULL if no handler is needed. *} +RETURN {* The old handler *} +ALSO {* bdd\_printset, bdd\_strm\_hook, fdd\_file\_hook *} +*/ +bddfilehandler bdd_file_hook(bddfilehandler handler) +{ + bddfilehandler old = filehandler; + filehandler = handler; + return old; +} + + +/* +NAME {* bdd\_printall *} +EXTRA {* bdd\_fprintall *} +SECTION {* fileio *} +SHORT {* prints all used entries in the node table *} +PROTO {* void bdd_printall(void) +void bdd_fprintall(FILE* ofile) *} +DESCR {* Prints to either stdout or the file {\tt ofile} all the used + entries in the main node table. The format is: + \begin{Ill} + {\tt [Nodenum] Var/level Low High} + \end{Ill} + Where {\tt Nodenum} is the position in the node table and level + is the position in the current variable order. *} +ALSO {* bdd\_printtable, bdd\_printset, bdd\_printdot *} +*/ +void bdd_printall(void) +{ + bdd_fprintall(stdout); +} + + +void bdd_fprintall(FILE *ofile) +{ + int n; + + for (n=0 ; n\\ + < $x_{2,1}:c_{2,1},\ldots,x_{2,n_2}:c_{2,n_2}$ >\\ + $\ldots$ \\ + < $x_{N,1}:c_{N,1},\ldots,x_{N,n_3}:c_{N,n_3}$ > } + \end{Ill} + Where the $x$'s are variable numbers (and the position in the + current order) and the $c$'s are the + possible assignments to these. Each set of brackets designates + one possible assignment to the set of variables that make up the + BDD. All variables not shown are don't cares. It is possible to + specify a callback handler for printing of the variables using + {\tt bdd\_file\_hook} or {\tt bdd\_strm\_hook}. *} +ALSO {* bdd\_printall, bdd\_printtable, bdd\_printdot, bdd\_file\_hook, bdd\_strm\_hook *} +*/ +void bdd_printset(BDD r) +{ + bdd_fprintset(stdout, r); +} + + +void bdd_fprintset(FILE *ofile, BDD r) +{ + int *set; + + if (r < 2) + { + fprintf(ofile, "%s", r == 0 ? "F" : "T"); + return; + } + + if ((set=(int *)malloc(sizeof(int)*bddvarnum)) == NULL) + { + bdd_error(BDD_MEMORY); + return; + } + + memset(set, 0, sizeof(int) * bddvarnum); + bdd_printset_rec(ofile, r, set); + free(set); +} + + +static void bdd_printset_rec(FILE *ofile, int r, int *set) +{ + int n; + int first; + + if (r == 0) + return; + else + if (r == 1) + { + fprintf(ofile, "<"); + first = 1; + + for (n=0 ; n 0) + { + if (!first) + fprintf(ofile, ", "); + first = 0; + if (filehandler) + filehandler(ofile, bddlevel2var[n]); + else + fprintf(ofile, "%d", bddlevel2var[n]); + fprintf(ofile, ":%d", (set[n]==2 ? 1 : 0)); + } + } + + fprintf(ofile, ">"); + } + else + { + set[LEVEL(r)] = 1; + bdd_printset_rec(ofile, LOW(r), set); + + set[LEVEL(r)] = 2; + bdd_printset_rec(ofile, HIGH(r), set); + + set[LEVEL(r)] = 0; + } +} + + +/* +NAME {* bdd\_printdot *} +EXTRA {* bdd\_fprintdot *} +SECTION {* fileio *} +SHORT {* prints a description of a BDD in DOT format *} +PROTO {* void bdd_printdot(BDD r) +int bdd_fnprintdot(char* fname, BDD r) +void bdd_fprintdot(FILE* ofile, BDD r) *} +DESCR {* Prints a BDD in a format suitable for use with the graph + drawing program DOT to either stdout, a designated file + {\tt ofile} or the file named by {\tt fname}. In the last case + the file will be opened for writing, any previous contents + destroyed and then closed again. *} +ALSO {* bdd\_printall, bdd\_printtable, bdd\_printset *} +*/ +void bdd_printdot(BDD r) +{ + bdd_fprintdot(stdout, r); +} + + +int bdd_fnprintdot(char *fname, BDD r) +{ + FILE *ofile = fopen(fname, "w"); + if (ofile == NULL) + return bdd_error(BDD_FILE); + bdd_fprintdot(ofile, r); + fclose(ofile); + return 0; +} + + +void bdd_fprintdot(FILE* ofile, BDD r) +{ + fprintf(ofile, "digraph G {\n"); + fprintf(ofile, "0 [shape=box, label=\"0\", style=filled, shape=box, height=0.3, width=0.3];\n"); + fprintf(ofile, "1 [shape=box, label=\"1\", style=filled, shape=box, height=0.3, width=0.3];\n"); + + bdd_fprintdot_rec(ofile, r); + + fprintf(ofile, "}\n"); + + bdd_unmark(r); +} + + +static void bdd_fprintdot_rec(FILE* ofile, BDD r) +{ + if (ISCONST(r) || MARKED(r)) + return; + + fprintf(ofile, "%d [label=\"", r); + if (filehandler) + filehandler(ofile, bddlevel2var[LEVEL(r)]); + else + fprintf(ofile, "%d", bddlevel2var[LEVEL(r)]); + fprintf(ofile, "\"];\n"); + + fprintf(ofile, "%d -> %d [style=dotted];\n", r, LOW(r)); + fprintf(ofile, "%d -> %d [style=filled];\n", r, HIGH(r)); + + SETMARK(r); + + bdd_fprintdot_rec(ofile, LOW(r)); + bdd_fprintdot_rec(ofile, HIGH(r)); +} + + +/*=== SAVE =============================================================*/ + +/* +NAME {* bdd\_save *} +EXTRA {* bdd\_fnsave *} +SECTION {* fileio *} +SHORT {* saves a BDD to a file *} +PROTO {* int bdd_fnsave(char *fname, BDD r) +int bdd_save(FILE *ofile, BDD r) *} +DESCR {* Saves the nodes used by {\tt r} to either a file {\tt ofile} + which must be opened for writing or to the file named {\tt fname}. + In the last case the file will be truncated and opened for + writing. *} +ALSO {* bdd\_load *} +RETURN {* Zero on succes, otherwise an error code from {\tt bdd.h}. *} +*/ +int bdd_fnsave(char *fname, BDD r) +{ + FILE *ofile; + int ok; + + if ((ofile=fopen(fname,"w")) == NULL) + return bdd_error(BDD_FILE); + + ok = bdd_save(ofile, r); + fclose(ofile); + return ok; +} + + +int bdd_save(FILE *ofile, BDD r) +{ + int err, n=0; + + if (r < 2) + { + fprintf(ofile, "0 0 %d\n", r); + return 0; + } + + bdd_markcount(r, &n); + bdd_unmark(r); + fprintf(ofile, "%d %d\n", n, bddvarnum); + + for (n=0 ; n bddvarnum) + bdd_setvarnum(vnum); + + if ((lh_table=(LoadHash*)malloc(lh_nodenum*sizeof(LoadHash))) == NULL) + return bdd_error(BDD_MEMORY); + + for (n=0 ; n= 2) + low = loadhash_get(low); + if (high >= 2) + high = loadhash_get(high); + + if (low<0 || high<0 || var<0) + return bdd_error(BDD_FORMAT); + + root = bdd_addref( bdd_ite(bdd_ithvar(var), high, low) ); + + loadhash_add(key, root); + } + + return root; +} + + +static void loadhash_add(int key, int data) +{ + int hash = key % lh_nodenum; + int pos = lh_freepos; + + lh_freepos = lh_table[pos].next; + lh_table[pos].next = lh_table[hash].first; + lh_table[hash].first = pos; + + lh_table[pos].key = key; + lh_table[pos].data = data; +} + + +static int loadhash_get(int key) +{ + int hash = lh_table[key % lh_nodenum].first; + + while (hash != -1 && lh_table[hash].key != key) + hash = lh_table[hash].next; + + if (hash == -1) + return -1; + return lh_table[hash].data; +} + + +/* EOF */ diff --git a/sdk/buddy-2.4/src/bddop.c b/sdk/buddy-2.4/src/bddop.c new file mode 100644 index 0000000..6aba2cc --- /dev/null +++ b/sdk/buddy-2.4/src/bddop.c @@ -0,0 +1,2924 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/bddop.c,v 1.1.1.1 2004/06/25 13:22:22 haimcohen Exp $ + FILE: bddop.c + DESCR: BDD operators + AUTH: Jorn Lind + DATE: (C) nov 1997 +*************************************************************************/ +#include +#include +#include +#include +#include + +#include "kernel.h" +#include "cache.h" + + /* Hash value modifiers to distinguish between entries in misccache */ +#define CACHEID_CONSTRAIN 0x0 +#define CACHEID_RESTRICT 0x1 +#define CACHEID_SATCOU 0x2 +#define CACHEID_SATCOULN 0x3 +#define CACHEID_PATHCOU 0x4 + + /* Hash value modifiers for replace/compose */ +#define CACHEID_REPLACE 0x0 +#define CACHEID_COMPOSE 0x1 +#define CACHEID_VECCOMPOSE 0x2 + + /* Hash value modifiers for quantification */ +#define CACHEID_EXIST 0x0 +#define CACHEID_FORALL 0x1 +#define CACHEID_UNIQUE 0x2 +#define CACHEID_APPEX 0x3 +#define CACHEID_APPAL 0x4 +#define CACHEID_APPUN 0x5 +#define CACHEID_PROJECT 0x6 + + + /* Number of boolean operators */ +#define OPERATOR_NUM 11 + + /* Operator results - entry = left<<1 | right (left,right in {0,1}) */ +static int oprres[OPERATOR_NUM][4] = +{ {0,0,0,1}, /* and ( & ) */ + {0,1,1,0}, /* xor ( ^ ) */ + {0,1,1,1}, /* or ( | ) */ + {1,1,1,0}, /* nand */ + {1,0,0,0}, /* nor */ + {1,1,0,1}, /* implication ( >> ) */ + {1,0,0,1}, /* bi-implication */ + {0,0,1,0}, /* difference /greater than ( - ) ( > ) */ + {0,1,0,0}, /* less than ( < ) */ + {1,0,1,1}, /* inverse implication ( << ) */ + {1,1,0,0} /* not ( ! ) */ +}; + + + /* Variables needed for the operators */ +static int applyop; /* Current operator for apply */ +static int appexop; /* Current operator for appex */ +static int appexid; /* Current cache id for appex */ +static int quantid; /* Current cache id for quantifications */ +static int *quantvarset; /* Current variable set for quant. */ +static int quantvarsetID; /* Current id used in quantvarset */ +static int quantlast; /* Current last variable to be quant. */ +static int replaceid; /* Current cache id for replace */ +static int *replacepair; /* Current replace pair */ +static int replacelast; /* Current last var. level to replace */ +static int composelevel; /* Current variable used for compose */ +static int miscid; /* Current cache id for other results */ +static int *varprofile; /* Current variable profile */ +static int supportID; /* Current ID (true value) for support */ +static int supportMin; /* Min. used level in support calc. */ +static int supportMax; /* Max. used level in support calc. */ +static int* supportSet; /* The found support set */ +static BddCache applycache; /* Cache for apply results */ +static BddCache itecache; /* Cache for ITE results */ +static BddCache quantcache; /* Cache for exist/forall results */ +static BddCache appexcache; /* Cache for appex/appall results */ +static BddCache replacecache; /* Cache for replace results */ +static BddCache misccache; /* Cache for other results */ +static int cacheratio; +static BDD satPolarity; +static int firstReorder; /* Used instead of local variable in order + to avoid compiler warning about 'first' + being clobbered by setjmp */ + +static char* allsatProfile; /* Variable profile for bdd_allsat() */ +static bddallsathandler allsatHandler; /* Callback handler for bdd_allsat() */ + +extern bddCacheStat bddcachestats; + + /* Internal prototypes */ +static BDD not_rec(BDD); +static BDD apply_rec(BDD, BDD); +static BDD ite_rec(BDD, BDD, BDD); +static int simplify_rec(BDD, BDD); +static int quant_rec(int); +static int project_rec(int); +static int appquant_rec(int, int); +static int restrict_rec(int); +static BDD constrain_rec(BDD, BDD); +static BDD replace_rec(BDD); +static BDD bdd_correctify(int, BDD, BDD); +static BDD compose_rec(BDD, BDD); +static BDD veccompose_rec(BDD); +static void support_rec(int, int*); +static BDD satone_rec(BDD); +static BDD satoneset_rec(BDD, BDD); +static int fullsatone_rec(int); +static void allsat_rec(BDD r); +static double satcount_rec(int); +static double satcountln_rec(int); +static void varprofile_rec(int); +static double bdd_pathcount_rec(BDD); +static int varset2vartable(BDD); +static int varset2svartable(BDD); + + + /* Hashvalues */ +#define NOTHASH(r) (r) +#define APPLYHASH(l,r,op) (TRIPLE(l,r,op)) +#define ITEHASH(f,g,h) (TRIPLE(f,g,h)) +#define RESTRHASH(r,var) (PAIR(r,var)) +#define CONSTRAINHASH(f,c) (PAIR(f,c)) +#define QUANTHASH(r) (r) +#define REPLACEHASH(r) (r) +#define VECCOMPOSEHASH(f) (f) +#define COMPOSEHASH(f,g) (PAIR(f,g)) +#define SATCOUHASH(r) (r) +#define PATHCOUHASH(r) (r) +#define APPEXHASH(l,r,op) (PAIR(l,r)) + +#ifndef M_LN2 +#define M_LN2 0.69314718055994530942 +#endif + +#define log1p(a) (log(1.0+a)) + +#define INVARSET(a) (quantvarset[a] == quantvarsetID) /* unsigned check */ +#define INSVARSET(a) (abs(quantvarset[a]) == quantvarsetID) /* signed check */ + +/************************************************************************* + Setup and shutdown +*************************************************************************/ + +int bdd_operator_init(int cachesize) +{ + if (BddCache_init(&applycache,cachesize) < 0) + return bdd_error(BDD_MEMORY); + + if (BddCache_init(&itecache,cachesize) < 0) + return bdd_error(BDD_MEMORY); + + if (BddCache_init(&quantcache,cachesize) < 0) + return bdd_error(BDD_MEMORY); + + if (BddCache_init(&appexcache,cachesize) < 0) + return bdd_error(BDD_MEMORY); + + if (BddCache_init(&replacecache,cachesize) < 0) + return bdd_error(BDD_MEMORY); + + if (BddCache_init(&misccache,cachesize) < 0) + return bdd_error(BDD_MEMORY); + + quantvarsetID = 0; + quantvarset = NULL; + cacheratio = 0; + supportSet = NULL; + + return 0; +} + + +void bdd_operator_done(void) +{ + if (quantvarset != NULL) + free(quantvarset); + + BddCache_done(&applycache); + BddCache_done(&itecache); + BddCache_done(&quantcache); + BddCache_done(&appexcache); + BddCache_done(&replacecache); + BddCache_done(&misccache); + + if (supportSet != NULL) + free(supportSet); +} + + +void bdd_operator_reset(void) +{ + BddCache_reset(&applycache); + BddCache_reset(&itecache); + BddCache_reset(&quantcache); + BddCache_reset(&appexcache); + BddCache_reset(&replacecache); + BddCache_reset(&misccache); +} + + +void bdd_operator_varresize(void) +{ + if (quantvarset != NULL) + free(quantvarset); + + if ((quantvarset=NEW(int,bddvarnum)) == NULL) + bdd_error(BDD_MEMORY); + + memset(quantvarset, 0, sizeof(int)*bddvarnum); + quantvarsetID = 0; +} + + +static void bdd_operator_noderesize(void) +{ + if (cacheratio > 0) + { + int newcachesize = bddnodesize / cacheratio; + + BddCache_resize(&applycache, newcachesize); + BddCache_resize(&itecache, newcachesize); + BddCache_resize(&quantcache, newcachesize); + BddCache_resize(&appexcache, newcachesize); + BddCache_resize(&replacecache, newcachesize); + BddCache_resize(&misccache, newcachesize); + } +} + + +/************************************************************************* + Other +*************************************************************************/ + +/* +NAME {* bdd\_setcacheratio *} +SECTION {* kernel *} +SHORT {* Sets the cache ratio for the operator caches *} +PROTO {* int bdd_setcacheratio(int r) *} +DESCR {* The ratio between the number of nodes in the nodetable + and the number of entries in the operator cachetables is called + the cache ratio. So a cache ratio of say, four, allocates one cache + entry for each four unique node entries. This value can be set with + {\tt bdd\_setcacheratio} to any positive value. When this is done + the caches are resized instantly to fit the new ratio. + The default is a fixed cache size determined at + initialization time. *} +RETURN {* The previous cache ratio or a negative number on error. *} +ALSO {* bdd\_init *} +*/ +int bdd_setcacheratio(int r) +{ + int old = cacheratio; + + if (r <= 0) + return bdd_error(BDD_RANGE); + if (bddnodesize == 0) + return old; + + cacheratio = r; + bdd_operator_noderesize(); + return old; +} + + +/************************************************************************* + Operators +*************************************************************************/ + +static void checkresize(void) +{ + if (bddresized) + bdd_operator_noderesize(); + bddresized = 0; +} + + +/*=== BUILD A CUBE =====================================================*/ + +/* +NAME {* bdd\_buildcube *} +EXTRA {* bdd\_ibuildcube *} +SECTION {* operator *} +SHORT {* build a cube from an array of variables *} +PROTO {* BDD bdd_buildcube(int value, int width, BDD *var) +BDD bdd_ibuildcube(int value, int width, int *var)*} +DESCR {* This function builds a cube from the variables in {\tt + var}. It does so by interpreting the {\tt width} low order + bits of {\tt value} as a bit mask--a set bit indicates that the + variable should be added in it's positive form, and a cleared + bit the opposite. The most significant bits are encoded with + the first variables in {\tt var}. Consider as an example + the call {\tt bdd\_buildcube(0xB, 4, var)}. This corresponds + to the expression: $var[0] \conj \neg var[1] \conj var[2] + \conj var[3]$. The first version of the function takes an array + of BDDs, whereas the second takes an array of variable numbers + as used in {\tt bdd\_ithvar}. *} +RETURN {* The resulting cube *} +ALSO {* bdd\_ithvar, fdd\_ithvar *} +*/ +BDD bdd_buildcube(int value, int width, BDD *variables) +{ + BDD result = BDDONE; + int z; + + for (z=0 ; z>=1) + { + BDD tmp; + BDD v; + + if (value & 0x1) + v = bdd_addref( variables[width-z-1] ); + else + v = bdd_addref( bdd_not(variables[width-z-1]) ); + + bdd_addref(result); + tmp = bdd_apply(result,v,bddop_and); + bdd_delref(result); + bdd_delref(v); + + result = tmp; + } + + return result; +} + + +BDD bdd_ibuildcube(int value, int width, int *variables) +{ + BDD result = BDDONE; + int z; + + for (z=0 ; z>=1) + { + BDD tmp; + BDD v; + + if (value & 0x1) + v = bdd_ithvar(variables[width-z-1]); + else + v = bdd_nithvar(variables[width-z-1]); + + bdd_addref(result); + tmp = bdd_apply(result,v,bddop_and); + bdd_delref(result); + + result = tmp; + } + + return result; +} + + +/*=== NOT ==============================================================*/ + +/* +NAME {* bdd\_not *} +SECTION {* operator *} +SHORT {* negates a bdd *} +PROTO {* BDD bdd_not(BDD r) *} +DESCR {* Negates the BDD {\tt r} by exchanging + all references to the zero-terminal with references to the + one-terminal and vice versa. *} +RETURN {* The negated bdd. *} +*/ +BDD bdd_not(BDD r) +{ + BDD res; + firstReorder = 1; + CHECKa(r, bddfalse); + + again: + if (setjmp(bddexception) == 0) + { + INITREF; + + if (!firstReorder) + bdd_disable_reorder(); + res = not_rec(r); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +static BDD not_rec(BDD r) +{ + BddCacheData *entry; + BDD res; + + if (ISZERO(r)) + return BDDONE; + if (ISONE(r)) + return BDDZERO; + + entry = BddCache_lookup(&applycache, NOTHASH(r)); + + if (entry->a == r && entry->c == bddop_not) + { +#ifdef CACHESTATS + bddcachestats.opHit++; +#endif + return entry->r.res; + } +#ifdef CACHESTATS + bddcachestats.opMiss++; +#endif + + PUSHREF( not_rec(LOW(r)) ); + PUSHREF( not_rec(HIGH(r)) ); + res = bdd_makenode(LEVEL(r), READREF(2), READREF(1)); + POPREF(2); + + entry->a = r; + entry->c = bddop_not; + entry->r.res = res; + + return res; +} + + +/*=== APPLY ============================================================*/ + +/* +NAME {* bdd\_apply *} +SECTION {* operator *} +SHORT {* basic bdd operations *} +PROTO {* BDD bdd_apply(BDD left, BDD right, int opr) *} +DESCR {* The {\tt bdd\_apply} function performs all of the basic + bdd operations with two operands, such as AND, OR etc. + The {\tt left} argument is the left bdd operand and {\tt right} + is the right operand. The {\tt opr} argument is the requested + operation and must be one of the following\\ + + \begin{tabular}{lllc} + {\bf Identifier} & {\bf Description} & {\bf Truth table} + & {\bf C++ opr.} \\ + {\tt bddop\_and} & logical and ($A \wedge B$) & [0,0,0,1] + & \verb%&% \\ + {\tt bddop\_xor} & logical xor ($A \oplus B$) & [0,1,1,0] + & \verb%^% \\ + {\tt bddop\_or} & logical or ($A \vee B$) & [0,1,1,1] + & \verb%|% \\ + {\tt bddop\_nand} & logical not-and & [1,1,1,0] \\ + {\tt bddop\_nor} & logical not-or & [1,0,0,0] \\ + {\tt bddop\_imp} & implication ($A \Rightarrow B$) & [1,1,0,1] + & \verb%>>% \\ + {\tt bddop\_biimp} & bi-implication ($A \Leftrightarrow B$)& [1,0,0,1] \\ + {\tt bddop\_diff} & set difference ($A \setminus B$) & [0,0,1,0] + & \verb%-% \\ + {\tt bddop\_less} & less than ($A < B$) & [0,1,0,0] + & \verb%<% \\ + {\tt bddop\_invimp} & reverse implication ($A \Leftarrow B$)& [1,0,1,1] + & \verb%<<% \\ + \end{tabular} + *} + RETURN {* The result of the operation. *} + ALSO {* bdd\_ite *} +*/ +BDD bdd_apply(BDD l, BDD r, int op) +{ + BDD res; + firstReorder = 1; + + CHECKa(l, bddfalse); + CHECKa(r, bddfalse); + + if (op<0 || op>bddop_invimp) + { + bdd_error(BDD_OP); + return bddfalse; + } + + again: + if (setjmp(bddexception) == 0) + { + INITREF; + applyop = op; + + if (!firstReorder) + bdd_disable_reorder(); + res = apply_rec(l, r); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +static BDD apply_rec(BDD l, BDD r) +{ + BddCacheData *entry; + BDD res; + + switch (applyop) + { + case bddop_and: + if (l == r) + return l; + if (ISZERO(l) || ISZERO(r)) + return 0; + if (ISONE(l)) + return r; + if (ISONE(r)) + return l; + break; + case bddop_or: + if (l == r) + return l; + if (ISONE(l) || ISONE(r)) + return 1; + if (ISZERO(l)) + return r; + if (ISZERO(r)) + return l; + break; + case bddop_xor: + if (l == r) + return 0; + if (ISZERO(l)) + return r; + if (ISZERO(r)) + return l; + break; + case bddop_nand: + if (ISZERO(l) || ISZERO(r)) + return 1; + break; + case bddop_nor: + if (ISONE(l) || ISONE(r)) + return 0; + break; + case bddop_imp: + if (ISZERO(l)) + return 1; + if (ISONE(l)) + return r; + if (ISONE(r)) + return 1; + break; + } + + if (ISCONST(l) && ISCONST(r)) + res = oprres[applyop][l<<1 | r]; + else + { + entry = BddCache_lookup(&applycache, APPLYHASH(l,r,applyop)); + + if (entry->a == l && entry->b == r && entry->c == applyop) + { +#ifdef CACHESTATS + bddcachestats.opHit++; +#endif + return entry->r.res; + } +#ifdef CACHESTATS + bddcachestats.opMiss++; +#endif + + if (LEVEL(l) == LEVEL(r)) + { + PUSHREF( apply_rec(LOW(l), LOW(r)) ); + PUSHREF( apply_rec(HIGH(l), HIGH(r)) ); + res = bdd_makenode(LEVEL(l), READREF(2), READREF(1)); + } + else + if (LEVEL(l) < LEVEL(r)) + { + PUSHREF( apply_rec(LOW(l), r) ); + PUSHREF( apply_rec(HIGH(l), r) ); + res = bdd_makenode(LEVEL(l), READREF(2), READREF(1)); + } + else + { + PUSHREF( apply_rec(l, LOW(r)) ); + PUSHREF( apply_rec(l, HIGH(r)) ); + res = bdd_makenode(LEVEL(r), READREF(2), READREF(1)); + } + + POPREF(2); + + entry->a = l; + entry->b = r; + entry->c = applyop; + entry->r.res = res; + } + + return res; +} + + +/* +NAME {* bdd\_and *} +SECTION {* operator *} +SHORT {* The logical 'and' of two BDDs *} +PROTO {* BDD bdd_and(BDD l, BDD r) *} +DESCR {* This a wrapper that calls {\tt bdd\_apply(l,r,bddop\_and)}. *} +RETURN {* The logical 'and' of {\tt l} and {\tt r}. *} +ALSO {* bdd\_apply, bdd\_or, bdd\_xor *} +*/ +BDD bdd_and(BDD l, BDD r) +{ + return bdd_apply(l,r,bddop_and); +} + + +/* +NAME {* bdd\_or *} +SECTION {* operator *} +SHORT {* The logical 'or' of two BDDs *} +PROTO {* BDD bdd_or(BDD l, BDD r) *} +DESCR {* This a wrapper that calls {\tt bdd\_apply(l,r,bddop\_or)}. *} +RETURN {* The logical 'or' of {\tt l} and {\tt r}. *} +ALSO {* bdd\_apply, bdd\_xor, bdd\_and *} +*/ +BDD bdd_or(BDD l, BDD r) +{ + return bdd_apply(l,r,bddop_or); +} + + +/* +NAME {* bdd\_xor *} +SECTION {* operator *} +SHORT {* The logical 'xor' of two BDDs *} +PROTO {* BDD bdd_xor(BDD l, BDD r) *} +DESCR {* This a wrapper that calls {\tt bdd\_apply(l,r,bddop\_xor)}. *} +RETURN {* The logical 'xor' of {\tt l} and {\tt r}. *} +ALSO {* bdd\_apply, bdd\_or, bdd\_and *} +*/ +BDD bdd_xor(BDD l, BDD r) +{ + return bdd_apply(l,r,bddop_xor); +} + + +/* +NAME {* bdd\_imp *} +SECTION {* operator *} +SHORT {* The logical 'implication' between two BDDs *} +PROTO {* BDD bdd_imp(BDD l, BDD r) *} +DESCR {* This a wrapper that calls {\tt bdd\_apply(l,r,bddop\_imp)}. *} +RETURN {* The logical 'implication' of {\tt l} and {\tt r} ($l \Rightarrow r$). *} +ALSO {* bdd\_apply, bdd\_biimp *} +*/ +BDD bdd_imp(BDD l, BDD r) +{ + return bdd_apply(l,r,bddop_imp); +} + + +/* +NAME {* bdd\_biimp *} +SECTION {* operator *} +SHORT {* The logical 'bi-implication' between two BDDs *} +PROTO {* BDD bdd_biimp(BDD l, BDD r) *} +DESCR {* This a wrapper that calls {\tt bdd\_apply(l,r,bddop\_biimp)}. *} +RETURN {* The logical 'bi-implication' of {\tt l} and {\tt r} ($l \Leftrightarrow r$). *} +ALSO {* bdd\_apply, bdd\_imp *} +*/ +BDD bdd_biimp(BDD l, BDD r) +{ + return bdd_apply(l,r,bddop_biimp); +} + + +/*=== ITE ==============================================================*/ + +/* +NAME {* bdd\_ite *} +SECTION {* operator *} +SHORT {* if-then-else operator *} +PROTO {* BDD bdd_ite(BDD f, BDD g, BDD h) *} +DESCR {* Calculates the BDD for the expression + $(f \conj g) \disj (\neg f \conj h)$ more efficiently than doing + the three operations separately. {\tt bdd\_ite} can also be used + for conjunction, disjunction and any other boolean operator, but + is not as efficient for the binary and unary operations. *} +RETURN {* The BDD for $(f \conj g) \disj (\neg f \conj h)$ *} +ALSO {* bdd\_apply *} +*/ +BDD bdd_ite(BDD f, BDD g, BDD h) +{ + BDD res; + firstReorder = 1; + + CHECKa(f, bddfalse); + CHECKa(g, bddfalse); + CHECKa(h, bddfalse); + + again: + if (setjmp(bddexception) == 0) + { + INITREF; + + if (!firstReorder) + bdd_disable_reorder(); + res = ite_rec(f,g,h); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +static BDD ite_rec(BDD f, BDD g, BDD h) +{ + BddCacheData *entry; + BDD res; + + if (ISONE(f)) + return g; + if (ISZERO(f)) + return h; + if (g == h) + return g; + if (ISONE(g) && ISZERO(h)) + return f; + if (ISZERO(g) && ISONE(h)) + return not_rec(f); + + entry = BddCache_lookup(&itecache, ITEHASH(f,g,h)); + if (entry->a == f && entry->b == g && entry->c == h) + { +#ifdef CACHESTATS + bddcachestats.opHit++; +#endif + return entry->r.res; + } +#ifdef CACHESTATS + bddcachestats.opMiss++; +#endif + + if (LEVEL(f) == LEVEL(g)) + { + if (LEVEL(f) == LEVEL(h)) + { + PUSHREF( ite_rec(LOW(f), LOW(g), LOW(h)) ); + PUSHREF( ite_rec(HIGH(f), HIGH(g), HIGH(h)) ); + res = bdd_makenode(LEVEL(f), READREF(2), READREF(1)); + } + else + if (LEVEL(f) < LEVEL(h)) + { + PUSHREF( ite_rec(LOW(f), LOW(g), h) ); + PUSHREF( ite_rec(HIGH(f), HIGH(g), h) ); + res = bdd_makenode(LEVEL(f), READREF(2), READREF(1)); + } + else /* f > h */ + { + PUSHREF( ite_rec(f, g, LOW(h)) ); + PUSHREF( ite_rec(f, g, HIGH(h)) ); + res = bdd_makenode(LEVEL(h), READREF(2), READREF(1)); + } + } + else + if (LEVEL(f) < LEVEL(g)) + { + if (LEVEL(f) == LEVEL(h)) + { + PUSHREF( ite_rec(LOW(f), g, LOW(h)) ); + PUSHREF( ite_rec(HIGH(f), g, HIGH(h)) ); + res = bdd_makenode(LEVEL(f), READREF(2), READREF(1)); + } + else + if (LEVEL(f) < LEVEL(h)) + { + PUSHREF( ite_rec(LOW(f), g, h) ); + PUSHREF( ite_rec(HIGH(f), g, h) ); + res = bdd_makenode(LEVEL(f), READREF(2), READREF(1)); + } + else /* f > h */ + { + PUSHREF( ite_rec(f, g, LOW(h)) ); + PUSHREF( ite_rec(f, g, HIGH(h)) ); + res = bdd_makenode(LEVEL(h), READREF(2), READREF(1)); + } + } + else /* f > g */ + { + if (LEVEL(g) == LEVEL(h)) + { + PUSHREF( ite_rec(f, LOW(g), LOW(h)) ); + PUSHREF( ite_rec(f, HIGH(g), HIGH(h)) ); + res = bdd_makenode(LEVEL(g), READREF(2), READREF(1)); + } + else + if (LEVEL(g) < LEVEL(h)) + { + PUSHREF( ite_rec(f, LOW(g), h) ); + PUSHREF( ite_rec(f, HIGH(g), h) ); + res = bdd_makenode(LEVEL(g), READREF(2), READREF(1)); + } + else /* g > h */ + { + PUSHREF( ite_rec(f, g, LOW(h)) ); + PUSHREF( ite_rec(f, g, HIGH(h)) ); + res = bdd_makenode(LEVEL(h), READREF(2), READREF(1)); + } + } + + POPREF(2); + + entry->a = f; + entry->b = g; + entry->c = h; + entry->r.res = res; + + return res; +} + + +/*=== RESTRICT =========================================================*/ + +/* +NAME {* bdd\_restrict *} +SECTION {* operator *} +SHORT {* restric a set of variables to constant values *} +PROTO {* BDD bdd_restrict(BDD r, BDD var) *} +DESCR {* This function restricts the variables in {\tt r} to constant + true or false. How this is done + depends on how the variables are included in the variable set + {\tt var}. If they + are included in their positive form then they are restricted to + true and vice versa. Unfortunately it is not possible to + insert variables in their negated form using {\tt bdd\_makeset}, + so the variable set has to be build manually as a + conjunction of the variables. Example: Assume variable 1 should be + restricted to true and variable 3 to false. + \begin{verbatim} + bdd X = make_user_bdd(); + bdd R1 = bdd_ithvar(1); + bdd R2 = bdd_nithvar(3); + bdd R = bdd_addref( bdd_apply(R1,R2, bddop_and) ); + bdd RES = bdd_addref( bdd_restrict(X,R) ); +\end{verbatim} + *} +RETURN {* The restricted bdd. *} +ALSO {* bdd\_makeset, bdd\_exist, bdd\_forall *} +*/ +BDD bdd_restrict(BDD r, BDD var) +{ + BDD res; + firstReorder = 1; + + CHECKa(r,bddfalse); + CHECKa(var,bddfalse); + + if (var < 2) /* Empty set */ + return r; + + again: + if (setjmp(bddexception) == 0) + { + if (varset2svartable(var) < 0) + return bddfalse; + + INITREF; + miscid = (var << 3) | CACHEID_RESTRICT; + + if (!firstReorder) + bdd_disable_reorder(); + res = restrict_rec(r); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +static int restrict_rec(int r) +{ + BddCacheData *entry; + int res; + + if (ISCONST(r) || LEVEL(r) > quantlast) + return r; + + entry = BddCache_lookup(&misccache, RESTRHASH(r,miscid)); + if (entry->a == r && entry->c == miscid) + { +#ifdef CACHESTATS + bddcachestats.opHit++; +#endif + return entry->r.res; + } +#ifdef CACHESTATS + bddcachestats.opMiss++; +#endif + + if (INSVARSET(LEVEL(r))) + { + if (quantvarset[LEVEL(r)] > 0) + res = restrict_rec(HIGH(r)); + else + res = restrict_rec(LOW(r)); + } + else + { + PUSHREF( restrict_rec(LOW(r)) ); + PUSHREF( restrict_rec(HIGH(r)) ); + res = bdd_makenode(LEVEL(r), READREF(2), READREF(1)); + POPREF(2); + } + + entry->a = r; + entry->c = miscid; + entry->r.res = res; + + return res; +} + + +/*=== GENERALIZED COFACTOR =============================================*/ + +/* +NAME {* bdd\_constrain *} +SECTION {* operator *} +SHORT {* generalized cofactor *} +PROTO {* BDD bdd_constrain(BDD f, BDD c) *} +DESCR {* Computes the generalized cofactor of {\tt f} with respect to + {\tt c}. *} +RETURN {* The constrained BDD *} +ALSO {* bdd\_restrict, bdd\_simplify *} +*/ +BDD bdd_constrain(BDD f, BDD c) +{ + BDD res; + firstReorder = 1; + + CHECKa(f,bddfalse); + CHECKa(c,bddfalse); + + again: + if (setjmp(bddexception) == 0) + { + INITREF; + miscid = CACHEID_CONSTRAIN; + + if (!firstReorder) + bdd_disable_reorder(); + res = constrain_rec(f, c); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +static BDD constrain_rec(BDD f, BDD c) +{ + BddCacheData *entry; + BDD res; + + if (ISONE(c)) + return f; + if (ISCONST(f)) + return f; + if (c == f) + return BDDONE; + if (ISZERO(c)) + return BDDZERO; + + entry = BddCache_lookup(&misccache, CONSTRAINHASH(f,c)); + if (entry->a == f && entry->b == c && entry->c == miscid) + { +#ifdef CACHESTATS + bddcachestats.opHit++; +#endif + return entry->r.res; + } +#ifdef CACHESTATS + bddcachestats.opMiss++; +#endif + + if (LEVEL(f) == LEVEL(c)) + { + if (ISZERO(LOW(c))) + res = constrain_rec(HIGH(f), HIGH(c)); + else if (ISZERO(HIGH(c))) + res = constrain_rec(LOW(f), LOW(c)); + else + { + PUSHREF( constrain_rec(LOW(f), LOW(c)) ); + PUSHREF( constrain_rec(HIGH(f), HIGH(c)) ); + res = bdd_makenode(LEVEL(f), READREF(2), READREF(1)); + POPREF(2); + } + } + else + if (LEVEL(f) < LEVEL(c)) + { + PUSHREF( constrain_rec(LOW(f), c) ); + PUSHREF( constrain_rec(HIGH(f), c) ); + res = bdd_makenode(LEVEL(f), READREF(2), READREF(1)); + POPREF(2); + } + else + { + if (ISZERO(LOW(c))) + res = constrain_rec(f, HIGH(c)); + else if (ISZERO(HIGH(c))) + res = constrain_rec(f, LOW(c)); + else + { + PUSHREF( constrain_rec(f, LOW(c)) ); + PUSHREF( constrain_rec(f, HIGH(c)) ); + res = bdd_makenode(LEVEL(c), READREF(2), READREF(1)); + POPREF(2); + } + } + + entry->a = f; + entry->b = c; + entry->c = miscid; + entry->r.res = res; + + return res; +} + + +/*=== REPLACE ==========================================================*/ + +/* +NAME {* bdd\_replace *} +SECTION {* operator *} +SHORT {* replaces variables with other variables *} +PROTO {* BDD bdd_replace(BDD r, bddPair *pair) *} +DESCR {* Replaces all variables in the BDD {\tt r} with the variables + defined by {\tt pair}. Each entry in {\tt pair} consists of a + old and a new variable. Whenever the old variable is found in + {\tt r} then a new node with the new variable is inserted instead. + *} +ALSO {* bdd\_newpair, bdd\_setpair, bdd\_setpairs *} +RETURN {* The result of the operation. *} +*/ +BDD bdd_replace(BDD r, bddPair *pair) +{ + BDD res; + firstReorder = 1; + + CHECKa(r, bddfalse); + + again: + if (setjmp(bddexception) == 0) + { + INITREF; + replacepair = pair->result; + replacelast = pair->last; + replaceid = (pair->id << 2) | CACHEID_REPLACE; + + if (!firstReorder) + bdd_disable_reorder(); + res = replace_rec(r); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +static BDD replace_rec(BDD r) +{ + BddCacheData *entry; + BDD res; + + if (ISCONST(r) || LEVEL(r) > replacelast) + return r; + + entry = BddCache_lookup(&replacecache, REPLACEHASH(r)); + if (entry->a == r && entry->c == replaceid) + { +#ifdef CACHESTATS + bddcachestats.opHit++; +#endif + return entry->r.res; + } +#ifdef CACHESTATS + bddcachestats.opMiss++; +#endif + + PUSHREF( replace_rec(LOW(r)) ); + PUSHREF( replace_rec(HIGH(r)) ); + + res = bdd_correctify(LEVEL(replacepair[LEVEL(r)]), READREF(2), READREF(1)); + POPREF(2); + + entry->a = r; + entry->c = replaceid; + entry->r.res = res; + + return res; +} + + +static BDD bdd_correctify(int level, BDD l, BDD r) +{ + BDD res; + + if (level < LEVEL(l) && level < LEVEL(r)) + return bdd_makenode(level, l, r); + + if (level == LEVEL(l) || level == LEVEL(r)) + { + bdd_error(BDD_REPLACE); + return 0; + } + + if (LEVEL(l) == LEVEL(r)) + { + PUSHREF( bdd_correctify(level, LOW(l), LOW(r)) ); + PUSHREF( bdd_correctify(level, HIGH(l), HIGH(r)) ); + res = bdd_makenode(LEVEL(l), READREF(2), READREF(1)); + } + else + if (LEVEL(l) < LEVEL(r)) + { + PUSHREF( bdd_correctify(level, LOW(l), r) ); + PUSHREF( bdd_correctify(level, HIGH(l), r) ); + res = bdd_makenode(LEVEL(l), READREF(2), READREF(1)); + } + else + { + PUSHREF( bdd_correctify(level, l, LOW(r)) ); + PUSHREF( bdd_correctify(level, l, HIGH(r)) ); + res = bdd_makenode(LEVEL(r), READREF(2), READREF(1)); + } + POPREF(2); + + return res; /* FIXME: cache ? */ +} + + +/*=== COMPOSE ==========================================================*/ + +/* +NAME {* bdd\_compose *} +SECTION {* operator *} +SHORT {* functional composition *} +PROTO {* BDD bdd_compose(BDD f, BDD g, int var) *} +DESCR {* Substitutes the variable {\tt var} with the BDD {\tt g} in + the BDD {\tt f}: result $= f[g/var]$. *} +RETURN {* The composed BDD *} +ALSO {* bdd\_veccompose, bdd\_replace, bdd\_restrict *} +*/ +BDD bdd_compose(BDD f, BDD g, int var) +{ + BDD res; + firstReorder = 1; + + CHECKa(f, bddfalse); + CHECKa(g, bddfalse); + if (var < 0 || var >= bddvarnum) + { + bdd_error(BDD_VAR); + return bddfalse; + } + + again: + if (setjmp(bddexception) == 0) + { + INITREF; + composelevel = bddvar2level[var]; + replaceid = (composelevel << 2) | CACHEID_COMPOSE; + + if (!firstReorder) + bdd_disable_reorder(); + res = compose_rec(f, g); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +static BDD compose_rec(BDD f, BDD g) +{ + BddCacheData *entry; + BDD res; + + if (LEVEL(f) > composelevel) + return f; + + entry = BddCache_lookup(&replacecache, COMPOSEHASH(f,g)); + if (entry->a == f && entry->b == g && entry->c == replaceid) + { +#ifdef CACHESTATS + bddcachestats.opHit++; +#endif + return entry->r.res; + } +#ifdef CACHESTATS + bddcachestats.opMiss++; +#endif + + if (LEVEL(f) < composelevel) + { + if (LEVEL(f) == LEVEL(g)) + { + PUSHREF( compose_rec(LOW(f), LOW(g)) ); + PUSHREF( compose_rec(HIGH(f), HIGH(g)) ); + res = bdd_makenode(LEVEL(f), READREF(2), READREF(1)); + } + else + if (LEVEL(f) < LEVEL(g)) + { + PUSHREF( compose_rec(LOW(f), g) ); + PUSHREF( compose_rec(HIGH(f), g) ); + res = bdd_makenode(LEVEL(f), READREF(2), READREF(1)); + } + else + { + PUSHREF( compose_rec(f, LOW(g)) ); + PUSHREF( compose_rec(f, HIGH(g)) ); + res = bdd_makenode(LEVEL(g), READREF(2), READREF(1)); + } + POPREF(2); + } + else + /*if (LEVEL(f) == composelevel) changed 2-nov-98 */ + { + res = ite_rec(g, HIGH(f), LOW(f)); + } + + entry->a = f; + entry->b = g; + entry->c = replaceid; + entry->r.res = res; + + return res; +} + + +/* +NAME {* bdd\_veccompose *} +SECTION {* operator *} +SHORT {* simultaneous functional composition *} +PROTO {* BDD bdd_veccompose(BDD f, bddPair *pair) *} +DESCR {* Uses the pairs of variables and BDDs in {\tt pair} to make + the simultaneous substitution: $f[g_1/V_1, \ldots, g_n/V_n]$. + In this way one or more BDDs + may be substituted in one step. The BDDs in + {\tt pair} may depend on the variables they are substituting. + {\tt bdd\_compose} may be used instead of + {\tt bdd\_replace} but is not as efficient when $g_i$ is a + single variable, the same applies to {\tt bdd\_restrict}. + Note that simultaneous substitution is not necessarily the same + as repeated substitution. Example: + $(x_1 \disj x_2)[x_3/x_1,x_4/x_3] = (x_3 \disj x_2) \neq + ((x_1 \disj x_2)[x_3/x_1])[x_4/x_3] = (x_4 \disj x_2)$. *} +RETURN {* The composed BDD *} +ALSO {* bdd\_compose, bdd\_replace, bdd\_restrict *} +*/ +BDD bdd_veccompose(BDD f, bddPair *pair) +{ + BDD res; + firstReorder = 1; + + CHECKa(f, bddfalse); + + again: + if (setjmp(bddexception) == 0) + { + INITREF; + replacepair = pair->result; + replaceid = (pair->id << 2) | CACHEID_VECCOMPOSE; + replacelast = pair->last; + + if (!firstReorder) + bdd_disable_reorder(); + res = veccompose_rec(f); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +static BDD veccompose_rec(BDD f) +{ + BddCacheData *entry; + register BDD res; + + if (LEVEL(f) > replacelast) + return f; + + entry = BddCache_lookup(&replacecache, VECCOMPOSEHASH(f)); + if (entry->a == f && entry->c == replaceid) + { +#ifdef CACHESTATS + bddcachestats.opHit++; +#endif + return entry->r.res; + } +#ifdef CACHESTATS + bddcachestats.opMiss++; +#endif + + PUSHREF( veccompose_rec(LOW(f)) ); + PUSHREF( veccompose_rec(HIGH(f)) ); + res = ite_rec(replacepair[LEVEL(f)], READREF(1), READREF(2)); + POPREF(2); + + entry->a = f; + entry->c = replaceid; + entry->r.res = res; + + return res; +} + + +/*=== SIMPLIFY =========================================================*/ + +/* +NAME {* bdd\_simplify *} +SECTION {* operator *} +SHORT {* coudert and Madre's restrict function *} +PROTO {* BDD bdd_simplify(BDD f, BDD d) *} +DESCR {* Tries to simplify the BDD {\tt f} by restricting it to the + domaine covered by {\tt d}. No checks are done to see if the + result is actually smaller than the input. This can be done + by the user with a call to {\tt bdd\_nodecount}. *} +ALSO {* bdd\_restrict *} +RETURN {* The simplified BDD *} +*/ +BDD bdd_simplify(BDD f, BDD d) +{ + BDD res; + firstReorder = 1; + + CHECKa(f, bddfalse); + CHECKa(d, bddfalse); + + again: + if (setjmp(bddexception) == 0) + { + INITREF; + applyop = bddop_or; + + if (!firstReorder) + bdd_disable_reorder(); + res = simplify_rec(f, d); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +static BDD simplify_rec(BDD f, BDD d) +{ + BddCacheData *entry; + BDD res; + + if (ISONE(d) || ISCONST(f)) + return f; + if (d == f) + return BDDONE; + if (ISZERO(d)) + return BDDZERO; + + entry = BddCache_lookup(&applycache, APPLYHASH(f,d,bddop_simplify)); + + if (entry->a == f && entry->b == d && entry->c == bddop_simplify) + { +#ifdef CACHESTATS + bddcachestats.opHit++; +#endif + return entry->r.res; + } +#ifdef CACHESTATS + bddcachestats.opMiss++; +#endif + + if (LEVEL(f) == LEVEL(d)) + { + if (ISZERO(LOW(d))) + res = simplify_rec(HIGH(f), HIGH(d)); + else + if (ISZERO(HIGH(d))) + res = simplify_rec(LOW(f), LOW(d)); + else + { + PUSHREF( simplify_rec(LOW(f), LOW(d)) ); + PUSHREF( simplify_rec(HIGH(f), HIGH(d)) ); + res = bdd_makenode(LEVEL(f), READREF(2), READREF(1)); + POPREF(2); + } + } + else + if (LEVEL(f) < LEVEL(d)) + { + PUSHREF( simplify_rec(LOW(f), d) ); + PUSHREF( simplify_rec(HIGH(f), d) ); + res = bdd_makenode(LEVEL(f), READREF(2), READREF(1)); + POPREF(2); + } + else /* LEVEL(d) < LEVEL(f) */ + { + PUSHREF( apply_rec(LOW(d), HIGH(d)) ); /* Exist quant */ + res = simplify_rec(f, READREF(1)); + POPREF(1); + } + + entry->a = f; + entry->b = d; + entry->c = bddop_simplify; + entry->r.res = res; + + return res; +} + + +/*=== QUANTIFICATION ===================================================*/ + +/* +NAME {* bdd\_exist *} +SECTION {* operator *} +SHORT {* existential quantification of variables *} +PROTO {* BDD bdd_exist(BDD r, BDD var) *} +DESCR {* Removes all occurences in {\tt r} of variables in the set + {\tt var} by existential quantification. *} +ALSO {* bdd\_forall, bdd\_unique, bdd\_makeset *} +RETURN {* The quantified BDD. *} +*/ +BDD bdd_exist(BDD r, BDD var) +{ + BDD res; + firstReorder = 1; + + CHECKa(r, bddfalse); + CHECKa(var, bddfalse); + + if (var < 2) /* Empty set */ + return r; + + again: + if (setjmp(bddexception) == 0) + { + if (varset2vartable(var) < 0) + return bddfalse; + + INITREF; + quantid = (var << 3) | CACHEID_EXIST; /* FIXME: range */ + applyop = bddop_or; + + if (!firstReorder) + bdd_disable_reorder(); + res = quant_rec(r); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +/* +NAME {* bdd\_forall *} +SECTION {* operator *} +SHORT {* universal quantification of variables *} +PROTO {* BDD bdd_forall(BDD r, BDD var) *} +DESCR {* Removes all occurences in {\tt r} of variables in the set + {\tt var} by universal quantification. *} +ALSO {* bdd\_exist, bdd\_unique, bdd\_makeset *} +RETURN {* The quantified BDD. *} +*/ +BDD bdd_forall(BDD r, BDD var) +{ + BDD res; + firstReorder = 1; + + CHECKa(r, bddfalse); + CHECKa(var, bddfalse); + + if (var < 2) /* Empty set */ + return r; + + again: + if (setjmp(bddexception) == 0) + { + if (varset2vartable(var) < 0) + return bddfalse; + + INITREF; + quantid = (var << 3) | CACHEID_FORALL; + applyop = bddop_and; + + if (!firstReorder) + bdd_disable_reorder(); + res = quant_rec(r); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +/* +NAME {* bdd\_unique *} +SECTION {* operator *} +SHORT {* unique quantification of variables *} +PROTO {* BDD bdd_unique(BDD r, BDD var) *} +DESCR {* Removes all occurences in {\tt r} of variables in the set + {\tt var} by unique quantification. This type of quantification + uses a XOR operator instead of an OR operator as in the + existential quantification, and an AND operator as in the + universal quantification. *} +ALSO {* bdd\_exist, bdd\_forall, bdd\_makeset *} +RETURN {* The quantified BDD. *} +*/ +BDD bdd_unique(BDD r, BDD var) +{ + BDD res; + firstReorder = 1; + + CHECKa(r, bddfalse); + CHECKa(var, bddfalse); + + if (var < 2) /* Empty set */ + return r; + + again: + if (setjmp(bddexception) == 0) + { + if (varset2vartable(var) < 0) + return bddfalse; + + INITREF; + quantid = (var << 3) | CACHEID_UNIQUE; + applyop = bddop_xor; + + if (!firstReorder) + bdd_disable_reorder(); + res = quant_rec(r); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +static int quant_rec(int r) +{ + BddCacheData *entry; + int res; + + if (r < 2 || LEVEL(r) > quantlast) + return r; + + entry = BddCache_lookup(&quantcache, QUANTHASH(r)); + if (entry->a == r && entry->c == quantid) + { +#ifdef CACHESTATS + bddcachestats.opHit++; +#endif + return entry->r.res; + } +#ifdef CACHESTATS + bddcachestats.opMiss++; +#endif + + PUSHREF( quant_rec(LOW(r)) ); + PUSHREF( quant_rec(HIGH(r)) ); + + if (INVARSET(LEVEL(r))) + res = apply_rec(READREF(2), READREF(1)); + else + res = bdd_makenode(LEVEL(r), READREF(2), READREF(1)); + + POPREF(2); + + entry->a = r; + entry->c = quantid; + entry->r.res = res; + + return res; +} + +/* +NAME {* bdd\_project *} +SECTION {* operator *} +SHORT {* projection by quantification of variables *} +PROTO {* BDD bdd_project(BDD r, BDD var) *} +DESCR {* Removes all occurences in {\tt r} of variables in the set + {\tt var} by existential quantification of variables not + in {\tt var}. *} +ALSO {* bdd\_forall, bdd\_unique, bdd\_makeset *} +RETURN {* The quantified BDD. *} +*/ +BDD bdd_project(BDD r, BDD var) +{ + BDD res; + firstReorder = 1; + + CHECKa(r, bddfalse); + CHECKa(var, bddfalse); + + if (var < 2) /* Empty set */ + return r; + + again: + if (setjmp(bddexception) == 0) + { + if (varset2vartable(var) < 0) + return bddfalse; + + INITREF; + quantid = (var << 3) | CACHEID_PROJECT; + applyop = bddop_or; + + if (!firstReorder) + bdd_disable_reorder(); + res = project_rec(r); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + +static int project_rec(int r) +{ + BddCacheData *entry; + int res; + + if (r < 2) + return r; + if (LEVEL(r) > quantlast) + return BDDONE; + + entry = BddCache_lookup(&quantcache, QUANTHASH(r)); + if (entry->a == r && entry->c == quantid) + { +#ifdef CACHESTATS + bddcachestats.opHit++; +#endif + return entry->r.res; + } +#ifdef CACHESTATS + bddcachestats.opMiss++; +#endif + + PUSHREF( project_rec(LOW(r)) ); + PUSHREF( project_rec(HIGH(r)) ); + + if (INVARSET(LEVEL(r))) + res = bdd_makenode(LEVEL(r), READREF(2), READREF(1)); + else + res = apply_rec(READREF(2), READREF(1)); + + POPREF(2); + + entry->a = r; + entry->c = quantid; + entry->r.res = res; + + return res; +} + + +/*=== APPLY & QUANTIFY =================================================*/ + +/* +NAME {* bdd\_appex *} +SECTION {* operator *} +SHORT {* apply operation and existential quantification *} +PROTO {* BDD bdd_appex(BDD left, BDD right, int opr, BDD var) *} +DESCR {* Applies the binary operator {\tt opr} to the arguments + {\tt left} and {\tt right} and then performs an existential + quantification of the variables from the variable set + {\tt var}. This is done in a bottom up manner such that both the + apply and quantification is done on the lower nodes before + stepping up to the higher nodes. This makes the {\tt bdd\_appex} + function much more efficient than an apply operation followed + by a quantification. If the operator is a conjunction then this + is similar to the relational product of the two BDDs. + \index{relational product} *} +ALSO {* bdd\_appall, bdd\_appuni, bdd\_apply, bdd\_exist, bdd\_forall, bdd\_unique, bdd\_makeset *} +RETURN {* The result of the operation. *} +*/ +BDD bdd_appex(BDD l, BDD r, int opr, BDD var) +{ + BDD res; + firstReorder = 1; + + CHECKa(l, bddfalse); + CHECKa(r, bddfalse); + CHECKa(var, bddfalse); + + if (opr<0 || opr>bddop_invimp) + { + bdd_error(BDD_OP); + return bddfalse; + } + + if (var < 2) /* Empty set */ + return bdd_apply(l,r,opr); + + again: + if (setjmp(bddexception) == 0) + { + if (varset2vartable(var) < 0) + return bddfalse; + + INITREF; + applyop = bddop_or; + appexop = opr; + appexid = (var << 5) | (appexop << 1); /* FIXME: range! */ + quantid = (appexid << 3) | CACHEID_APPEX; + + if (!firstReorder) + bdd_disable_reorder(); + res = appquant_rec(l, r); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +/* +NAME {* bdd\_appall *} +SECTION {* operator *} +SHORT {* apply operation and universal quantification *} +PROTO {* BDD bdd_appall(BDD left, BDD right, int opr, BDD var) *} +DESCR {* Applies the binary operator {\tt opr} to the arguments + {\tt left} and {\tt right} and then performs an universal + quantification of the variables from the variable set + {\tt var}. This is done in a bottom up manner such that both the + apply and quantification is done on the lower nodes before + stepping up to the higher nodes. This makes the {\tt bdd\_appall} + function much more efficient than an apply operation followed + by a quantification. *} +ALSO {* bdd\_appex, bdd\_appuni, bdd\_apply, bdd\_exist, bdd\_forall, bdd\_unique, bdd\_makeset *} +RETURN {* The result of the operation. *} +*/ +BDD bdd_appall(BDD l, BDD r, int opr, BDD var) +{ + BDD res; + firstReorder = 1; + + CHECKa(l, bddfalse); + CHECKa(r, bddfalse); + CHECKa(var, bddfalse); + + if (opr<0 || opr>bddop_invimp) + { + bdd_error(BDD_OP); + return bddfalse; + } + + if (var < 2) /* Empty set */ + return bdd_apply(l,r,opr); + + again: + if (setjmp(bddexception) == 0) + { + if (varset2vartable(var) < 0) + return bddfalse; + + INITREF; + applyop = bddop_and; + appexop = opr; + appexid = (var << 5) | (appexop << 1) | 1; /* FIXME: range! */ + quantid = (appexid << 3) | CACHEID_APPAL; + + if (!firstReorder) + bdd_disable_reorder(); + res = appquant_rec(l, r); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +/* +NAME {* bdd\_appuni *} +SECTION {* operator *} +SHORT {* apply operation and unique quantification *} +PROTO {* BDD bdd_appuni(BDD left, BDD right, int opr, BDD var) *} +DESCR {* Applies the binary operator {\tt opr} to the arguments + {\tt left} and {\tt right} and then performs a unique + quantification of the variables from the variable set + {\tt var}. This is done in a bottom up manner such that both the + apply and quantification is done on the lower nodes before + stepping up to the higher nodes. This makes the {\tt bdd\_appuni} + function much more efficient than an apply operation followed + by a quantification. *} +ALSO {* bdd\_appex, bdd\_appall, bdd\_apply, bdd\_exist, bdd\_unique, bdd\_forall, bdd\_makeset *} +RETURN {* The result of the operation. *} +*/ +BDD bdd_appuni(BDD l, BDD r, int opr, BDD var) +{ + BDD res; + firstReorder = 1; + + CHECKa(l, bddfalse); + CHECKa(r, bddfalse); + CHECKa(var, bddfalse); + + if (opr<0 || opr>bddop_invimp) + { + bdd_error(BDD_OP); + return bddfalse; + } + + if (var < 2) /* Empty set */ + return bdd_apply(l,r,opr); + + again: + if (setjmp(bddexception) == 0) + { + if (varset2vartable(var) < 0) + return bddfalse; + + INITREF; + applyop = bddop_xor; + appexop = opr; + appexid = (var << 5) | (appexop << 1) | 1; /* FIXME: range! */ + quantid = (appexid << 3) | CACHEID_APPUN; + + if (!firstReorder) + bdd_disable_reorder(); + res = appquant_rec(l, r); + if (!firstReorder) + bdd_enable_reorder(); + } + else + { + bdd_checkreorder(); + + if (firstReorder-- == 1) + goto again; + res = BDDZERO; /* avoid warning about res being uninitialized */ + } + + checkresize(); + return res; +} + + +static int appquant_rec(int l, int r) +{ + BddCacheData *entry; + int res; + + switch (appexop) + { + case bddop_and: + if (l == 0 || r == 0) + return 0; + if (l == r) + return quant_rec(l); + if (l == 1) + return quant_rec(r); + if (r == 1) + return quant_rec(l); + break; + case bddop_or: + if (l == 1 || r == 1) + return 1; + if (l == r) + return quant_rec(l); + if (l == 0) + return quant_rec(r); + if (r == 0) + return quant_rec(l); + break; + case bddop_xor: + if (l == r) + return 0; + if (l == 0) + return quant_rec(r); + if (r == 0) + return quant_rec(l); + break; + case bddop_nand: + if (l == 0 || r == 0) + return 1; + break; + case bddop_nor: + if (l == 1 || r == 1) + return 0; + break; + } + + if (ISCONST(l) && ISCONST(r)) + res = oprres[appexop][(l<<1) | r]; + else + if (LEVEL(l) > quantlast && LEVEL(r) > quantlast) + { + int oldop = applyop; + applyop = appexop; + res = apply_rec(l,r); + applyop = oldop; + } + else + { + entry = BddCache_lookup(&appexcache, APPEXHASH(l,r,appexop)); + if (entry->a == l && entry->b == r && entry->c == appexid) + { +#ifdef CACHESTATS + bddcachestats.opHit++; +#endif + return entry->r.res; + } +#ifdef CACHESTATS + bddcachestats.opMiss++; +#endif + + if (LEVEL(l) == LEVEL(r)) + { + PUSHREF( appquant_rec(LOW(l), LOW(r)) ); + PUSHREF( appquant_rec(HIGH(l), HIGH(r)) ); + if (INVARSET(LEVEL(l))) + res = apply_rec(READREF(2), READREF(1)); + else + res = bdd_makenode(LEVEL(l), READREF(2), READREF(1)); + } + else + if (LEVEL(l) < LEVEL(r)) + { + PUSHREF( appquant_rec(LOW(l), r) ); + PUSHREF( appquant_rec(HIGH(l), r) ); + if (INVARSET(LEVEL(l))) + res = apply_rec(READREF(2), READREF(1)); + else + res = bdd_makenode(LEVEL(l), READREF(2), READREF(1)); + } + else + { + PUSHREF( appquant_rec(l, LOW(r)) ); + PUSHREF( appquant_rec(l, HIGH(r)) ); + if (INVARSET(LEVEL(r))) + res = apply_rec(READREF(2), READREF(1)); + else + res = bdd_makenode(LEVEL(r), READREF(2), READREF(1)); + } + + POPREF(2); + + entry->a = l; + entry->b = r; + entry->c = appexid; + entry->r.res = res; + } + + return res; +} + + +/************************************************************************* + Informational functions +*************************************************************************/ + +/*=== SUPPORT ==========================================================*/ + +/* +NAME {* bdd\_support *} +SECTION {* info *} +SHORT {* returns the variable support of a BDD *} +PROTO {* BDD bdd_support(BDD r) *} +DESCR {* Finds all the variables that {\tt r} depends on. That is + the support of {\tt r}. *} +ALSO {* bdd\_makeset *} +RETURN {* A BDD variable set. *} +*/ +BDD bdd_support(BDD r) +{ + static int supportSize = 0; + int n; + int res=1; + + CHECKa(r, bddfalse); + + if (r < 2) + return bddfalse; + + /* On-demand allocation of support set */ + if (supportSet == NULL || supportSize < bddvarnum) + { + if ((supportSet=(int*)malloc(bddvarnum*sizeof(int))) == NULL) + { + bdd_error(BDD_MEMORY); + return bddfalse; + } + memset(supportSet, 0, bddvarnum*sizeof(int)); + supportSize = bddvarnum; + supportID = 0; + } + + /* Update global variables used to speed up bdd_support() + * - instead of always memsetting support to zero, we use + * a change counter. + * - and instead of reading the whole array afterwards, we just + * look from 'min' to 'max' used BDD variables. + */ + if (supportID == 0x0FFFFFFF) + { + /* We probably don't get here -- but let's just be sure */ + memset(supportSet, 0, bddvarnum*sizeof(int)); + supportID = 0; + } + ++supportID; + supportMin = LEVEL(r); + supportMax = supportMin; + + support_rec(r, supportSet); + bdd_unmark(r); + + bdd_disable_reorder(); + + for (n=supportMax ; n>=supportMin ; --n) + if (supportSet[n] == supportID) + { + register BDD tmp; + bdd_addref(res); + tmp = bdd_makenode(n, 0, res); + bdd_delref(res); + res = tmp; + } + + bdd_enable_reorder(); + + return res; +} + + +static void support_rec(int r, int* support) +{ + BddNode *node; + + if (r < 2) + return; + + node = &bddnodes[r]; + if (LEVELp(node) & MARKON || LOWp(node) == -1) + return; + + support[LEVELp(node)] = supportID; + + if (LEVELp(node) > supportMax) + supportMax = LEVELp(node); + + LEVELp(node) |= MARKON; + + support_rec(LOWp(node), support); + support_rec(HIGHp(node), support); +} + + +/*=== ONE SATISFYING VARIABLE ASSIGNMENT ===============================*/ + +/* +NAME {* bdd\_satone *} +SECTION {* operator *} +SHORT {* finds one satisfying variable assignment *} +PROTO {* BDD bdd_satone(BDD r) *} +DESCR {* Finds a BDD with at most one variable at each level. This BDD + implies {\tt r} and is not false unless {\tt r} is + false. *} +ALSO {* bdd\_allsat bdd\_satoneset, bdd\_fullsatone, bdd\_satcount, bdd\_satcountln *} +RETURN {* The result of the operation. *} +*/ +BDD bdd_satone(BDD r) +{ + BDD res; + + CHECKa(r, bddfalse); + if (r < 2) + return r; + + bdd_disable_reorder(); + + INITREF; + res = satone_rec(r); + + bdd_enable_reorder(); + + checkresize(); + return res; +} + + +static BDD satone_rec(BDD r) +{ + if (ISCONST(r)) + return r; + + if (ISZERO(LOW(r))) + { + BDD res = satone_rec(HIGH(r)); + return PUSHREF( bdd_makenode(LEVEL(r), BDDZERO, res) ); + } + else + { + BDD res = satone_rec(LOW(r)); + return PUSHREF( bdd_makenode(LEVEL(r), res, BDDZERO) ); + } +} + + +/* +NAME {* bdd\_satoneset *} +SECTION {* operator *} +SHORT {* finds one satisfying variable assignment *} +PROTO {* BDD bdd_satoneset(BDD r, BDD var, BDD pol) *} +DESCR {* Finds a minterm in {\tt r}. The {\tt var} argument is a + variable set that defines a set of variables that {\em must} be + mentioned in the result. The polarity of these variables in + result---in case they are undefined in {\tt r}---are defined + by the {\tt pol} parameter. If {\tt pol} is the false BDD then + the variables will be in negative form, and otherwise they will + be in positive form. *} +ALSO {* bdd\_allsat bdd\_satone, bdd\_fullsatone, bdd\_satcount, bdd\_satcountln *} +RETURN {* The result of the operation. *} +*/ +BDD bdd_satoneset(BDD r, BDD var, BDD pol) +{ + BDD res; + + CHECKa(r, bddfalse); + if (ISZERO(r)) + return r; + if (!ISCONST(pol)) + { + bdd_error(BDD_ILLBDD); + return bddfalse; + } + + bdd_disable_reorder(); + + INITREF; + satPolarity = pol; + res = satoneset_rec(r, var); + + bdd_enable_reorder(); + + checkresize(); + return res; +} + + +static BDD satoneset_rec(BDD r, BDD var) +{ + if (ISCONST(r) && ISCONST(var)) + return r; + + if (LEVEL(r) < LEVEL(var)) + { + if (ISZERO(LOW(r))) + { + BDD res = satoneset_rec(HIGH(r), var); + return PUSHREF( bdd_makenode(LEVEL(r), BDDZERO, res) ); + } + else + { + BDD res = satoneset_rec(LOW(r), var); + return PUSHREF( bdd_makenode(LEVEL(r), res, BDDZERO) ); + } + } + else if (LEVEL(var) < LEVEL(r)) + { + BDD res = satoneset_rec(r, HIGH(var)); + if (satPolarity == BDDONE) + return PUSHREF( bdd_makenode(LEVEL(var), BDDZERO, res) ); + else + return PUSHREF( bdd_makenode(LEVEL(var), res, BDDZERO) ); + } + else /* LEVEL(r) == LEVEL(var) */ + { + if (ISZERO(LOW(r))) + { + BDD res = satoneset_rec(HIGH(r), HIGH(var)); + return PUSHREF( bdd_makenode(LEVEL(r), BDDZERO, res) ); + } + else + { + BDD res = satoneset_rec(LOW(r), HIGH(var)); + return PUSHREF( bdd_makenode(LEVEL(r), res, BDDZERO) ); + } + } + +} + + +/*=== EXACTLY ONE SATISFYING VARIABLE ASSIGNMENT =======================*/ + +/* +NAME {* bdd\_fullsatone *} +SECTION {* operator *} +SHORT {* finds one satisfying variable assignment *} +PROTO {* BDD bdd_fullsatone(BDD r) *} +DESCR {* Finds a BDD with exactly one variable at all levels. This BDD + implies {\tt r} and is not false unless {\tt r} is + false. *} +ALSO {* bdd\_allsat bdd\_satone, bdd\_satoneset, bdd\_satcount, bdd\_satcountln *} +RETURN {* The result of the operation. *} +*/ +BDD bdd_fullsatone(BDD r) +{ + BDD res; + int v; + + CHECKa(r, bddfalse); + if (r == 0) + return 0; + + bdd_disable_reorder(); + + INITREF; + res = fullsatone_rec(r); + + for (v=LEVEL(r)-1 ; v>=0 ; v--) + { + res = PUSHREF( bdd_makenode(v, res, 0) ); + } + + bdd_enable_reorder(); + + checkresize(); + return res; +} + + +static int fullsatone_rec(int r) +{ + if (r < 2) + return r; + + if (LOW(r) != 0) + { + int res = fullsatone_rec(LOW(r)); + int v; + + for (v=LEVEL(LOW(r))-1 ; v>LEVEL(r) ; v--) + { + res = PUSHREF( bdd_makenode(v, res, 0) ); + } + + return PUSHREF( bdd_makenode(LEVEL(r), res, 0) ); + } + else + { + int res = fullsatone_rec(HIGH(r)); + int v; + + for (v=LEVEL(HIGH(r))-1 ; v>LEVEL(r) ; v--) + { + res = PUSHREF( bdd_makenode(v, res, 0) ); + } + + return PUSHREF( bdd_makenode(LEVEL(r), 0, res) ); + } +} + + +/*=== ALL SATISFYING VARIABLE ASSIGNMENTS ==============================*/ + +/* +NAME {* bdd\_allsat *} +SECTION {* operator *} +SHORT {* finds all satisfying variable assignments *} +PROTO {* BDD bdd_satone(BDD r, bddallsathandler handler) *} +DESCR {* Iterates through all legal variable assignments (those + that make the BDD come true) for the bdd {\tt r} and + calls the callback handler {\tt handler} for each of them. + The array passed to {\tt handler} contains one entry for + each of the globaly defined variables. Each entry is either + 0 if the variable is false, 1 if it is true, and -1 if it + is a don't care. + + The following is an example of a callback handler that + prints 'X' for don't cares, '0' for zero, and '1' for one: + \begin{verbatim} +void allsatPrintHandler(char* varset, int size) +{ + for (int v=0; v=0 ; --v) + allsatProfile[bddlevel2var[v]] = -1; + + allsatHandler = handler; + INITREF; + + allsat_rec(r); + + free(allsatProfile); +} + + +static void allsat_rec(BDD r) +{ + if (ISONE(r)) + { + allsatHandler(allsatProfile, bddvarnum); + return; + } + + if (ISZERO(r)) + return; + + if (!ISZERO(LOW(r))) + { + int v; + + allsatProfile[bddlevel2var[LEVEL(r)]] = 0; + + for (v=LEVEL(LOW(r))-1 ; v>LEVEL(r) ; --v) + { + allsatProfile[bddlevel2var[v]] = -1; + } + + allsat_rec(LOW(r)); + } + + if (!ISZERO(HIGH(r))) + { + int v; + + allsatProfile[bddlevel2var[LEVEL(r)]] = 1; + + for (v=LEVEL(HIGH(r))-1 ; v>LEVEL(r) ; --v) + { + allsatProfile[bddlevel2var[v]] = -1; + } + + allsat_rec(HIGH(r)); + } +} + + +/*=== COUNT NUMBER OF SATISFYING ASSIGNMENT ============================*/ + +/* +NAME {* bdd\_satcount *} +EXTRA {* bdd\_setcountset *} +SECTION {* info *} +SHORT {* calculates the number of satisfying variable assignments *} +PROTO {* double bdd_satcount(BDD r) +double bdd_satcountset(BDD r, BDD varset) *} +DESCR {* Calculates how many possible variable assignments there exists + such that {\tt r} is satisfied (true). All defined + variables are considered in the first version. In the + second version, only the variables in the variable + set {\tt varset} are considered. This makes the function a + {\em lot} slower. *} +ALSO {* bdd\_satone, bdd\_fullsatone, bdd\_satcountln *} +RETURN {* The number of possible assignments. *} +*/ +double bdd_satcount(BDD r) +{ + double size=1; + + CHECKa(r, 0.0); + + miscid = CACHEID_SATCOU; + size = pow(2.0, (double)LEVEL(r)); + + return size * satcount_rec(r); +} + + +double bdd_satcountset(BDD r, BDD varset) +{ + double unused = bddvarnum; + BDD n; + + if (ISCONST(varset) || ISZERO(r)) /* empty set */ + return 0.0; + + for (n=varset ; !ISCONST(n) ; n=HIGH(n)) + unused--; + + unused = bdd_satcount(r) / pow(2.0,unused); + + return unused >= 1.0 ? unused : 1.0; +} + + +static double satcount_rec(int root) +{ + BddCacheData *entry; + BddNode *node; + double size, s; + + if (root < 2) + return root; + + entry = BddCache_lookup(&misccache, SATCOUHASH(root)); + if (entry->a == root && entry->c == miscid) + return entry->r.dres; + + node = &bddnodes[root]; + size = 0; + s = 1; + + s *= pow(2.0, (float)(LEVEL(LOWp(node)) - LEVELp(node) - 1)); + size += s * satcount_rec(LOWp(node)); + + s = 1; + s *= pow(2.0, (float)(LEVEL(HIGHp(node)) - LEVELp(node) - 1)); + size += s * satcount_rec(HIGHp(node)); + + entry->a = root; + entry->c = miscid; + entry->r.dres = size; + + return size; +} + + +/* +NAME {* bdd\_satcountln *} +EXTRA {* bdd\_setcountlnset *} +SECTION {* info *} +SHORT {* calculates the log. number of satisfying variable assignments *} +PROTO {* double bdd_satcountln(BDD r) +double bdd_satcountlnset(BDD r, BDD varset)*} +DESCR {* Calculates how many possible variable assignments there + exists such that {\tt r} is satisfied (true) and returns + the logarithm of this. The result is calculated in such a + manner that it is practically impossible to get an + overflow, which is very possible for {\tt bdd\_satcount} if + the number of defined variables is too large. All defined + variables are considered in the first version. In the + second version, only the variables in the variable + set {\tt varset} are considered. This makes the function + a {\em lot} slower! *} +ALSO {* bdd\_satone, bdd\_fullsatone, bdd\_satcount *} +RETURN {* The logarithm of the number of possible assignments. *} */ +double bdd_satcountln(BDD r) +{ + double size; + + CHECKa(r, 0.0); + + miscid = CACHEID_SATCOULN; + size = satcountln_rec(r); + + if (size >= 0.0) + size += LEVEL(r); + + return size; +} + + +double bdd_satcountlnset(BDD r, BDD varset) +{ + double unused = bddvarnum; + BDD n; + + if (ISCONST(varset)) /* empty set */ + return 0.0; + + for (n=varset ; !ISCONST(n) ; n=HIGH(n)) + unused--; + + unused = bdd_satcountln(r) - unused; + + return unused >= 0.0 ? unused : 0.0; +} + + +static double satcountln_rec(int root) +{ + BddCacheData *entry; + BddNode *node; + double size, s1,s2; + + if (root == 0) + return -1.0; + if (root == 1) + return 0.0; + + entry = BddCache_lookup(&misccache, SATCOUHASH(root)); + if (entry->a == root && entry->c == miscid) + return entry->r.dres; + + node = &bddnodes[root]; + + s1 = satcountln_rec(LOWp(node)); + if (s1 >= 0.0) + s1 += LEVEL(LOWp(node)) - LEVELp(node) - 1; + + s2 = satcountln_rec(HIGHp(node)); + if (s2 >= 0.0) + s2 += LEVEL(HIGHp(node)) - LEVELp(node) - 1; + + if (s1 < 0.0) + size = s2; + else if (s2 < 0.0) + size = s1; + else if (s1 < s2) + size = s2 + log1p(pow(2.0,s1-s2)) / M_LN2; + else + size = s1 + log1p(pow(2.0,s2-s1)) / M_LN2; + + entry->a = root; + entry->c = miscid; + entry->r.dres = size; + + return size; +} + + +/*=== COUNT NUMBER OF ALLOCATED NODES ==================================*/ + +/* +NAME {* bdd\_nodecount *} +SECTION {* info *} +SHORT {* counts the number of nodes used for a BDD *} +PROTO {* int bdd_nodecount(BDD r) *} +DESCR {* Traverses the BDD and counts all distinct nodes that are used + for the BDD. *} +RETURN {* The number of nodes. *} +ALSO {* bdd\_pathcount, bdd\_satcount, bdd\_anodecount *} +*/ +int bdd_nodecount(BDD r) +{ + int num=0; + + CHECK(r); + + bdd_markcount(r, &num); + bdd_unmark(r); + + return num; +} + + +/* +NAME {* bdd\_anodecount *} +SECTION {* info *} +SHORT {* counts the number of shared nodes in an array of BDDs *} +PROTO {* int bdd_anodecount(BDD *r, int num) *} +DESCR {* Traverses all of the BDDs in {\tt r} and counts all distinct nodes + that are used in the BDDs--if a node is used in more than one + BDD then it only counts once. The {\tt num} parameter holds the + size of the array. *} +RETURN {* The number of nodes *} +ALSO {* bdd\_nodecount *} +*/ +int bdd_anodecount(BDD *r, int num) +{ + int n; + int cou=0; + + for (n=0 ; na == r && entry->c == miscid) + return entry->r.dres; + + size = bdd_pathcount_rec(LOW(r)) + bdd_pathcount_rec(HIGH(r)); + + entry->a = r; + entry->c = miscid; + entry->r.dres = size; + + return size; +} + + +/************************************************************************* + Other internal functions +*************************************************************************/ + +static int varset2vartable(BDD r) +{ + BDD n; + + if (r < 2) + return bdd_error(BDD_VARSET); + + quantvarsetID++; + + if (quantvarsetID == INT_MAX) + { + memset(quantvarset, 0, sizeof(int)*bddvarnum); + quantvarsetID = 1; + } + + for (n=r ; n > 1 ; n=HIGH(n)) + { + quantvarset[LEVEL(n)] = quantvarsetID; + quantlast = LEVEL(n); + } + + return 0; +} + + +static int varset2svartable(BDD r) +{ + BDD n; + + if (r < 2) + return bdd_error(BDD_VARSET); + + quantvarsetID++; + + if (quantvarsetID == INT_MAX/2) + { + memset(quantvarset, 0, sizeof(int)*bddvarnum); + quantvarsetID = 1; + } + + for (n=r ; !ISCONST(n) ; ) + { + if (ISZERO(LOW(n))) + { + quantvarset[LEVEL(n)] = quantvarsetID; + n = HIGH(n); + } + else + { + quantvarset[LEVEL(n)] = -quantvarsetID; + n = LOW(n); + } + quantlast = LEVEL(n); + } + + return 0; +} + + +/* EOF */ diff --git a/sdk/buddy-2.4/src/bddtest.cxx b/sdk/buddy-2.4/src/bddtest.cxx new file mode 100644 index 0000000..e2ab42b --- /dev/null +++ b/sdk/buddy-2.4/src/bddtest.cxx @@ -0,0 +1,110 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +#include +#include "bdd.h" +#include "bvec.h" + +using namespace std; + + +#define ERROR(msg) fail(msg, __FILE__, __LINE__) + +static void fail(const string msg, const char* file, int lineNum) +{ + cout << "Error in " << file << "(" << lineNum << "): " << msg << endl; + exit(1); +} + + +static void testSupport(void) +{ + bdd even = bdd_ithvar(0) | bdd_ithvar(2) | bdd_ithvar(4); + bdd odd = bdd_ithvar(1) | bdd_ithvar(3) | bdd_ithvar(5); + + cout << "Testing support\n"; + + bdd s1 = bdd_support(even); + bdd s2 = bdd_support(odd); + + if (s1 != (bdd_ithvar(0) & bdd_ithvar(2) & bdd_ithvar(4))) + ERROR("Support of 'even' failed\n"); + if (s2 != (bdd_ithvar(1) & bdd_ithvar(3) & bdd_ithvar(5))) + ERROR("Support of 'odd' failed\n"); + + /* Try many time in order check that the internal support ID + * is set correctly */ + for (int n=0 ; n<500 ; ++n) + { + s1 = bdd_support(even); + s2 = bdd_support(odd); + + if (s1 != (bdd_ithvar(0) & bdd_ithvar(2) & bdd_ithvar(4))) + ERROR("Support of 'even' failed"); + if (s2 != (bdd_ithvar(1) & bdd_ithvar(3) & bdd_ithvar(5))) + ERROR("Support of 'odd' failed"); + } +} + + +void testBvecIte() +{ + cout << "Testing ITE for vector\n"; + + bdd a = bdd_ithvar(0); + bvec b = bvec_var(3, 1, 2); + bvec c = bvec_var(3, 2, 2); + + bvec res = bvec_ite(a,b,c); + + bdd r0 = bdd_ite( bdd_ithvar(0), bdd_ithvar(1), bdd_ithvar(2) ); + bdd r1 = bdd_ite( bdd_ithvar(0), bdd_ithvar(3), bdd_ithvar(4) ); + bdd r2 = bdd_ite( bdd_ithvar(0), bdd_ithvar(5), bdd_ithvar(6) ); + + if (res[0] != r0) + ERROR("Bit 0 failed."); + if (res[1] != r1) + ERROR("Bit 1 failed."); + if (res[2] != r2) + ERROR("Bit 2 failed."); +} + + +int main(int ac, char** av) +{ + bdd_init(1000,1000); + + bdd_setvarnum(10); + + testSupport(); + testBvecIte(); + + bdd_done(); + return 0; +} diff --git a/sdk/buddy-2.4/src/bddtree.h b/sdk/buddy-2.4/src/bddtree.h new file mode 100644 index 0000000..310c07d --- /dev/null +++ b/sdk/buddy-2.4/src/bddtree.h @@ -0,0 +1,60 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/bddtree.h,v 1.1.1.1 2004/06/25 13:22:26 haimcohen Exp $ + FILE: tree.h + DESCR: Trees for BDD variables + AUTH: Jorn Lind + DATE: (C) march 1998 +*************************************************************************/ + +#ifndef _TREE_H +#define _TREE_H + +typedef struct s_BddTree +{ + int first, last; /* First and last variable in this block */ + int pos; /* Sifting position */ + int *seq; /* Sequence of first...last in the current order */ + char fixed; /* Are the sub-blocks fixed or may they be reordered */ + int id; /* A sequential id number given by addblock */ + struct s_BddTree *next, *prev; + struct s_BddTree *nextlevel; +} BddTree; + +BddTree *bddtree_new(int); +void bddtree_del(BddTree *); +BddTree *bddtree_addrange(BddTree *, int, int, int, int); +void bddtree_print(FILE *, BddTree *, int); + +#endif /* _TREE_H */ + + +/* EOF */ diff --git a/sdk/buddy-2.4/src/buddy-2.4-stamp/buddy-2.4-done b/sdk/buddy-2.4/src/buddy-2.4-stamp/buddy-2.4-done new file mode 100644 index 0000000..e69de29 diff --git a/sdk/buddy-2.4/src/bvec.c b/sdk/buddy-2.4/src/bvec.c new file mode 100644 index 0000000..c2eed95 --- /dev/null +++ b/sdk/buddy-2.4/src/bvec.c @@ -0,0 +1,1355 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/bvec.c,v 1.1.1.1 2004/06/25 13:22:34 haimcohen Exp $ + FILE: bvec.c + DESCR: Boolean vector arithmetics using BDDs + AUTH: Jorn Lind + DATE: (C) may 1999 +*************************************************************************/ +#include +#include "kernel.h" +#include "bvec.h" + +#define DEFAULT(v) { v.bitnum=0; v.bitvec=NULL; } + +/************************************************************************* +*************************************************************************/ + +static bvec bvec_build(int bitnum, int isTrue) +{ + bvec vec; + int n; + + vec.bitvec = NEW(BDD,bitnum); + vec.bitnum = bitnum; + if (!vec.bitvec) + { + bdd_error(BDD_MEMORY); + vec.bitnum = 0; + return vec; + } + + for (n=0 ; n 0) + { + val >>= 1; + bitnum++; + } + + return bitnum; +} +#endif + +/* +NAME {* bvec\_copy *} +SECTION {* bvec *} +SHORT {* create a copy of a bvec *} +PROTO {* bvec bvec_copy(bvec src) *} +DESCR {* Returns a copy of {\tt src}. The result is reference counted. *} +ALSO {* bvec\_con *} +*/ +bvec bvec_copy(bvec src) +{ + bvec dst; + int n; + + if (src.bitnum == 0) + { + DEFAULT(dst); + return dst; + } + + dst = bvec_build(src.bitnum,0); + + for (n=0 ; n> 1; + } + + return v; +} + + +/* +NAME {* bvec\_var *} +SECTION {* bvec *} +SHORT {* build a boolean vector with BDD variables *} +PROTO {* bvec bvec_var(int bitnum, int offset, int step) *} +DESCR {* Builds a boolean vector with the BDD variables $v_1, \ldots, + v_n$ as the elements. Each variable will be the the variabled + numbered {\tt offset + N*step} where {\tt N} ranges from 0 to + {\tt bitnum}-1.*} +RETURN {* The boolean vector (which is already reference counted) *} +ALSO {* bvec\_true, bvec\_false, bvec\_con *} +*/ +bvec bvec_var(int bitnum, int offset, int step) +{ + bvec v; + int n; + + v = bvec_build(bitnum,0); + + for (n=0 ; n=0 ; n--) + if (ISONE(e.bitvec[n])) + val = (val << 1) | 1; + else if (ISZERO(e.bitvec[n])) + val = val << 1; + else + return 0; + + return val; +} + + +/*======================================================================*/ + +/* +NAME {* bvec\_free *} +SECTION {* bvec *} +SHORT {* frees all memory used by a boolean vector *} +PROTO {* void bvec_free(bvec v) *} +DESCR {* Use this function to release any unused boolean vectors. The + decrease of the reference counts on the BDDs in {\tt v} is done + by {\tt bvec\_free}. *} +*/ +void bvec_free(bvec v) +{ + bvec_delref(v); + free(v.bitvec); +} + + +/* +NAME {* bvec\_addref *} +SECTION {* bvec *} +SHORT {* increase reference count of a boolean vector *} +PROTO {* bvec bvec_addref(bvec v) *} +DESCR {* Use this function to increase the reference count of all BDDs + in a {\tt v}. Please note that all boolean vectors returned + from BuDDy are reference counted from the beginning. *} +RETURN {* The boolean vector {\tt v} *} +ALSO {* bvec\_delref *} +*/ +bvec bvec_addref(bvec v) +{ + int n; + + for (n=0 ; n>1); + + if (c & 0x1) + { + res = bvec_add(e, rest); + bvec_free(rest); + } + else + res = rest; + + bvec_free(next); + + return res; +} + + +/* +NAME {* bvec\_mul *} +SECTION {* bvec *} +SHORT {* builds a boolean vector for multiplication *} +PROTO {* bvec bvec_mul(bvec l, bvec r) *} +DESCR {* Builds a boolean vector representing the multiplication + of {\tt l} and {\tt r}. *} +RETURN {* The result of the multiplication (which is already reference counted) *} +ALSO {* bvec\_mulfixed, bvec\_div, bvec\_add, bvec\_shl *} +*/ +bvec bvec_mul(bvec left, bvec right) +{ + int n; + int bitnum = left.bitnum + right.bitnum; + bvec res; + bvec leftshifttmp; + bvec leftshift; + + if (left.bitnum == 0 || right.bitnum == 0) + { + DEFAULT(res); + return res; + } + + res = bvec_false(bitnum); + leftshifttmp = bvec_copy(left); + leftshift = bvec_coerce(bitnum, leftshifttmp); + + /*bvec_delref(leftshifttmp);*/ + bvec_free(leftshifttmp); + + for (n=0 ; n=1 ; m--) + leftshift.bitvec[m] = leftshift.bitvec[m-1]; + leftshift.bitvec[0] = bddfalse; + + /*bvec_delref(added);*/ + bvec_free(added); + } + + /*bvec_delref(leftshift);*/ + bvec_free(leftshift); + + return res; +} + +static void bvec_div_rec(bvec divisor, bvec *remainder, bvec *result, int step) +{ + int n; + BDD isSmaller = bdd_addref( bvec_lte(divisor, *remainder) ); + bvec newResult = bvec_shlfixed( *result, 1, isSmaller ); + bvec zero = bvec_build(divisor.bitnum, bddfalse); + bvec newRemainder, tmp, sub = bvec_build(divisor.bitnum, bddfalse); + + for (n=0 ; nbitvec[divisor.bitnum-1]); + + if (step > 1) + bvec_div_rec( divisor, &newRemainder, &newResult, step-1 ); + + bvec_free(tmp); + bvec_free(sub); + bvec_free(zero); + bdd_delref(isSmaller); + + bvec_free(*remainder); + bvec_free(*result); + *result = newResult; + *remainder = newRemainder; +} + + +/* +NAME {* bvec\_divfixed *} +SECTION {* bvec *} +SHORT {* builds a boolean vector for division by a constant *} +PROTO {* int bvec_div(bvec e, int c, bvec *res, bvec *rem) *} +DESCR {* Builds a new boolean vector representing the integer division + of {\tt e} with {\tt c}. The result of the division will be stored + in {\tt res} and the remainder of the division will be stored in + {\tt rem}. Both vectors should be initialized as the function + will try to release the nodes used by them. If an error occurs then + the nodes will {\em not} be freed. *} +RETURN {* Zero on success or a negative error code on error. *} +ALSO {* bvec\_div, bvec\_mul, bvec\_add, bvec\_shl *} +*/ +int bvec_divfixed(bvec e, int c, bvec *res, bvec *rem) +{ + if (c > 0) + { + bvec divisor = bvec_con(e.bitnum, c); + bvec tmp = bvec_build(e.bitnum, 0); + bvec tmpremainder = bvec_shlfixed(tmp, 1, e.bitvec[e.bitnum-1]); + bvec result = bvec_shlfixed(e, 1, bddfalse); + bvec remainder; + + bvec_div_rec(divisor, &tmpremainder, &result, divisor.bitnum); + remainder = bvec_shrfixed(tmpremainder, 1, bddfalse); + + bvec_free(tmp); + bvec_free(tmpremainder); + bvec_free(divisor); + + *res = result; + *rem = remainder; + + return 0; + } + + return bdd_error(BVEC_DIVZERO); +} + +#if 0 +void p(bvec x) +{ + int n; + for (n=0 ; n 0) + res.bitvec[right.bitnum-n] = divLteRem; + + /* Shift 'div' one bit right */ + bdd_delref(div.bitvec[0]); + for (m=0 ; m= 0) + tmp1 = bdd_addref( bdd_and(rEquN, l.bitvec[m-n]) ); + else + tmp1 = bdd_addref( bdd_and(rEquN, c) ); + tmp2 = bdd_addref( bdd_or(res.bitvec[m], tmp1) ); + bdd_delref(tmp1); + + bdd_delref(res.bitvec[m]); + res.bitvec[m] = tmp2; + } + + bdd_delref(rEquN); + /*bvec_delref(val);*/ + bvec_free(val); + } + + /* At last make sure 'c' is shiftet in for r-values > l-bitnum */ + val = bvec_con(r.bitnum, l.bitnum); + rEquN = bdd_addref( bvec_gth(r, val) ); + tmp1 = bdd_addref( bdd_and(rEquN, c) ); + + for (m=0 ; m l-bitnum */ + val = bvec_con(r.bitnum, l.bitnum); + rEquN = bdd_addref( bvec_gth(r, val) ); + tmp1 = bdd_addref( bdd_and(rEquN, c) ); + + for (m=0 ; m y$ *} +PROTO {* bdd bvec_gth(bvec l, bvec r) *} +DESCR {* Returns the BDD representing {\tt l > r} + ({\em not} reference counted). Both vectors must have the + same number of bits. *} +ALSO {* bvec\_lth, bvec\_lte, bvec\_gte, bvec\_equ, bvec\_neq *} +*/ +bdd bvec_gth(bvec l, bvec r) +{ + BDD tmp = bdd_addref( bvec_lte(l,r) ); + BDD p = bdd_not(tmp); + bdd_delref(tmp); + return p; +} + + +/* +NAME {* bvec\_gte *} +SECTION {* bvec *} +SHORT {* calculates the truth value of $x \geq y$ *} +PROTO {* bdd bvec_gte(bvec l, bvec r) *} +DESCR {* Returns the BDD representing {\tt l}$\geq${\tt r} + ({\em not} reference counted). Both vectors must have the + same number of bits. *} +ALSO {* bvec\_lth, bvec\_gth, bvec\_gth, bvec\_equ, bvec\_neq *} +*/ +bdd bvec_gte(bvec l, bvec r) +{ + BDD tmp = bdd_addref( bvec_lth(l,r) ); + BDD p = bdd_not(tmp); + bdd_delref(tmp); + return p; +} + + +/* +NAME {* bvec\_equ *} +SECTION {* bvec *} +SHORT {* calculates the truth value of $x = y$ *} +PROTO {* bdd bvec_equ(bvec l, bvec r) *} +DESCR {* Returns the BDD representing {\tt l = r} + ({\em not} reference counted). Both vectors must have the + same number of bits. *} +ALSO {* bvec\_lth, bvec\_lte, bvec\_gth, bvec\_gte, bvec\_neq *} +*/ +bdd bvec_equ(bvec l, bvec r) +{ + BDD p = bddtrue; + int n; + + if (l.bitnum == 0 || r.bitnum == 0) + return bddfalse; + + if (l.bitnum != r.bitnum) + { + bdd_error(BVEC_SIZE); + return p; + } + + for (n=0 ; n>(int a) const { return bvec_shrfixed(*this,a,bddfalse); } + bvec operator>>(const bvec &a) const { return bvec_shr(*this,a,bddfalse); } + bvec operator+(const bvec &a) const { return bvec_add(*this, a); } + bvec operator-(const bvec &a) const { return bvec_sub(*this, a); } + bvec operator*(int a) const { return bvec_mulfixed(*this, a); } + bvec operator*(const bvec a) const { return bvec_mul(*this, a); } + bdd operator<(const bvec &a) const { return bvec_lth(*this, a); } + bdd operator<=(const bvec &a) const { return bvec_lte(*this, a); } + bdd operator>(const bvec &a) const { return bvec_gth(*this, a); } + bdd operator>=(const bvec &a) const { return bvec_gte(*this, a); } + bdd operator==(const bvec &a) const { return bvec_equ(*this, a); } + bdd operator!=(const bvec &a) const { return bvec_neq(*this, a); } +}; + +std::ostream &operator<<(std::ostream &, const bvec &); + +inline bvec bvec_truepp(int bitnum) +{ return bvec_true(bitnum); } + +inline bvec bvec_falsepp(int bitnum) +{ return bvec_false(bitnum); } + +inline bvec bvec_conpp(int bitnum, int val) +{ return bvec_con(bitnum, val); } + +inline bvec bvec_varpp(int bitnum, int offset, int step) +{ return bvec_var(bitnum, offset, step); } + +inline bvec bvec_varfddpp(int var) +{ return bvec_varfdd(var); } + +inline bvec bvec_varvecpp(int bitnum, int *var) +{ return bvec_varvec(bitnum, var); } + +inline bvec bvec_coerce(int bitnum, const bvec &v) +{ return bvec_coerce(bitnum, v.roots); } + +inline int bvec_isconst(const bvec &e) +{ return bvec_isconst(e.roots); } + +inline int bvec_val(const bvec &e) +{ return bvec_val(e.roots); } + +inline bvec bvec_copy(const bvec &v) +{ return bvec_copy(v.roots); } + +inline bvec bvec_add(const bvec &left, const bvec &right) +{ return bvec_add(left.roots, right.roots); } + +inline bvec bvec_sub(const bvec &left, const bvec &right) +{ return bvec_sub(left.roots, right.roots); } + +inline bvec bvec_mulfixed(const bvec &e, int c) +{ return bvec_mulfixed(e.roots, c); } + +inline bvec bvec_mul(const bvec &left, const bvec &right) +{ return bvec_mul(left.roots, right.roots); } + +inline int bvec_divfixed(const bvec &e, int c, bvec &res, bvec &rem) +{ return bvec_divfixed(e.roots, c, &res.roots, &rem.roots); } + +inline int bvec_div(const bvec &l, const bvec &r, bvec &res, bvec &rem) +{ return bvec_div(l.roots, r.roots, &res.roots, &rem.roots); } + +inline bvec bvec_ite(const bdd& a, const bvec& b, const bvec& c) +{ return bvec_ite(a.root, b.roots, c.roots); } + +inline bvec bvec_shlfixed(const bvec &e, int pos, const bdd &c) +{ return bvec_shlfixed(e.roots, pos, c.root); } + +inline bvec bvec_shl(const bvec &left, const bvec &right, const bdd &c) +{ return bvec_shl(left.roots, right.roots, c.root); } + +inline bvec bvec_shrfixed(const bvec &e, int pos, const bdd &c) +{ return bvec_shrfixed(e.roots, pos, c.root); } + +inline bvec bvec_shr(const bvec &left, const bvec &right, const bdd &c) +{ return bvec_shr(left.roots, right.roots, c.root); } + +inline bdd bvec_lth(const bvec &left, const bvec &right) +{ return bvec_lth(left.roots, right.roots); } + +inline bdd bvec_lte(const bvec &left, const bvec &right) +{ return bvec_lte(left.roots, right.roots); } + +inline bdd bvec_gth(const bvec &left, const bvec &right) +{ return bvec_gth(left.roots, right.roots); } + +inline bdd bvec_gte(const bvec &left, const bvec &right) +{ return bvec_gte(left.roots, right.roots); } + +inline bdd bvec_equ(const bvec &left, const bvec &right) +{ return bvec_equ(left.roots, right.roots); } + +inline bdd bvec_neq(const bvec &left, const bvec &right) +{ return bvec_neq(left.roots, right.roots); } + + + /* Hack to allow for overloading */ +#define bvec_var(a,b,c) bvec_varpp(a,b,c) +#define bvec_varfdd(a) bvec_varfddpp(a) +#define bvec_varvec(a,b) bvec_varvecpp(a,b) +#define bvec_true(a) bvec_truepp(a) +#define bvec_false(a) bvec_falsepp(a) +#define bvec_con(a,b) bvec_conpp((a),(b)) + + +#endif /* CPLUSPLUS */ + +#endif /* _BVEC_H */ + +/* EOF */ diff --git a/sdk/buddy-2.4/src/cache.c b/sdk/buddy-2.4/src/cache.c new file mode 100644 index 0000000..603fecb --- /dev/null +++ b/sdk/buddy-2.4/src/cache.c @@ -0,0 +1,97 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/cache.c,v 1.1.1.1 2004/06/25 13:22:34 haimcohen Exp $ + FILE: cache.c + DESCR: Cache class for caching apply/exist etc. results in BDD package + AUTH: Jorn Lind + DATE: (C) june 1997 +*************************************************************************/ +#include +#include "kernel.h" +#include "cache.h" +#include "prime.h" + +/************************************************************************* +*************************************************************************/ + +int BddCache_init(BddCache *cache, int size) +{ + int n; + + size = bdd_prime_gte(size); + + if ((cache->table=NEW(BddCacheData,size)) == NULL) + return bdd_error(BDD_MEMORY); + + for (n=0 ; ntable[n].a = -1; + cache->tablesize = size; + + return 0; +} + + +void BddCache_done(BddCache *cache) +{ + free(cache->table); + cache->table = NULL; + cache->tablesize = 0; +} + + +int BddCache_resize(BddCache *cache, int newsize) +{ + int n; + + free(cache->table); + + newsize = bdd_prime_gte(newsize); + + if ((cache->table=NEW(BddCacheData,newsize)) == NULL) + return bdd_error(BDD_MEMORY); + + for (n=0 ; ntable[n].a = -1; + cache->tablesize = newsize; + + return 0; +} + + +void BddCache_reset(BddCache *cache) +{ + register int n; + for (n=0 ; ntablesize ; n++) + cache->table[n].a = -1; +} + + +/* EOF */ diff --git a/sdk/buddy-2.4/src/cache.h b/sdk/buddy-2.4/src/cache.h new file mode 100644 index 0000000..9533a0f --- /dev/null +++ b/sdk/buddy-2.4/src/cache.h @@ -0,0 +1,70 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/cache.h,v 1.1.1.1 2004/06/25 13:22:34 haimcohen Exp $ + FILE: cache.h + DESCR: Cache class for caching apply/exist etc. results + AUTH: Jorn Lind + DATE: (C) june 1997 +*************************************************************************/ + +#ifndef _CACHE_H +#define _CACHE_H + +typedef struct +{ + union + { + double dres; + int res; + } r; + int a,b,c; +} BddCacheData; + + +typedef struct +{ + BddCacheData *table; + int tablesize; +} BddCache; + + +extern int BddCache_init(BddCache *, int); +extern void BddCache_done(BddCache *); +extern int BddCache_resize(BddCache *, int); +extern void BddCache_reset(BddCache *); + +#define BddCache_lookup(cache, hash) (&(cache)->table[hash % (cache)->tablesize]) + + +#endif /* _CACHE_H */ + + +/* EOF */ diff --git a/sdk/buddy-2.4/src/cppext.cxx b/sdk/buddy-2.4/src/cppext.cxx new file mode 100644 index 0000000..d034314 --- /dev/null +++ b/sdk/buddy-2.4/src/cppext.cxx @@ -0,0 +1,624 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/cppext.cxx,v 1.1.1.1 2004/06/25 13:22:39 haimcohen Exp $ + FILE: cppext.cxx + DESCR: C++ extension of BDD package + AUTH: Jorn Lind + DATE: (C) august 1997 +*************************************************************************/ +#include +#include +#include +#include "kernel.h" +#include "bvec.h" + +using namespace std; + + /* Formatting objects for iostreams */ +#define IOFORMAT_SET 0 +#define IOFORMAT_TABLE 1 +#define IOFORMAT_DOT 2 +#define IOFORMAT_ALL 3 +#define IOFORMAT_FDDSET 4 + +int bdd_ioformat::curformat = IOFORMAT_SET; +bdd_ioformat bddset(IOFORMAT_SET); +bdd_ioformat bddtable(IOFORMAT_TABLE); +bdd_ioformat bdddot(IOFORMAT_DOT); +bdd_ioformat bddall(IOFORMAT_ALL); +bdd_ioformat fddset(IOFORMAT_FDDSET); + + /* Constant true and false extension */ +const bdd bddtruepp = bdd_true(); +const bdd bddfalsepp = bdd_false(); + + /* Internal prototypes */ +static void bdd_printset_rec(ostream&, int, int*); +static void bdd_printdot_rec(ostream&, int); +static void fdd_printset_rec(ostream &, int, int *); + + +static bddstrmhandler strmhandler_bdd; +static bddstrmhandler strmhandler_fdd; + + // Avoid calling C++ version of anodecount +#undef bdd_anodecount + +/************************************************************************* + Setup (and shutdown) +*************************************************************************/ + +#undef bdd_init + +int bdd_cpp_init(int n, int c) +{ + int ok = bdd_init(n,c); + + strmhandler_bdd = NULL; + strmhandler_fdd = NULL; + + return ok; +} + + +/************************************************************************* + BDD C++ functions +*************************************************************************/ + +bdd bdd_buildcube(int val, int width, const bdd *variables) +{ + BDD *var = NEW(BDD,width); + BDD res; + int n; + + // No need for ref.cou. since variables[n] holds the reference + for (n=0 ; n 0) + { + if (!first) + o << ", "; + first = 0; + if (strmhandler_bdd) + strmhandler_bdd(o,bddlevel2var[n]); + else + o << bddlevel2var[n]; + o << ":" << (set[n]==2 ? 1 : 0); + } + } + + o << ">"; + } + else + { + set[LEVEL(r)] = 1; + bdd_printset_rec(o, LOW(r), set); + + set[LEVEL(r)] = 2; + bdd_printset_rec(o, HIGH(r), set); + + set[LEVEL(r)] = 0; + } +} + + +static void bdd_printdot_rec(ostream& o, int r) +{ + if (ISCONST(r) || MARKED(r)) + return; + + o << r << "[label=\""; + if (strmhandler_bdd) + strmhandler_bdd(o,bddlevel2var[LEVEL(r)]); + else + o << bddlevel2var[LEVEL(r)]; + o << "\"];\n"; + o << r << " -> " << LOW(r) << "[style=dotted];\n"; + o << r << " -> " << HIGH(r) << "[style=filled];\n"; + + SETMARK(r); + + bdd_printdot_rec(o, LOW(r)); + bdd_printdot_rec(o, HIGH(r)); +} + + +static void fdd_printset_rec(ostream &o, int r, int *set) +{ + int n,m,i; + int used = 0; + int *binval; + int ok, first; + + if (r == 0) + return; + else + if (r == 1) + { + o << "<"; + first=1; + int fdvarnum = fdd_domainnum(); + + for (n=0 ; n"; + } + else + { + set[bddlevel2var[LEVEL(r)]] = 1; + fdd_printset_rec(o, LOW(r), set); + + set[bddlevel2var[LEVEL(r)]] = 2; + fdd_printset_rec(o, HIGH(r), set); + + set[bddlevel2var[LEVEL(r)]] = 0; + } +} + + +/*=[ FDD I/O functions ]================================================*/ + +/* +NAME {* fdd\_strm\_hook *} +SECTION {* fdd *} +SHORT {* Specifies a printing callback handler *} +PROTO {* bddstrmhandler fdd_strm_hook(bddstrmhandler handler) *} +DESCR {* A printing callback handler for use with FDDs is used to + convert the FDD integer identifier into something readable by the + end user. Typically the handler will print a string name + instead of the identifier. A handler could look like this: + \begin{verbatim} +void printhandler(ostream &o, int var) +{ + extern char **names; + o << names[var]; +} +\end{verbatim} + + \noindent + The handler can then be passed to BuDDy like this: + {\tt fdd\_strm\_hook(printhandler)}. + + No default handler is supplied. The argument {\tt handler} may be + NULL if no handler is needed. *} +RETURN {* The old handler *} +ALSO {* fdd\_printset, bdd\_file\_hook *} +*/ +bddstrmhandler fdd_strm_hook(bddstrmhandler handler) +{ + bddstrmhandler old = strmhandler_fdd; + strmhandler_fdd = handler; + return old; +} + + +/************************************************************************* + bvec functions +*************************************************************************/ + +bvec bvec::operator=(const bvec &src) +{ + if (&src != this) + { + bvec_free(roots); + roots = bvec_copy(src.roots); + } + return *this; +} + + +void bvec::set(int bitnum, const bdd &b) +{ + bdd_delref(roots.bitvec[bitnum]); + roots.bitvec[bitnum] = b.root; + bdd_addref(roots.bitvec[bitnum]); +} + + +/*======================================================================*/ + +bvec bvec_map1(const bvec &a, + bdd (*fun)(const bdd &)) +{ + bvec res; + int n; + + res = bvec_false(a.bitnum()); + for (n=0 ; n < a.bitnum() ; n++) + res.set(n, fun(a[n])); + + return res; +} + + +bvec bvec_map2(const bvec &a, const bvec &b, + bdd (*fun)(const bdd &, const bdd &)) +{ + bvec res; + int n; + + if (a.bitnum() != b.bitnum()) + { + bdd_error(BVEC_SIZE); + return res; + } + + res = bvec_false(a.bitnum()); + for (n=0 ; n < a.bitnum() ; n++) + res.set(n, fun(a[n], b[n])); + + return res; +} + + +bvec bvec_map3(const bvec &a, const bvec &b, const bvec &c, + bdd (*fun)(const bdd &, const bdd &, const bdd &)) +{ + bvec res; + int n; + + if (a.bitnum() != b.bitnum() || b.bitnum() != c.bitnum()) + { + bdd_error(BVEC_SIZE); + return res; + } + + res = bvec_false(a.bitnum()); + for (n=0 ; n < a.bitnum() ; n++) + res.set(n, fun(a[n], b[n], c[n]) ); + + return res; +} + + +ostream &operator<<(ostream &o, const bvec &v) +{ + for (int i=0 ; i +#include +#include "kernel.h" +#include "fdd.h" + + +static void fdd_printset_rec(FILE *, int, int *); + +/*======================================================================*/ +/* NOTE: ALL FDD operations works with LSB in top of the variable order */ +/* and in index zero of the domain tables */ +/*======================================================================*/ + +typedef struct s_Domain +{ + int realsize; /* The specified domain (0...N-1) */ + int binsize; /* The number of BDD variables representing the domain */ + int *ivar; /* Variable indeces for the variable set */ + BDD var; /* The BDD variable set */ +} Domain; + + +static void Domain_allocate(Domain*, int); +static void Domain_done(Domain*); + +static int firstbddvar; +static int fdvaralloc; /* Number of allocated domains */ +static int fdvarnum; /* Number of defined domains */ +static Domain *domain; /* Table of domain sizes */ + +static bddfilehandler filehandler; + +/************************************************************************* + Domain definition +*************************************************************************/ + +void bdd_fdd_init(void) +{ + domain = NULL; + fdvarnum = fdvaralloc = 0; + firstbddvar = 0; +} + + +void bdd_fdd_done(void) +{ + int n; + + if (domain != NULL) + { + for (n=0 ; n fdvaralloc) + { + fdvaralloc += (num > fdvaralloc) ? num : fdvaralloc; + + domain = (Domain*)realloc(domain, sizeof(Domain)*fdvaralloc); + if (domain == NULL) + return bdd_error(BDD_MEMORY); + } + } + + /* Create bdd variable tables */ + for (n=0 ; n bddvarnum) + bdd_setvarnum(firstbddvar + extravars); + + /* Set correct variable sequence (interleaved) */ + for (bn=0,more=1 ; more ; bn++) + { + more = 0; + + for (n=0 ; n= fdvarnum || v2 < 0 || v2 >= fdvarnum) + return bdd_error(BDD_VAR); + + if (fdvarnum + 1 > fdvaralloc) + { + fdvaralloc += fdvaralloc; + + domain = (Domain*)realloc(domain, sizeof(Domain)*fdvaralloc); + if (domain == NULL) + return bdd_error(BDD_MEMORY); + } + + d = &domain[fdvarnum]; + d->realsize = domain[v1].realsize * domain[v2].realsize; + d->binsize = domain[v1].binsize + domain[v2].binsize; + d->ivar = (int *)malloc(sizeof(int)*d->binsize); + + for (n=0 ; nivar[n] = domain[v1].ivar[n]; + for (n=0 ; nivar[domain[v1].binsize+n] = domain[v2].ivar[n]; + + d->var = bdd_makeset(d->ivar, d->binsize); + bdd_addref(d->var); + + return fdvarnum++; +} + + +/* +NAME {* fdd\_clearall *} +SECTION {* fdd *} +SHORT {* clear all allocated FDD blocks *} +PROTO {* void fdd_clearall(void) *} +DESCR {* Removes all defined finite domain blocks defined by + {\tt fdd\_extdomain()} and {\tt fdd\_overlapdomain()} *} +*/ +void fdd_clearall(void) +{ + bdd_fdd_done(); + bdd_fdd_init(); +} + + +/************************************************************************* + FDD helpers +*************************************************************************/ + +/* +NAME {* fdd\_domainnum *} +SECTION {* fdd *} +SHORT {* number of defined finite domain blocks *} +PROTO {* int fdd_domainnum(void) *} +DESCR {* Returns the number of finite domain blocks define by calls to + {\tt bdd\_extdomain}. *} +RETURN {* The number of defined finite domain blocks + or a negative error code *} +ALSO {* fdd\_domainsize, fdd\_extdomain *} +*/ +int fdd_domainnum(void) +{ + if (!bddrunning) + return bdd_error(BDD_RUNNING); + + return fdvarnum; +} + + +/* +NAME {* fdd\_domainsize *} +SECTION {* fdd *} +SHORT {* real size of a finite domain block *} +PROTO {* int fdd_domainsize(int var) *} +DESCR {* Returns the size of the domain for the finite domain + block {\tt var}. *} +RETURN {* The size or a negative error code *} +ALSO {* fdd\_domainnum *} +*/ +int fdd_domainsize(int v) +{ + if (!bddrunning) + return bdd_error(BDD_RUNNING); + + if (v < 0 || v >= fdvarnum) + return bdd_error(BDD_VAR); + return domain[v].realsize; +} + + +/* +NAME {* fdd\_varnum *} +SECTION {* fdd *} +SHORT {* binary size of a finite domain block *} +PROTO {* int fdd_varnum(int var) *} +DESCR {* Returns the number of BDD variables used for the finite domain + block {\tt var}. *} +RETURN {* The number of variables or a negative error code *} +ALSO {* fdd\_vars *} +*/ +int fdd_varnum(int v) +{ + if (!bddrunning) + return bdd_error(BDD_RUNNING); + + if (v >= fdvarnum || v < 0) + return bdd_error(BDD_VAR); + return domain[v].binsize; +} + + +/* +NAME {* fdd\_vars *} +SECTION {* fdd *} +SHORT {* all BDD variables associated with a finite domain block *} +PROTO {* int *fdd_vars(int var) *} +DESCR {* Returns an integer array containing the BDD variables used to + define the finite domain block {\tt var}. The size of the array + is the number of variables used to define the finite domain block. + The array will have the Least Significant Bit at pos 0. The + array must {\em not} be deallocated. *} +RETURN {* Integer array contaning the variable numbers or NULL if + {\tt v} is an unknown block. *} +ALSO {* fdd\_varnum *} +*/ +int *fdd_vars(int v) +{ + if (!bddrunning) + { + bdd_error(BDD_RUNNING); + return NULL; + } + + if (v >= fdvarnum || v < 0) + { + bdd_error(BDD_VAR); + return NULL; + } + + return domain[v].ivar; +} + + + +/************************************************************************* + FDD primitives +*************************************************************************/ + +/* +NAME {* fdd\_ithvar *} +SECTION {* fdd *} +SHORT {* the BDD for the i'th FDD set to a specific value *} +PROTO {* BDD fdd_ithvar(int var, int val) *} +DESCR {* Returns the BDD that defines the value {\tt val} for the + finite domain block {\tt var}. The encoding places the + Least Significant Bit at the top of the BDD tree + (which means they will have the lowest variable index). + The returned BDD will be $V_0 \conj V_1 \conj \ldots + \conj V_N$ where each $V_i$ will be in positive or negative form + depending on the value of {\tt val}. *} +RETURN {* The correct BDD or the constant false BDD on error. *} +ALSO {* fdd\_ithset *} +*/ +BDD fdd_ithvar(int var, int val) +{ + int n; + int v=1, tmp; + + if (!bddrunning) + { + bdd_error(BDD_RUNNING); + return bddfalse; + } + + if (var < 0 || var >= fdvarnum) + { + bdd_error(BDD_VAR); + return bddfalse; + } + + if (val < 0 || val >= domain[var].realsize) + { + bdd_error(BDD_RANGE); + return bddfalse; + } + + for (n=0 ; n>= 1; + } + + return v; +} + + +/* +NAME {* fdd\_scanvar *} +SECTION {* fdd *} +SHORT {* Finds one satisfying value of a FDD variable *} +PROTO {* int fdd_scanvar(BDD r, int var) *} +DESCR {* Finds one satisfying assignment of the FDD variable {\tt var} in the + BDD {\tt r} and returns this value. *} +RETURN {* The value of a satisfying assignment of {\tt var}. If {\tt r} is + the trivially false BDD, then a negative value is returned. *} +ALSO {* fdd\_scanallvar *} +*/ +int fdd_scanvar(BDD r, int var) +{ + int *allvar; + int res; + + CHECK(r); + if (r == bddfalse) + return -1; + if (var < 0 || var >= fdvarnum) + return bdd_error(BDD_VAR); + + allvar = fdd_scanallvar(r); + res = allvar[var]; + free(allvar); + + return res; +} + + +/* +NAME {* fdd\_scanallvar *} +SECTION {* fdd *} +SHORT {* Finds one satisfying value of all FDD variables *} +PROTO {* int* fdd_scanallvar(BDD r) *} +DESCR {* Finds one satisfying assignment in {\tt r} of all the defined + FDD variables. Each value is stored in an array which is + returned. The size of this array is exactly the number of + FDD variables defined. It is the user's responsibility to + free this array using {\tt free()}. *} +RETURN {* An array with all satisfying values. If {\tt r} is the trivially + false BDD, then NULL is returned. *} +ALSO {* fdd\_scanvar *} +*/ +int* fdd_scanallvar(BDD r) +{ + int n; + char *store; + int *res; + BDD p = r; + + CHECKa(r,NULL); + if (r == bddfalse) + return NULL; + + store = NEW(char,bddvarnum); + for (n=0 ; n=0 ; m--) + if ( store[domain[n].ivar[m]] ) + val = val*2 + 1; + else + val = val*2; + + res[n] = val; + } + + free(store); + + return res; +} + +/* +NAME {* fdd\_ithset *} +SECTION {* fdd *} +SHORT {* the variable set for the i'th finite domain block *} +PROTO {* BDD fdd_ithset(int var) *} +DESCR {* Returns the variable set that contains the variables used to + define the finite domain block {\tt var}. *} +RETURN {* The variable set or the constant false BDD on error. *} +ALSO {* fdd\_ithvar *} +*/ +BDD fdd_ithset(int var) +{ + if (!bddrunning) + { + bdd_error(BDD_RUNNING); + return bddfalse; + } + + if (var < 0 || var >= fdvarnum) + { + bdd_error(BDD_VAR); + return bddfalse; + } + + return domain[var].var; +} + +/* +NAME {* fdd\_domain *} +SECTION {* fdd *} +SHORT {* BDD encoding of the domain of a FDD variable *} +PROTO {* BDD fdd_domain(int var) *} +DESCR {* Returns what corresponds to a disjunction of all possible + values of the variable {\tt var}. + This is more efficient than doing + {\tt fdd\_ithvar(var,0) OR fdd\_ithvar(var,1) ...} explicitely + for all values in the domain of {\tt var}. *} +RETURN {* The encoding of the domain*} +*/ +BDD fdd_domain(int var) +{ + int n,val; + Domain *dom; + BDD d; + + if (!bddrunning) + { + bdd_error(BDD_RUNNING); + return bddfalse; + } + + if (var < 0 || var >= fdvarnum) + { + bdd_error(BDD_VAR); + return bddfalse; + } + + /* Encode V<=X-1. V is the variables in 'var' and X is the domain size */ + + dom = &domain[var]; + val = dom->realsize-1; + d = bddtrue; + + for (n=0 ; nbinsize ; n++) + { + BDD tmp; + + if (val & 0x1) + tmp = bdd_apply( bdd_nithvar(dom->ivar[n]), d, bddop_or ); + else + tmp = bdd_apply( bdd_nithvar(dom->ivar[n]), d, bddop_and ); + + val >>= 1; + + bdd_addref(tmp); + bdd_delref(d); + d = tmp; + } + + return d; +} + + +/* +NAME {* fdd\_equals *} +SECTION {* fdd *} +SHORT {* returns a BDD setting two FD. blocks equal *} +PROTO {* BDD fdd_equals(int f, int g) *} +DESCR {* Builds a BDD which is true for all the possible assignments to + the variable blocks {\tt f} and {\tt g} that makes the blocks + equal. This is more or less just a shorthand for calling + {\tt fdd\_equ()}. *} +RETURN {* The correct BDD or the constant false on errors. *} +*/ +BDD fdd_equals(int left, int right) +{ + BDD e = bddtrue, tmp1, tmp2; + int n; + + if (!bddrunning) + { + bdd_error(BDD_RUNNING); + return bddfalse; + } + + if (left < 0 || left >= fdvarnum || right < 0 || right >= fdvarnum) + { + bdd_error(BDD_VAR); + return bddfalse; + } + if (domain[left].realsize != domain[right].realsize) + { + bdd_error(BDD_RANGE); + return bddfalse; + } + + for (n=0 ; n"); + } + else + { + set[bddlevel2var[LEVEL(r)]] = 1; + fdd_printset_rec(ofile, LOW(r), set); + + set[bddlevel2var[LEVEL(r)]] = 2; + fdd_printset_rec(ofile, HIGH(r), set); + + set[bddlevel2var[LEVEL(r)]] = 0; + } +} + + +/*======================================================================*/ + +/* +NAME {* fdd\_scanset *} +SECTION {* fdd *} +SHORT {* scans a variable set *} +PROTO {* int fdd_scanset(BDD r, int **varset, int *varnum) *} +DESCR {* Scans the BDD {\tt r} to find all occurences of FDD variables + and then stores these in {\tt varset}. {\tt varset} will be set + to point to an array of size {\tt varnum} which will contain + the indices of the found FDD variables. It is the users + responsibility to free {\tt varset} after use. *} +RETURN {* Zero on success or a negative error code on error. *} +ALSO {* fdd\_makeset *} +*/ +int fdd_scanset(BDD r, int **varset, int *varnum) +{ + int *fv, fn; + int num,n,m,i; + + if (!bddrunning) + return bdd_error(BDD_RUNNING); + + if ((n=bdd_scanset(r, &fv, &fn)) < 0) + return n; + + for (n=0,num=0 ; n= fdvarnum) + { + bdd_error(BDD_VAR); + return bddfalse; + } + + for (n=0 ; n last || first < 0 || last >= fdvarnum) + return bdd_error(BDD_VARBLK); + + for (n=first ; n<=last ; n++) + { + bdd_addref(res); + tmp = bdd_apply(domain[n].var, res, bddop_and); + bdd_delref(res); + res = tmp; + } + + err = bdd_addvarblock(res, fixed); + + bdd_delref(res); + return err; +} + + +/* +NAME {* fdd\_setpair *} +SECTION {* fdd *} +SHORT {* defines a pair for two finite domain blocks *} +PROTO {* int fdd_setpair(bddPair *pair, int p1, int p2) *} +DESCR {* Defines each variable in the finite domain block {\tt p1} to + be paired with the corresponding variable in {\tt p2}. The result + is stored in {\tt pair} which must be allocated using + {\tt bdd\_makepair}. *} +RETURN {* Zero on success or a negative error code on error. *} +ALSO {* fdd\_setpairs *} +*/ +int fdd_setpair(bddPair *pair, int p1, int p2) +{ + int n,e; + + if (!bddrunning) + return bdd_error(BDD_RUNNING); + + if (p1<0 || p1>=fdvarnum || p2<0 || p2>=fdvarnum) + return bdd_error(BDD_VAR); + + if (domain[p1].binsize != domain[p2].binsize) + return bdd_error(BDD_VARNUM); + + for (n=0 ; n=fdvarnum || p2[n]<0 || p2[n]>=fdvarnum) + return bdd_error(BDD_VAR); + + for (n=0 ; nivar); + bdd_delref(d->var); +} + + +static void Domain_allocate(Domain* d, int range) +{ + int calcsize = 2; + + if (range <= 0 || range > INT_MAX/2) + { + bdd_error(BDD_RANGE); + return; + } + + d->realsize = range; + d->binsize = 1; + + while (calcsize < range) + { + d->binsize++; + calcsize <<= 1; + } + + d->ivar = (int *)malloc(sizeof(int)*d->binsize); + d->var = bddtrue; +} + + +int *fdddec2bin(int var, int val) +{ + int *res; + int n = 0; + + res = (int *)malloc(sizeof(int)*domain[var].binsize); + memset(res, 0, sizeof(int)*domain[var].binsize); + + while (val > 0) + { + if (val & 0x1) + res[n] = 1; + val >>= 1; + n++; + } + + return res; +} + + +/* EOF */ + +int fdd_overlapdomains(int *doms, int nbdoms) +{ + Domain *d; + int i,j,n; + + if (!bddrunning) + return bdd_error(BDD_RUNNING); + + for (i=0 ; i= fdvarnum) + return bdd_error(BDD_VAR); + } + + /* if (v1 < 0 || v1 >= fdvarnum || v2 < 0 || v2 >= fdvarnum) */ + /* return bdd_error(BDD_VAR); */ + + if (fdvarnum + 1 > fdvaralloc) + { + fdvaralloc += fdvaralloc; + + domain = (Domain*)realloc(domain, sizeof(Domain)*fdvaralloc); + if (domain == NULL) + return bdd_error(BDD_MEMORY); + } + + d = &domain[fdvarnum]; + d->realsize = 0; + d->binsize = 0; + for (i=0 ; irealsize += domain[doms[i]].realsize; + d->binsize += domain[doms[i]].binsize; + } + /* d->realsize = domain[v1].realsize * domain[v2].realsize; */ + /* d->binsize = domain[v1].binsize + domain[v2].binsize; */ + d->ivar = (int *)malloc(sizeof(int)*d->binsize); + + j=0; + for (i=0 ; iivar[j++] = domain[doms[i]].ivar[n]; + + /* for (n=0 ; nivar[n] = domain[v1].ivar[n]; */ + /* for (n=0 ; nivar[domain[v1].binsize+n] = domain[v2].ivar[n]; */ + + d->var = bdd_makeset(d->ivar, d->binsize); + bdd_addref(d->var); + + return fdvarnum++; +} diff --git a/sdk/buddy-2.4/src/fdd.h b/sdk/buddy-2.4/src/fdd.h new file mode 100644 index 0000000..754ef92 --- /dev/null +++ b/sdk/buddy-2.4/src/fdd.h @@ -0,0 +1,174 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/fdd.h,v 1.1.1.1 2004/06/25 13:22:40 haimcohen Exp $ + FILE: fdd.h + DESCR: Finite domain data with BDDs + AUTH: Jorn Lind + DATE: (C) february 1999 +*************************************************************************/ + +#ifndef _FDD_H +#define _FDD_H + +#include "bdd.h" + + +#ifdef CPLUSPLUS +extern "C" { +#endif + +/* In file fdd.c */ + +extern int fdd_extdomain(int*, int); +extern int fdd_overlapdomain(int, int); +extern int fdd_overlapdomains(int*, int); +extern void fdd_clearall(void); +extern int fdd_domainnum(void); +extern int fdd_domainsize(int); +extern int fdd_varnum(int); +extern int* fdd_vars(int); +extern BDD fdd_ithvar(int, int); +extern int fdd_scanvar(BDD, int); +extern int* fdd_scanallvar(BDD); +extern BDD fdd_ithset(int); +extern BDD fdd_domain(int); +extern BDD fdd_equals(int, int); +extern bddfilehandler fdd_file_hook(bddfilehandler); +#ifdef CPLUSPLUS +extern bddstrmhandler fdd_strm_hook(bddstrmhandler); +#endif +extern void fdd_printset(BDD); +extern void fdd_fprintset(FILE*, BDD); +extern int fdd_scanset(BDD, int**, int*); +extern BDD fdd_makeset(int*, int); +extern int fdd_intaddvarblock(int, int, int); +extern int fdd_setpair(bddPair*, int, int); +extern int fdd_setpairs(bddPair*, int*, int*, int); + +#ifdef CPLUSPLUS +} +#endif + +/************************************************************************* + If this file is included from a C++ compiler then the following + classes, wrappers and hacks are supplied. +*************************************************************************/ +#ifdef CPLUSPLUS + + /* FDD extensions */ + +inline bdd fdd_ithvarpp(int var, int val) +{ return fdd_ithvar(var, val); } + +inline bdd fdd_ithsetpp(int var) +{ return fdd_ithset(var); } + +inline bdd fdd_domainpp(int var) +{ return fdd_domain(var); } + +inline int fdd_scanvar(const bdd &r, int var) +{ return fdd_scanvar(r.root, var); } + +inline int* fdd_scanallvar(const bdd &r) +{ return fdd_scanallvar(r.root); } + +inline bdd fdd_equalspp(int left, int right) +{ return fdd_equals(left, right); } + +inline void fdd_printset(const bdd &r) +{ fdd_printset(r.root); } + +inline void fdd_fprintset(FILE* ofile, const bdd &r) +{ fdd_fprintset(ofile, r.root); } + +inline int fdd_scanset(const bdd &r, int *&v, int &n) +{ return fdd_scanset(r.root, &v, &n); } + +inline bdd fdd_makesetpp(int *v, int n) +{ return fdd_makeset(v,n); } + +#if 0 +inline bdd* fdd_conpp(int bitnum, int var) +{ return fdd_transfer( bitnum, fdd_con(bitnum, var) ); } + +inline bdd* fdd_varpp(int bitnum, int var) +{ return fdd_transfer( bitnum, fdd_var(bitnum, var) ); } + +extern int fdd_isconst(int bitnum, bdd *e); +extern int fdd_val(int bitnum, bdd *e); + +inline bdd* fdd_add(int bitnum, bdd *left, bdd *right) +{ return fdd_termopr(bitnum, left, right,bdd::fddAdd); } + +inline bdd* fdd_sub(int bitnum, bdd *left, bdd *right) +{ return fdd_termopr(bitnum, left, right,bdd::fddSub); } + +inline bdd* fdd_shl(int bitnum, bdd *expr, bdd c) +{ return fdd_shift(bitnum, expr, c, bdd::fddShl); } + +inline bdd* fdd_shr(int bitnum, bdd *expr, bdd c) +{ return fdd_shift(bitnum, expr, c, bdd::fddShr); } + +inline bdd fdd_lth(int bitnum, bdd *left, bdd *right) +{ return fdd_relopr(bitnum, left, right, bdd::fddLth); } + +inline bdd fdd_lte(int bitnum, bdd *left, bdd *right) +{ return fdd_relopr(bitnum, left, right, bdd::fddLte); } + +inline bdd fdd_gth(int bitnum, bdd *left, bdd *right) +{ return fdd_relopr(bitnum, left, right, bdd::fddGth); } + +inline bdd fdd_gte(int bitnum, bdd *left, bdd *right) +{ return fdd_relopr(bitnum, left, right, bdd::fddGte); } + +inline bdd fdd_equ(int bitnum, bdd *left, bdd *right) +{ return fdd_relopr(bitnum, left, right, bdd::fddEqu); } + +inline bdd fdd_neq(int bitnum, bdd *left, bdd *right) +{ return fdd_relopr(bitnum, left, right, bdd::fddNeq); } +#endif + + /* Hacks to allow for overloading of return-types only */ +#define fdd_ithvar fdd_ithvarpp +#define fdd_ithset fdd_ithsetpp +#define fdd_domain fdd_domainpp +#define fdd_equals fdd_equalspp +#define fdd_makeset fdd_makesetpp +#define fdd_con fdd_conpp +#define fdd_var fdd_varpp + + +#endif /* CPLUSPLUS */ + +#endif /* _FDD_H */ + + +/* EOF */ diff --git a/sdk/buddy-2.4/src/imatrix.c b/sdk/buddy-2.4/src/imatrix.c new file mode 100644 index 0000000..eb21ea4 --- /dev/null +++ b/sdk/buddy-2.4/src/imatrix.c @@ -0,0 +1,149 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + FILE: imatrix.cc + DESCR: Interaction matrix + AUTH: Jorn Lind + DATE: (C) february 2000 +*************************************************************************/ +#include +#include +#include +#include "kernel.h" +#include "imatrix.h" + +/************************************************************************* +*************************************************************************/ + +imatrix* imatrixNew(int size) +{ + imatrix *mtx = NEW(imatrix,1); + int n,m; + + if (!mtx) + return NULL; + + if ((mtx->rows=NEW(char*,size)) == NULL) + { + free(mtx); + return NULL; + } + + for (n=0 ; nrows[n]=NEW(char,size/8+1)) == NULL) + { + for (m=0 ; mrows[m]); + free(mtx); + return NULL; + } + + memset(mtx->rows[n], 0, size/8+1); + } + + mtx->size = size; + + return mtx; +} + + +void imatrixDelete(imatrix *mtx) +{ + int n; + + for (n=0 ; nsize ; n++) + free(mtx->rows[n]); + free(mtx->rows); + free(mtx); +} + + +/*======================================================================*/ + +void imatrixFPrint(imatrix *mtx, FILE *ofile) +{ + int x,y; + + fprintf(ofile, " "); + for (x=0 ; xsize ; x++) + fprintf(ofile, "%c", x < 26 ? (x+'a') : (x-26)+'A'); + fprintf(ofile, "\n"); + + for (y=0 ; ysize ; y++) + { + fprintf(ofile, "%2d %c", y, y < 26 ? (y+'a') : (y-26)+'A'); + for (x=0 ; xsize ; x++) + fprintf(ofile, "%c", imatrixDepends(mtx,y,x) ? 'x' : ' '); + fprintf(ofile, "\n"); + } +} + + +void imatrixPrint(imatrix *mtx) +{ + imatrixFPrint(mtx, stdout); +} + + +void imatrixSet(imatrix *mtx, int a, int b) +{ + mtx->rows[a][b/8] |= 1<<(b%8); +} + + +void imatrixClr(imatrix *mtx, int a, int b) +{ + mtx->rows[a][b/8] &= ~(1<<(b%8)); +} + + +int imatrixDepends(imatrix *mtx, int a, int b) +{ + return mtx->rows[a][b/8] & (1<<(b%8)); +} + + +/*======================================================================*/ + +#if 0 +void main(void) +{ + imatrix *m = imatrixNew(16); + + imatrixSet(m,0,2); + imatrixSet(m,8,8); + imatrixSet(m,15,15); + + imatrixPrint(m); +} +#endif + +/* EOF */ diff --git a/sdk/buddy-2.4/src/imatrix.h b/sdk/buddy-2.4/src/imatrix.h new file mode 100644 index 0000000..bca711e --- /dev/null +++ b/sdk/buddy-2.4/src/imatrix.h @@ -0,0 +1,59 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + FILE: imatrix.h + DESCR: Interaction matrix + AUTH: Jorn Lind + DATE: (C) february 2000 +*************************************************************************/ + +#ifndef _IMATRIX_H +#define _IMATRIX_H + +typedef struct _imatrix +{ + char **rows; + int size; +} imatrix; + + +extern imatrix* imatrixNew(int); +extern void imatrixDelete(imatrix*); +extern void imatrixFPrint(imatrix*,FILE *); +extern void imatrixPrint(imatrix*); +extern void imatrixSet(imatrix*,int,int); +extern void imatrixClr(imatrix*,int,int); +extern int imatrixDepends(imatrix*,int,int); + + +#endif /* _IMATRIX_H */ + + +/* EOF */ diff --git a/sdk/buddy-2.4/src/kernel.c b/sdk/buddy-2.4/src/kernel.c new file mode 100644 index 0000000..cd5c1f3 --- /dev/null +++ b/sdk/buddy-2.4/src/kernel.c @@ -0,0 +1,1496 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/kernel.c,v 1.2 2004/07/13 21:04:36 haimcohen Exp $ + FILE: kernel.c + DESCR: implements the bdd kernel functions. + AUTH: Jorn Lind + DATE: (C) june 1997 + + WARNING: Do not use pointers to nodes across makenode calls, + as makenode may resize/move the nodetable. + +*************************************************************************/ +#include "config.h" +#include +#include +#include +#include +#include + +#include "kernel.h" +#include "cache.h" +#include "prime.h" + +/************************************************************************* + Various definitions and global variables +*************************************************************************/ + +/*=== EXTERNAL VARIABLES FOR PACKAGE USERS =============================*/ + +/* +NAME {* bddtrue *} +SECTION {* kernel *} +SHORT {* the constant true bdd *} +PROTO {* extern const BDD bddtrue; *} +DESCR {* This bdd holds the constant true value *} +ALSO {* bddfalse, bdd\_true, bdd\_false *} +*/ +const BDD bddtrue=1; /* The constant true bdd */ + +/* +NAME {* bddfalse*} +SECTION {* kernel *} +SHORT {* the constant false bdd *} +PROTO {* extern const BDD bddfalse; *} +DESCR {* This bdd holds the constant false value *} +ALSO {* bddtrue, bdd\_true, bdd\_false *} +*/ +const BDD bddfalse=0; /* The constant false bdd */ + + +/*=== INTERNAL DEFINITIONS =============================================*/ + +/* Min. number of nodes (%) that has to be left after a garbage collect + unless a resize should be done. */ +static int minfreenodes=20; + + +/*=== GLOBAL KERNEL VARIABLES ==========================================*/ + +int bddrunning; /* Flag - package initialized */ +int bdderrorcond; /* Some error condition */ +int bddnodesize; /* Number of allocated nodes */ +int bddmaxnodesize; /* Maximum allowed number of nodes */ +int bddmaxnodeincrease; /* Max. # of nodes used to inc. table */ +BddNode* bddnodes; /* All of the bdd nodes */ +int bddfreepos; /* First free node */ +int bddfreenum; /* Number of free nodes */ +long int bddproduced; /* Number of new nodes ever produced */ +int bddvarnum; /* Number of defined BDD variables */ +int* bddrefstack; /* Internal node reference stack */ +int* bddrefstacktop; /* Internal node reference stack top */ +int* bddvar2level; /* Variable -> level table */ +int* bddlevel2var; /* Level -> variable table */ +jmp_buf bddexception; /* Long-jump point for interrupting calc. */ +int bddresized; /* Flag indicating a resize of the nodetable */ + +bddCacheStat bddcachestats; + + +/*=== PRIVATE KERNEL VARIABLES =========================================*/ + +static BDD* bddvarset; /* Set of defined BDD variables */ +static int gbcollectnum; /* Number of garbage collections */ +static int cachesize; /* Size of the operator caches */ +static long int gbcclock; /* Clock ticks used in GBC */ +static int usednodes_nextreorder; /* When to do reorder next time */ +static bddinthandler err_handler; /* Error handler */ +static bddgbchandler gbc_handler; /* Garbage collection handler */ +static bdd2inthandler resize_handler; /* Node-table-resize handler */ + + + /* Strings for all error mesages */ +static char *errorstrings[BDD_ERRNUM] = +{ "Out of memory", "Unknown variable", "Value out of range", + "Unknown BDD root dereferenced", "bdd_init() called twice", + "File operation failed", "Incorrect file format", + "Variables not in ascending order", "User called break", + "Mismatch in size of variable sets", + "Cannot allocate fewer nodes than already in use", + "Unknown operator", "Illegal variable set", + "Bad variable block operation", + "Trying to decrease the number of variables", + "Trying to replace with variables already in the bdd", + "Number of nodes reached user defined maximum", + "Unknown BDD - was not in node table", + "Bad size argument", + "Mismatch in bitvector size", + "Illegal shift-left/right parameter", + "Division by zero" }; + + +/*=== OTHER INTERNAL DEFINITIONS =======================================*/ + +#define NODEHASH(lvl,l,h) (TRIPLE(lvl,l,h) % bddnodesize) + + +/************************************************************************* + BDD misc. user operations +*************************************************************************/ + +/* +NAME {* bdd\_init *} +SECTION {* kernel *} +SHORT {* initializes the BDD package *} +PROTO {* int bdd_init(int nodesize, int cachesize) *} +DESCR {* This function initiates the bdd package and {\em must} be called + before any bdd operations are done. The argument {\tt nodesize} + is the initial number of nodes in the nodetable and {\tt cachesize} + is the fixed size of the internal caches. Typical values for + {\tt nodesize} are 10000 nodes for small test examples and up to + 1000000 nodes for large examples. A cache size of 10000 seems to + work good even for large examples, but lesser values should do it + for smaller examples. + + The number of cache entries can also be set to depend on the size + of the nodetable using a call to {\tt bdd\_setcacheratio}. + + The initial number of nodes is not critical for any bdd operation + as the table will be resized whenever there are to few nodes left + after a garbage collection. But it does have some impact on the + efficency of the operations. *} +RETURN {* If no errors occur then 0 is returned, otherwise + a negative error code. *} +ALSO {* bdd\_done, bdd\_resize\_hook *} +*/ +int bdd_init(int initnodesize, int cs) +{ + int n, err; + + if (bddrunning) + return bdd_error(BDD_RUNNING); + + bddnodesize = bdd_prime_gte(initnodesize); + + if ((bddnodes=(BddNode*)malloc(sizeof(BddNode)*bddnodesize)) == NULL) + return bdd_error(BDD_MEMORY); + + bddresized = 0; + + for (n=0 ; n MAXVAR) + { + bdd_error(BDD_RANGE); + return bddfalse; + } + + if (num < bddvarnum) + return bdd_error(BDD_DECVNUM); + if (num == bddvarnum) + return 0; + + if (bddvarset == NULL) + { + if ((bddvarset=(BDD*)malloc(sizeof(BDD)*num*2)) == NULL) + return bdd_error(BDD_MEMORY); + if ((bddlevel2var=(int*)malloc(sizeof(int)*(num+1))) == NULL) + { + free(bddvarset); + return bdd_error(BDD_MEMORY); + } + if ((bddvar2level=(int*)malloc(sizeof(int)*(num+1))) == NULL) + { + free(bddvarset); + free(bddlevel2var); + return bdd_error(BDD_MEMORY); + } + } + else + { + if ((bddvarset=(BDD*)realloc(bddvarset,sizeof(BDD)*num*2)) == NULL) + return bdd_error(BDD_MEMORY); + if ((bddlevel2var=(int*)realloc(bddlevel2var,sizeof(int)*(num+1))) == NULL) + { + free(bddvarset); + return bdd_error(BDD_MEMORY); + } + if ((bddvar2level=(int*)realloc(bddvar2level,sizeof(int)*(num+1))) == NULL) + { + free(bddvarset); + free(bddlevel2var); + return bdd_error(BDD_MEMORY); + } + } + + if (bddrefstack != NULL) + free(bddrefstack); + bddrefstack = bddrefstacktop = (int*)malloc(sizeof(int)*(num*3+4)); + + for(bdv=bddvarnum ; bddvarnum < num; bddvarnum++) + { + bddvarset[bddvarnum*2] = PUSHREF( bdd_makenode(bddvarnum, 0, 1) ); + bddvarset[bddvarnum*2+1] = bdd_makenode(bddvarnum, 1, 0); + POPREF(1); + + if (bdderrorcond) + { + bddvarnum = bdv; + return -bdderrorcond; + } + + bddnodes[bddvarset[bddvarnum*2]].refcou = MAXREF; + bddnodes[bddvarset[bddvarnum*2+1]].refcou = MAXREF; + bddlevel2var[bddvarnum] = bddvarnum; + bddvar2level[bddvarnum] = bddvarnum; + } + + LEVEL(0) = num; + LEVEL(1) = num; + bddvar2level[num] = num; + bddlevel2var[num] = num; + + bdd_pairs_resize(oldbddvarnum, bddvarnum); + bdd_operator_varresize(); + + bdd_enable_reorder(); + + return 0; +} + + +/* +NAME {* bdd\_extvarnum *} +SECTION {* kernel *} +SHORT {* add extra BDD variables *} +PROTO {* int bdd_extvarnum(int num) *} +DESCR {* Extends the current number of allocated BDD variables with + {\tt num} extra variables. *} +RETURN {* The old number of allocated variables or a negative error code. *} +ALSO {* bdd\_setvarnum, bdd\_ithvar, bdd\_nithvar *} +*/ +int bdd_extvarnum(int num) +{ + int start = bddvarnum; + + if (num < 0 || num > 0x3FFFFFFF) + return bdd_error(BDD_RANGE); + + bdd_setvarnum(bddvarnum+num); + return start; +} + + +/* +NAME {* bdd\_error\_hook *} +SECTION {* kernel *} +SHORT {* set a handler for error conditions *} +PROTO {* bddinthandler bdd_error_hook(bddinthandler handler) *} +DESCR {* Whenever an error occurs in the bdd package a test is done to + see if an error handler is supplied by the user and if such exists + then it will be called + with an error code in the variable {\tt errcode}. The handler may + then print any usefull information and return or exit afterwards. + + This function sets the handler to be {\tt handler}. If a {\tt NULL} + argument is supplied then no calls are made when an error occurs. + Possible error codes are found in {\tt bdd.h}. The default handler + is {\tt bdd\_default\_errhandler} which will use {\tt exit()} to + terminate the program. + + Any handler should be defined like this: + \begin{verbatim} +void my_error_handler(int errcode) +{ + ... +} +\end{verbatim} *} +RETURN {* The previous handler *} +ALSO {* bdd\_errstring *} +*/ +bddinthandler bdd_error_hook(bddinthandler handler) +{ + bddinthandler tmp = err_handler; + err_handler = handler; + return tmp; +} + + +/* +NAME {* bdd\_clear\_error *} +SECTION {* kernel *} +SHORT {* clears an error condition in the kernel *} +PROTO {* void bdd_clear_error(void) *} +DESCR {* The BuDDy kernel may at some point run out of new ROBDD nodes if + a maximum limit is set with {\tt bdd\_setmaxnodenum}. In this case + the current error handler is called and an internal error flag + is set. Further calls to BuDDy will always return {\tt bddfalse}. + From here BuDDy must either be restarted or {\tt bdd\_clear\_error} + may be called after action is taken to let BuDDy continue. This may + not be especially usefull since the default error handler exits + the program - other needs may of course exist.*} +ALSO {* bdd\_error\_hook, bdd\_setmaxnodenum *} +*/ +void bdd_clear_error(void) +{ + bdderrorcond = 0; + bdd_operator_reset(); +} + + +/* +NAME {* bdd\_gbc\_hook *} +SECTION {* kernel *} +SHORT {* set a handler for garbage collections *} +PROTO {* bddgbchandler bdd_gbc_hook(bddgbchandler handler) *} +DESCR {* Whenever a garbage collection is required, a test is done to + see if a handler for this event is supplied by the user and if such + exists then it is called, both before and after the garbage collection + takes places. This is indicated by an integer flag {\tt pre} passed to + the handler, which will be one before garbage collection and zero + after garbage collection. + + This function sets the handler to be {\tt handler}. If a {\tt + NULL} argument is supplied then no calls are made when a + garbage collection takes place. The argument {\tt pre} + indicates pre vs. post garbage collection and the argument + {\tt stat} contains information about the garbage + collection. The default handler is {\tt bdd\_default\_gbchandler}. + + Any handler should be defined like this: + \begin{verbatim} +void my_gbc_handler(int pre, bddGbcStat *stat) +{ + ... +} +\end{verbatim} *} +RETURN {* The previous handler *} +ALSO {* bdd\_resize\_hook, bdd\_reorder\_hook *} */ +bddgbchandler bdd_gbc_hook(bddgbchandler handler) +{ + bddgbchandler tmp = gbc_handler; + gbc_handler = handler; + return tmp; +} + + +/* +NAME {* bdd\_resize\_hook *} +SECTION {* kernel *} +SHORT {* set a handler for nodetable resizes *} +PROTO {* bdd2inthandler bdd_resize_hook(bdd2inthandler handler) *} +DESCR {* Whenever it is impossible to get enough free nodes by a garbage + collection then the node table is resized and a test is done to see + if a handler is supllied by the user for this event. If so then + it is called with {\tt oldsize} being the old nodetable size and + {\tt newsize} being the new nodetable size. + + This function sets the handler to be {\tt handler}. If a {\tt NULL} + argument is supplied then no calls are made when a table resize + is done. No default handler is supplied. + + Any handler should be defined like this: + \begin{verbatim} +void my_resize_handler(int oldsize, int newsize) +{ + ... +} +\end{verbatim} *} +RETURN {* The previous handler *} +ALSO {* bdd\_gbc\_hook, bdd\_reorder\_hook, bdd\_setminfreenodes *} +*/ +bdd2inthandler bdd_resize_hook(bdd2inthandler handler) +{ + bdd2inthandler tmp = handler; + resize_handler = handler; + return tmp; +} + + +/* +NAME {* bdd\_setmaxincrease *} +SECTION {* kernel *} +SHORT {* set max. number of nodes used to increase node table *} +PROTO {* int bdd_setmaxincrease(int size) *} +DESCR {* The node table is expanded by doubling the size of the table + when no more free nodes can be found, but a maximum for the + number of new nodes added can be set with {\tt bdd\_maxincrease} + to {\tt size} nodes. The default is 50000 nodes (1 Mb). *} +RETURN {* The old threshold on succes, otherwise a negative error code. *} +ALSO {* bdd\_setmaxnodenum, bdd\_setminfreenodes *} +*/ +int bdd_setmaxincrease(int size) +{ + int old = bddmaxnodeincrease; + + if (size < 0) + return bdd_error(BDD_SIZE); + + bddmaxnodeincrease = size; + return old; +} + +/* +NAME {* bdd\_setmaxnodenum *} +SECTION {* kernel *} +SHORT {* set the maximum available number of bdd nodes *} +PROTO {* int bdd_setmaxnodenum(int size) *} +DESCR {* This function sets the maximal number of bdd nodes the package may + allocate before it gives up a bdd operation. The + argument {\tt size} is the absolute maximal number of nodes there + may be allocated for the nodetable. Any attempt to allocate more + nodes results in the constant false being returned and the error + handler being called until some nodes are deallocated. + A value of 0 is interpreted as an unlimited amount. + It is {\em not} possible to specify + fewer nodes than there has already been allocated. *} +RETURN {* The old threshold on succes, otherwise a negative error code. *} +ALSO {* bdd\_setmaxincrease, bdd\_setminfreenodes *} +*/ +int bdd_setmaxnodenum(int size) +{ + if (size > bddnodesize || size == 0) + { + int old = bddmaxnodesize; + bddmaxnodesize = size; + return old; + } + + return bdd_error(BDD_NODES); +} + + +/* +NAME {* bdd\_setminfreenodes *} +SECTION {* kernel *} +SHORT {* set min. no. of nodes to be reclaimed after GBC. *} +PROTO {* int bdd_setminfreenodes(int n) *} +DESCR {* Whenever a garbage collection is executed the number of free + nodes left are checked to see if a resize of the node table is + required. If $X = (\mathit{bddfreenum}*100)/\mathit{maxnum}$ + is less than or + equal to {\tt n} then a resize is initiated. The range of + {\tt X} is of course $0\ldots 100$ and has some influence + on how fast the package is. A low number means harder attempts + to avoid resizing and saves space, and a high number reduces + the time used in garbage collections. The default value is + 20. *} +RETURN {* The old threshold on succes, otherwise a negative error code. *} +ALSO {* bdd\_setmaxnodenum, bdd\_setmaxincrease *} +*/ +int bdd_setminfreenodes(int mf) +{ + int old = minfreenodes; + + if (mf<0 || mf>100) + return bdd_error(BDD_RANGE); + + minfreenodes = mf; + return old; +} + + +/* +NAME {* bdd\_getnodenum *} +SECTION {* kernel *} +SHORT {* get the number of active nodes in use *} +PROTO {* int bdd_getnodenum(void) *} +DESCR {* Returns the number of nodes in the nodetable that are + currently in use. Note that dead nodes that have not been + reclaimed yet + by a garbage collection are counted as active. *} +RETURN {* The number of nodes. *} +ALSO {* bdd\_getallocnum, bdd\_setmaxnodenum *} +*/ +int bdd_getnodenum(void) +{ + return bddnodesize - bddfreenum; +} + + +/* +NAME {* bdd\_getallocnum *} +SECTION {* kernel *} +SHORT {* get the number of allocated nodes *} +PROTO {* int bdd_getallocnum(void) *} +DESCR {* Returns the number of nodes currently allocated. This includes + both dead and active nodes. *} +RETURN {* The number of nodes. *} +ALSO {* bdd\_getnodenum, bdd\_setmaxnodenum *} +*/ +int bdd_getallocnum(void) +{ + return bddnodesize; +} + + +/* +NAME {* bdd\_isrunning *} +SECTION {* kernel *} +SHORT {* test whether the package is started or not *} +PROTO {* void bdd_isrunning(void) *} +DESCR {* This function tests the internal state of the package and returns + a status. *} +RETURN {* 1 (true) if the package has been started, otherwise 0. *} +ALSO {* bdd\_init, bdd\_done *} +*/ +int bdd_isrunning(void) +{ + return bddrunning; +} + + +/* +NAME {* bdd\_versionstr *} +SECTION {* kernel *} +SHORT {* returns a text string with version information *} +PROTO {* char* bdd_versionstr(void) *} +DESCR {* This function returns a text string with information about the + version of the bdd package. *} +ALSO {* bdd\_versionnum *} +*/ +char *bdd_versionstr(void) +{ + static char str[] = "BuDDy - release " PACKAGE_VERSION; + return str; +} + + +/* +NAME {* bdd\_versionnum *} +SECTION {* kernel *} +SHORT {* returns the version number of the bdd package *} +PROTO {* int bdd_versionnum(void) *} +DESCR {* This function returns the version number of the bdd package. The + number is in the range 10-99 for version 1.0 to 9.9. *} +ALSO {* bdd\_versionstr *} +*/ +int bdd_versionnum(void) +{ + return MAJOR_VERSION * 10 + MINOR_VERSION; +} + + +/* +NAME {* bdd\_stats *} +SECTION {* kernel *} +SHORT {* returns some status information about the bdd package *} +PROTO {* void bdd_stats(bddStat* stat) *} +DESCR {* This function acquires information about the internal state of + the bdd package. The status information is written into the + {\tt stat} argument. *} +ALSO {* bddStat *} +*/ +void bdd_stats(bddStat *s) +{ + s->produced = bddproduced; + s->nodenum = bddnodesize; + s->maxnodenum = bddmaxnodesize; + s->freenodes = bddfreenum; + s->minfreenodes = minfreenodes; + s->varnum = bddvarnum; + s->cachesize = cachesize; + s->gbcnum = gbcollectnum; +} + + + +/* +NAME {* bdd\_cachestats *} +SECTION {* kernel *} +SHORT {* Fetch cache access usage *} +PROTO {* void bdd_cachestats(bddCacheStat *s) *} +DESCR {* Fetches cache usage information and stores it in {\tt s}. The + fields of {\tt s} can be found in the documentaion for + {\tt bddCacheStat}. This function may or may not be compiled + into the BuDDy package - depending on the setup at compile + time of BuDDy. *} +ALSO {* bddCacheStat, bdd\_printstat *} +*/ +void bdd_cachestats(bddCacheStat *s) +{ + *s = bddcachestats; +} + + +/* +NAME {* bdd\_printstat *} +EXTRA {* bdd\_fprintstat *} +SECTION {* kernel *} +SHORT {* print cache statistics *} +PROTO {* void bdd_printstat(void) +void bdd_fprintstat(FILE *ofile) *} +DESCR {* Prints information about the cache performance on standard output + (or the supplied file). The information contains the number of + accesses to the unique node table, the number of times a node + was (not) found there and how many times a hash chain had to + traversed. Hit and miss count is also given for the operator + caches. *} +ALSO {* bddCacheStat, bdd\_cachestats *} +*/ +void bdd_fprintstat(FILE *ofile) +{ + bddCacheStat s; + bdd_cachestats(&s); + + fprintf(ofile, "\nCache statistics\n"); + fprintf(ofile, "----------------\n"); + + fprintf(ofile, "Unique Access: %ld\n", s.uniqueAccess); + fprintf(ofile, "Unique Chain: %ld\n", s.uniqueChain); + fprintf(ofile, "Unique Hit: %ld\n", s.uniqueHit); + fprintf(ofile, "Unique Miss: %ld\n", s.uniqueMiss); + fprintf(ofile, "=> Hit rate = %.2f\n", + (s.uniqueHit+s.uniqueMiss > 0) ? + ((float)s.uniqueHit)/((float)s.uniqueHit+s.uniqueMiss) : 0); + fprintf(ofile, "Operator Hits: %ld\n", s.opHit); + fprintf(ofile, "Operator Miss: %ld\n", s.opMiss); + fprintf(ofile, "=> Hit rate = %.2f\n", + (s.opHit+s.opMiss > 0) ? + ((float)s.opHit)/((float)s.opHit+s.opMiss) : 0); + fprintf(ofile, "Swap count = %ld\n", s.swapCount); +} + + +void bdd_printstat(void) +{ + bdd_fprintstat(stdout); +} + + +/************************************************************************* + Error handler +*************************************************************************/ + +/* +NAME {* bdd\_errstring *} +SECTION {* kernel *} +SHORT {* converts an error code to a string*} +PROTO {* const char *bdd_errstring(int errorcode) *} +DESCR {* Converts a negative error code {\tt errorcode} to a descriptive + string that can be used for error handling. *} +RETURN {* An error description string if {\tt e} is known, otherwise {\tt NULL}. *} +ALSO {* bdd\_err\_hook *} +*/ +const char *bdd_errstring(int e) +{ + e = abs(e); + if (e<1 || e>BDD_ERRNUM) + return NULL; + return errorstrings[e-1]; +} + + +void bdd_default_errhandler(int e) +{ + fprintf(stderr, "BDD error: %s\n", bdd_errstring(e)); + exit(1); +} + + +int bdd_error(int e) +{ + if (err_handler != NULL) + err_handler(e); + + return e; +} + + +/************************************************************************* + BDD primitives +*************************************************************************/ + +/* +NAME {* bdd\_true *} +SECTION {* kernel *} +SHORT {* returns the constant true bdd *} +PROTO {* BDD bdd_true(void) *} +DESCR {* This function returns the constant true bdd and can freely be + used together with the {\tt bddtrue} and {\tt bddfalse} + constants. *} +RETURN {* The constant true bdd *} +ALSO {* bdd\_false, bddtrue, bddfalse *} +*/ +BDD bdd_true(void) +{ + return 1; +} + + +/* +NAME {* bdd\_false *} +SECTION {* kernel *} +SHORT {* returns the constant false bdd *} +PROTO {* BDD bdd_false(void) *} +DESCR {* This function returns the constant false bdd and can freely be + used together with the {\tt bddtrue} and {\tt bddfalse} + constants. *} +RETURN {* The constant false bdd *} +ALSO {* bdd\_true, bddtrue, bddfalse *} +*/ +BDD bdd_false(void) +{ + return 0; +} + + +/* +NAME {* bdd\_ithvar *} +SECTION {* kernel *} +SHORT {* returns a bdd representing the I'th variable *} +PROTO {* BDD bdd_ithvar(int var) *} +DESCR {* This function is used to get a bdd representing the I'th + variable (one node with the childs true and false). The requested + variable must be in the range define by {\tt + bdd\_setvarnum} starting with 0 being the first. For ease + of use then the bdd returned from {\tt bdd\_ithvar} does + not have to be referenced counted with a call to {\tt + bdd\_addref}. The initial variable order is defined by the + the index {\tt var} that also defines the position in the + variable order -- variables with lower indecies are before + those with higher indecies. *} +RETURN {* The I'th variable on succes, otherwise the constant false bdd *} +ALSO {* bdd\_setvarnum, bdd\_nithvar, bddtrue, bddfalse *} */ +BDD bdd_ithvar(int var) +{ + if (var < 0 || var >= bddvarnum) + { + bdd_error(BDD_VAR); + return bddfalse; + } + + return bddvarset[var*2]; +} + + +/* +NAME {* bdd\_nithvar *} +SECTION {* kernel *} +SHORT {* returns a bdd representing the negation of the I'th variable *} +PROTO {* BDD bdd_nithvar(int var) *} +DESCR {* This function is used to get a bdd representing the negation of + the I'th variable (one node with the childs false and true). + The requested variable must be in the range define by + {\tt bdd\_setvarnum} starting with 0 being the first. For ease of + use then the bdd returned from {\tt bdd\_nithvar} does not have + to be referenced counted with a call to {\tt bdd\_addref}. *} +RETURN {* The negated I'th variable on succes, otherwise the constant false bdd *} +ALSO {* bdd\_setvarnum, bdd\_ithvar, bddtrue, bddfalse *} +*/ +BDD bdd_nithvar(int var) +{ + if (var < 0 || var >= bddvarnum) + { + bdd_error(BDD_VAR); + return bddfalse; + } + + return bddvarset[var*2+1]; +} + + +/* +NAME {* bdd\_varnum *} +SECTION {* kernel *} +SHORT {* returns the number of defined variables *} +PROTO {* int bdd_varnum(void) *} +DESCR {* This function returns the number of variables defined by + a call to {\tt bdd\_setvarnum}.*} +RETURN {* The number of defined variables *} +ALSO {* bdd\_setvarnum, bdd\_ithvar *} +*/ +int bdd_varnum(void) +{ + return bddvarnum; +} + + +/* +NAME {* bdd\_var *} +SECTION {* info *} +SHORT {* gets the variable labeling the bdd *} +PROTO {* int bdd_var(BDD r) *} +DESCR {* Gets the variable labeling the bdd {\tt r}. *} +RETURN {* The variable number. *} +*/ +int bdd_var(BDD root) +{ + CHECK(root); + if (root < 2) + return bdd_error(BDD_ILLBDD); + + return (bddlevel2var[LEVEL(root)]); +} + + +/* +NAME {* bdd\_low *} +SECTION {* info *} +SHORT {* gets the false branch of a bdd *} +PROTO {* BDD bdd_low(BDD r) *} +DESCR {* Gets the false branch of the bdd {\tt r}. *} +RETURN {* The bdd of the false branch *} +ALSO {* bdd\_high *} +*/ +BDD bdd_low(BDD root) +{ + CHECK(root); + if (root < 2) + return bdd_error(BDD_ILLBDD); + + return (LOW(root)); +} + + +/* +NAME {* bdd\_high *} +SECTION {* info *} +SHORT {* gets the true branch of a bdd *} +PROTO {* BDD bdd_high(BDD r) *} +DESCR {* Gets the true branch of the bdd {\tt r}. *} +RETURN {* The bdd of the true branch *} +ALSO {* bdd\_low *} +*/ +BDD bdd_high(BDD root) +{ + CHECK(root); + if (root < 2) + return bdd_error(BDD_ILLBDD); + + return (HIGH(root)); +} + + + +/************************************************************************* + Garbage collection and node referencing +*************************************************************************/ + +void bdd_default_gbchandler(int pre, bddGbcStat *s) +{ + if (!pre) + { + printf("Garbage collection #%d: %d nodes / %d free", + s->num, s->nodes, s->freenodes); + printf(" / %.1fs / %.1fs total\n", + (float)s->time/(float)(CLOCKS_PER_SEC), + (float)s->sumtime/(float)CLOCKS_PER_SEC); + } +} + + +static void bdd_gbc_rehash(void) +{ + int n; + + bddfreepos = 0; + bddfreenum = 0; + + for (n=bddnodesize-1 ; n>=2 ; n--) + { + register BddNode *node = &bddnodes[n]; + + if (LOWp(node) != -1) + { + register unsigned int hash; + + hash = NODEHASH(LEVELp(node), LOWp(node), HIGHp(node)); + node->next = bddnodes[hash].hash; + bddnodes[hash].hash = n; + } + else + { + node->next = bddfreepos; + bddfreepos = n; + bddfreenum++; + } + } +} + + +void bdd_gbc(void) +{ + int *r; + int n; + long int c2, c1 = clock(); + + if (gbc_handler != NULL) + { + bddGbcStat s; + s.nodes = bddnodesize; + s.freenodes = bddfreenum; + s.time = 0; + s.sumtime = gbcclock; + s.num = gbcollectnum; + gbc_handler(1, &s); + } + + for (r=bddrefstack ; r 0) + bdd_mark(n); + bddnodes[n].hash = 0; + } + + bddfreepos = 0; + bddfreenum = 0; + + for (n=bddnodesize-1 ; n>=2 ; n--) + { + register BddNode *node = &bddnodes[n]; + + if ((LEVELp(node) & MARKON) && LOWp(node) != -1) + { + register unsigned int hash; + + LEVELp(node) &= MARKOFF; + hash = NODEHASH(LEVELp(node), LOWp(node), HIGHp(node)); + node->next = bddnodes[hash].hash; + bddnodes[hash].hash = n; + } + else + { + LOWp(node) = -1; + node->next = bddfreepos; + bddfreepos = n; + bddfreenum++; + } + } + + bdd_operator_reset(); + + c2 = clock(); + gbcclock += c2-c1; + gbcollectnum++; + + if (gbc_handler != NULL) + { + bddGbcStat s; + s.nodes = bddnodesize; + s.freenodes = bddfreenum; + s.time = c2-c1; + s.sumtime = gbcclock; + s.num = gbcollectnum; + gbc_handler(0, &s); + } +} + + +/* +NAME {* bdd\_addref *} +SECTION {* kernel *} +SHORT {* increases the reference count on a node *} +PROTO {* BDD bdd_addref(BDD r) *} +DESCR {* Reference counting is done on externaly referenced nodes only + and the count for a specific node {\tt r} can and must be + increased using this function to avoid loosing the node in the next + garbage collection. *} +ALSO {* bdd\_delref *} +RETURN {* The BDD node {\tt r}. *} +*/ +BDD bdd_addref(BDD root) +{ + if (root < 2 || !bddrunning) + return root; + if (root >= bddnodesize) + return bdd_error(BDD_ILLBDD); + if (LOW(root) == -1) + return bdd_error(BDD_ILLBDD); + + INCREF(root); + return root; +} + + +/* +NAME {* bdd\_delref *} +SECTION {* kernel *} +SHORT {* decreases the reference count on a node *} +PROTO {* BDD bdd_delref(BDD r) *} +DESCR {* Reference counting is done on externaly referenced nodes only + and the count for a specific node {\tt r} can and must be + decreased using this function to make it possible to reclaim the + node in the next garbage collection. *} +ALSO {* bdd\_addref *} +RETURN {* The BDD node {\tt r}. *} +*/ +BDD bdd_delref(BDD root) +{ + if (root < 2 || !bddrunning) + return root; + if (root >= bddnodesize) + return bdd_error(BDD_ILLBDD); + if (LOW(root) == -1) + return bdd_error(BDD_ILLBDD); + + /* if the following line is present, fails there much earlier */ + if (!HASREF(root)) bdd_error(BDD_BREAK); /* distinctive */ + + DECREF(root); + return root; +} + + +/*=== RECURSIVE MARK / UNMARK ==========================================*/ + +void bdd_mark(int i) +{ + BddNode *node; + + if (i < 2) + return; + + node = &bddnodes[i]; + if (LEVELp(node) & MARKON || LOWp(node) == -1) + return; + + LEVELp(node) |= MARKON; + + bdd_mark(LOWp(node)); + bdd_mark(HIGHp(node)); +} + + +void bdd_mark_upto(int i, int level) +{ + BddNode *node = &bddnodes[i]; + + if (i < 2) + return; + + if (LEVELp(node) & MARKON || LOWp(node) == -1) + return; + + if (LEVELp(node) > level) + return; + + LEVELp(node) |= MARKON; + + bdd_mark_upto(LOWp(node), level); + bdd_mark_upto(HIGHp(node), level); +} + + +void bdd_markcount(int i, int *cou) +{ + BddNode *node; + + if (i < 2) + return; + + node = &bddnodes[i]; + if (MARKEDp(node) || LOWp(node) == -1) + return; + + SETMARKp(node); + *cou += 1; + + bdd_markcount(LOWp(node), cou); + bdd_markcount(HIGHp(node), cou); +} + + +void bdd_unmark(int i) +{ + BddNode *node; + + if (i < 2) + return; + + node = &bddnodes[i]; + + if (!MARKEDp(node) || LOWp(node) == -1) + return; + UNMARKp(node); + + bdd_unmark(LOWp(node)); + bdd_unmark(HIGHp(node)); +} + + +void bdd_unmark_upto(int i, int level) +{ + BddNode *node = &bddnodes[i]; + + if (i < 2) + return; + + if (!(LEVELp(node) & MARKON)) + return; + + LEVELp(node) &= MARKOFF; + + if (LEVELp(node) > level) + return; + + bdd_unmark_upto(LOWp(node), level); + bdd_unmark_upto(HIGHp(node), level); +} + + +/************************************************************************* + Unique node table functions +*************************************************************************/ + +int bdd_makenode(unsigned int level, int low, int high) +{ + register BddNode *node; + register unsigned int hash; + register int res; + +#ifdef CACHESTATS + bddcachestats.uniqueAccess++; +#endif + + /* check whether childs are equal */ + if (low == high) + return low; + + /* Try to find an existing node of this kind */ + hash = NODEHASH(level, low, high); + res = bddnodes[hash].hash; + + while(res != 0) + { + if (LEVEL(res) == level && LOW(res) == low && HIGH(res) == high) + { +#ifdef CACHESTATS + bddcachestats.uniqueHit++; +#endif + return res; + } + + res = bddnodes[res].next; +#ifdef CACHESTATS + bddcachestats.uniqueChain++; +#endif + } + + /* No existing node -> build one */ +#ifdef CACHESTATS + bddcachestats.uniqueMiss++; +#endif + + /* Any free nodes to use ? */ + if (bddfreepos == 0) + { + if (bdderrorcond) + return 0; + + /* Try to allocate more nodes */ + bdd_gbc(); + + if ((bddnodesize-bddfreenum) >= usednodes_nextreorder && + bdd_reorder_ready()) + { + longjmp(bddexception,1); + } + + if ((bddfreenum*100) / bddnodesize <= minfreenodes) + { + bdd_noderesize(1); + hash = NODEHASH(level, low, high); + } + + /* Panic if that is not possible */ + if (bddfreepos == 0) + { + bdd_error(BDD_NODENUM); + bdderrorcond = abs(BDD_NODENUM); + return 0; + } + } + + /* Build new node */ + res = bddfreepos; + bddfreepos = bddnodes[bddfreepos].next; + bddfreenum--; + bddproduced++; + + node = &bddnodes[res]; + LEVELp(node) = level; + LOWp(node) = low; + HIGHp(node) = high; + + /* Insert node */ + node->next = bddnodes[hash].hash; + bddnodes[hash].hash = res; + + return res; +} + + +int bdd_noderesize(int doRehash) +{ + BddNode *newnodes; + int oldsize = bddnodesize; + int n; + + if (bddnodesize >= bddmaxnodesize && bddmaxnodesize > 0) + return -1; + + bddnodesize = bddnodesize << 1; + + if (bddnodesize > oldsize + bddmaxnodeincrease) + bddnodesize = oldsize + bddmaxnodeincrease; + + if (bddnodesize > bddmaxnodesize && bddmaxnodesize > 0) + bddnodesize = bddmaxnodesize; + + bddnodesize = bdd_prime_lte(bddnodesize); + + if (resize_handler != NULL) + resize_handler(oldsize, bddnodesize); + + newnodes = (BddNode*)realloc(bddnodes, sizeof(BddNode)*bddnodesize); + if (newnodes == NULL) + return bdd_error(BDD_MEMORY); + bddnodes = newnodes; + + if (doRehash) + for (n=0 ; n 1 ; n=HIGH(n)) + num++; + + if (((*varset) = (int *)malloc(sizeof(int)*num)) == NULL) + return bdd_error(BDD_MEMORY); + + for (n=r, num=0 ; n > 1 ; n=HIGH(n)) + (*varset)[num++] = bddlevel2var[LEVEL(n)]; + + *varnum = num; + + return 0; +} + + +/* +NAME {* bdd\_makeset *} +SECTION {* kernel *} +SHORT {* builds a BDD variable set from an integer array *} +PROTO {* BDD bdd_makeset(int *v, int n) *} +DESCR {* Reads a set of variable numbers from the integer array {\tt v} + which must hold exactly {\tt n} integers and then builds a BDD + representing the variable set. + + The BDD variable set is represented as the conjunction of + all the variables in their positive form and may just as + well be made that way by the user. The user should keep a + reference to the returned BDD instead of building it every + time the set is needed. *} +ALSO {* bdd\_scanset *} +RETURN {* A BDD variable set. *} */ +BDD bdd_makeset(int *varset, int varnum) +{ + int v, res=1; + + for (v=varnum-1 ; v>=0 ; v--) + { + BDD tmp; + bdd_addref(res); + tmp = bdd_apply(res, bdd_ithvar(varset[v]), bddop_and); + bdd_delref(res); + res = tmp; + } + + return res; +} + + +/* EOF */ + +/* int PUSHREF(int a) {return *(bddrefstacktop++) = (a);} */ diff --git a/sdk/buddy-2.4/src/kernel.h b/sdk/buddy-2.4/src/kernel.h new file mode 100644 index 0000000..03f3321 --- /dev/null +++ b/sdk/buddy-2.4/src/kernel.h @@ -0,0 +1,231 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/kernel.h,v 1.2 2004/07/13 20:51:49 haimcohen Exp $ + FILE: kernel.h + DESCR: Kernel specific definitions for BDD package + AUTH: Jorn Lind + DATE: (C) june 1997 +*************************************************************************/ + +#ifndef _KERNEL_H +#define _KERNEL_H + +/*=== Includes =========================================================*/ + +#include +#include +#include "bdd.h" + +/*=== SANITY CHECKS ====================================================*/ + + /* Make sure we use at least 32 bit integers */ +#if (INT_MAX < 0x7FFFFFFF) +#error The compiler does not support 4 byte integers! +#endif + + + /* Sanity check argument and return eventual error code */ +#define CHECK(r)\ + if (!bddrunning) return bdd_error(BDD_RUNNING);\ + else if ((r) < 0 || (r) >= bddnodesize) return bdd_error(BDD_ILLBDD);\ + else if (r >= 2 && LOW(r) == -1) return bdd_error(BDD_ILLBDD)\ + + /* Sanity check argument and return eventually the argument 'a' */ +#define CHECKa(r,a)\ + if (!bddrunning) { bdd_error(BDD_RUNNING); return (a); }\ + else if ((r) < 0 || (r) >= bddnodesize)\ + { bdd_error(BDD_ILLBDD); return (a); }\ + else if (r >= 2 && LOW(r) == -1)\ + { bdd_error(BDD_ILLBDD); return (a); } + +#define CHECKn(r)\ + if (!bddrunning) { bdd_error(BDD_RUNNING); return; }\ + else if ((r) < 0 || (r) >= bddnodesize)\ + { bdd_error(BDD_ILLBDD); return; }\ + else if (r >= 2 && LOW(r) == -1)\ + { bdd_error(BDD_ILLBDD); return; } + + +/*=== SEMI-INTERNAL TYPES ==============================================*/ + +typedef struct s_BddNode /* Node table entry */ +{ + unsigned int refcou : 10; + unsigned int level : 22; + int low; + int high; + int hash; + int next; +} BddNode; + + +/*=== KERNEL VARIABLES =================================================*/ + +#ifdef CPLUSPLUS +extern "C" { +#endif + +extern int bddrunning; /* Flag - package initialized */ +extern int bdderrorcond; /* Some error condition was met */ +extern int bddnodesize; /* Number of allocated nodes */ +extern int bddmaxnodesize; /* Maximum allowed number of nodes */ +extern int bddmaxnodeincrease; /* Max. # of nodes used to inc. table */ +extern BddNode* bddnodes; /* All of the bdd nodes */ +extern int bddvarnum; /* Number of defined BDD variables */ +extern int* bddrefstack; /* Internal node reference stack */ +extern int* bddrefstacktop; /* Internal node reference stack top */ +extern int* bddvar2level; +extern int* bddlevel2var; +extern jmp_buf bddexception; +extern int bddreorderdisabled; +extern int bddresized; +extern bddCacheStat bddcachestats; + +#ifdef CPLUSPLUS +} +#endif + + +/*=== KERNEL DEFINITIONS ===============================================*/ + +#define MAXVAR 0x1FFFFF +#define MAXREF 0x3FF + + /* Reference counting */ +#define DECREF(n) if (bddnodes[n].refcou!=MAXREF && bddnodes[n].refcou>0) bddnodes[n].refcou-- +#define INCREF(n) if (bddnodes[n].refcourefcou!=MAXREF && n->refcou>0) n->refcou-- +#define INCREFp(n) if (n->refcourefcou++ +#define HASREF(n) (bddnodes[n].refcou > 0) + + /* Marking BDD nodes */ +#define MARKON 0x200000 /* Bit used to mark a node (1) */ +#define MARKOFF 0x1FFFFF /* - unmark */ +#define MARKHIDE 0x1FFFFF +#define SETMARK(n) (bddnodes[n].level |= MARKON) +#define UNMARK(n) (bddnodes[n].level &= MARKOFF) +#define MARKED(n) (bddnodes[n].level & MARKON) +#define SETMARKp(p) (node->level |= MARKON) +#define UNMARKp(p) (node->level &= MARKOFF) +#define MARKEDp(p) (node->level & MARKON) + + /* Hashfunctions */ + +#define PAIR(a,b) ((unsigned int)((((unsigned int)a)+((unsigned int)b))*(((unsigned int)a)+((unsigned int)b)+((unsigned int)1))/((unsigned int)2)+((unsigned int)a))) +#define TRIPLE(a,b,c) ((unsigned int)(PAIR((unsigned int)c,PAIR(a,b)))) + + + /* Inspection of BDD nodes */ +#define ISCONST(a) ((a) < 2) +#define ISNONCONST(a) ((a) >= 2) +#define ISONE(a) ((a) == 1) +#define ISZERO(a) ((a) == 0) +#define LEVEL(a) (bddnodes[a].level) +#define LOW(a) (bddnodes[a].low) +#define HIGH(a) (bddnodes[a].high) +#define LEVELp(p) ((p)->level) +#define LOWp(p) ((p)->low) +#define HIGHp(p) ((p)->high) + + /* Stacking for garbage collector */ +#define INITREF (bddrefstacktop = bddrefstack) +#define PUSHREF(a) (*(bddrefstacktop++) = (a)) +/* int PUSHREF(int a); */ +#define READREF(a) (*(bddrefstacktop-(a))) +#define POPREF(a) (bddrefstacktop -= (a)) + +#define BDDONE 1 +#define BDDZERO 0 + +#ifndef CLOCKS_PER_SEC + /* Pass `CPPFLAGS=-DDEFAULT_CLOCK=1000' as an argument to ./configure + to override this setting. */ +# ifndef DEFAULT_CLOCK +# define DEFAULT_CLOCK 60 +# endif +# define CLOCKS_PER_SEC DEFAULT_CLOCK +#endif + +#define DEFAULTMAXNODEINC 50000 + +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#define MAX(a,b) ((a) > (b) ? (a) : (b)) +#define NEW(t,n) ( (t*)malloc(sizeof(t)*(n)) ) + + +/*=== KERNEL PROTOTYPES ================================================*/ + +#ifdef CPLUSPLUS +extern "C" { +#endif + +extern int bdd_error(int); +extern int bdd_makenode(unsigned int, int, int); +extern int bdd_noderesize(int); +extern void bdd_checkreorder(void); +extern void bdd_mark(int); +extern void bdd_mark_upto(int, int); +extern void bdd_markcount(int, int*); +extern void bdd_unmark(int); +extern void bdd_unmark_upto(int, int); +extern void bdd_register_pair(bddPair*); +extern int *fdddec2bin(int, int); + +extern int bdd_operator_init(int); +extern void bdd_operator_done(void); +extern void bdd_operator_varresize(void); +extern void bdd_operator_reset(void); + +extern void bdd_pairs_init(void); +extern void bdd_pairs_done(void); +extern int bdd_pairs_resize(int,int); +extern void bdd_pairs_vardown(int); + +extern void bdd_fdd_init(void); +extern void bdd_fdd_done(void); + +extern void bdd_reorder_init(void); +extern void bdd_reorder_done(void); +extern int bdd_reorder_ready(void); +extern void bdd_reorder_auto(void); +extern int bdd_reorder_vardown(int); +extern int bdd_reorder_varup(int); + +extern void bdd_cpp_init(void); + +#ifdef CPLUSPLUS +} +#endif + +#endif /* _KERNEL_H */ + + +/* EOF */ diff --git a/sdk/buddy-2.4/src/libbdd.la b/sdk/buddy-2.4/src/libbdd.la new file mode 100644 index 0000000..75c807d --- /dev/null +++ b/sdk/buddy-2.4/src/libbdd.la @@ -0,0 +1,35 @@ +# libbdd.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.6 (1.1220.2.95 2004/04/11 05:50:42) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libbdd.so.0' + +# Names of this library. +library_names='libbdd.so.0.0.0 libbdd.so.0 libbdd.so' + +# The name of the static archive. +old_library='libbdd.a' + +# Libraries that this one depends upon. +dependency_libs='' + +# Version information for libbdd. +current=0 +age=0 +revision=0 + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/usr/local/lib' diff --git a/sdk/buddy-2.4/src/pairs.c b/sdk/buddy-2.4/src/pairs.c new file mode 100644 index 0000000..c77a52b --- /dev/null +++ b/sdk/buddy-2.4/src/pairs.c @@ -0,0 +1,335 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/pairs.c,v 1.1.1.1 2004/06/25 13:22:50 haimcohen Exp $ + FILE: pairs.c + DESCR: Pair management for BDD package. + AUTH: Jorn Lind + DATE: february 1997 +*************************************************************************/ +#include +#include +#include "kernel.h" + +/*======================================================================*/ + +static int pairsid; /* Pair identifier */ +static bddPair* pairs; /* List of all replacement pairs in use */ + + +/************************************************************************* +*************************************************************************/ + +void bdd_pairs_init(void) +{ + pairsid = 0; + pairs = NULL; +} + + +void bdd_pairs_done(void) +{ + bddPair *p = pairs; + int n; + + while (p != NULL) + { + bddPair *next = p->next; + for (n=0 ; nresult[n] ); + free(p->result); + free(p); + p = next; + } +} + + +static int update_pairsid(void) +{ + pairsid++; + + if (pairsid == (INT_MAX >> 2)) + { + bddPair *p; + pairsid = 0; + for (p=pairs ; p!=NULL ; p=p->next) + p->id = pairsid++; + bdd_operator_reset(); + } + + return pairsid; +} + + +void bdd_register_pair(bddPair *p) +{ + p->next = pairs; + pairs = p; +} + + +void bdd_pairs_vardown(int level) +{ + bddPair *p; + + for (p=pairs ; p!=NULL ; p=p->next) + { + int tmp; + + tmp = p->result[level]; + p->result[level] = p->result[level+1]; + p->result[level+1] = tmp; + + if (p->last == level) + p->last++; + } +} + + +int bdd_pairs_resize(int oldsize, int newsize) +{ + bddPair *p; + int n; + + for (p=pairs ; p!=NULL ; p=p->next) + { + if ((p->result=(BDD*)realloc(p->result,sizeof(BDD)*newsize)) == NULL) + return bdd_error(BDD_MEMORY); + + for (n=oldsize ; nresult[n] = bdd_ithvar(bddlevel2var[n]); + } + + return 0; +} + + +/* +NAME {* bdd\_newpair *} +SECTION {* kernel *} +SHORT {* creates an empty variable pair table *} +PROTO {* bddPair *bdd_newpair(void) *} +DESCR {* Variable pairs of the type {\tt bddPair} are used in + {\tt bdd\_replace} to define which variables to replace with + other variables. This function allocates such an empty table. The + table can be freed by a call to {\em bdd\_freepair}. *} +RETURN {* Returns a new table of pairs. *} +ALSO {* bdd\_freepair, bdd\_replace, bdd\_setpair, bdd\_setpairs *} +*/ +bddPair *bdd_newpair(void) +{ + int n; + bddPair *p; + + if ((p=(bddPair*)malloc(sizeof(bddPair))) == NULL) + { + bdd_error(BDD_MEMORY); + return NULL; + } + + if ((p->result=(BDD*)malloc(sizeof(BDD)*bddvarnum)) == NULL) + { + free(p); + bdd_error(BDD_MEMORY); + return NULL; + } + + for (n=0 ; nresult[n] = bdd_ithvar(bddlevel2var[n]); + + p->id = update_pairsid(); + p->last = -1; + + bdd_register_pair(p); + return p; +} + + +/* +NAME {* bdd\_setpair *} +EXTRA {* bdd\_setbddpair *} +SECTION {* kernel *} +SHORT {* set one variable pair *} +PROTO {* int bdd_setpair(bddPair *pair, int oldvar, int newvar) +int bdd_setbddpair(bddPair *pair, BDD oldvar, BDD newvar) *} +DESCR {* Adds the pair {\tt (oldvar,newvar)} to the table of pairs + {\tt pair}. This results in {\tt oldvar} being substituted + with {\tt newvar} in a call to {\tt bdd\_replace}. In the first + version {\tt newvar} is an integer representing the variable + to be replaced with the old variable. + In the second version {\tt oldvar} is a BDD. + In this case the variable {\tt oldvar} is substituted with the + BDD {\tt newvar}. + The possibility to substitute with any BDD as {\tt newvar} is + utilized in bdd\_compose, whereas only the topmost variable + in the BDD is used in bdd\_replace. *} +RETURN {* Zero on success, otherwise a negative error code. *} +ALSO {* bdd\_newpair, bdd\_setpairs, bdd\_resetpair, bdd\_replace, bdd\_compose *} +*/ +int bdd_setpair(bddPair *pair, int oldvar, int newvar) +{ + if (pair == NULL) + return 0; + + if (oldvar < 0 || oldvar > bddvarnum-1) + return bdd_error(BDD_VAR); + if (newvar < 0 || newvar > bddvarnum-1) + return bdd_error(BDD_VAR); + + bdd_delref( pair->result[bddvar2level[oldvar]] ); + pair->result[bddvar2level[oldvar]] = bdd_ithvar(newvar); + pair->id = update_pairsid(); + + if (bddvar2level[oldvar] > pair->last) + pair->last = bddvar2level[oldvar]; + + return 0; +} + + +int bdd_setbddpair(bddPair *pair, int oldvar, BDD newvar) +{ + int oldlevel; + + if (pair == NULL) + return 0; + + CHECK(newvar); + if (oldvar < 0 || oldvar >= bddvarnum) + return bdd_error(BDD_VAR); + oldlevel = bddvar2level[oldvar]; + + bdd_delref( pair->result[oldlevel] ); + pair->result[oldlevel] = bdd_addref(newvar); + pair->id = update_pairsid(); + + if (oldlevel > pair->last) + pair->last = oldlevel; + + return 0; +} + + +/* +NAME {* bdd\_setpairs *} +EXTRA {* bdd\_setbddpairs *} +SECTION {* kernel *} +SHORT {* defines a whole set of pairs *} +PROTO {* int bdd_setpairs(bddPair *pair, int *oldvar, int *newvar, int size) +int bdd_setbddpairs(bddPair *pair, int *oldvar, BDD *newvar, int size) *} +DESCR {* As for {\tt bdd\_setpair} but with {\tt oldvar} and {\tt newvar} + being arrays of variables (BDDs) of size {\tt size}. *} +RETURN {* Zero on success, otherwise a negative error code. *} +ALSO {* bdd\_newpair, bdd\_setpair, bdd\_replace, bdd\_compose *} +*/ +int bdd_setpairs(bddPair *pair, int *oldvar, int *newvar, int size) +{ + int n,e; + if (pair == NULL) + return 0; + + for (n=0 ; nnext != p) + bp = bp->next; + + if (bp != NULL) + bp->next = p->next; + } + else + pairs = p->next; + + for (n=0 ; nresult[n] ); + free(p->result); + free(p); +} + + +/* +NAME {* bdd\_resetpair *} +SECTION {* kernel *} +SHORT {* clear all variable pairs *} +PROTO {* void bdd_resetpair(bddPair *pair) *} +DESCR {* Resets the table of pairs {\tt pair} by setting all substitutions + to their default values (that is no change). *} +ALSO {* bdd\_newpair, bdd\_setpair, bdd\_freepair *} +*/ +void bdd_resetpair(bddPair *p) +{ + int n; + + for (n=0 ; nresult[n] = bdd_ithvar(n); + p->last = 0; +} + + +/* EOF */ + diff --git a/sdk/buddy-2.4/src/prime.c b/sdk/buddy-2.4/src/prime.c new file mode 100644 index 0000000..13c9ac6 --- /dev/null +++ b/sdk/buddy-2.4/src/prime.c @@ -0,0 +1,321 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/prime.c,v 1.1.1.1 2004/06/25 13:22:51 haimcohen Exp $ + FILE: prime.c + DESCR: Prime number calculations + AUTH: Jorn Lind + DATE: (C) feb 2001 +*************************************************************************/ +#include +#include +#include +#include "prime.h" + + +#define Random(i) ( (rand() % (i)) + 1 ) +#define isEven(src) (!((src) & 0x1)) +#define hasFactor(src,n) ( (((src)!=(n)) && ((src)%(n) == 0)) ) +#define BitIsSet(src,b) ( ((src) & (1<<(b))) != 0 ) + +#define CHECKTIMES 20 + +#if defined(BUDDYUINT64) + typedef BUDDYUINT64 UINT64; + #define BUILTIN64 +#elif defined(__GNUC__) || defined(__KCC) + typedef long long UINT64; + #define BUILTIN64 +#elif defined(_MSV_VER) + typedef unsigned _int64 UINT64; + #define BUILTIN64 +#else + typedef struct __UINT64 + { + unsigned int hi; + unsigned int lo; + } UINT64; + + #define MAX(a,b) ((a) > (b) ? (a) : (b)) + #define GETCARRY(a,b) ( ((a)+(b)) < MAX((a),(b)) ? 1 : 0 ) +#endif + + +#ifndef BUILTIN64 +/************************************************************************* + 64 bit unsigned int arithmetics +*************************************************************************/ + +static UINT64 u64_mul(unsigned int x, unsigned int y) +{ + UINT64 res; + unsigned int yh = 0; + unsigned int yl = y; + int i; + + res.lo = res.hi = 0; + + for (i=0 ; i<32 ; ++i) + { + if (x & 0x1) + { + unsigned int carry = GETCARRY(res.lo,yl); + res.lo += yl; + res.hi += yh + carry; + } + + yh = (yh << 1) | (yl & 0x80000000 ? 1 : 0); + yl = (yl << 1); + + x >>= 1; + } + + return res; +} + + +static void u64_shl(UINT64* a, unsigned int *carryOut) +{ + *carryOut = (*carryOut << 1) | (a->hi & 0x80000000 ? 0x1 : 0x0); + a->hi = (a->hi << 1) | (a->lo & 0x80000000 ? 0x1 : 0x0); + a->lo = (a->lo << 1); +} + + +static unsigned int u64_mod(UINT64 dividend, unsigned int divisor) +{ + unsigned int remainder = 0; + int i; + + u64_shl(÷nd, &remainder); + + for (i=0 ; i<64 ; ++i) + { + if (remainder >= divisor) + remainder -= divisor; + + u64_shl(÷nd, &remainder); + } + + return remainder >> 1; +} +#endif /* BUILTIN64 */ + +#ifdef BUILTIN64 +#define u64_mulmod(a,b,c) ((unsigned int)( ((UINT64)a*(UINT64)b)%(UINT64)c )); +#else +#define u64_mulmod(a,b,c) u64_mod( u64_mul((a),(b)), (c) ); +#endif + + +/************************************************************************* + Miller Rabin check +*************************************************************************/ + +static unsigned int numberOfBits(unsigned int src) +{ + unsigned int b; + + if (src == 0) + return 0; + + for (b=(sizeof(unsigned int)*8)-1 ; b>0 ; --b) + if (BitIsSet(src,b)) + return b+1; + + return 1; +} + + + +static int isWitness(unsigned int witness, unsigned int src) +{ + unsigned int bitNum = numberOfBits(src-1)-1; + unsigned int d = 1; + int i; + + for (i=bitNum ; i>=0 ; --i) + { + unsigned int x = d; + + d = u64_mulmod(d,d,src); + + if (d == 1 && x != 1 && x != src-1) + return 1; + + if (BitIsSet(src-1,i)) + d = u64_mulmod(d,witness,src); + } + + return d != 1; +} + + +static int isMillerRabinPrime(unsigned int src) +{ + int n; + + for (n=0 ; n +#include +#include +#include +#include +#include "kernel.h" +#include "bddtree.h" +#include "imatrix.h" +#include "prime.h" + +/* IMPORTANT: + * The semantics of the "level" field in the BddNode struct changes during + * variable reordering in order to make a fast variable swap possible when + * two variables are independent. Instead of refering to the level of the node + * it refers to the *variable* !!! + */ + + /* Change macros to reflect the above idea */ +#define VAR(n) (bddnodes[n].level) +#define VARp(p) (p->level) + + /* Avoid these - they are misleading! */ +#undef LEVEL +#undef LEVELp + + +#define __USERESIZE /* FIXME */ + + /* Current auto reord. method and number of automatic reorderings left */ +static int bddreordermethod; +static int bddreordertimes; + + /* Flag for disabling reordering temporarily */ +static int reorderdisabled; + + /* Store for the variable relationships */ +static BddTree *vartree; +static int blockid; + + /* Store for the ref.cou. of the external roots */ +static int *extroots; +static int extrootsize; + +/* Level data */ +typedef struct _levelData +{ + int start; /* Start of this sub-table (entry in "bddnodes") */ + int size; /* Size of this sub-table */ + int maxsize; /* Max. allowed size of sub-table */ + int nodenum; /* Number of nodes in this level */ +} levelData; + +static levelData *levels; /* Indexed by variable! */ + + /* Interaction matrix */ +static imatrix *iactmtx; + + /* Reordering information for the user */ +static int verbose; +static bddinthandler reorder_handler; +static bddfilehandler reorder_filehandler; +static bddsizehandler reorder_nodenum; + + /* Number of live nodes before and after a reordering session */ +static int usednum_before; +static int usednum_after; + + /* Kernel variables needed for reordering */ +extern int bddfreepos; +extern int bddfreenum; +extern int bddproduced; + + /* Flag telling us when a node table resize is done */ +static int resizedInMakenode; + + /* New node hashing function for use with reordering */ +#define NODEHASH(var,l,h) ((PAIR((l),(h))%levels[var].size)+levels[var].start) + + /* Reordering prototypes */ +static void blockdown(BddTree *); +static void addref_rec(int, char *); +static void reorder_gbc(); +static void reorder_setLevellookup(void); +static int reorder_makenode(int, int, int); +static int reorder_varup(int); +static int reorder_vardown(int); +static int reorder_init(void); +static void reorder_done(void); + +#define random(a) (rand() % (a)) + + /* For sorting the blocks according to some specific size value */ +typedef struct s_sizePair +{ + int val; + BddTree *block; +} sizePair; + + +/************************************************************************* + Initialize and shutdown +*************************************************************************/ + +void bdd_reorder_init(void) +{ + reorderdisabled = 0; + vartree = NULL; + + bdd_clrvarblocks(); + bdd_reorder_hook(bdd_default_reohandler); + bdd_reorder_verbose(0); + bdd_autoreorder_times(BDD_REORDER_NONE, 0); + reorder_nodenum = bdd_getnodenum; + usednum_before = usednum_after = 0; + blockid = 0; +} + + +void bdd_reorder_done(void) +{ + bddtree_del(vartree); + bdd_operator_reset(); + vartree = NULL; +} + + +/************************************************************************* + Reordering heuristics +*************************************************************************/ + +/*=== Reorder using a sliding window of size 2 =========================*/ + +static BddTree *reorder_win2(BddTree *t) +{ + BddTree *this=t, *first=t; + + if (t == NULL) + return t; + + if (verbose > 1) + printf("Win2 start: %d nodes\n", reorder_nodenum()); + fflush(stdout); + + while (this->next != NULL) + { + int best = reorder_nodenum(); + blockdown(this); + + if (best < reorder_nodenum()) + { + blockdown(this->prev); + this = this->next; + } + else + if (first == this) + first = this->prev; + + if (verbose > 1) + { + printf("."); + fflush(stdout); + } + } + + if (verbose > 1) + printf("\nWin2 end: %d nodes\n", reorder_nodenum()); + fflush(stdout); + + return first; +} + + +static BddTree *reorder_win2ite(BddTree *t) +{ + BddTree *this, *first=t; + int lastsize; + int c=1; + + if (t == NULL) + return t; + + if (verbose > 1) + printf("Win2ite start: %d nodes\n", reorder_nodenum()); + + do + { + lastsize = reorder_nodenum(); + + this = t; + while (this->next != NULL) + { + int best = reorder_nodenum(); + + blockdown(this); + + if (best < reorder_nodenum()) + { + blockdown(this->prev); + this = this->next; + } + else + if (first == this) + first = this->prev; + if (verbose > 1) + { + printf("."); + fflush(stdout); + } + } + + if (verbose > 1) + printf(" %d nodes\n", reorder_nodenum()); + c++; + } + while (reorder_nodenum() != lastsize); + + return first; +} + + +/*=== Reorder using a sliding window of size 3 =========================*/ +#define X(a) + +static BddTree *reorder_swapwin3(BddTree *this, BddTree **first) +{ + int setfirst = (this->prev == NULL ? 1 : 0); + BddTree *next = this; + int best = reorder_nodenum(); + + if (this->next->next == NULL) /* Only two blocks left -> win2 swap */ + { + blockdown(this); + + if (best < reorder_nodenum()) + { + blockdown(this->prev); + next = this->next; + } + else + { + next = this; + if (setfirst) + *first = this->prev; + } + } + else /* Real win3 swap */ + { + int pos = 0; + X(printf("%d: ", reorder_nodenum())); + blockdown(this); /* B A* C (4) */ + X(printf("A")); + pos++; + if (best > reorder_nodenum()) + { + X(printf("(%d)", reorder_nodenum())); + pos = 0; + best = reorder_nodenum(); + } + + blockdown(this); /* B C A* (3) */ + X(printf("B")); + pos++; + if (best > reorder_nodenum()) + { + X(printf("(%d)", reorder_nodenum())); + pos = 0; + best = reorder_nodenum(); + } + + this = this->prev->prev; + blockdown(this); /* C B* A (2) */ + X(printf("C")); + pos++; + if (best > reorder_nodenum()) + { + X(printf("(%d)", reorder_nodenum())); + pos = 0; + best = reorder_nodenum(); + } + + blockdown(this); /* C A B* (1) */ + X(printf("D")); + pos++; + if (best > reorder_nodenum()) + { + X(printf("(%d)", reorder_nodenum())); + pos = 0; + best = reorder_nodenum(); + } + + this = this->prev->prev; + blockdown(this); /* A C* B (0)*/ + X(printf("E")); + pos++; + if (best > reorder_nodenum()) + { + X(printf("(%d)", reorder_nodenum())); + pos = 0; + best = reorder_nodenum(); + } + + X(printf(" -> ")); + + if (pos >= 1) /* A C B -> C A* B */ + { + this = this->prev; + blockdown(this); + next = this; + if (setfirst) + *first = this->prev; + X(printf("a(%d)", reorder_nodenum())); + } + + if (pos >= 2) /* C A B -> C B A* */ + { + blockdown(this); + next = this->prev; + if (setfirst) + *first = this->prev->prev; + X(printf("b(%d)", reorder_nodenum())); + } + + if (pos >= 3) /* C B A -> B C* A */ + { + this = this->prev->prev; + blockdown(this); + next = this; + if (setfirst) + *first = this->prev; + X(printf("c(%d)", reorder_nodenum())); + } + + if (pos >= 4) /* B C A -> B A C* */ + { + blockdown(this); + next = this->prev; + if (setfirst) + *first = this->prev->prev; + X(printf("d(%d)", reorder_nodenum())); + } + + if (pos >= 5) /* B A C -> A B* C */ + { + this = this->prev->prev; + blockdown(this); + next = this; + if (setfirst) + *first = this->prev; + X(printf("e(%d)", reorder_nodenum())); + } + X(printf("\n")); + } + + return next; +} + + +static BddTree *reorder_win3(BddTree *t) +{ + BddTree *this=t, *first=t; + + if (t == NULL) + return t; + + if (verbose > 1) + printf("Win3 start: %d nodes\n", reorder_nodenum()); + fflush(stdout); + + while (this->next != NULL) + { + this = reorder_swapwin3(this, &first); + + if (verbose > 1) + { + printf("."); + fflush(stdout); + } + } + + if (verbose > 1) + printf("\nWin3 end: %d nodes\n", reorder_nodenum()); + fflush(stdout); + + return first; +} + + +static BddTree *reorder_win3ite(BddTree *t) +{ + BddTree *this=t, *first=t; + int lastsize; + + if (t == NULL) + return t; + + if (verbose > 1) + printf("Win3ite start: %d nodes\n", reorder_nodenum()); + + do + { + lastsize = reorder_nodenum(); + this = first; + + while (this->next != NULL && this->next->next != NULL) + { + this = reorder_swapwin3(this, &first); + + if (verbose > 1) + { + printf("."); + fflush(stdout); + } + } + + if (verbose > 1) + printf(" %d nodes\n", reorder_nodenum()); + } + while (reorder_nodenum() != lastsize); + + if (verbose > 1) + printf("Win3ite end: %d nodes\n", reorder_nodenum()); + + return first; +} + + +/*=== Reorder by sifting =============================================*/ + +/* Move a specific block up and down in the order and place at last in + the best position +*/ +static void reorder_sift_bestpos(BddTree *blk, int middlePos) +{ + int best = reorder_nodenum(); + int maxAllowed; + int bestpos = 0; + int dirIsUp = 1; + int n; + + if (bddmaxnodesize > 0) + maxAllowed = MIN(best/5+best, bddmaxnodesize-bddmaxnodeincrease-2); + else + maxAllowed = best/5+best; + + /* Determine initial direction */ + if (blk->pos > middlePos) + dirIsUp = 0; + + /* Move block back and forth */ + for (n=0 ; n<2 ; n++) + { + int first = 1; + + if (dirIsUp) + { + while (blk->prev != NULL && + (reorder_nodenum() <= maxAllowed || first)) + { + first = 0; + blockdown(blk->prev); + bestpos--; + + if (verbose > 1) + { + printf("-"); + fflush(stdout); + } + + if (reorder_nodenum() < best) + { + best = reorder_nodenum(); + bestpos = 0; + + if (bddmaxnodesize > 0) + maxAllowed = MIN(best/5+best, + bddmaxnodesize-bddmaxnodeincrease-2); + else + maxAllowed = best/5+best; + } + } + } + else + { + while (blk->next != NULL && + (reorder_nodenum() <= maxAllowed || first)) + { + first = 0; + blockdown(blk); + bestpos++; + + if (verbose > 1) + { + printf("+"); + fflush(stdout); + } + + if (reorder_nodenum() < best) + { + best = reorder_nodenum(); + bestpos = 0; + + if (bddmaxnodesize > 0) + maxAllowed = MIN(best/5+best, + bddmaxnodesize-bddmaxnodeincrease-2); + else + maxAllowed = best/5+best; + } + } + } + + if (reorder_nodenum() > maxAllowed && verbose > 1) + { + printf("!"); + fflush(stdout); + } + + dirIsUp = !dirIsUp; + } + + /* Move to best pos */ + while (bestpos < 0) + { + blockdown(blk); + bestpos++; + } + while (bestpos > 0) + { + blockdown(blk->prev); + bestpos--; + } +} + + +/* Go through all blocks in a specific sequence and find best + position for each of them +*/ +static BddTree *reorder_sift_seq(BddTree *t, BddTree **seq, int num) +{ + BddTree *this; + int n; + + if (t == NULL) + return t; + + for (n=0 ; n 1) + { + printf("Sift "); + if (reorder_filehandler) + reorder_filehandler(stdout, seq[n]->id); + else + printf("%d", seq[n]->id); + printf(": "); + } + + reorder_sift_bestpos(seq[n], num/2); + + if (verbose > 1) + printf("\n> %d nodes", reorder_nodenum()); + + c2 = clock(); + if (verbose > 1) + printf(" (%.1f sec)\n", (float)(c2-c1)/CLOCKS_PER_SEC); + } + + /* Find first block */ + for (this=t ; this->prev != NULL ; this=this->prev) + /* nil */; + + return this; +} + + +/* Compare function for sorting sifting sequence + */ +static int siftTestCmp(const void *aa, const void *bb) +{ + const sizePair *a = (sizePair*)aa; + const sizePair *b = (sizePair*)bb; + + if (a->val < b->val) + return -1; + if (a->val > b->val) + return 1; + return 0; +} + + +/* Find sifting sequence based on the number of nodes at each level + */ +static BddTree *reorder_sift(BddTree *t) +{ + BddTree *this, **seq; + sizePair *p; + int n, num; + + for (this=t,num=0 ; this!=NULL ; this=this->next) + this->pos = num++; + + if ((p=NEW(sizePair,num)) == NULL) + return t; + if ((seq=NEW(BddTree*,num)) == NULL) + { + free(p); + return t; + } + + for (this=t,n=0 ; this!=NULL ; this=this->next,n++) + { + int v; + + /* Accumulate number of nodes for each block */ + p[n].val = 0; + for (v=this->first ; v<=this->last ; v++) + p[n].val -= levels[v].nodenum; + + p[n].block = this; + } + + /* Sort according to the number of nodes at each level */ + qsort(p, num, sizeof(sizePair), siftTestCmp); + + /* Create sequence */ + for (n=0 ; n 1) + printf("Reorder %d\n", c++); + + lastsize = reorder_nodenum(); + first = reorder_sift(first); + } + while (reorder_nodenum() != lastsize); + + return first; +} + + +/*=== Random reordering (mostly for debugging and test ) =============*/ + +static BddTree *reorder_random(BddTree *t) +{ + BddTree *this; + BddTree **seq; + int n, num=0; + + if (t == NULL) + return t; + + for (this=t ; this!=NULL ; this=this->next) + num++; + seq = NEW(BddTree*,num); + for (this=t,num=0 ; this!=NULL ; this=this->next) + seq[num++] = this; + + for (n=0 ; n<4*num ; n++) + { + int blk = random(num); + if (seq[blk]->next != NULL) + blockdown(seq[blk]); + } + + /* Find first block */ + for (this=t ; this->prev != NULL ; this=this->prev) + /* nil */; + + free(seq); + + if (verbose) + printf("Random order: %d nodes\n", reorder_nodenum()); + return this; +} + + +/************************************************************************* + Swapping adjacent blocks +*************************************************************************/ + +static void blockdown(BddTree *left) +{ + BddTree *right = left->next; + int n; + int leftsize = left->last - left->first; + int rightsize = right->last - right->first; + int leftstart = bddvar2level[left->seq[0]]; + int *lseq = left->seq; + int *rseq = right->seq; + + /* Move left past right */ + while (bddvar2level[lseq[0]] < bddvar2level[rseq[rightsize]]) + { + for (n=0 ; n leftstart) + { + for (n=rightsize ; n>0 ; n--) + { + if (bddvar2level[rseq[n]]-1 != bddvar2level[rseq[n-1]] + && bddvar2level[rseq[n]] > leftstart) + { + reorder_varup(rseq[n]); + } + } + + if (bddvar2level[rseq[0]] > leftstart) + reorder_varup(rseq[0]); + } + + /* Swap left and right data in the order */ + left->next = right->next; + right->prev = left->prev; + left->prev = right; + right->next = left; + + if (right->prev != NULL) + right->prev->next = right; + if (left->next != NULL) + left->next->prev = left; + + n = left->pos; + left->pos = right->pos; + right->pos = n; +} + + +/************************************************************************* + Kernel reordering routines +*************************************************************************/ + +/*=== Garbage collection for reordering ================================*/ + +/* Note: Node may be marked + */ +static void addref_rec(int r, char *dep) +{ + if (r < 2) + return; + + if (bddnodes[r].refcou == 0) + { + bddfreenum--; + + /* Detect variable dependencies for the interaction matrix */ + dep[VAR(r) & MARKHIDE] = 1; + + /* Make sure the nodenum field is updated. Used in the initial GBC */ + levels[VAR(r) & MARKHIDE].nodenum++; + + addref_rec(LOW(r), dep); + addref_rec(HIGH(r), dep); + } + else + { + int n; + + /* Update (from previously found) variable dependencies + * for the interaction matrix */ + for (n=0 ; n 0) + { + SETMARK(n); + extrootsize++; + } + } + + if ((extroots=(int*)(malloc(sizeof(int)*extrootsize))) == NULL) + return bdd_error(BDD_MEMORY); + + iactmtx = imatrixNew(bddvarnum); + + for (n=2,extrootsize=0 ; nhash = 0; + } + + bddnodes[0].hash = 0; + bddnodes[1].hash = 0; + + free(dep); + return 0; +} + + +/* Now that all nodes are recursively reference counted we must make sure + that the new hashing scheme is used AND that dead nodes are removed. + This is also a good time to create the interaction matrix. +*/ +static void reorder_gbc(void) +{ + int n; + + bddfreepos = 0; + bddfreenum = 0; + + /* No need to zero all hash fields - this is done in mark_roots */ + + for (n=bddnodesize-1 ; n>=2 ; n--) + { + register BddNode *node = &bddnodes[n]; + + if (node->refcou > 0) + { + register unsigned int hash; + + hash = NODEHASH(VARp(node), LOWp(node), HIGHp(node)); + node->next = bddnodes[hash].hash; + bddnodes[hash].hash = n; + + } + else + { + LOWp(node) = -1; + node->next = bddfreepos; + bddfreepos = n; + bddfreenum++; + } + } +} + + +static void reorder_setLevellookup(void) +{ + int n; + + for (n=0 ; n= 4) + levels[n].size = bdd_prime_lte(levels[n].size); + +#if 0 + printf("L%3d: start %d, size %d, nodes %d\n", n, levels[n].start, + levels[n].size, levels[n].nodenum); +#endif + } +} + + +static void reorder_rehashAll(void) +{ + int n; + + reorder_setLevellookup(); + bddfreepos = 0; + + for (n=bddnodesize-1 ; n>=0 ; n--) + bddnodes[n].hash = 0; + + for (n=bddnodesize-1 ; n>=2 ; n--) + { + register BddNode *node = &bddnodes[n]; + + if (node->refcou > 0) + { + register unsigned int hash; + + hash = NODEHASH(VARp(node), LOWp(node), HIGHp(node)); + node->next = bddnodes[hash].hash; + bddnodes[hash].hash = n; + } + else + { + node->next = bddfreepos; + bddfreepos = n; + } + } +} + + +/*=== Unique table handling for reordering =============================*/ + +/* Note: rehashing must not take place during a makenode call. It is okay + to resize the table, but *not* to rehash it. + */ +static int reorder_makenode(int var, int low, int high) +{ + register BddNode *node; + register unsigned int hash; + register int res; + +#ifdef CACHESTATS + bddcachestats.uniqueAccess++; +#endif + + /* Note: We know that low,high has a refcou greater than zero, so + there is no need to add reference *recursively* */ + + /* check whether childs are equal */ + if (low == high) + { + INCREF(low); + return low; + } + + /* Try to find an existing node of this kind */ + hash = NODEHASH(var, low, high); + res = bddnodes[hash].hash; + + while(res != 0) + { + if (LOW(res) == low && HIGH(res) == high) + { +#ifdef CACHESTATS + bddcachestats.uniqueHit++; +#endif + INCREF(res); + return res; + } + res = bddnodes[res].next; + +#ifdef CACHESTATS + bddcachestats.uniqueChain++; +#endif + } + + /* No existing node -> build one */ +#ifdef CACHESTATS + bddcachestats.uniqueMiss++; +#endif + + /* Any free nodes to use ? */ + if (bddfreepos == 0) + { + if (bdderrorcond) + return 0; + + /* Try to allocate more nodes - call noderesize without + * enabling rehashing. + * Note: if ever rehashing is allowed here, then remember to + * update local variable "hash" */ + bdd_noderesize(0); + resizedInMakenode = 1; + + /* Panic if that is not possible */ + if (bddfreepos == 0) + { + bdd_error(BDD_NODENUM); + bdderrorcond = abs(BDD_NODENUM); + return 0; + } + } + + /* Build new node */ + res = bddfreepos; + bddfreepos = bddnodes[bddfreepos].next; + levels[var].nodenum++; + bddproduced++; + bddfreenum--; + + node = &bddnodes[res]; + VARp(node) = var; + LOWp(node) = low; + HIGHp(node) = high; + + /* Insert node in hash chain */ + node->next = bddnodes[hash].hash; + bddnodes[hash].hash = res; + + /* Make sure it is reference counted */ + node->refcou = 1; + INCREF(LOWp(node)); + INCREF(HIGHp(node)); + + return res; +} + + +/*=== Swapping two adjacent variables ==================================*/ + +/* Go through var 0 nodes. Move nodes that depends on var 1 to a separate + * chain (toBeProcessed) and let the rest stay in the table. + */ +static int reorder_downSimple(int var0) +{ + int toBeProcessed = 0; + int var1 = bddlevel2var[bddvar2level[var0]+1]; + int vl0 = levels[var0].start; + int size0 = levels[var0].size; + int n; + + levels[var0].nodenum = 0; + + for (n=0 ; nnext; + + if (VAR(LOWp(node)) != var1 && VAR(HIGHp(node)) != var1) + { + /* Node does not depend on next var, let it stay in the chain */ + node->next = bddnodes[n+vl0].hash; + bddnodes[n+vl0].hash = r; + levels[var0].nodenum++; + } + else + { + /* Node depends on next var - save it for later procesing */ + node->next = toBeProcessed; + toBeProcessed = r; +#ifdef SWAPCOUNT + bddcachestats.swapCount++; +#endif + + } + + r = next; + } + } + + return toBeProcessed; +} + + +/* Now process all the var 0 nodes that depends on var 1. + * + * It is extremely important that no rehashing is done inside the makenode + * calls, since this would destroy the toBeProcessed chain. + */ +static void reorder_swap(int toBeProcessed, int var0) +{ + int var1 = bddlevel2var[bddvar2level[var0]+1]; + + while (toBeProcessed) + { + BddNode *node = &bddnodes[toBeProcessed]; + int next = node->next; + int f0 = LOWp(node); + int f1 = HIGHp(node); + int f00, f01, f10, f11, hash; + + /* Find the cofactors for the new nodes */ + if (VAR(f0) == var1) + { + f00 = LOW(f0); + f01 = HIGH(f0); + } + else + f00 = f01 = f0; + + if (VAR(f1) == var1) + { + f10 = LOW(f1); + f11 = HIGH(f1); + } + else + f10 = f11 = f1; + + /* Note: makenode does refcou. */ + f0 = reorder_makenode(var0, f00, f10); + f1 = reorder_makenode(var0, f01, f11); + node = &bddnodes[toBeProcessed]; /* Might change in makenode */ + + /* We know that the refcou of the grandchilds of this node + * is greater than one (these are f00...f11), so there is + * no need to do a recursive refcou decrease. It is also + * possible for the LOWp(node)/high nodes to come alive again, + * so deref. of the childs is delayed until the local GBC. */ + + DECREF(LOWp(node)); + DECREF(HIGHp(node)); + + /* Update in-place */ + VARp(node) = var1; + LOWp(node) = f0; + HIGHp(node) = f1; + + levels[var1].nodenum++; + + /* Rehash the node since it got new childs */ + hash = NODEHASH(VARp(node), LOWp(node), HIGHp(node)); + node->next = bddnodes[hash].hash; + bddnodes[hash].hash = toBeProcessed; + + toBeProcessed = next; + } +} + + +/* Now go through the var 1 chains. The nodes live here have survived + * the call to reorder_swap() and may stay in the chain. + * The dead nodes are reclaimed. + */ +static void reorder_localGbc(int var0) +{ + int var1 = bddlevel2var[bddvar2level[var0]+1]; + int vl1 = levels[var1].start; + int size1 = levels[var1].size; + int n; + + for (n=0 ; nnext; + + if (node->refcou > 0) + { + node->next = bddnodes[hash].hash; + bddnodes[hash].hash = r; + } + else + { + DECREF(LOWp(node)); + DECREF(HIGHp(node)); + + LOWp(node) = -1; + node->next = bddfreepos; + bddfreepos = r; + levels[var1].nodenum--; + bddfreenum++; + } + + r = next; + } + } +} + + + + +#ifdef USERESIZE + +static void reorder_swapResize(int toBeProcessed, int var0) +{ + int var1 = bddlevel2var[bddvar2level[var0]+1]; + + while (toBeProcessed) + { + BddNode *node = &bddnodes[toBeProcessed]; + int next = node->next; + int f0 = LOWp(node); + int f1 = HIGHp(node); + int f00, f01, f10, f11; + + /* Find the cofactors for the new nodes */ + if (VAR(f0) == var1) + { + f00 = LOW(f0); + f01 = HIGH(f0); + } + else + f00 = f01 = f0; + + if (VAR(f1) == var1) + { + f10 = LOW(f1); + f11 = HIGH(f1); + } + else + f10 = f11 = f1; + + /* Note: makenode does refcou. */ + f0 = reorder_makenode(var0, f00, f10); + f1 = reorder_makenode(var0, f01, f11); + node = &bddnodes[toBeProcessed]; /* Might change in makenode */ + + /* We know that the refcou of the grandchilds of this node + * is greater than one (these are f00...f11), so there is + * no need to do a recursive refcou decrease. It is also + * possible for the LOWp(node)/high nodes to come alive again, + * so deref. of the childs is delayed until the local GBC. */ + + DECREF(LOWp(node)); + DECREF(HIGHp(node)); + + /* Update in-place */ + VARp(node) = var1; + LOWp(node) = f0; + HIGHp(node) = f1; + + levels[var1].nodenum++; + + /* Do not rehash yet since we are going to resize the hash table */ + + toBeProcessed = next; + } +} + + +static void reorder_localGbcResize(int toBeProcessed, int var0) +{ + int var1 = bddlevel2var[bddvar2level[var0]+1]; + int vl1 = levels[var1].start; + int size1 = levels[var1].size; + int n; + + for (n=0 ; nnext; + + if (node->refcou > 0) + { + node->next = toBeProcessed; + toBeProcessed = r; + } + else + { + DECREF(LOWp(node)); + DECREF(HIGHp(node)); + + LOWp(node) = -1; + node->next = bddfreepos; + bddfreepos = r; + levels[var1].nodenum--; + bddfreenum++; + } + + r = next; + } + } + + /* Resize */ + if (levels[var1].nodenum < levels[var1].size) + levels[var1].size = MIN(levels[var1].maxsize, levels[var1].size/2); + else + levels[var1].size = MIN(levels[var1].maxsize, levels[var1].size*2); + + if (levels[var1].size >= 4) + levels[var1].size = bdd_prime_lte(levels[var1].size); + + /* Rehash the remaining live nodes */ + while (toBeProcessed) + { + BddNode *node = &bddnodes[toBeProcessed]; + int next = node->next; + int hash = NODEHASH(VARp(node), LOWp(node), HIGHp(node)); + + node->next = bddnodes[hash].hash; + bddnodes[hash].hash = toBeProcessed; + + toBeProcessed = next; + } +} + +#endif /* USERESIZE */ + + +static int reorder_varup(int var) +{ + if (var < 0 || var >= bddvarnum) + return bdd_error(BDD_VAR); + if (bddvar2level[var] == 0) + return 0; + return reorder_vardown( bddlevel2var[bddvar2level[var]-1]); +} + + +#if 0 +static void sanitycheck(void) +{ + int n,v,r; + int cou=0; + + for (v=0 ; v 0) + { + assert(LEVEL(n) < LEVEL(LOW(n))); + assert(LEVEL(n) < LEVEL(HIGH(n))); + cou--; + } + } + + assert(cou == 0); +} +#endif + +static int reorder_vardown(int var) +{ + int n, level; + + if (var < 0 || var >= bddvarnum) + return bdd_error(BDD_VAR); + if ((level=bddvar2level[var]) >= bddvarnum-1) + return 0; + + resizedInMakenode = 0; + + if (imatrixDepends(iactmtx, var, bddlevel2var[level+1])) + { + int toBeProcessed = reorder_downSimple(var); +#ifdef USERESIZE + levelData *l = &levels[var]; + + if (l->nodenum < (l->size)/3 || + l->nodenum >= (l->size*3)/2 && l->size < l->maxsize) + { + reorder_swapResize(toBeProcessed, var); + reorder_localGbcResize(toBeProcessed, var); + } + else +#endif + { + reorder_swap(toBeProcessed, var); + reorder_localGbc(var); + } + } + + /* Swap the var<->level tables */ + n = bddlevel2var[level]; + bddlevel2var[level] = bddlevel2var[level+1]; + bddlevel2var[level+1] = n; + + n = bddvar2level[var]; + bddvar2level[var] = bddvar2level[ bddlevel2var[level] ]; + bddvar2level[ bddlevel2var[level] ] = n; + + /* Update all rename pairs */ + bdd_pairs_vardown(level); + + if (resizedInMakenode) + reorder_rehashAll(); + + return 0; +} + + +/************************************************************************* + User reordering interface +*************************************************************************/ + +/* +NAME {* bdd\_swapvar *} +SECTION {* reorder *} +SHORT {* Swap two BDD variables *} +PROTO {* int bdd_swapvar(int v1, int v2) *} +DESCR {* Use {\tt bdd\_swapvar} to swap the position (in the current + variable order) of the two BDD + variables {\tt v1} and {\tt v2}. There are no constraints on the + position of the two variables before the call. This function may + {\em not} be used together with user defined variable blocks. + The swap is done by a series of adjacent variable swaps and + requires the whole node table to be rehashed twice for each call + to {\tt bdd\_swapvar}. It should therefore not be used were + efficiency is a major concern. *} +RETURN {* Zero on succes and a negative error code otherwise. *} +ALSO {* bdd\_reorder, bdd\_addvarblock *} +*/ +int bdd_swapvar(int v1, int v2) +{ + int l1, l2; + + /* Do not swap when variable-blocks are used */ + if (vartree != NULL) + return bdd_error(BDD_VARBLK); + + /* Don't bother swapping x with x */ + if (v1 == v2) + return 0; + + /* Make sure the variable exists */ + if (v1 < 0 || v1 >= bddvarnum || v2 < 0 || v2 >= bddvarnum) + return bdd_error(BDD_VAR); + + l1 = bddvar2level[v1]; + l2 = bddvar2level[v2]; + + /* Make sure v1 is before v2 */ + if (l1 > l2) + { + int tmp = v1; + v1 = v2; + v2 = tmp; + l1 = bddvar2level[v1]; + l2 = bddvar2level[v2]; + } + + reorder_init(); + + /* Move v1 to v2's position */ + while (bddvar2level[v1] < l2) + reorder_vardown(v1); + + /* Move v2 to v1's position */ + while (bddvar2level[v2] > l1) + reorder_varup(v2); + + reorder_done(); + + return 0; +} + + +void bdd_default_reohandler(int prestate) +{ + static long c1; + + if (verbose > 0) + { + if (prestate) + { + printf("Start reordering\n"); + c1 = clock(); + } + else + { + long c2 = clock(); + printf("End reordering. Went from %d to %d nodes (%.1f sec)\n", + usednum_before, usednum_after, (float)(c2-c1)/CLOCKS_PER_SEC); + } + } +} + + +/* +NAME {* bdd\_disable\_reorder *} +SECTION {* reorder *} +SHORT {* Disable automatic reordering *} +PROTO {* void bdd_disable_reorder(void) *} +DESCR {* Disables automatic reordering until {\tt bdd\_enable\_reorder} + is called. Reordering is enabled by default as soon as any variable + blocks have been defined. *} +ALSO {* bdd\_enable\_reorder *} +*/ +void bdd_disable_reorder(void) +{ + reorderdisabled = 1; +} + + +/* +NAME {* bdd\_enable\_reorder *} +SECTION {* reorder *} +SHORT {* Enables automatic reordering *} +PROTO {* void bdd_enable_reorder(void) *} +DESCR {* Re-enables reordering after a call to {\tt bdd\_disable\_reorder}. *} +ALSO {* bdd\_disable\_reorder *} +*/ +void bdd_enable_reorder(void) +{ + reorderdisabled = 0; +} + + +int bdd_reorder_ready(void) +{ + if (bddreordermethod == BDD_REORDER_NONE || vartree == NULL || + bddreordertimes == 0 || reorderdisabled) + return 0; + return 1; +} + + +void bdd_reorder_auto(void) +{ + if (!bdd_reorder_ready) + return; + + if (reorder_handler != NULL) + reorder_handler(1); + + bdd_reorder(bddreordermethod); + bddreordertimes--; + + if (reorder_handler != NULL) + reorder_handler(0); +} + + +static int reorder_init(void) +{ + int n; + + if ((levels=NEW(levelData,bddvarnum)) == NULL) + return -1; + + for (n=0 ; n b) + return 1; + return 0; +} + + +static BddTree *reorder_block(BddTree *t, int method) +{ + BddTree *this; + + if (t == NULL) + return NULL; + + if (t->fixed == BDD_REORDER_FREE && t->nextlevel!=NULL) + { + switch(method) + { + case BDD_REORDER_WIN2: + t->nextlevel = reorder_win2(t->nextlevel); + break; + case BDD_REORDER_WIN2ITE: + t->nextlevel = reorder_win2ite(t->nextlevel); + break; + case BDD_REORDER_SIFT: + t->nextlevel = reorder_sift(t->nextlevel); + break; + case BDD_REORDER_SIFTITE: + t->nextlevel = reorder_siftite(t->nextlevel); + break; + case BDD_REORDER_WIN3: + t->nextlevel = reorder_win3(t->nextlevel); + break; + case BDD_REORDER_WIN3ITE: + t->nextlevel = reorder_win3ite(t->nextlevel); + break; + case BDD_REORDER_RANDOM: + t->nextlevel = reorder_random(t->nextlevel); + break; + } + } + + for (this=t->nextlevel ; this ; this=this->next) + reorder_block(this, method); + + if (t->seq != NULL) + qsort(t->seq, t->last-t->first+1, sizeof(int), varseqCmp); + + return t; +} + + +/* +NAME {* bdd\_reorder *} +SECTION {* reorder *} +SHORT {* start dynamic reordering *} +PROTO {* void bdd_reorder(int method) *} +DESCR {* This function initiates dynamic reordering using the heuristic + defined by {\tt method}, which may be one of the following + \begin{description} + \item {\tt BDD\_REORDER\_WIN2}\\ + Reordering using a sliding window of size 2. This algorithm + swaps two adjacent variable blocks and if this results in + more nodes then the two blocks are swapped back again. + Otherwise the result is kept in the variable order. This is + then repeated for all variable blocks. + \item {\tt BDD\_REORDER\_WIN2ITE}\\ + The same as above but the process is repeated until no further + progress is done. Usually a fast and efficient method. + \item {\tt BDD\_REORDER\_WIN3}\\ + The same as above but with a window size of 3. + \item {\tt BDD\_REORDER\_WIN2ITE}\\ + The same as above but with a window size of 3. + \item {\tt BDD\_REORDER\_SIFT}\\ + Reordering where each block is moved through all possible + positions. The best of these is then used as the new position. + Potentially a very slow but good method. + \item {\tt BDD\_REORDER\_SIFTITE}\\ + The same as above but the process is repeated until no further + progress is done. Can be extremely slow. + \item {\tt BDD\_REORDER\_RANDOM}\\ + Mostly used for debugging purpose, but may be usefull for + others. Selects a random position for each variable. + \end{description} + *} +ALSO {* bdd\_autoreorder, bdd\_reorder\_verbose, bdd\_addvarblock, bdd\_clrvarblocks *} +*/ +void bdd_reorder(int method) +{ + BddTree *top; + int savemethod = bddreordermethod; + int savetimes = bddreordertimes; + + bddreordermethod = method; + bddreordertimes = 1; + + if ((top=bddtree_new(-1)) == NULL) + return; + if (reorder_init() < 0) + return; + + usednum_before = bddnodesize - bddfreenum; + + top->first = 0; + top->last = bdd_varnum()-1; + top->fixed = 0; + top->next = NULL; + top->nextlevel = vartree; + + reorder_block(top, method); + vartree = top->nextlevel; + free(top); + + usednum_after = bddnodesize - bddfreenum; + + reorder_done(); + bddreordermethod = savemethod; + bddreordertimes = savetimes; +} + + +/* +NAME {* bdd\_reorder\_gain *} +SECTION {* reorder *} +SHORT {* Calculate the gain in size after a reordering *} +PROTO {* int bdd_reorder_gain(void) *} +DESCR {* Returns the gain in percent of the previous number of used + nodes. The value returned is + \[ (100 * (A - B)) / A \] + Where $A$ is previous number of used nodes and $B$ is current + number of used nodes. + *} +*/ +int bdd_reorder_gain(void) +{ + if (usednum_before == 0) + return 0; + + return (100*(usednum_before - usednum_after)) / usednum_before; +} + + +/* +NAME {* bdd\_reorder\_hook *} +SECTION {* reorder *} +SHORT {* sets a handler for automatic reorderings *} +PROTO {* bddinthandler bdd_reorder_hook(bddinthandler handler) *} +DESCR {* Whenever automatic reordering is done, a check is done to see + if the user has supplied a handler for that event. If so then + it is called with the argument {\tt prestate} being 1 if the + handler is called immediately {\em before} reordering and + {\tt prestate} being 0 if it is called immediately after. + The default handler is + {\tt bdd\_default\_reohandler} which will print information + about the reordering. + + A typical handler could look like this: + \begin{verbatim} +void reorderhandler(int prestate) +{ + if (prestate) + printf("Start reordering"); + else + printf("End reordering"); +} +\end{verbatim} *} +RETURN {* The previous handler *} +ALSO {* bdd\_reorder, bdd\_autoreorder, bdd\_resize\_hook *} +*/ +bddinthandler bdd_reorder_hook(bddinthandler handler) +{ + bddinthandler tmp = reorder_handler; + reorder_handler = handler; + return tmp; +} + + +/* +NAME {* bdd\_blockfile\_hook *} +SECTION {* reorder *} +SHORT {* Specifies a printing callback handler *} +PROTO {* bddfilehandler bdd_blockfile_hook(bddfilehandler handler) *} +DESCR {* A printing callback handler is used to convert the variable + block identifiers into something readable by the end user. Use + {\tt bdd\_blockfile\_hook} to pass a handler to BuDDy. A typical + handler could look like this: +\begin{verbatim} +void printhandler(FILE *o, int block) +{ + extern char **blocknames; + fprintf(o, "%s", blocknames[block]); +} +\end{verbatim} + \noindent + The handler is then called from {\tt bdd\_printorder} and + {\tt bdd\_reorder} (depending on the verbose level) with + the block numbers returned by {\tt bdd\_addvarblock} as arguments. + No default handler is supplied. The argument {\tt handler} may be + NULL if no handler is needed. *} +RETURN {* The old handler *} +ALSO {* bdd\_printorder *} +*/ +bddfilehandler bdd_blockfile_hook(bddfilehandler handler) +{ + bddfilehandler tmp = reorder_filehandler; + reorder_filehandler = handler; + return tmp; +} + + +/* +NAME {* bdd\_autoreorder *} +EXTRA {* bdd\_autoreorder\_times *} +SECTION {* reorder *} +SHORT {* enables automatic reordering *} +PROTO {* int bdd_autoreorder(int method) +int bdd_autoreorder_times(int method, int num) *} +DESCR {* Enables automatic reordering using {\tt method} as the reordering + method. If {\tt method} is {\tt BDD\_REORDER\_NONE} then + automatic reordering is disabled. Automatic + reordering is done every time the number of active nodes in the + node table has been doubled and works by interrupting the current + BDD operation, doing the reordering and the retrying the operation. + + In the second form the argument {\tt num} specifies the allowed + number of reorderings. So if for example a "one shot" reordering + is needed, then the {\tt num} argument would be set to one. + + Values for {\tt method} can be found under {\tt bdd\_reorder}. + *} +RETURN {* Returns the old value of {\tt method} *} +ALSO {* bdd\_reorder *} +*/ +int bdd_autoreorder(int method) +{ + int tmp = bddreordermethod; + bddreordermethod = method; + bddreordertimes = -1; + return tmp; +} + + +int bdd_autoreorder_times(int method, int num) +{ + int tmp = bddreordermethod; + bddreordermethod = method; + bddreordertimes = num; + return tmp; +} + + +/* +NAME {* bdd\_var2level *} +SECTION {* reorder *} +SHORT {* Fetch the level of a specific BDD variable *} +PROTO {* int bdd_var2level(int var) *} +DESCR {* Returns the position of the variable {\tt var} in the current + variable order. *} +ALSO {* bdd\_reorder, bdd\_level2var *} +*/ +int bdd_var2level(int var) +{ + if (var < 0 || var >= bddvarnum) + return bdd_error(BDD_VAR); + + return bddvar2level[var]; +} + + +/* +NAME {* bdd\_level2var *} +SECTION {* reorder *} +SHORT {* Fetch the variable number of a specific level *} +PROTO {* int bdd_level2var(int level) *} +DESCR {* Returns the variable placed at position {\tt level} in the + current variable order. *} +ALSO {* bdd\_reorder, bdd\_var2level *} +*/ +int bdd_level2var(int level) +{ + if (level < 0 || level >= bddvarnum) + return bdd_error(BDD_VAR); + + return bddlevel2var[level]; +} + + +/* +NAME {* bdd\_getreorder\_times *} +SECTION {* reorder *} +SHORT {* Fetch the current number of allowed reorderings *} +PROTO {* int bdd_getreorder_times(void) *} +DESCR {* Returns the current number of allowed reorderings left. This + value can be defined by {\tt bdd\_autoreorder\_times}. *} +ALSO {* bdd\_reorder\_times, bdd\_getreorder\_method *} +*/ +int bdd_getreorder_times(void) +{ + return bddreordertimes; +} + + +/* +NAME {* bdd\_getreorder\_method *} +SECTION {* reorder *} +SHORT {* Fetch the current reorder method *} +PROTO {* int bdd_getreorder_method(void) *} +DESCR {* Returns the current reorder method as defined by + {\tt bdd\_autoreorder}. *} +ALSO {* bdd\_reorder, bdd\_getreorder\_times *} +*/ +int bdd_getreorder_method(void) +{ + return bddreordermethod; +} + + +/* +NAME {* bdd\_reorder\_verbose *} +SECTION {* reorder *} +SHORT {* enables verbose information about reorderings *} +PROTO {* int bdd_reorder_verbose(int v) *} +DESCR {* With {\tt bdd\_reorder\_verbose} it is possible to set the level + of information which should be printed during reordering. A value + of zero means no information, a value of one means some information + and any greater value will result in a lot of reordering + information. The default value is zero. *} +RETURN {* The old verbose level *} +ALSO {* bdd\_reorder *} +*/ +int bdd_reorder_verbose(int v) +{ + int tmp = verbose; + verbose = v; + return tmp; +} + + +/* +NAME {* bdd\_reorder\_probe *} +SECTION {* reorder *} +SHORT {* Define a handler for minimization of BDDs *} +PROTO {* bddsizehandler bdd_reorder_probe(bddsizehandler handler) *} +DESCR {* Reordering is typically done to minimize the global number of + BDD nodes in use, but it may in some cases be usefull to minimize + with respect to a specific BDD. With {\tt bdd\_reorder\_probe} it + is possible to define a callback function that calculates the + size of a specific BDD (or anything else in fact). This handler + will then be called by the reordering functions to get the current + size information. A typical handle could look like this: +\begin{verbatim} +int sizehandler(void) +{ + extern BDD mybdd; + return bdd_nodecount(mybdd); +} +\end{verbatim} + No default handler is supplied. The argument {\tt handler} may be + NULL if no handler is needed. *} + *} +RETURN {* The old handler *} +ALSO {* bdd\_reorder *} +*/ +bddsizehandler bdd_reorder_probe(bddsizehandler handler) +{ + bddsizehandler old = reorder_nodenum; + if (handler == NULL) + return reorder_nodenum; + reorder_nodenum = handler; + return old; +} + + +/* +NAME {* bdd\_clrvarblocks *} +SECTION {* reorder *} +SHORT {* clears all variable blocks *} +PROTO {* void bdd_clrvarblocks(void) *} +DESCR {* Clears all the variable blocks that has been defined by calls + to bdd\_addvarblock. *} +ALSO {* bdd\_addvarblock *} +*/ +void bdd_clrvarblocks(void) +{ + bddtree_del(vartree); + vartree = NULL; + blockid = 0; +} + + +/* +NAME {* bdd\_addvarblock *} +EXTRA {* bdd\_intaddvarblock *} +SECTION {* reorder *} +SHORT {* adds a new variable block for reordering *} +PROTO {* int bdd_addvarblock(BDD var, int fixed) +int bdd_intaddvarblock(int first, int last, int fixed) *} +DESCR {* Creates a new variable block with the variables in the variable + set {\tt var}. The variables in {\tt var} must be contiguous. + In the second form the argument {\tt first} is the first variable + included in the block and {\tt last} is the last variable included + in the block. This order does not depend on current variable + order. + + The variable blocks are ordered as a tree, with the largest + ranges at top and the smallest at the bottom. Example: Assume + the block 0-9 is added as the first block and then the block 0-6. + This yields the 0-9 block at the top, with the 0-6 block as a + child. If now the block 2-4 was added, it would become a child + of the 0-6 block. A block of 0-8 would be a child of the 0-9 + block and have the 0-6 block as a child. Partially overlapping + blocks are not allowed. + + The {\tt fixed} parameter sets the block to be fixed (no + reordering of its child blocks is allowed) or free, using + the constants {\tt BDD\_REORDER\_FIXED} and {\tt + BDD\_REORDER\_FREE}. Reordering is always done on the top + most blocks first and then recursively downwards. + + The return value is an integer that can be used to identify + the block later on - with for example {\tt bdd\_blockfile\_hook}. + The values returned will be in the sequence $0,1,2,3,\ldots$. + *} +RETURN {* A non-negative identifier on success, otherwise a negative error code. *} +ALSO {* bdd\_varblockall, fdd\_intaddvarblock, bdd\_clrvarblocks *} */ +int bdd_addvarblock(BDD b, int fixed) +{ + BddTree *t; + int n, *v, size; + int first, last; + + if ((n=bdd_scanset(b, &v, &size)) < 0) + return n; + if (size < 1) + return bdd_error(BDD_VARBLK); + + first = last = v[0]; + + for (n=0 ; n last) + last = v[n]; + } + + if ((t=bddtree_addrange(vartree, first,last, fixed,blockid)) == NULL) + return bdd_error(BDD_VARBLK); + + vartree = t; + return blockid++; +} + + +int bdd_intaddvarblock(int first, int last, int fixed) +{ + BddTree *t; + + if (first < 0 || first >= bddvarnum || last < 0 || last >= bddvarnum) + return bdd_error(BDD_VAR); + + if ((t=bddtree_addrange(vartree, first,last, fixed,blockid)) == NULL) + return bdd_error(BDD_VARBLK); + + vartree = t; + return blockid++; +} + + +/* +NAME {* bdd\_varblockall *} +SECTION {* reorder *} +SHORT {* add a variable block for all variables *} +PROTO {* void bdd_varblockall(void) *} +DESCR {* Adds a variable block for all BDD variables declared so far. + Each block contains one variable only. More variable blocks + can be added later with the use of {\tt bdd\_addvarblock} -- + in this case the tree of variable blocks will have the blocks + of single variables as the leafs. *} +ALSO {* bdd\_addvarblock, bdd\_intaddvarblock *} +*/ +void bdd_varblockall(void) +{ + int n; + + for (n=0 ; n level) + reorder_varup(lowvar); + } + + reorder_done(); +} + + +static void print_order_rec(FILE *o, BddTree *t, int level) +{ + if (t == NULL) + return; + + if (t->nextlevel) + { + fprintf(o, "%*s", level*3, ""); + if (reorder_filehandler) + reorder_filehandler(o,t->id); + else + fprintf(o, "%3d", t->id); + fprintf(o, "{\n"); + + print_order_rec(o, t->nextlevel, level+1); + + fprintf(o, "%*s", level*3, ""); + if (reorder_filehandler) + reorder_filehandler(o,t->id); + else + fprintf(o, "%3d", t->id); + fprintf(o, "}\n"); + + print_order_rec(o, t->next, level); + } + else + { + fprintf(o, "%*s", level*3, ""); + if (reorder_filehandler) + reorder_filehandler(o,t->id); + else + fprintf(o, "%3d", t->id); + fprintf(o, "\n"); + + print_order_rec(o, t->next, level); + } +} + + + +void bdd_fprintorder(FILE *ofile) +{ + print_order_rec(ofile, vartree, 0); +} + + + +/* EOF */ diff --git a/sdk/buddy-2.4/src/tree.c b/sdk/buddy-2.4/src/tree.c new file mode 100644 index 0000000..450e79a --- /dev/null +++ b/sdk/buddy-2.4/src/tree.c @@ -0,0 +1,222 @@ +/*======================================================================== + Copyright (C) 1996-2002 by Jorn Lind-Nielsen + All rights reserved + + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, reproduce, prepare derivative + works, distribute, and display this software and its documentation + for any purpose, provided that (1) the above copyright notice and + the following two paragraphs appear in all copies of the source code + and (2) redistributions, including without limitation binaries, + reproduce these notices in the supporting documentation. Substantial + modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided + that the new terms are clearly indicated in all files where they apply. + + IN NO EVENT SHALL JORN LIND-NIELSEN, OR DISTRIBUTORS OF THIS + SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, + INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS + SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE + ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + JORN LIND-NIELSEN SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO + OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +========================================================================*/ + +/************************************************************************* + $Header: /cvsroot/buddy/buddy/src/tree.c,v 1.1.1.1 2004/06/25 13:23:00 haimcohen Exp $ + FILE: tree.c + DESCR: Trees for BDD variables + AUTH: Jorn Lind + DATE: (C) march 1998 +*************************************************************************/ +#include +#include +#include "kernel.h" +#include "bddtree.h" + +/************************************************************************* +*************************************************************************/ + +BddTree *bddtree_addrange_rec(BddTree *, BddTree *, int, int, int, int); + + +/*======================================================================*/ + +static void update_seq(BddTree *t) +{ + int n; + int low = t->first; + + for (n=t->first ; n<=t->last ; n++) + if (bddvar2level[n] < bddvar2level[low]) + low = n; + + for (n=t->first ; n<=t->last ; n++) + t->seq[bddvar2level[n]-bddvar2level[low]] = n; +} + + +BddTree *bddtree_new(int id) +{ + BddTree *t = NEW(BddTree,1); + if (t == NULL) + return NULL; + + t->first = t->last = -1; + t->fixed = 1; + t->next = t->prev = t->nextlevel = NULL; + t->seq = NULL; + t->id = id; + return t; +} + + +void bddtree_del(BddTree *t) +{ + if (t == NULL) + return; + + bddtree_del(t->nextlevel); + bddtree_del(t->next); + if (t->seq != NULL) + free(t->seq); + free(t); +} + + +BddTree *bddtree_addrange_rec(BddTree *t, BddTree *prev, + int first, int last, int fixed, int id) +{ + if (first < 0 || last < 0 || last < first) + return NULL; + + /* Empty tree -> build one */ + if (t == NULL) + { + if ((t=bddtree_new(id)) == NULL) + return NULL; + t->first = first; + t->fixed = fixed; + t->seq = NEW(int,last-first+1); + t->last = last; + update_seq(t); + t->prev = prev; + return t; + } + + /* Check for identity */ + if (first == t->first && last == t->last) + return t; + + /* Before this section -> insert */ + if (last < t->first) + { + BddTree *tnew = bddtree_new(id); + if (tnew == NULL) + return NULL; + tnew->first = first; + tnew->last = last; + tnew->fixed = fixed; + tnew->seq = NEW(int,last-first+1); + update_seq(tnew); + tnew->next = t; + tnew->prev = t->prev; + t->prev = tnew; + return tnew; + } + + /* After this this section -> go to next */ + if (first > t->last) + { + t->next = bddtree_addrange_rec(t->next, t, first, last, fixed, id); + return t; + } + + /* Inside this section -> insert in next level */ + if (first >= t->first && last <= t->last) + { + t->nextlevel = + bddtree_addrange_rec(t->nextlevel,NULL,first,last,fixed,id); + return t; + } + + /* Covering this section -> insert above this level */ + if (first <= t->first) + { + BddTree *tnew; + BddTree *this = t; + + while (1) + { + /* Partial cover ->error */ + if (last >= this->first && last < this->last) + return NULL; + + if (this->next == NULL || last < this->next->first) + { + tnew = bddtree_new(id); + if (tnew == NULL) + return NULL; + tnew->first = first; + tnew->last = last; + tnew->fixed = fixed; + tnew->seq = NEW(int,last-first+1); + update_seq(tnew); + tnew->nextlevel = t; + tnew->next = this->next; + tnew->prev = t->prev; + if (this->next != NULL) + this->next->prev = tnew; + this->next = NULL; + t->prev = NULL; + return tnew; + } + + this = this->next; + } + + } + + return NULL; +} + + +BddTree *bddtree_addrange(BddTree *t, int first, int last, int fixed,int id) +{ + return bddtree_addrange_rec(t,NULL,first,last,fixed,id); +} + + +#if 0 +int main(void) +{ + BddTree *t = NULL; + + t = bddtree_addrange(t, 8,10,1); + printf("A\n"); bddtree_print(stdout, t, 0); + t = bddtree_addrange(t, 2,99,1); + printf("B\n"); bddtree_print(stdout, t, 0); + t = bddtree_addrange(t, 11,50,1); + printf("C\n"); bddtree_print(stdout, t, 0); + t = bddtree_addrange(t, 5,7,1); + printf("D\n"); bddtree_print(stdout, t, 0); + t = bddtree_addrange(t, 5,10,1); + printf("E\n"); bddtree_print(stdout, t, 0); + t = bddtree_addrange(t, 100,150,1); + printf("F\n"); bddtree_print(stdout, t, 0); + t = bddtree_addrange(t, 60,65,1); + printf("G\n"); bddtree_print(stdout, t, 0); + t = bddtree_addrange(t, 3,200,1); + + printf("H\n"); bddtree_print(stdout, t, 0); + bddtree_del(t); + return 0; +} +#endif + +/* EOF */ diff --git a/sdk/buddy-2.4/stamp-h1 b/sdk/buddy-2.4/stamp-h1 new file mode 100644 index 0000000..4547fe1 --- /dev/null +++ b/sdk/buddy-2.4/stamp-h1 @@ -0,0 +1 @@ +timestamp for config.h diff --git a/sdk/buddy-2.4/tools/config.guess b/sdk/buddy-2.4/tools/config.guess new file mode 100644 index 0000000..2fc3acc --- /dev/null +++ b/sdk/buddy-2.4/tools/config.guess @@ -0,0 +1,1411 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +timestamp='2003-06-17' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +## for Red Hat Linux +if test -f /etc/redhat-release ; then + VENDOR=redhat ; +else + VENDOR= ; +fi + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha*:OpenVMS:*:*) + echo alpha-hp-vms + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit 0 ;; + DRS?6000:UNIX_SV:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7 && exit 0 ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && exit 0 + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + *:UNICOS/mp:*:*) + echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*|*:GNU/FreeBSD:*:*) + # Determine whether the default compiler uses glibc. + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #if __GLIBC__ >= 2 + LIBC=gnu + #else + LIBC= + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:[34]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit 0 ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR:-unknown}-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-${VENDOR:-unknown}-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-${VENDOR:-unknown}-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR:-ibm}-linux-gnu + exit 0 ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-${VENDOR:-unknown}-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-${VENDOR:-pc}-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit 0 ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + case `uname -p` in + *86) UNAME_PROCESSOR=i686 ;; + powerpc) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/sdk/buddy-2.4/tools/config.sub b/sdk/buddy-2.4/tools/config.sub new file mode 100644 index 0000000..7cee3d6 --- /dev/null +++ b/sdk/buddy-2.4/tools/config.sub @@ -0,0 +1,1500 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +timestamp='2003-06-18' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k \ + | m32r | m68000 | m68k | m88k | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | msp430 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | s390 | s390x \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* \ + | m32r-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | msp430-* \ + | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | s390-* | s390x-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nv1) + basic_machine=nv1-cray + os=-unicosmp + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/sdk/buddy-2.4/tools/depcomp b/sdk/buddy-2.4/tools/depcomp new file mode 100644 index 0000000..25bdb18 --- /dev/null +++ b/sdk/buddy-2.4/tools/depcomp @@ -0,0 +1,526 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2004-04-25.13 + +# Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit 0 + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit 0 + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi +# `libtool' can also be set to `yes' or `no'. + +if test -z "$depfile"; then + base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` + dir=`echo "$object" | sed 's,/.*$,/,'` + if test "$dir" = "$object"; then + dir= + fi + # FIXME: should be _deps on DOS. + depfile="$dir.deps/$base" +fi + +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. + "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + stat=$? + + if test -f "$tmpdepfile"; then : + else + stripped=`echo "$stripped" | sed 's,^.*/,,'` + tmpdepfile="$stripped.u" + fi + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + if test -f "$tmpdepfile"; then + outname="$stripped.o" + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # Dependencies are output in .lo.d with libtool 1.4. + # They are output in .o.d with libtool 1.5. + tmpdepfile1="$dir.libs/$base.lo.d" + tmpdepfile2="$dir.libs/$base.o.d" + tmpdepfile3="$dir.libs/$base.d" + "$@" -Wc,-MD + else + tmpdepfile1="$dir$base.o.d" + tmpdepfile2="$dir$base.d" + tmpdepfile3="$dir$base.d" + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + if test -f "$tmpdepfile1"; then + tmpdepfile="$tmpdepfile1" + elif test -f "$tmpdepfile2"; then + tmpdepfile="$tmpdepfile2" + else + tmpdepfile="$tmpdepfile3" + fi + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/sdk/buddy-2.4/tools/install-sh b/sdk/buddy-2.4/tools/install-sh new file mode 100644 index 0000000..e4160c9 --- /dev/null +++ b/sdk/buddy-2.4/tools/install-sh @@ -0,0 +1,325 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2004-04-01.17 + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename= +transform_arg= +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd= +chgrpcmd= +stripcmd= +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src= +dst= +dir_arg= + +usage="Usage: $0 [OPTION]... SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 -d DIRECTORIES... + +In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default. +In the second, create the directory path DIR. + +Options: +-b=TRANSFORMBASENAME +-c copy source (using $cpprog) instead of moving (using $mvprog). +-d create directories instead of installing files. +-g GROUP $chgrp installed files to GROUP. +-m MODE $chmod installed files to MODE. +-o USER $chown installed files to USER. +-s strip installed files (using $stripprog). +-t=TRANSFORM +--help display this help and exit. +--version display version info and exit. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG +" + +while test -n "$1"; do + case $1 in + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + -c) instcmd=$cpprog + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + --help) echo "$usage"; exit 0;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -s) stripcmd=$stripprog + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + --version) echo "$0 $scriptversion"; exit 0;; + + *) # When -d is used, all remaining arguments are directories to create. + test -n "$dir_arg" && break + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dstarg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dstarg" + shift # fnord + fi + shift # arg + dstarg=$arg + done + break;; + esac +done + +if test -z "$1"; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src ;; + esac + + if test -n "$dir_arg"; then + dst=$src + src= + + if test -d "$dst"; then + instcmd=: + chmodcmd= + else + instcmd=$mkdirprog + fi + else + # Waiting for this to be detected by the "$instcmd $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dstarg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dstarg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst ;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + dst=$dst/`basename "$src"` + fi + fi + + # This sed command emulates the dirname command. + dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + + # Make sure that the destination directory exists. + + # Skip lots of stat calls in the usual case. + if test ! -d "$dstdir"; then + defaultIFS=' + ' + IFS="${IFS-$defaultIFS}" + + oIFS=$IFS + # Some sh's can't handle IFS=/ for some reason. + IFS='%' + set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` + IFS=$oIFS + + pathcomp= + + while test $# -ne 0 ; do + pathcomp=$pathcomp$1 + shift + if test ! -d "$pathcomp"; then + $mkdirprog "$pathcomp" || lasterr=$? + # mkdir can fail with a `File exist' error in case several + # install-sh are creating the directory concurrently. This + # is OK. + test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; } + fi + pathcomp=$pathcomp/ + done + fi + + if test -n "$dir_arg"; then + $doit $instcmd "$dst" \ + && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } + + else + # If we're going to rename the final executable, determine the name now. + if test -z "$transformarg"; then + dstfile=`basename "$dst"` + else + dstfile=`basename "$dst" $transformbasename \ + | sed $transformarg`$transformbasename + fi + + # don't allow the sed command to completely eliminate the filename. + test -z "$dstfile" && dstfile=`basename "$dst"` + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 + trap '(exit $?); exit' 1 2 13 15 + + # Move or copy the file name to the temp name + $doit $instcmd "$src" "$dsttmp" && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $instcmd $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && + + # Now rename the file to the real destination. + { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ + || { + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + if test -f "$dstdir/$dstfile"; then + $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ + || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ + || { + echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + (exit 1); exit + } + else + : + fi + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + } + } + fi || { (exit 1); exit; } +done + +# The final little trick to "correctly" pass the exit status to the exit trap. +{ + (exit 0); exit +} + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/sdk/buddy-2.4/tools/ltmain.sh b/sdk/buddy-2.4/tools/ltmain.sh new file mode 100644 index 0000000..6828dc0 --- /dev/null +++ b/sdk/buddy-2.4/tools/ltmain.sh @@ -0,0 +1,6443 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 +# Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +basename="s,^.*/,,g" + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# define SED for historic ltconfig's generated by Libtool 1.3 +test -z "$SED" && SED=sed + +# The name of this program: +progname=`echo "$progpath" | $SED $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.6 +TIMESTAMP=" (1.1220.2.95 2004/04/11 05:50:42)" + + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () { + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'` + if test "X$win32_nmres" = "Ximport" ; then + win32_libid_type="x86 archive import" + else + win32_libid_type="x86 archive static" + fi + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $echo $win32_libid_type +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () { + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} +# End of Shell function definitions +##################################### + +# Darwin sucks +#eval std_shrext=\"$shrext_cmds\" + +# And fixing for Darwin sucks for everybody else +if test -z "$shrext_cmds" && test -n "$shrext"; then + eval shrext_cmds=\"$shrext\" +fi +eval std_shrext=\"$shrext_cmds\" + +# This value is evaluated to 32768, so place it here as a compatilibity hack +# because older libtool.m4 didn't define this variable +test -z "$max_cmd_len" && max_cmd_len=32768 + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + $echo + $echo "Copyright (C) 2003 Free Software Foundation, Inc." + $echo "This is free software; see the source for copying conditions. There is NO" + $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit $EXIT_SUCCESS + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $EXIT_SUCCESS + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $EXIT_SUCCESS + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) prevopt="--tag" prev=tag ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + for arg + do + case "$arg_mode" in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$later $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" + continue + ;; + + * ) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + *.java) xform=java ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo $srcfile > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + fi + build_libtool_libs=no + build_old_libs=yes + prefer_static_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + exit $EXIT_FAILURE + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-mingw* | *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + deplibs="$deplibs $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # gcc -m* arguments should be passed to the linker via $compiler_flags + # in order to pass architecture information to the linker + # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo + # but this is not reliable with gcc because gcc may use -mfoo to + # select a different linker, different libraries, etc, while + # -Wl,-mfoo simply passes -mfoo to the linker. + -m*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + if test "$with_gcc" = "yes" ; then + compiler_flags="$compiler_flags $arg" + fi + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # The PATH hackery in wrapper scripts is required on Windows + # in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test "$status" -ne 0 && test ! -d "$output_objdir"; then + exit $status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + esac + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + if test "$deplibs_check_method" != pass_all; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + + # Read the .la file + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; shift + libname=`eval \\$echo \"$libname_spec\"` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5* ) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | $EGREP "bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$deplibs $path" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$2" + number_minor="$3" + number_revision="$4" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor - 1` + age="$number_minor" + revision="$number_minor" + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + [0-9]*) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $revision in + [0-9]*) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $age in + [0-9]*) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + major=`expr $current - $age + 1` + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$echo "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + for path in $notinst_path; do + lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'` + deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'` + dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` + done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name="`expr $a_deplib : '-l\(.*\)'`" + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval $echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + inst_prefix_arg= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + if test -n "$inst_prefix_dir" && (echo "$test_deplib" | grep -- "$inst_prefix_dir" >/dev/null); then + inst_prefix_arg="$test_deplib" + else + tmp_deplibs="$tmp_deplibs $test_deplib" + fi + ;; + esac + done + deplibs="$tmp_deplibs" + if test -n "$inst_prefix_arg"; then + deplibs="$inst_prefix_arg $deplibs" + fi + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + status=$? + if test "$status" -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" + status=$? + if test "$status" -ne 0 && test ! -d "$xdir"; then + exit $status + fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi + + libobjs="$libobjs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$save_output-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$save_output-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$save_output-${k}.$objext + objlist=$obj + len=1 + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadale object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$save_output-${i}.$objext" + done + + $echo "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + status=$? + if test "$status" -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" + status=$? + if test "$status" -ne 0 && test ! -d "$xdir"; then + exit $status + fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi + + reload_conv_objs="$reload_objs "`find $xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + esac + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$output.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + else + $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + cwrappersource=`$echo ${objdir}/lt-${output}.c` + cwrapper=`$echo ${output}.exe` + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef DIR_SEPARATOR +#define DIR_SEPARATOR '/' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +#define HAVE_DOS_BASED_FILE_SYSTEM +#ifndef DIR_SEPARATOR_2 +#define DIR_SEPARATOR_2 '\\' +#endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +char * basename (const char *name); +char * fnqualify(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup ((char *) basename (argv[0])); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = fnqualify(argv[0]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +char * +basename (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha (name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return (char *) base; +} + +char * +fnqualify(const char *path) +{ + size_t size; + char *p; + char tmp[LT_PATHMAX + 1]; + + assert(path != NULL); + + /* Is it qualified already? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha (path[0]) && path[1] == ':') + return xstrdup (path); +#endif + if (IS_DIR_SEPARATOR (path[0])) + return xstrdup (path); + + /* prepend the current directory */ + /* doesn't handle '~' */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */ + p = XMALLOC(char, size); + sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path); + return p; +} + +char * +strendzap(char *str, const char *pat) +{ + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + $echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $echo \"\$relink_command_output\" >&2 + $rm \"\$progdir/\$file\" + exit $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \$progdir\\\\\$program \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \$progdir/\$program \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit $EXIT_FAILURE + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + status=$? + if test "$status" -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + # Add in members from convenience archives. + for xlib in $addlibs; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "$mkdir $xdir" + $run $mkdir "$xdir" + status=$? + if test "$status" -ne 0 && test ! -d "$xdir"; then + exit $status + fi + # We will extract separately just the conflicting names and we will no + # longer touch any unique names. It is faster to leave these extract + # automatically by $AR in one run. + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + if ($AR t "$xabs" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 + $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 + $AR t "$xabs" | sort | uniq -cd | while read -r count name + do + i=1 + while test "$i" -le "$count" + do + # Put our $i before any first dot (extension) + # Never overwrite any file + name_to="$name" + while test "X$name_to" = "X$name" || test -f "$xdir/$name_to" + do + name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` + done + $show "(cd $xdir && $AR xN $i $xabs '$name' && $mv '$name' '$name_to')" + $run eval "(cd \$xdir && $AR xN $i \$xabs '$name' && $mv '$name' '$name_to')" || exit $? + i=`expr $i + 1` + done + done + fi + + oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` + done + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + # GNU ar 2.10+ was changed to match POSIX; thus no paths are + # encoded into archives. This makes 'ar r' malfunction in + # this piecewise linking case whenever conflicting object + # names appear in distinct ar calls; check, warn and compensate. + if (for obj in $save_oldobjs + do + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 + $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 + AR_FLAGS=cq + fi + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*"` && + test "$len" -le "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg="$nonopt" + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest="$arg" + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) prev="-f" ;; + -g) prev="-g" ;; + -m) prev="-m" ;; + -o) prev="-o" ;; + -s) + stripme=" -s" + continue + ;; + -*) ;; + + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest="$arg" + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run eval "$striplib $destdir/$realname" || exit $? + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # To insure that "foo" is sourced, and not "foo.exe", + # finese the cygwin/MSYS system by explicitly sourcing "foo." + # which disallows the automatic-append-.exe behavior. + case $build in + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; + *) wrapperdot=${wrapper} ;; + esac + # If there is no directory component, then add one. + case $file in + */* | *\\*) . ${wrapperdot} ;; + *) . ./${wrapperdot} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # To insure that "foo" is sourced, and not "foo.exe", + # finese the cygwin/MSYS system by explicitly sourcing "foo." + # which disallows the automatic-append-.exe behavior. + case $build in + *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; + *) wrapperdot=${wrapper} ;; + esac + # If there is no directory component, then add one. + case $file in + */* | *\\*) . ${wrapperdot} ;; + *) . ./${wrapperdot} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir="/tmp" + test -n "$TMPDIR" && tmpdir="$TMPDIR" + tmpdir="$tmpdir/libtool-$$" + save_umask=`umask` + umask 0077 + if $mkdir "$tmpdir"; then + umask $save_umask + else + umask $save_umask + $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 + continue + fi + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyways + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "----------------------------------------------------------------------" + $echo "Libraries have been installed in:" + for libdir in $libdirs; do + $echo " $libdir" + done + $echo + $echo "If you ever happen to want to link against installed libraries" + $echo "in a given directory, LIBDIR, you must either use libtool, and" + $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + $echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + $echo " during execution" + fi + if test -n "$runpath_var"; then + $echo " - add LIBDIR to the \`$runpath_var' environment variable" + $echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $echo + $echo "See any operating system documentation about shared libraries for" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "----------------------------------------------------------------------" + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if (test -L "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ + || test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + + if test "$mode" = uninstall; then + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + fi + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $EXIT_SUCCESS + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/sdk/buddy-2.4/tools/missing b/sdk/buddy-2.4/tools/missing new file mode 100644 index 0000000..e7ef83a --- /dev/null +++ b/sdk/buddy-2.4/tools/missing @@ -0,0 +1,360 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2003-09-02.23 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then + # We have makeinfo, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + tar) + shift + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + fi + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/sdk/wxscintilla/CMakeLists.txt b/sdk/wxscintilla/CMakeLists.txt new file mode 100644 index 0000000..9aa8642 --- /dev/null +++ b/sdk/wxscintilla/CMakeLists.txt @@ -0,0 +1,26 @@ +# This file is part of EPOCH. +# File: CMakeLists.txt +# Author: Florent Teichteil-Königsbuch +# Contact: florent.teichteil@onera.fr +# +# EPOCH is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# EPOCH is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with EPOCH. If not, see . + +MESSAGE (STATUS "Compiling wxScintilla-1.69.2 from codelite-2.7.0.4375") +FILE (GLOB_RECURSE WXSCINTILLA_SOURCES ${CMAKE_CURRENT_SOURCE_DIR} *.cxx *.cpp) +INCLUDE_DIRECTORIES (${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/src/scintilla/include + ${CMAKE_CURRENT_SOURCE_DIR}/src/scintilla/src) +ADD_DEFINITIONS (-D__WX__=1 -DSCI_LEXER -DLINK_LEXERS) +ADD_LIBRARY (epoch-wxscintilla STATIC ${WXSCINTILLA_SOURCES}) + diff --git a/sdk/wxscintilla/include/wx/wxscintilla.h b/sdk/wxscintilla/include/wx/wxscintilla.h new file mode 100644 index 0000000..4b75cb8 --- /dev/null +++ b/sdk/wxscintilla/include/wx/wxscintilla.h @@ -0,0 +1,3837 @@ +//////////////////////////////////////////////////////////////////////////// +// Name: wxscintilla.h +// Purpose: A wxWidgets implementation of Scintilla. This class is the +// one meant to be used directly by wx applications. It does not +// derive directly from the Scintilla classes, and in fact there +// is no mention of Scintilla classes at all in this header. +// This class delegates all method calls and events to the +// Scintilla objects and so forth. This allows the use of +// Scintilla without polluting the namespace with all the +// classes and itentifiers from Scintilla. +// +// Author: Robin Dunn +// +// Created: 13-Jan-2000 +// RCS-ID: $Id: wxscintilla.h,v 1.38 2006/09/22 19:42:14 wyo Exp $ +// Copyright: (c) 2004 wxCode +// Licence: wxWindows +///////////////////////////////////////////////////////////////////////////// + +#ifndef __WXSCINTILLA_H__ +#define __WXSCINTILLA_H__ + +#define wxSCINTILLA_VERSION _T("1.71.1") + +#include +#include + +#ifdef __APPLE__ +#include "Platform.h" +#endif + +#ifdef WXDLLIMPEXP_SCI +#undef WXDLLIMPEXP_SCI +#endif + +#ifdef WXMAKINGDLL_SCI + #define WXDLLIMPEXP_SCI WXEXPORT +#elif defined(WXUSINGDLL_SCI) + #define WXDLLIMPEXP_SCI WXIMPORT +#else // not making nor using DLL + #define WXDLLIMPEXP_SCI +#endif + +// SWIG can't handle "#if" type of conditionals, only "#ifdef" +#ifdef SWIG +#define SCI_USE_DND 1 +#else +#if wxUSE_DRAG_AND_DROP +#define SCI_USE_DND 1 +#endif +#endif + +//---------------------------------------------------------------------- + +// Should a wxPopupWindow be used for the call tips and autocomplete windows? +#ifndef wxSCI_USE_POPUP +#define wxSCI_USE_POPUP 1 +#endif + +//---------------------------------------------------------------------- +// BEGIN generated section. The following code is automatically generated +// by gen_iface.py. Do not edit this file. Edit wxscintilla.h.in instead +// and regenerate + +#define wxSCI_INVALID_POSITION -1 + +// Define start of Scintilla messages to be greater than all Windows edit (EM_*) messages +// as many EM_ messages can be used although that use is deprecated. +#define wxSCI_START 2000 +#define wxSCI_OPTIONAL_START 3000 +#define wxSCI_LEXER_START 4000 +#define wxSCI_WS_INVISIBLE 0 +#define wxSCI_WS_VISIBLEALWAYS 1 +#define wxSCI_WS_VISIBLEAFTERINDENT 2 +#define wxSCI_WS_INDENTVISIBLE 3 +#define wxSCI_EOL_CRLF 0 +#define wxSCI_EOL_CR 1 +#define wxSCI_EOL_LF 2 + +// The SC_CP_UTF8 value can be used to enter Unicode mode. +// This is the same value as CP_UTF8 in Windows +#define wxSCI_CP_UTF8 65001 + +// The SC_CP_DBCS value can be used to indicate a DBCS mode for GTK+. +#define wxSCI_CP_DBCS 1 + +#define wxSCI_MARKER_MAX 31 +#define wxSCI_MARK_CIRCLE 0 +#define wxSCI_MARK_ROUNDRECT 1 +#define wxSCI_MARK_ARROW 2 +#define wxSCI_MARK_SMALLRECT 3 +#define wxSCI_MARK_SHORTARROW 4 +#define wxSCI_MARK_EMPTY 5 +#define wxSCI_MARK_ARROWDOWN 6 +#define wxSCI_MARK_MINUS 7 +#define wxSCI_MARK_PLUS 8 + +// Shapes used for outlining column. +#define wxSCI_MARK_VLINE 9 +#define wxSCI_MARK_LCORNER 10 +#define wxSCI_MARK_TCORNER 11 +#define wxSCI_MARK_BOXPLUS 12 +#define wxSCI_MARK_BOXPLUSCONNECTED 13 +#define wxSCI_MARK_BOXMINUS 14 +#define wxSCI_MARK_BOXMINUSCONNECTED 15 +#define wxSCI_MARK_LCORNERCURVE 16 +#define wxSCI_MARK_TCORNERCURVE 17 +#define wxSCI_MARK_CIRCLEPLUS 18 +#define wxSCI_MARK_CIRCLEPLUSCONNECTED 19 +#define wxSCI_MARK_CIRCLEMINUS 20 +#define wxSCI_MARK_CIRCLEMINUSCONNECTED 21 + +// Invisible mark that only sets the line background color. +#define wxSCI_MARK_BACKGROUND 22 +#define wxSCI_MARK_DOTDOTDOT 23 +#define wxSCI_MARK_ARROWS 24 +#define wxSCI_MARK_PIXMAP 25 +#define wxSCI_MARK_FULLRECT 26 +#define wxSCI_MARK_ARROW_IN_BOX 100 +#define wxSCI_MARK_ARROWDOWN_IN_BOX 101 +#define wxSCI_MARK_FULLRECT_TAIL 102 +#define wxSCI_MARK_PLUS_IN_BOX 103 +#define wxSCI_MARK_MINUS_IN_BOX 104 +#define wxSCI_MARK_CHARACTER 10000 + +// Markers used for outlining column. +#define wxSCI_MARKNUM_FOLDEREND 25 +#define wxSCI_MARKNUM_FOLDEROPENMID 26 +#define wxSCI_MARKNUM_FOLDERMIDTAIL 27 +#define wxSCI_MARKNUM_FOLDERTAIL 28 +#define wxSCI_MARKNUM_FOLDERSUB 29 +#define wxSCI_MARKNUM_FOLDER 30 +#define wxSCI_MARKNUM_FOLDEROPEN 31 +#define wxSCI_MASK_FOLDERS 0xFE000000 +#define wxSCI_MARGIN_SYMBOL 0 +#define wxSCI_MARGIN_NUMBER 1 +#define wxSCI_MARGIN_BACK 2 +#define wxSCI_MARGIN_FORE 3 +#define wxSCI_MARGIN_TEXT 4 +#define wxSCI_MARGIN_RTEXT 5 + +// Styles in range 32..38 are predefined for parts of the UI and are not used as normal styles. +// Styles 39 is for future use. +#define wxSCI_STYLE_DEFAULT 32 +#define wxSCI_STYLE_LINENUMBER 33 +#define wxSCI_STYLE_BRACELIGHT 34 +#define wxSCI_STYLE_BRACEBAD 35 +#define wxSCI_STYLE_CONTROLCHAR 36 +#define wxSCI_STYLE_INDENTGUIDE 37 +#define wxSCI_STYLE_CALLTIP 38 +#define wxSCI_STYLE_LASTPREDEFINED 39 +#define wxSCI_STYLE_MAX 127 + +// Character set identifiers are used in StyleSetCharacterSet. +// The values are the same as the Windows *_CHARSET values. +#define wxSCI_CHARSET_ANSI 0 +#define wxSCI_CHARSET_DEFAULT 1 +#define wxSCI_CHARSET_BALTIC 186 +#define wxSCI_CHARSET_CHINESEBIG5 136 +#define wxSCI_CHARSET_EASTEUROPE 238 +#define wxSCI_CHARSET_GB2312 134 +#define wxSCI_CHARSET_GREEK 161 +#define wxSCI_CHARSET_HANGUL 129 +#define wxSCI_CHARSET_MAC 77 +#define wxSCI_CHARSET_OEM 255 +#define wxSCI_CHARSET_RUSSIAN 204 +#define wxSCI_CHARSET_CYRILLIC 1251 +#define wxSCI_CHARSET_SHIFTJIS 128 +#define wxSCI_CHARSET_SYMBOL 2 +#define wxSCI_CHARSET_TURKISH 162 +#define wxSCI_CHARSET_JOHAB 130 +#define wxSCI_CHARSET_HEBREW 177 +#define wxSCI_CHARSET_ARABIC 178 +#define wxSCI_CHARSET_VIETNAMESE 163 +#define wxSCI_CHARSET_THAI 222 +#define wxSCI_CHARSET_8859_15 1000 +#define wxSCI_CASE_MIXED 0 +#define wxSCI_CASE_UPPER 1 +#define wxSCI_CASE_LOWER 2 +#define wxSCI_INDIC_MAX 7 +#define wxSCI_INDIC_PLAIN 0 +#define wxSCI_INDIC_SQUIGGLE 1 +#define wxSCI_INDIC_TT 2 +#define wxSCI_INDIC_DIAGONAL 3 +#define wxSCI_INDIC_STRIKE 4 +#define wxSCI_INDIC_HIDDEN 5 +#define wxSCI_INDIC_BOX 6 +#define wxSCI_INDIC_ROUNDBOX 7 +#define wxSCI_INDIC0_MASK 0x20 +#define wxSCI_INDIC1_MASK 0x40 +#define wxSCI_INDIC2_MASK 0x80 +#define wxSCI_INDICS_MASK 0xE0 + +// PrintColourMode - use same colours as screen. +#define wxSCI_PRINT_NORMAL 0 + +// PrintColourMode - invert the light value of each style for printing. +#define wxSCI_PRINT_INVERTLIGHT 1 + +// PrintColourMode - force black text on white background for printing. +#define wxSCI_PRINT_BLACKONWHITE 2 + +// PrintColourMode - text stays coloured, but all background is forced to be white for printing. +#define wxSCI_PRINT_COLOURONWHITE 3 + +// PrintColourMode - only the default-background is forced to be white for printing. +#define wxSCI_PRINT_COLOURONWHITEDEFAULTBG 4 +#define wxSCI_FIND_WHOLEWORD 2 +#define wxSCI_FIND_MATCHCASE 4 +#define wxSCI_FIND_WORDSTART 0x00100000 +#define wxSCI_FIND_REGEXP 0x00200000 +#define wxSCI_FIND_POSIX 0x00400000 +#define wxSCI_FOLDLEVELBASE 0x400 +#define wxSCI_FOLDLEVELWHITEFLAG 0x1000 +#define wxSCI_FOLDLEVELHEADERFLAG 0x2000 +#define wxSCI_FOLDLEVELBOXHEADERFLAG 0x4000 +#define wxSCI_FOLDLEVELBOXFOOTERFLAG 0x8000 +#define wxSCI_FOLDLEVELCONTRACTED 0x10000 +#define wxSCI_FOLDLEVELUNINDENT 0x20000 +#define wxSCI_FOLDLEVELNUMBERMASK 0x0FFF +#define wxSCI_FOLDFLAG_LINEBEFORE_EXPANDED 0x0002 +#define wxSCI_FOLDFLAG_LINEBEFORE_CONTRACTED 0x0004 +#define wxSCI_FOLDFLAG_LINEAFTER_EXPANDED 0x0008 +#define wxSCI_FOLDFLAG_LINEAFTER_CONTRACTED 0x0010 +#define wxSCI_FOLDFLAG_LEVELNUMBERS 0x0040 +#define wxSCI_FOLDFLAG_BOX 0x0001 +#define wxSCI_TIME_FOREVER 10000000 +#define wxSCI_WRAP_NONE 0 +#define wxSCI_WRAP_WORD 1 +#define wxSCI_WRAP_CHAR 2 +#define wxSCI_WRAPVISUALFLAG_NONE 0x0000 +#define wxSCI_WRAPVISUALFLAG_END 0x0001 +#define wxSCI_WRAPVISUALFLAG_START 0x0002 +#define wxSCI_WRAPVISUALFLAGLOC_DEFAULT 0x0000 +#define wxSCI_WRAPVISUALFLAGLOC_END_BY_TEXT 0x0001 +#define wxSCI_WRAPVISUALFLAGLOC_START_BY_TEXT 0x0002 +#define wxSCI_CACHE_NONE 0 +#define wxSCI_CACHE_CARET 1 +#define wxSCI_CACHE_PAGE 2 +#define wxSCI_CACHE_DOCUMENT 3 +#define wxSCI_EDGE_NONE 0 +#define wxSCI_EDGE_LINE 1 +#define wxSCI_EDGE_BACKGROUND 2 +#define wxSCI_CURSORNORMAL -1 +#define wxSCI_CURSORWAIT 4 + +// Constants for use with SetVisiblePolicy, similar to SetCaretPolicy. +#define wxSCI_VISIBLE_SLOP 0x01 +#define wxSCI_VISIBLE_STRICT 0x04 + +// Caret policy, used by SetXCaretPolicy and SetYCaretPolicy. +// If CARET_SLOP is set, we can define a slop value: caretSlop. +// This value defines an unwanted zone (UZ) where the caret is... unwanted. +// This zone is defined as a number of pixels near the vertical margins, +// and as a number of lines near the horizontal margins. +// By keeping the caret away from the edges, it is seen within its context, +// so it is likely that the identifier that the caret is on can be completely seen, +// and that the current line is seen with some of the lines following it which are +// often dependent on that line. +#define wxSCI_CARET_SLOP 0x01 + +// If CARET_STRICT is set, the policy is enforced... strictly. +// The caret is centred on the display if slop is not set, +// and cannot go in the UZ if slop is set. +#define wxSCI_CARET_STRICT 0x04 + +// If CARET_JUMPS is set, the display is moved more energetically +// so the caret can move in the same direction longer before the policy is applied again. +#define wxSCI_CARET_JUMPS 0x10 + +// If CARET_EVEN is not set, instead of having symmetrical UZs, +// the left and bottom UZs are extended up to right and top UZs respectively. +// This way, we favour the displaying of useful information: the begining of lines, +// where most code reside, and the lines after the caret, eg. the body of a function. +#define wxSCI_CARET_EVEN 0x08 + +// Selection modes +#define wxSCI_SEL_STREAM 0 +#define wxSCI_SEL_RECTANGLE 1 +#define wxSCI_SEL_LINES 2 + +// Maximum value of keywordSet parameter of SetKeyWords. +#define wxSCI_KEYWORDSET_MAX 8 + +// Notifications +// Type of modification and the action which caused the modification. +// These are defined as a bit mask to make it easy to specify which notifications are wanted. +// One bit is set from each of SC_MOD_* and SC_PERFORMED_*. +#define wxSCI_MOD_INSERTTEXT 0x1 +#define wxSCI_MOD_DELETETEXT 0x2 +#define wxSCI_MOD_CHANGESTYLE 0x4 +#define wxSCI_MOD_CHANGEFOLD 0x8 +#define wxSCI_PERFORMED_USER 0x10 +#define wxSCI_PERFORMED_UNDO 0x20 +#define wxSCI_PERFORMED_REDO 0x40 +#define wxSCI_MULTISTEPUNDOREDO 0x80 +#define wxSCI_LASTSTEPINUNDOREDO 0x100 +#define wxSCI_MOD_CHANGEMARKER 0x200 +#define wxSCI_MOD_BEFOREINSERT 0x400 +#define wxSCI_MOD_BEFOREDELETE 0x800 +#define wxSCI_MULTILINEUNDOREDO 0x1000 +#define wxSCI_MODEVENTMASKALL 0x1FFF + +// Symbolic key codes and modifier flags. +// ASCII and other printable characters below 256. +// Extended keys above 300. +#define wxSCI_KEY_DOWN 300 +#define wxSCI_KEY_UP 301 +#define wxSCI_KEY_LEFT 302 +#define wxSCI_KEY_RIGHT 303 +#define wxSCI_KEY_HOME 304 +#define wxSCI_KEY_END 305 +#define wxSCI_KEY_PRIOR 306 +#define wxSCI_KEY_NEXT 307 +#define wxSCI_KEY_DELETE 308 +#define wxSCI_KEY_INSERT 309 +#define wxSCI_KEY_ESCAPE 7 +#define wxSCI_KEY_BACK 8 +#define wxSCI_KEY_TAB 9 +#define wxSCI_KEY_RETURN 13 +#define wxSCI_KEY_ADD 310 +#define wxSCI_KEY_SUBTRACT 311 +#define wxSCI_KEY_DIVIDE 312 +#define wxSCI_SCMOD_NULL 0 +#define wxSCI_SCMOD_SHIFT 1 +#define wxSCI_SCMOD_CTRL 2 +#define wxSCI_SCMOD_ALT 4 + +// Caret line alpha background +#define wxSCI_ALPHA_TRANSPARENT 0 +#define wxSCI_ALPHA_OPAQUE 255 +#define wxSCI_ALPHA_NOALPHA 256 + +// For SciLexer.h +#define wxSCI_LEX_CONTAINER 0 +#define wxSCI_LEX_NULL 1 +#define wxSCI_LEX_PYTHON 2 +#define wxSCI_LEX_CPP 3 +#define wxSCI_LEX_HTML 4 +#define wxSCI_LEX_XML 5 +#define wxSCI_LEX_PERL 6 +#define wxSCI_LEX_SQL 7 +#define wxSCI_LEX_VB 8 +#define wxSCI_LEX_PROPERTIES 9 +#define wxSCI_LEX_ERRORLIST 10 +#define wxSCI_LEX_MAKEFILE 11 +#define wxSCI_LEX_BATCH 12 +#define wxSCI_LEX_XCODE 13 +#define wxSCI_LEX_LATEX 14 +#define wxSCI_LEX_LUA 15 +#define wxSCI_LEX_DIFF 16 +#define wxSCI_LEX_CONF 17 +#define wxSCI_LEX_PASCAL 18 +#define wxSCI_LEX_AVE 19 +#define wxSCI_LEX_ADA 20 +#define wxSCI_LEX_LISP 21 +#define wxSCI_LEX_RUBY 22 +#define wxSCI_LEX_EIFFEL 23 +#define wxSCI_LEX_EIFFELKW 24 +#define wxSCI_LEX_TCL 25 +#define wxSCI_LEX_NNCRONTAB 26 +#define wxSCI_LEX_BULLANT 27 +#define wxSCI_LEX_VBSCRIPT 28 +#define wxSCI_LEX_BAAN 31 +#define wxSCI_LEX_MATLAB 32 +#define wxSCI_LEX_SCRIPTOL 33 +#define wxSCI_LEX_ASM 34 +#define wxSCI_LEX_CPPNOCASE 35 +#define wxSCI_LEX_FORTRAN 36 +#define wxSCI_LEX_F77 37 +#define wxSCI_LEX_CSS 38 +#define wxSCI_LEX_POV 39 +#define wxSCI_LEX_LOUT 40 +#define wxSCI_LEX_ESCRIPT 41 +#define wxSCI_LEX_PS 42 +#define wxSCI_LEX_NSIS 43 +#define wxSCI_LEX_MMIXAL 44 +#define wxSCI_LEX_CLW 45 +#define wxSCI_LEX_CLWNOCASE 46 +#define wxSCI_LEX_LOT 47 +#define wxSCI_LEX_YAML 48 +#define wxSCI_LEX_TEX 49 +#define wxSCI_LEX_METAPOST 50 +#define wxSCI_LEX_POWERBASIC 51 +#define wxSCI_LEX_FORTH 52 +#define wxSCI_LEX_ERLANG 53 +#define wxSCI_LEX_OCTAVE 54 +#define wxSCI_LEX_MSSQL 55 +#define wxSCI_LEX_VERILOG 56 +#define wxSCI_LEX_KIX 57 +#define wxSCI_LEX_GUI4CLI 58 +#define wxSCI_LEX_SPECMAN 59 +#define wxSCI_LEX_AU3 60 +#define wxSCI_LEX_APDL 61 +#define wxSCI_LEX_BASH 62 +#define wxSCI_LEX_ASN1 63 +#define wxSCI_LEX_VHDL 64 +#define wxSCI_LEX_CAML 65 +#define wxSCI_LEX_BLITZBASIC 66 +#define wxSCI_LEX_PUREBASIC 67 +#define wxSCI_LEX_HASKELL 68 +#define wxSCI_LEX_PHPSCRIPT 69 +#define wxSCI_LEX_TADS3 70 +#define wxSCI_LEX_REBOL 71 +#define wxSCI_LEX_SMALLTALK 72 +#define wxSCI_LEX_FLAGSHIP 73 +#define wxSCI_LEX_CSOUND 74 +#define wxSCI_LEX_FREEBASIC 75 +#define wxSCI_LEX_INNOSETUP 76 +#define wxSCI_LEX_OPAL 77 +#define wxSCI_LEX_SPICE 78 +#define wxSCI_LEX_D 79 +#define wxSCI_LEX_CMAKE 80 +#define wxSCI_LEX_GAP 81 +#define wxSCI_LEX_PLM 82 +#define wxSCI_LEX_PROGRESS 83 +#define wxSCI_LEX_ABAQUS 84 +#define wxSCI_LEX_ASYMPTOTE 85 +#define wxSCI_LEX_R 86 +#define wxSCI_LEX_MAGIK 87 +#define wxSCI_LEX_POWERSHELL 88 + +//ERAN +#define wxSCI_LEX_GCC 150 +#define wxSCI_LEX_CPPCHECK 153 +#define wxSCI_LEX_GCC_DEFAULT 0 +#define wxSCI_LEX_GCC_ERROR 1 +#define wxSCI_LEX_GCC_WARNING 2 +#define wxSCI_LEX_GCC_BUILDING 3 +#define wxSCI_LEX_GCC_FILE_LINK 4 +#define wxSCI_LEX_GCC_OUTPUT 5 +#define wxSCI_LEX_GCC_MAKE_ENTER 6 +#define wxSCI_LEX_GCC_MAKE_LEAVING 7 + +#define wxSCI_LEX_FIF 151 +#define wxSCI_LEX_FIF_DEFAULT 0 +#define wxSCI_LEX_FIF_FILE 1 +#define wxSCI_LEX_FIF_MATCH 2 +#define wxSCI_LEX_FIF_FILE_SHORT 3 +#define wxSCI_LEX_FIF_PROJECT 4 +#define wxSCI_LEX_FIF_SCOPE 5 + +#define wxSCI_LEX_SVN 152 +#define wxSCI_LEX_SVN_DEFAULT 0 +#define wxSCI_LEX_SVN_UPDATED 1 +#define wxSCI_LEX_SVN_CONFLICT 2 +#define wxSCI_LEX_SVN_MERGED 3 +#define wxSCI_LEX_SVN_DELETED 4 +#define wxSCI_LEX_SVN_ADDED 5 +#define wxSCI_LEX_SVN_INFO 6 + +//ERAN - END + +//EPOCH - START +#define wxSCI_LEX_ALTARICA 154 +#define wxSCI_ALTARICA_DEFAULT 0 +#define wxSCI_ALTARICA_COMMENT 1 +#define wxSCI_ALTARICA_COMMENTLINE 2 +#define wxSCI_ALTARICA_KEYWORD 3 +#define wxSCI_ALTARICA_TYPE 4 +#define wxSCI_ALTARICA_IDENTIFIER 5 +#define wxSCI_ALTARICA_OPERATOR 6 +#define wxSCI_ALTARICA_NUMBER 7 +#define wxSCI_ALTARICA_FORBIDDEN 8 + +#define wxSCI_LEX_PRISM 155 +#define wxSCI_PRISM_DEFAULT 0 +#define wxSCI_PRISM_COMMENT 1 +#define wxSCI_PRISM_KEYWORD 2 +#define wxSCI_PRISM_FUNCTION 3 +#define wxSCI_PRISM_TYPE 4 +#define wxSCI_PRISM_IDENTIFIER 5 +#define wxSCI_PRISM_OPERATOR 6 +#define wxSCI_PRISM_NUMBER 7 +#define wxSCI_PRISM_STRING 8 +#define wxSCI_PRISM_FORBIDDEN 9 +//EPOCH - END + +// When a lexer specifies its language as SCLEX_AUTOMATIC it receives a +// value assigned in sequence from SCLEX_AUTOMATIC+1. +#define wxSCI_LEX_AUTOMATIC 1000 + +// Lexical states for SCLEX_PYTHON +#define wxSCI_P_DEFAULT 0 +#define wxSCI_P_COMMENTLINE 1 +#define wxSCI_P_NUMBER 2 +#define wxSCI_P_STRING 3 +#define wxSCI_P_CHARACTER 4 +#define wxSCI_P_WORD 5 +#define wxSCI_P_TRIPLE 6 +#define wxSCI_P_TRIPLEDOUBLE 7 +#define wxSCI_P_CLASSNAME 8 +#define wxSCI_P_DEFNAME 9 +#define wxSCI_P_OPERATOR 10 +#define wxSCI_P_IDENTIFIER 11 +#define wxSCI_P_COMMENTBLOCK 12 +#define wxSCI_P_STRINGEOL 13 +#define wxSCI_P_WORD2 14 +#define wxSCI_P_DECORATOR 15 + +// Lexical states for SCLEX_CPP +#define wxSCI_C_DEFAULT 0 +#define wxSCI_C_COMMENT 1 +#define wxSCI_C_COMMENTLINE 2 +#define wxSCI_C_COMMENTDOC 3 +#define wxSCI_C_NUMBER 4 +#define wxSCI_C_WORD 5 +#define wxSCI_C_STRING 6 +#define wxSCI_C_CHARACTER 7 +#define wxSCI_C_UUID 8 +#define wxSCI_C_PREPROCESSOR 9 +#define wxSCI_C_OPERATOR 10 +#define wxSCI_C_IDENTIFIER 11 +#define wxSCI_C_STRINGEOL 12 +#define wxSCI_C_VERBATIM 13 +#define wxSCI_C_REGEX 14 +#define wxSCI_C_COMMENTLINEDOC 15 +#define wxSCI_C_WORD2 16 +#define wxSCI_C_COMMENTDOCKEYWORD 17 +#define wxSCI_C_COMMENTDOCKEYWORDERROR 18 +#define wxSCI_C_GLOBALCLASS 19 + +// Lexical states for SCLEX_TCL +#define wxSCI_TCL_DEFAULT 0 +#define wxSCI_TCL_COMMENT 1 +#define wxSCI_TCL_COMMENTLINE 2 +#define wxSCI_TCL_NUMBER 3 +#define wxSCI_TCL_WORD_IN_QUOTE 4 +#define wxSCI_TCL_IN_QUOTE 5 +#define wxSCI_TCL_OPERATOR 6 +#define wxSCI_TCL_IDENTIFIER 7 +#define wxSCI_TCL_SUBSTITUTION 8 +#define wxSCI_TCL_SUB_BRACE 9 +#define wxSCI_TCL_MODIFIER 10 +#define wxSCI_TCL_EXPAND 11 +#define wxSCI_TCL_WORD 12 +#define wxSCI_TCL_WORD2 13 +#define wxSCI_TCL_WORD3 14 +#define wxSCI_TCL_WORD4 15 +#define wxSCI_TCL_WORD5 16 +#define wxSCI_TCL_WORD6 17 +#define wxSCI_TCL_WORD7 18 +#define wxSCI_TCL_WORD8 19 +#define wxSCI_TCL_COMMENT_BOX 20 +#define wxSCI_TCL_BLOCK_COMMENT 21 + +// Lexical states for SCLEX_HTML, SCLEX_XML +#define wxSCI_H_DEFAULT 0 +#define wxSCI_H_TAG 1 +#define wxSCI_H_TAGUNKNOWN 2 +#define wxSCI_H_ATTRIBUTE 3 +#define wxSCI_H_ATTRIBUTEUNKNOWN 4 +#define wxSCI_H_NUMBER 5 +#define wxSCI_H_DOUBLESTRING 6 +#define wxSCI_H_SINGLESTRING 7 +#define wxSCI_H_OTHER 8 +#define wxSCI_H_COMMENT 9 +#define wxSCI_H_ENTITY 10 + +// XML and ASP +#define wxSCI_H_TAGEND 11 +#define wxSCI_H_XMLSTART 12 +#define wxSCI_H_XMLEND 13 +#define wxSCI_H_SCRIPT 14 +#define wxSCI_H_ASP 15 +#define wxSCI_H_ASPAT 16 +#define wxSCI_H_CDATA 17 +#define wxSCI_H_QUESTION 18 + +// More HTML +#define wxSCI_H_VALUE 19 + +// X-Code +#define wxSCI_H_XCCOMMENT 20 + +// SGML +#define wxSCI_H_SGML_DEFAULT 21 +#define wxSCI_H_SGML_COMMAND 22 +#define wxSCI_H_SGML_1ST_PARAM 23 +#define wxSCI_H_SGML_DOUBLESTRING 24 +#define wxSCI_H_SGML_SIMPLESTRING 25 +#define wxSCI_H_SGML_ERROR 26 +#define wxSCI_H_SGML_SPECIAL 27 +#define wxSCI_H_SGML_ENTITY 28 +#define wxSCI_H_SGML_COMMENT 29 +#define wxSCI_H_SGML_1ST_PARAM_COMMENT 30 +#define wxSCI_H_SGML_BLOCK_DEFAULT 31 + +// Embedded Javascript +#define wxSCI_HJ_START 40 +#define wxSCI_HJ_DEFAULT 41 +#define wxSCI_HJ_COMMENT 42 +#define wxSCI_HJ_COMMENTLINE 43 +#define wxSCI_HJ_COMMENTDOC 44 +#define wxSCI_HJ_NUMBER 45 +#define wxSCI_HJ_WORD 46 +#define wxSCI_HJ_KEYWORD 47 +#define wxSCI_HJ_DOUBLESTRING 48 +#define wxSCI_HJ_SINGLESTRING 49 +#define wxSCI_HJ_SYMBOLS 50 +#define wxSCI_HJ_STRINGEOL 51 +#define wxSCI_HJ_REGEX 52 + +// ASP Javascript +#define wxSCI_HJA_START 55 +#define wxSCI_HJA_DEFAULT 56 +#define wxSCI_HJA_COMMENT 57 +#define wxSCI_HJA_COMMENTLINE 58 +#define wxSCI_HJA_COMMENTDOC 59 +#define wxSCI_HJA_NUMBER 60 +#define wxSCI_HJA_WORD 61 +#define wxSCI_HJA_KEYWORD 62 +#define wxSCI_HJA_DOUBLESTRING 63 +#define wxSCI_HJA_SINGLESTRING 64 +#define wxSCI_HJA_SYMBOLS 65 +#define wxSCI_HJA_STRINGEOL 66 +#define wxSCI_HJA_REGEX 67 + +// Embedded VBScript +#define wxSCI_HB_START 70 +#define wxSCI_HB_DEFAULT 71 +#define wxSCI_HB_COMMENTLINE 72 +#define wxSCI_HB_NUMBER 73 +#define wxSCI_HB_WORD 74 +#define wxSCI_HB_STRING 75 +#define wxSCI_HB_IDENTIFIER 76 +#define wxSCI_HB_STRINGEOL 77 + +// ASP VBScript +#define wxSCI_HBA_START 80 +#define wxSCI_HBA_DEFAULT 81 +#define wxSCI_HBA_COMMENTLINE 82 +#define wxSCI_HBA_NUMBER 83 +#define wxSCI_HBA_WORD 84 +#define wxSCI_HBA_STRING 85 +#define wxSCI_HBA_IDENTIFIER 86 +#define wxSCI_HBA_STRINGEOL 87 + +// Embedded Python +#define wxSCI_HP_START 90 +#define wxSCI_HP_DEFAULT 91 +#define wxSCI_HP_COMMENTLINE 92 +#define wxSCI_HP_NUMBER 93 +#define wxSCI_HP_STRING 94 +#define wxSCI_HP_CHARACTER 95 +#define wxSCI_HP_WORD 96 +#define wxSCI_HP_TRIPLE 97 +#define wxSCI_HP_TRIPLEDOUBLE 98 +#define wxSCI_HP_CLASSNAME 99 +#define wxSCI_HP_DEFNAME 100 +#define wxSCI_HP_OPERATOR 101 +#define wxSCI_HP_IDENTIFIER 102 + +// PHP +#define wxSCI_HPHP_COMPLEX_VARIABLE 104 + +// ASP Python +#define wxSCI_HPA_START 105 +#define wxSCI_HPA_DEFAULT 106 +#define wxSCI_HPA_COMMENTLINE 107 +#define wxSCI_HPA_NUMBER 108 +#define wxSCI_HPA_STRING 109 +#define wxSCI_HPA_CHARACTER 110 +#define wxSCI_HPA_WORD 111 +#define wxSCI_HPA_TRIPLE 112 +#define wxSCI_HPA_TRIPLEDOUBLE 113 +#define wxSCI_HPA_CLASSNAME 114 +#define wxSCI_HPA_DEFNAME 115 +#define wxSCI_HPA_OPERATOR 116 +#define wxSCI_HPA_IDENTIFIER 117 + +// PHP +#define wxSCI_HPHP_DEFAULT 118 +#define wxSCI_HPHP_HSTRING 119 +#define wxSCI_HPHP_SIMPLESTRING 120 +#define wxSCI_HPHP_WORD 121 +#define wxSCI_HPHP_NUMBER 122 +#define wxSCI_HPHP_VARIABLE 123 +#define wxSCI_HPHP_COMMENT 124 +#define wxSCI_HPHP_COMMENTLINE 125 +#define wxSCI_HPHP_HSTRING_VARIABLE 126 +#define wxSCI_HPHP_OPERATOR 127 + +// Lexical states for SCLEX_PERL +#define wxSCI_PL_DEFAULT 0 +#define wxSCI_PL_ERROR 1 +#define wxSCI_PL_COMMENTLINE 2 +#define wxSCI_PL_POD 3 +#define wxSCI_PL_NUMBER 4 +#define wxSCI_PL_WORD 5 +#define wxSCI_PL_STRING 6 +#define wxSCI_PL_CHARACTER 7 +#define wxSCI_PL_PUNCTUATION 8 +#define wxSCI_PL_PREPROCESSOR 9 +#define wxSCI_PL_OPERATOR 10 +#define wxSCI_PL_IDENTIFIER 11 +#define wxSCI_PL_SCALAR 12 +#define wxSCI_PL_ARRAY 13 +#define wxSCI_PL_HASH 14 +#define wxSCI_PL_SYMBOLTABLE 15 +#define wxSCI_PL_VARIABLE_INDEXER 16 +#define wxSCI_PL_REGEX 17 +#define wxSCI_PL_REGSUBST 18 +#define wxSCI_PL_LONGQUOTE 19 +#define wxSCI_PL_BACKTICKS 20 +#define wxSCI_PL_DATASECTION 21 +#define wxSCI_PL_HERE_DELIM 22 +#define wxSCI_PL_HERE_Q 23 +#define wxSCI_PL_HERE_QQ 24 +#define wxSCI_PL_HERE_QX 25 +#define wxSCI_PL_STRING_Q 26 +#define wxSCI_PL_STRING_QQ 27 +#define wxSCI_PL_STRING_QX 28 +#define wxSCI_PL_STRING_QR 29 +#define wxSCI_PL_STRING_QW 30 +#define wxSCI_PL_POD_VERB 31 + +// Lexical states for SCLEX_RUBY +#define wxSCI_RB_DEFAULT 0 +#define wxSCI_RB_ERROR 1 +#define wxSCI_RB_COMMENTLINE 2 +#define wxSCI_RB_POD 3 +#define wxSCI_RB_NUMBER 4 +#define wxSCI_RB_WORD 5 +#define wxSCI_RB_STRING 6 +#define wxSCI_RB_CHARACTER 7 +#define wxSCI_RB_CLASSNAME 8 +#define wxSCI_RB_DEFNAME 9 +#define wxSCI_RB_OPERATOR 10 +#define wxSCI_RB_IDENTIFIER 11 +#define wxSCI_RB_REGEX 12 +#define wxSCI_RB_GLOBAL 13 +#define wxSCI_RB_SYMBOL 14 +#define wxSCI_RB_MODULE_NAME 15 +#define wxSCI_RB_INSTANCE_VAR 16 +#define wxSCI_RB_CLASS_VAR 17 +#define wxSCI_RB_BACKTICKS 18 +#define wxSCI_RB_DATASECTION 19 +#define wxSCI_RB_HERE_DELIM 20 +#define wxSCI_RB_HERE_Q 21 +#define wxSCI_RB_HERE_QQ 22 +#define wxSCI_RB_HERE_QX 23 +#define wxSCI_RB_STRING_Q 24 +#define wxSCI_RB_STRING_QQ 25 +#define wxSCI_RB_STRING_QX 26 +#define wxSCI_RB_STRING_QR 27 +#define wxSCI_RB_STRING_QW 28 +#define wxSCI_RB_WORD_DEMOTED 29 +#define wxSCI_RB_STDIN 30 +#define wxSCI_RB_STDOUT 31 +#define wxSCI_RB_STDERR 40 +#define wxSCI_RB_UPPER_BOUND 41 + +// Lexical states for SCLEX_VB, SCLEX_VBSCRIPT, SCLEX_POWERBASIC +#define wxSCI_B_DEFAULT 0 +#define wxSCI_B_COMMENT 1 +#define wxSCI_B_NUMBER 2 +#define wxSCI_B_KEYWORD 3 +#define wxSCI_B_STRING 4 +#define wxSCI_B_PREPROCESSOR 5 +#define wxSCI_B_OPERATOR 6 +#define wxSCI_B_IDENTIFIER 7 +#define wxSCI_B_DATE 8 +#define wxSCI_B_STRINGEOL 9 +#define wxSCI_B_KEYWORD2 10 +#define wxSCI_B_KEYWORD3 11 +#define wxSCI_B_KEYWORD4 12 +#define wxSCI_B_CONSTANT 13 +#define wxSCI_B_ASM 14 +#define wxSCI_B_LABEL 15 +#define wxSCI_B_ERROR 16 +#define wxSCI_B_HEXNUMBER 17 +#define wxSCI_B_BINNUMBER 18 + +// Lexical states for SCLEX_PROPERTIES +#define wxSCI_PROPS_DEFAULT 0 +#define wxSCI_PROPS_COMMENT 1 +#define wxSCI_PROPS_SECTION 2 +#define wxSCI_PROPS_ASSIGNMENT 3 +#define wxSCI_PROPS_DEFVAL 4 +#define wxSCI_PROPS_KEY 5 + +// Lexical states for SCLEX_LATEX +#define wxSCI_L_DEFAULT 0 +#define wxSCI_L_COMMAND 1 +#define wxSCI_L_TAG 2 +#define wxSCI_L_MATH 3 +#define wxSCI_L_COMMENT 4 + +// Lexical states for SCLEX_LUA +#define wxSCI_LUA_DEFAULT 0 +#define wxSCI_LUA_COMMENT 1 +#define wxSCI_LUA_COMMENTLINE 2 +#define wxSCI_LUA_COMMENTDOC 3 +#define wxSCI_LUA_NUMBER 4 +#define wxSCI_LUA_WORD 5 +#define wxSCI_LUA_STRING 6 +#define wxSCI_LUA_CHARACTER 7 +#define wxSCI_LUA_LITERALSTRING 8 +#define wxSCI_LUA_PREPROCESSOR 9 +#define wxSCI_LUA_OPERATOR 10 +#define wxSCI_LUA_IDENTIFIER 11 +#define wxSCI_LUA_STRINGEOL 12 +#define wxSCI_LUA_WORD2 13 +#define wxSCI_LUA_WORD3 14 +#define wxSCI_LUA_WORD4 15 +#define wxSCI_LUA_WORD5 16 +#define wxSCI_LUA_WORD6 17 +#define wxSCI_LUA_WORD7 18 +#define wxSCI_LUA_WORD8 19 + +// Lexical states for SCLEX_ERRORLIST +#define wxSCI_ERR_DEFAULT 0 +#define wxSCI_ERR_PYTHON 1 +#define wxSCI_ERR_GCC 2 +#define wxSCI_ERR_MS 3 +#define wxSCI_ERR_CMD 4 +#define wxSCI_ERR_BORLAND 5 +#define wxSCI_ERR_PERL 6 +#define wxSCI_ERR_NET 7 +#define wxSCI_ERR_LUA 8 +#define wxSCI_ERR_CTAG 9 +#define wxSCI_ERR_DIFF_CHANGED 10 +#define wxSCI_ERR_DIFF_ADDITION 11 +#define wxSCI_ERR_DIFF_DELETION 12 +#define wxSCI_ERR_DIFF_MESSAGE 13 +#define wxSCI_ERR_PHP 14 +#define wxSCI_ERR_ELF 15 +#define wxSCI_ERR_IFC 16 +#define wxSCI_ERR_IFORT 17 +#define wxSCI_ERR_ABSF 18 +#define wxSCI_ERR_TIDY 19 +#define wxSCI_ERR_JAVA_STACK 20 + +// Lexical states for SCLEX_BATCH +#define wxSCI_BAT_DEFAULT 0 +#define wxSCI_BAT_COMMENT 1 +#define wxSCI_BAT_WORD 2 +#define wxSCI_BAT_LABEL 3 +#define wxSCI_BAT_HIDE 4 +#define wxSCI_BAT_COMMAND 5 +#define wxSCI_BAT_IDENTIFIER 6 +#define wxSCI_BAT_OPERATOR 7 + +// Lexical states for SCLEX_MAKEFILE +#define wxSCI_MAKE_DEFAULT 0 +#define wxSCI_MAKE_COMMENT 1 +#define wxSCI_MAKE_PREPROCESSOR 2 +#define wxSCI_MAKE_IDENTIFIER 3 +#define wxSCI_MAKE_OPERATOR 4 +#define wxSCI_MAKE_TARGET 5 +#define wxSCI_MAKE_IDEOL 9 + +// Lexical states for SCLEX_DIFF +#define wxSCI_DIFF_DEFAULT 0 +#define wxSCI_DIFF_COMMENT 1 +#define wxSCI_DIFF_COMMAND 2 +#define wxSCI_DIFF_HEADER 3 +#define wxSCI_DIFF_POSITION 4 +#define wxSCI_DIFF_DELETED 5 +#define wxSCI_DIFF_ADDED 6 + +// Lexical states for SCLEX_CONF (Apache Configuration Files Lexer) +#define wxSCI_CONF_DEFAULT 0 +#define wxSCI_CONF_COMMENT 1 +#define wxSCI_CONF_NUMBER 2 +#define wxSCI_CONF_IDENTIFIER 3 +#define wxSCI_CONF_EXTENSION 4 +#define wxSCI_CONF_PARAMETER 5 +#define wxSCI_CONF_STRING 6 +#define wxSCI_CONF_OPERATOR 7 +#define wxSCI_CONF_IP 8 +#define wxSCI_CONF_DIRECTIVE 9 + +// Lexical states for SCLEX_AVE, Avenue +#define wxSCI_AVE_DEFAULT 0 +#define wxSCI_AVE_COMMENT 1 +#define wxSCI_AVE_NUMBER 2 +#define wxSCI_AVE_WORD 3 +#define wxSCI_AVE_STRING 6 +#define wxSCI_AVE_ENUM 7 +#define wxSCI_AVE_STRINGEOL 8 +#define wxSCI_AVE_IDENTIFIER 9 +#define wxSCI_AVE_OPERATOR 10 +#define wxSCI_AVE_WORD1 11 +#define wxSCI_AVE_WORD2 12 +#define wxSCI_AVE_WORD3 13 +#define wxSCI_AVE_WORD4 14 +#define wxSCI_AVE_WORD5 15 +#define wxSCI_AVE_WORD6 16 + +// Lexical states for SCLEX_ADA +#define wxSCI_ADA_DEFAULT 0 +#define wxSCI_ADA_WORD 1 +#define wxSCI_ADA_IDENTIFIER 2 +#define wxSCI_ADA_NUMBER 3 +#define wxSCI_ADA_DELIMITER 4 +#define wxSCI_ADA_CHARACTER 5 +#define wxSCI_ADA_CHARACTEREOL 6 +#define wxSCI_ADA_STRING 7 +#define wxSCI_ADA_STRINGEOL 8 +#define wxSCI_ADA_LABEL 9 +#define wxSCI_ADA_COMMENTLINE 10 +#define wxSCI_ADA_ILLEGAL 11 + +// Lexical states for SCLEX_BAAN +#define wxSCI_BAAN_DEFAULT 0 +#define wxSCI_BAAN_COMMENT 1 +#define wxSCI_BAAN_COMMENTDOC 2 +#define wxSCI_BAAN_NUMBER 3 +#define wxSCI_BAAN_WORD 4 +#define wxSCI_BAAN_STRING 5 +#define wxSCI_BAAN_PREPROCESSOR 6 +#define wxSCI_BAAN_OPERATOR 7 +#define wxSCI_BAAN_IDENTIFIER 8 +#define wxSCI_BAAN_STRINGEOL 9 +#define wxSCI_BAAN_WORD2 10 + +// Lexical states for SCLEX_LISP +#define wxSCI_LISP_DEFAULT 0 +#define wxSCI_LISP_COMMENT 1 +#define wxSCI_LISP_NUMBER 2 +#define wxSCI_LISP_KEYWORD 3 +#define wxSCI_LISP_KEYWORD_KW 4 +#define wxSCI_LISP_SYMBOL 5 +#define wxSCI_LISP_STRING 6 +#define wxSCI_LISP_STRINGEOL 8 +#define wxSCI_LISP_IDENTIFIER 9 +#define wxSCI_LISP_OPERATOR 10 +#define wxSCI_LISP_SPECIAL 11 +#define wxSCI_LISP_MULTI_COMMENT 12 + +// Lexical states for SCLEX_EIFFEL and SCLEX_EIFFELKW +#define wxSCI_EIFFEL_DEFAULT 0 +#define wxSCI_EIFFEL_COMMENTLINE 1 +#define wxSCI_EIFFEL_NUMBER 2 +#define wxSCI_EIFFEL_WORD 3 +#define wxSCI_EIFFEL_STRING 4 +#define wxSCI_EIFFEL_CHARACTER 5 +#define wxSCI_EIFFEL_OPERATOR 6 +#define wxSCI_EIFFEL_IDENTIFIER 7 +#define wxSCI_EIFFEL_STRINGEOL 8 + +// Lexical states for SCLEX_NNCRONTAB (nnCron crontab Lexer) +#define wxSCI_NNCRONTAB_DEFAULT 0 +#define wxSCI_NNCRONTAB_COMMENT 1 +#define wxSCI_NNCRONTAB_TASK 2 +#define wxSCI_NNCRONTAB_SECTION 3 +#define wxSCI_NNCRONTAB_KEYWORD 4 +#define wxSCI_NNCRONTAB_MODIFIER 5 +#define wxSCI_NNCRONTAB_ASTERISK 6 +#define wxSCI_NNCRONTAB_NUMBER 7 +#define wxSCI_NNCRONTAB_STRING 8 +#define wxSCI_NNCRONTAB_ENVIRONMENT 9 +#define wxSCI_NNCRONTAB_IDENTIFIER 10 + +// Lexical states for SCLEX_FORTH (Forth Lexer) +#define wxSCI_FORTH_DEFAULT 0 +#define wxSCI_FORTH_COMMENT 1 +#define wxSCI_FORTH_COMMENT_ML 2 +#define wxSCI_FORTH_IDENTIFIER 3 +#define wxSCI_FORTH_CONTROL 4 +#define wxSCI_FORTH_KEYWORD 5 +#define wxSCI_FORTH_DEFWORD 6 +#define wxSCI_FORTH_PREWORD1 7 +#define wxSCI_FORTH_PREWORD2 8 +#define wxSCI_FORTH_NUMBER 9 +#define wxSCI_FORTH_STRING 10 +#define wxSCI_FORTH_LOCALE 11 + +// Lexical states for SCLEX_MATLAB +#define wxSCI_MATLAB_DEFAULT 0 +#define wxSCI_MATLAB_COMMENT 1 +#define wxSCI_MATLAB_COMMAND 2 +#define wxSCI_MATLAB_NUMBER 3 +#define wxSCI_MATLAB_KEYWORD 4 + +// single quoted string +#define wxSCI_MATLAB_STRING 5 +#define wxSCI_MATLAB_OPERATOR 6 +#define wxSCI_MATLAB_IDENTIFIER 7 +#define wxSCI_MATLAB_DOUBLEQUOTESTRING 8 + +// Lexical states for SCLEX_SCRIPTOL +#define wxSCI_SCRIPTOL_DEFAULT 0 +#define wxSCI_SCRIPTOL_WHITE 1 +#define wxSCI_SCRIPTOL_COMMENTLINE 2 +#define wxSCI_SCRIPTOL_PERSISTENT 3 +#define wxSCI_SCRIPTOL_CSTYLE 4 +#define wxSCI_SCRIPTOL_COMMENTBLOCK 5 +#define wxSCI_SCRIPTOL_NUMBER 6 +#define wxSCI_SCRIPTOL_STRING 7 +#define wxSCI_SCRIPTOL_CHARACTER 8 +#define wxSCI_SCRIPTOL_STRINGEOL 9 +#define wxSCI_SCRIPTOL_KEYWORD 10 +#define wxSCI_SCRIPTOL_OPERATOR 11 +#define wxSCI_SCRIPTOL_IDENTIFIER 12 +#define wxSCI_SCRIPTOL_TRIPLE 13 +#define wxSCI_SCRIPTOL_CLASSNAME 14 +#define wxSCI_SCRIPTOL_PREPROCESSOR 15 + +// Lexical states for SCLEX_ASM +#define wxSCI_ASM_DEFAULT 0 +#define wxSCI_ASM_COMMENT 1 +#define wxSCI_ASM_NUMBER 2 +#define wxSCI_ASM_STRING 3 +#define wxSCI_ASM_OPERATOR 4 +#define wxSCI_ASM_IDENTIFIER 5 +#define wxSCI_ASM_CPUINSTRUCTION 6 +#define wxSCI_ASM_MATHINSTRUCTION 7 +#define wxSCI_ASM_REGISTER 8 +#define wxSCI_ASM_DIRECTIVE 9 +#define wxSCI_ASM_DIRECTIVEOPERAND 10 +#define wxSCI_ASM_COMMENTBLOCK 11 +#define wxSCI_ASM_CHARACTER 12 +#define wxSCI_ASM_STRINGEOL 13 +#define wxSCI_ASM_EXTINSTRUCTION 14 + +// Lexical states for SCLEX_FORTRAN +#define wxSCI_F_DEFAULT 0 +#define wxSCI_F_COMMENT 1 +#define wxSCI_F_NUMBER 2 +#define wxSCI_F_STRING1 3 +#define wxSCI_F_STRING2 4 +#define wxSCI_F_STRINGEOL 5 +#define wxSCI_F_OPERATOR 6 +#define wxSCI_F_IDENTIFIER 7 +#define wxSCI_F_WORD 8 +#define wxSCI_F_WORD2 9 +#define wxSCI_F_WORD3 10 +#define wxSCI_F_PREPROCESSOR 11 +#define wxSCI_F_OPERATOR2 12 +#define wxSCI_F_LABEL 13 +#define wxSCI_F_CONTINUATION 14 + +// Lexical states for SCLEX_CSS +#define wxSCI_CSS_DEFAULT 0 +#define wxSCI_CSS_TAG 1 +#define wxSCI_CSS_CLASS 2 +#define wxSCI_CSS_PSEUDOCLASS 3 +#define wxSCI_CSS_UNKNOWN_PSEUDOCLASS 4 +#define wxSCI_CSS_OPERATOR 5 +#define wxSCI_CSS_IDENTIFIER 6 +#define wxSCI_CSS_UNKNOWN_IDENTIFIER 7 +#define wxSCI_CSS_VALUE 8 +#define wxSCI_CSS_COMMENT 9 +#define wxSCI_CSS_ID 10 +#define wxSCI_CSS_IMPORTANT 11 +#define wxSCI_CSS_DIRECTIVE 12 +#define wxSCI_CSS_DOUBLESTRING 13 +#define wxSCI_CSS_SINGLESTRING 14 +#define wxSCI_CSS_IDENTIFIER2 15 +#define wxSCI_CSS_ATTRIBUTE 16 + +// Lexical states for SCLEX_POV +#define wxSCI_POV_DEFAULT 0 +#define wxSCI_POV_COMMENT 1 +#define wxSCI_POV_COMMENTLINE 2 +#define wxSCI_POV_NUMBER 3 +#define wxSCI_POV_OPERATOR 4 +#define wxSCI_POV_IDENTIFIER 5 +#define wxSCI_POV_STRING 6 +#define wxSCI_POV_STRINGEOL 7 +#define wxSCI_POV_DIRECTIVE 8 +#define wxSCI_POV_BADDIRECTIVE 9 +#define wxSCI_POV_WORD2 10 +#define wxSCI_POV_WORD3 11 +#define wxSCI_POV_WORD4 12 +#define wxSCI_POV_WORD5 13 +#define wxSCI_POV_WORD6 14 +#define wxSCI_POV_WORD7 15 +#define wxSCI_POV_WORD8 16 + +// Lexical states for SCLEX_LOUT +#define wxSCI_LOUT_DEFAULT 0 +#define wxSCI_LOUT_COMMENT 1 +#define wxSCI_LOUT_NUMBER 2 +#define wxSCI_LOUT_WORD 3 +#define wxSCI_LOUT_WORD2 4 +#define wxSCI_LOUT_WORD3 5 +#define wxSCI_LOUT_WORD4 6 +#define wxSCI_LOUT_STRING 7 +#define wxSCI_LOUT_OPERATOR 8 +#define wxSCI_LOUT_IDENTIFIER 9 +#define wxSCI_LOUT_STRINGEOL 10 + +// Lexical states for SCLEX_ESCRIPT +#define wxSCI_ESCRIPT_DEFAULT 0 +#define wxSCI_ESCRIPT_COMMENT 1 +#define wxSCI_ESCRIPT_COMMENTLINE 2 +#define wxSCI_ESCRIPT_COMMENTDOC 3 +#define wxSCI_ESCRIPT_NUMBER 4 +#define wxSCI_ESCRIPT_WORD 5 +#define wxSCI_ESCRIPT_STRING 6 +#define wxSCI_ESCRIPT_OPERATOR 7 +#define wxSCI_ESCRIPT_IDENTIFIER 8 +#define wxSCI_ESCRIPT_BRACE 9 +#define wxSCI_ESCRIPT_WORD2 10 +#define wxSCI_ESCRIPT_WORD3 11 + +// Lexical states for SCLEX_PS +#define wxSCI_PS_DEFAULT 0 +#define wxSCI_PS_COMMENT 1 +#define wxSCI_PS_DSC_COMMENT 2 +#define wxSCI_PS_DSC_VALUE 3 +#define wxSCI_PS_NUMBER 4 +#define wxSCI_PS_NAME 5 +#define wxSCI_PS_KEYWORD 6 +#define wxSCI_PS_LITERAL 7 +#define wxSCI_PS_IMMEVAL 8 +#define wxSCI_PS_PAREN_ARRAY 9 +#define wxSCI_PS_PAREN_DICT 10 +#define wxSCI_PS_PAREN_PROC 11 +#define wxSCI_PS_TEXT 12 +#define wxSCI_PS_HEXSTRING 13 +#define wxSCI_PS_BASE85STRING 14 +#define wxSCI_PS_BADSTRINGCHAR 15 + +// Lexical states for SCLEX_NSIS +#define wxSCI_NSIS_DEFAULT 0 +#define wxSCI_NSIS_COMMENT 1 +#define wxSCI_NSIS_STRINGDQ 2 +#define wxSCI_NSIS_STRINGLQ 3 +#define wxSCI_NSIS_STRINGRQ 4 +#define wxSCI_NSIS_FUNCTION 5 +#define wxSCI_NSIS_VARIABLE 6 +#define wxSCI_NSIS_LABEL 7 +#define wxSCI_NSIS_USERDEFINED 8 +#define wxSCI_NSIS_SECTIONDEF 9 +#define wxSCI_NSIS_SUBSECTIONDEF 10 +#define wxSCI_NSIS_IFDEFINEDEF 11 +#define wxSCI_NSIS_MACRODEF 12 +#define wxSCI_NSIS_STRINGVAR 13 +#define wxSCI_NSIS_NUMBER 14 +#define wxSCI_NSIS_SECTIONGROUP 15 +#define wxSCI_NSIS_PAGEEX 16 +#define wxSCI_NSIS_FUNCTIONDEF 17 +#define wxSCI_NSIS_COMMENTBOX 18 + +// Lexical states for SCLEX_MMIXAL +#define wxSCI_MMIXAL_LEADWS 0 +#define wxSCI_MMIXAL_COMMENT 1 +#define wxSCI_MMIXAL_LABEL 2 +#define wxSCI_MMIXAL_OPCODE 3 +#define wxSCI_MMIXAL_OPCODE_PRE 4 +#define wxSCI_MMIXAL_OPCODE_VALID 5 +#define wxSCI_MMIXAL_OPCODE_UNKNOWN 6 +#define wxSCI_MMIXAL_OPCODE_POST 7 +#define wxSCI_MMIXAL_OPERANDS 8 +#define wxSCI_MMIXAL_NUMBER 9 +#define wxSCI_MMIXAL_REF 10 +#define wxSCI_MMIXAL_CHAR 11 +#define wxSCI_MMIXAL_STRING 12 +#define wxSCI_MMIXAL_REGISTER 13 +#define wxSCI_MMIXAL_HEX 14 +#define wxSCI_MMIXAL_OPERATOR 15 +#define wxSCI_MMIXAL_SYMBOL 16 +#define wxSCI_MMIXAL_INCLUDE 17 + +// Lexical states for SCLEX_CLW +#define wxSCI_CLW_DEFAULT 0 +#define wxSCI_CLW_LABEL 1 +#define wxSCI_CLW_COMMENT 2 +#define wxSCI_CLW_STRING 3 +#define wxSCI_CLW_USER_IDENTIFIER 4 +#define wxSCI_CLW_INTEGER_CONSTANT 5 +#define wxSCI_CLW_REAL_CONSTANT 6 +#define wxSCI_CLW_PICTURE_STRING 7 +#define wxSCI_CLW_KEYWORD 8 +#define wxSCI_CLW_COMPILER_DIRECTIVE 9 +#define wxSCI_CLW_RUNTIME_EXPRESSIONS 10 +#define wxSCI_CLW_BUILTIN_PROCEDURES_FUNCTION 11 +#define wxSCI_CLW_STRUCTURE_DATA_TYPE 12 +#define wxSCI_CLW_ATTRIBUTE 13 +#define wxSCI_CLW_STANDARD_EQUATE 14 +#define wxSCI_CLW_ERROR 15 +#define wxSCI_CLW_DEPRECATED 16 + +// Lexical states for SCLEX_LOT +#define wxSCI_LOT_DEFAULT 0 +#define wxSCI_LOT_HEADER 1 +#define wxSCI_LOT_BREAK 2 +#define wxSCI_LOT_SET 3 +#define wxSCI_LOT_PASS 4 +#define wxSCI_LOT_FAIL 5 +#define wxSCI_LOT_ABORT 6 + +// Lexical states for SCLEX_YAML +#define wxSCI_YAML_DEFAULT 0 +#define wxSCI_YAML_COMMENT 1 +#define wxSCI_YAML_IDENTIFIER 2 +#define wxSCI_YAML_KEYWORD 3 +#define wxSCI_YAML_NUMBER 4 +#define wxSCI_YAML_REFERENCE 5 +#define wxSCI_YAML_DOCUMENT 6 +#define wxSCI_YAML_TEXT 7 +#define wxSCI_YAML_ERROR 8 + +// Lexical states for SCLEX_TEX +#define wxSCI_TEX_DEFAULT 0 +#define wxSCI_TEX_SPECIAL 1 +#define wxSCI_TEX_GROUP 2 +#define wxSCI_TEX_SYMBOL 3 +#define wxSCI_TEX_COMMAND 4 +#define wxSCI_TEX_TEXT 5 +#define wxSCI_METAPOST_DEFAULT 0 +#define wxSCI_METAPOST_SPECIAL 1 +#define wxSCI_METAPOST_GROUP 2 +#define wxSCI_METAPOST_SYMBOL 3 +#define wxSCI_METAPOST_COMMAND 4 +#define wxSCI_METAPOST_TEXT 5 +#define wxSCI_METAPOST_EXTRA 6 + +// Lexical states for SCLEX_ERLANG +#define wxSCI_ERLANG_DEFAULT 0 +#define wxSCI_ERLANG_COMMENT 1 +#define wxSCI_ERLANG_VARIABLE 2 +#define wxSCI_ERLANG_NUMBER 3 +#define wxSCI_ERLANG_KEYWORD 4 +#define wxSCI_ERLANG_STRING 5 +#define wxSCI_ERLANG_OPERATOR 6 +#define wxSCI_ERLANG_ATOM 7 +#define wxSCI_ERLANG_FUNCTION_NAME 8 +#define wxSCI_ERLANG_CHARACTER 9 +#define wxSCI_ERLANG_MACRO 10 +#define wxSCI_ERLANG_RECORD 11 +#define wxSCI_ERLANG_SEPARATOR 12 +#define wxSCI_ERLANG_NODE_NAME 13 +#define wxSCI_ERLANG_UNKNOWN 31 + +// Lexical states for SCLEX_OCTAVE are identical to MatLab +// Lexical states for SCLEX_MSSQL +#define wxSCI_MSSQL_DEFAULT 0 +#define wxSCI_MSSQL_COMMENT 1 +#define wxSCI_MSSQL_LINE_COMMENT 2 +#define wxSCI_MSSQL_NUMBER 3 +#define wxSCI_MSSQL_STRING 4 +#define wxSCI_MSSQL_OPERATOR 5 +#define wxSCI_MSSQL_IDENTIFIER 6 +#define wxSCI_MSSQL_VARIABLE 7 +#define wxSCI_MSSQL_COLUMN_NAME 8 +#define wxSCI_MSSQL_STATEMENT 9 +#define wxSCI_MSSQL_DATATYPE 10 +#define wxSCI_MSSQL_SYSTABLE 11 +#define wxSCI_MSSQL_GLOBAL_VARIABLE 12 +#define wxSCI_MSSQL_FUNCTION 13 +#define wxSCI_MSSQL_STORED_PROCEDURE 14 +#define wxSCI_MSSQL_DEFAULT_PREF_DATATYPE 15 +#define wxSCI_MSSQL_COLUMN_NAME_2 16 + +// Lexical states for SCLEX_VERILOG +#define wxSCI_V_DEFAULT 0 +#define wxSCI_V_COMMENT 1 +#define wxSCI_V_COMMENTLINE 2 +#define wxSCI_V_COMMENTLINEBANG 3 +#define wxSCI_V_NUMBER 4 +#define wxSCI_V_WORD 5 +#define wxSCI_V_STRING 6 +#define wxSCI_V_WORD2 7 +#define wxSCI_V_WORD3 8 +#define wxSCI_V_PREPROCESSOR 9 +#define wxSCI_V_OPERATOR 10 +#define wxSCI_V_IDENTIFIER 11 +#define wxSCI_V_STRINGEOL 12 +#define wxSCI_V_USER 19 + +// Lexical states for SCLEX_KIX +#define wxSCI_KIX_DEFAULT 0 +#define wxSCI_KIX_COMMENT 1 +#define wxSCI_KIX_STRING1 2 +#define wxSCI_KIX_STRING2 3 +#define wxSCI_KIX_NUMBER 4 +#define wxSCI_KIX_VAR 5 +#define wxSCI_KIX_MACRO 6 +#define wxSCI_KIX_KEYWORD 7 +#define wxSCI_KIX_FUNCTIONS 8 +#define wxSCI_KIX_OPERATOR 9 +#define wxSCI_KIX_IDENTIFIER 31 + +// Lexical states for SCLEX_GUI4CLI +#define wxSCI_GC_DEFAULT 0 +#define wxSCI_GC_COMMENTLINE 1 +#define wxSCI_GC_COMMENTBLOCK 2 +#define wxSCI_GC_GLOBAL 3 +#define wxSCI_GC_EVENT 4 +#define wxSCI_GC_ATTRIBUTE 5 +#define wxSCI_GC_CONTROL 6 +#define wxSCI_GC_COMMAND 7 +#define wxSCI_GC_STRING 8 +#define wxSCI_GC_OPERATOR 9 + +// Lexical states for SCLEX_SPECMAN +#define wxSCI_SN_DEFAULT 0 +#define wxSCI_SN_CODE 1 +#define wxSCI_SN_COMMENTLINE 2 +#define wxSCI_SN_COMMENTLINEBANG 3 +#define wxSCI_SN_NUMBER 4 +#define wxSCI_SN_WORD 5 +#define wxSCI_SN_STRING 6 +#define wxSCI_SN_WORD2 7 +#define wxSCI_SN_WORD3 8 +#define wxSCI_SN_PREPROCESSOR 9 +#define wxSCI_SN_OPERATOR 10 +#define wxSCI_SN_IDENTIFIER 11 +#define wxSCI_SN_STRINGEOL 12 +#define wxSCI_SN_REGEXTAG 13 +#define wxSCI_SN_SIGNAL 14 +#define wxSCI_SN_USER 19 + +// Lexical states for SCLEX_AU3 +#define wxSCI_AU3_DEFAULT 0 +#define wxSCI_AU3_COMMENT 1 +#define wxSCI_AU3_COMMENTBLOCK 2 +#define wxSCI_AU3_NUMBER 3 +#define wxSCI_AU3_FUNCTION 4 +#define wxSCI_AU3_KEYWORD 5 +#define wxSCI_AU3_MACRO 6 +#define wxSCI_AU3_STRING 7 +#define wxSCI_AU3_OPERATOR 8 +#define wxSCI_AU3_VARIABLE 9 +#define wxSCI_AU3_SENT 10 +#define wxSCI_AU3_PREPROCESSOR 11 +#define wxSCI_AU3_SPECIAL 12 +#define wxSCI_AU3_EXPAND 13 +#define wxSCI_AU3_COMOBJ 14 +#define wxSCI_AU3_UDF 15 + +// Lexical states for SCLEX_APDL +#define wxSCI_APDL_DEFAULT 0 +#define wxSCI_APDL_COMMENT 1 +#define wxSCI_APDL_COMMENTBLOCK 2 +#define wxSCI_APDL_NUMBER 3 +#define wxSCI_APDL_STRING 4 +#define wxSCI_APDL_OPERATOR 5 +#define wxSCI_APDL_WORD 6 +#define wxSCI_APDL_PROCESSOR 7 +#define wxSCI_APDL_COMMAND 8 +#define wxSCI_APDL_SLASHCOMMAND 9 +#define wxSCI_APDL_STARCOMMAND 10 +#define wxSCI_APDL_ARGUMENT 11 +#define wxSCI_APDL_FUNCTION 12 + +// Lexical states for SCLEX_BASH +#define wxSCI_SH_DEFAULT 0 +#define wxSCI_SH_ERROR 1 +#define wxSCI_SH_COMMENTLINE 2 +#define wxSCI_SH_NUMBER 3 +#define wxSCI_SH_WORD 4 +#define wxSCI_SH_STRING 5 +#define wxSCI_SH_CHARACTER 6 +#define wxSCI_SH_OPERATOR 7 +#define wxSCI_SH_IDENTIFIER 8 +#define wxSCI_SH_SCALAR 9 +#define wxSCI_SH_PARAM 10 +#define wxSCI_SH_BACKTICKS 11 +#define wxSCI_SH_HERE_DELIM 12 +#define wxSCI_SH_HERE_Q 13 + +// Lexical states for SCLEX_ASN1 +#define wxSCI_ASN1_DEFAULT 0 +#define wxSCI_ASN1_COMMENT 1 +#define wxSCI_ASN1_IDENTIFIER 2 +#define wxSCI_ASN1_STRING 3 +#define wxSCI_ASN1_OID 4 +#define wxSCI_ASN1_SCALAR 5 +#define wxSCI_ASN1_KEYWORD 6 +#define wxSCI_ASN1_ATTRIBUTE 7 +#define wxSCI_ASN1_DESCRIPTOR 8 +#define wxSCI_ASN1_TYPE 9 +#define wxSCI_ASN1_OPERATOR 10 + +// Lexical states for SCLEX_VHDL +#define wxSCI_VHDL_DEFAULT 0 +#define wxSCI_VHDL_COMMENT 1 +#define wxSCI_VHDL_COMMENTLINEBANG 2 +#define wxSCI_VHDL_NUMBER 3 +#define wxSCI_VHDL_STRING 4 +#define wxSCI_VHDL_OPERATOR 5 +#define wxSCI_VHDL_IDENTIFIER 6 +#define wxSCI_VHDL_STRINGEOL 7 +#define wxSCI_VHDL_KEYWORD 8 +#define wxSCI_VHDL_STDOPERATOR 9 +#define wxSCI_VHDL_ATTRIBUTE 10 +#define wxSCI_VHDL_STDFUNCTION 11 +#define wxSCI_VHDL_STDPACKAGE 12 +#define wxSCI_VHDL_STDTYPE 13 +#define wxSCI_VHDL_USERWORD 14 + +// Lexical states for SCLEX_CAML +#define wxSCI_CAML_DEFAULT 0 +#define wxSCI_CAML_IDENTIFIER 1 +#define wxSCI_CAML_TAGNAME 2 +#define wxSCI_CAML_KEYWORD 3 +#define wxSCI_CAML_KEYWORD2 4 +#define wxSCI_CAML_KEYWORD3 5 +#define wxSCI_CAML_LINENUM 6 +#define wxSCI_CAML_OPERATOR 7 +#define wxSCI_CAML_NUMBER 8 +#define wxSCI_CAML_CHAR 9 +#define wxSCI_CAML_STRING 11 +#define wxSCI_CAML_COMMENT 12 +#define wxSCI_CAML_COMMENT1 13 +#define wxSCI_CAML_COMMENT2 14 +#define wxSCI_CAML_COMMENT3 15 + +// Lexical states for SCLEX_HA +#define wxSCI_HA_DEFAULT 0 +#define wxSCI_HA_IDENTIFIER 1 +#define wxSCI_HA_KEYWORD 2 +#define wxSCI_HA_NUMBER 3 +#define wxSCI_HA_STRING 4 +#define wxSCI_HA_CHARACTER 5 +#define wxSCI_HA_CLASS 6 +#define wxSCI_HA_MODULE 7 +#define wxSCI_HA_CAPITAL 8 +#define wxSCI_HA_DATA 9 +#define wxSCI_HA_IMPORT 10 +#define wxSCI_HA_OPERATOR 11 +#define wxSCI_HA_INSTANCE 12 +#define wxSCI_HA_COMMENTLINE 13 +#define wxSCI_HA_COMMENTBLOCK 14 +#define wxSCI_HA_COMMENTBLOCK2 15 +#define wxSCI_HA_COMMENTBLOCK3 16 + +// Lexical states for SCLEX_T3 +#define wxSCI_T3_DEFAULT 0 +#define wxSCI_T3_X_DEFAULT 1 +#define wxSCI_T3_PREPROCESSOR 2 +#define wxSCI_T3_BLOCK_COMMENT 3 +#define wxSCI_T3_LINE_COMMENT 4 +#define wxSCI_T3_OPERATOR 5 +#define wxSCI_T3_KEYWORD 6 +#define wxSCI_T3_NUMBER 7 +#define wxSCI_T3_IDENTIFIER 8 +#define wxSCI_T3_S_STRING 9 +#define wxSCI_T3_D_STRING 10 +#define wxSCI_T3_X_STRING 11 +#define wxSCI_T3_LIB_DIRECTIVE 12 +#define wxSCI_T3_MSG_PARAM 13 +#define wxSCI_T3_HTML_TAG 14 +#define wxSCI_T3_HTML_DEFAULT 15 +#define wxSCI_T3_HTML_STRING 16 +#define wxSCI_T3_USER1 17 +#define wxSCI_T3_USER2 18 +#define wxSCI_T3_USER3 19 + +// Lexical states for SCLEX_REBOL +#define wxSCI_REBOL_DEFAULT 0 +#define wxSCI_REBOL_COMMENTLINE 1 +#define wxSCI_REBOL_COMMENTBLOCK 2 +#define wxSCI_REBOL_PREFACE 3 +#define wxSCI_REBOL_OPERATOR 4 +#define wxSCI_REBOL_CHARACTER 5 +#define wxSCI_REBOL_QUOTEDSTRING 6 +#define wxSCI_REBOL_BRACEDSTRING 7 +#define wxSCI_REBOL_NUMBER 8 +#define wxSCI_REBOL_PAIR 9 +#define wxSCI_REBOL_TUPLE 10 +#define wxSCI_REBOL_BINARY 11 +#define wxSCI_REBOL_MONEY 12 +#define wxSCI_REBOL_ISSUE 13 +#define wxSCI_REBOL_TAG 14 +#define wxSCI_REBOL_FILE 15 +#define wxSCI_REBOL_EMAIL 16 +#define wxSCI_REBOL_URL 17 +#define wxSCI_REBOL_DATE 18 +#define wxSCI_REBOL_TIME 19 +#define wxSCI_REBOL_IDENTIFIER 20 +#define wxSCI_REBOL_WORD 21 +#define wxSCI_REBOL_WORD2 22 +#define wxSCI_REBOL_WORD3 23 +#define wxSCI_REBOL_WORD4 24 +#define wxSCI_REBOL_WORD5 25 +#define wxSCI_REBOL_WORD6 26 +#define wxSCI_REBOL_WORD7 27 +#define wxSCI_REBOL_WORD8 28 + +// Lexical states for SCLEX_SQL +#define wxSCI_SQL_DEFAULT 0 +#define wxSCI_SQL_COMMENT 1 +#define wxSCI_SQL_COMMENTLINE 2 +#define wxSCI_SQL_COMMENTDOC 3 +#define wxSCI_SQL_NUMBER 4 +#define wxSCI_SQL_WORD 5 +#define wxSCI_SQL_STRING 6 +#define wxSCI_SQL_CHARACTER 7 +#define wxSCI_SQL_SQLPLUS 8 +#define wxSCI_SQL_SQLPLUS_PROMPT 9 +#define wxSCI_SQL_OPERATOR 10 +#define wxSCI_SQL_IDENTIFIER 11 +#define wxSCI_SQL_SQLPLUS_COMMENT 13 +#define wxSCI_SQL_COMMENTLINEDOC 15 +#define wxSCI_SQL_WORD2 16 +#define wxSCI_SQL_COMMENTDOCKEYWORD 17 +#define wxSCI_SQL_COMMENTDOCKEYWORDERROR 18 +#define wxSCI_SQL_USER1 19 +#define wxSCI_SQL_USER2 20 +#define wxSCI_SQL_USER3 21 +#define wxSCI_SQL_USER4 22 +#define wxSCI_SQL_QUOTEDIDENTIFIER 23 + +// Lexical states for SCLEX_ST +#define wxSCI_ST_DEFAULT 0 +#define wxSCI_ST_STRING 1 +#define wxSCI_ST_NUMBER 2 +#define wxSCI_ST_COMMENT 3 +#define wxSCI_ST_SYMBOL 4 +#define wxSCI_ST_BINARY 5 +#define wxSCI_ST_BOOL 6 +#define wxSCI_ST_SELF 7 +#define wxSCI_ST_SUPER 8 +#define wxSCI_ST_NIL 9 +#define wxSCI_ST_GLOBAL 10 +#define wxSCI_ST_RETURN 11 +#define wxSCI_ST_SPECIAL 12 +#define wxSCI_ST_KWSEND 13 +#define wxSCI_ST_ASSIGN 14 +#define wxSCI_ST_CHARACTER 15 +#define wxSCI_ST_SPEC_SEL 16 + +// Lexical states for SCLEX_FS +#define wxSCI_FS_DEFAULT 0 +#define wxSCI_FS_COMMENT 1 +#define wxSCI_FS_COMMENTLINE 2 +#define wxSCI_FS_COMMENTDOC 3 +#define wxSCI_FS_COMMENTLINEDOC 4 +#define wxSCI_FS_COMMENTDOCKEYWORD 5 +#define wxSCI_FS_COMMENTDOCKEYWORDERROR 6 +#define wxSCI_FS_KEYWORD 7 +#define wxSCI_FS_KEYWORD2 8 +#define wxSCI_FS_KEYWORD3 9 +#define wxSCI_FS_KEYWORD4 10 +#define wxSCI_FS_NUMBER 11 +#define wxSCI_FS_STRING 12 +#define wxSCI_FS_PREPROCESSOR 13 +#define wxSCI_FS_OPERATOR 14 +#define wxSCI_FS_IDENTIFIER 15 +#define wxSCI_FS_DATE 16 +#define wxSCI_FS_STRINGEOL 17 +#define wxSCI_FS_CONSTANT 18 +#define wxSCI_FS_WORDOPERATOR 19 +#define wxSCI_FS_DISABLEDCODE 20 +#define wxSCI_FS_DEFAULT_C 21 +#define wxSCI_FS_COMMENTDOC_C 22 +#define wxSCI_FS_COMMENTLINEDOC_C 23 +#define wxSCI_FS_KEYWORD_C 24 +#define wxSCI_FS_KEYWORD2_C 25 +#define wxSCI_FS_NUMBER_C 26 +#define wxSCI_FS_STRING_C 27 +#define wxSCI_FS_PREPROCESSOR_C 28 +#define wxSCI_FS_OPERATOR_C 29 +#define wxSCI_FS_IDENTIFIER_C 30 +#define wxSCI_FS_STRINGEOL_C 31 + +// Lexical states for SCLEX_CSOUND +#define wxSCI_CSOUND_DEFAULT 0 +#define wxSCI_CSOUND_COMMENT 1 +#define wxSCI_CSOUND_NUMBER 2 +#define wxSCI_CSOUND_OPERATOR 3 +#define wxSCI_CSOUND_INSTR 4 +#define wxSCI_CSOUND_IDENTIFIER 5 +#define wxSCI_CSOUND_OPCODE 6 +#define wxSCI_CSOUND_HEADERSTMT 7 +#define wxSCI_CSOUND_USERKEYWORD 8 +#define wxSCI_CSOUND_COMMENTBLOCK 9 +#define wxSCI_CSOUND_PARAM 10 +#define wxSCI_CSOUND_ARATE_VAR 11 +#define wxSCI_CSOUND_KRATE_VAR 12 +#define wxSCI_CSOUND_IRATE_VAR 13 +#define wxSCI_CSOUND_GLOBAL_VAR 14 +#define wxSCI_CSOUND_STRINGEOL 15 + +// Lexical states for SCLEX_INNOSETUP +#define wxSCI_INNO_DEFAULT 0 +#define wxSCI_INNO_COMMENT 1 +#define wxSCI_INNO_KEYWORD 2 +#define wxSCI_INNO_PARAMETER 3 +#define wxSCI_INNO_SECTION 4 +#define wxSCI_INNO_PREPROC 5 +#define wxSCI_INNO_PREPROC_INLINE 6 +#define wxSCI_INNO_COMMENT_PASCAL 7 +#define wxSCI_INNO_KEYWORD_PASCAL 8 +#define wxSCI_INNO_KEYWORD_USER 9 +#define wxSCI_INNO_STRING_DOUBLE 10 +#define wxSCI_INNO_STRING_SINGLE 11 +#define wxSCI_INNO_IDENTIFIER 12 + +// Lexical states for SCLEX_OPAL +#define wxSCI_OPAL_SPACE 0 +#define wxSCI_OPAL_COMMENT_BLOCK 1 +#define wxSCI_OPAL_COMMENT_LINE 2 +#define wxSCI_OPAL_INTEGER 3 +#define wxSCI_OPAL_KEYWORD 4 +#define wxSCI_OPAL_SORT 5 +#define wxSCI_OPAL_STRING 6 +#define wxSCI_OPAL_PAR 7 +#define wxSCI_OPAL_BOOL_CONST 8 +#define wxSCI_OPAL_DEFAULT 32 + +// Lexical states for SCLEX_SPICE +#define wxSCI_SPICE_DEFAULT 0 +#define wxSCI_SPICE_IDENTIFIER 1 +#define wxSCI_SPICE_KEYWORD 2 +#define wxSCI_SPICE_KEYWORD2 3 +#define wxSCI_SPICE_KEYWORD3 4 +#define wxSCI_SPICE_NUMBER 5 +#define wxSCI_SPICE_DELIMITER 6 +#define wxSCI_SPICE_VALUE 7 +#define wxSCI_SPICE_COMMENTLINE 8 + + +//----------------------------------------- +// Commands that can be bound to keystrokes + + +// Redoes the next action on the undo history. +#define wxSCI_CMD_REDO 2011 + +// Select all the text in the document. +#define wxSCI_CMD_SELECTALL 2013 + +// Undo one action in the undo history. +#define wxSCI_CMD_UNDO 2176 + +// Cut the selection to the clipboard. +#define wxSCI_CMD_CUT 2177 + +// Copy the selection to the clipboard. +#define wxSCI_CMD_COPY 2178 + +// Paste the contents of the clipboard into the document replacing the selection. +#define wxSCI_CMD_PASTE 2179 + +// Clear the selection. +#define wxSCI_CMD_CLEAR 2180 + +// Move caret down one line. +#define wxSCI_CMD_LINEDOWN 2300 + +// Move caret down one line extending selection to new caret position. +#define wxSCI_CMD_LINEDOWNEXTEND 2301 + +// Move caret up one line. +#define wxSCI_CMD_LINEUP 2302 + +// Move caret up one line extending selection to new caret position. +#define wxSCI_CMD_LINEUPEXTEND 2303 + +// Move caret left one character. +#define wxSCI_CMD_CHARLEFT 2304 + +// Move caret left one character extending selection to new caret position. +#define wxSCI_CMD_CHARLEFTEXTEND 2305 + +// Move caret right one character. +#define wxSCI_CMD_CHARRIGHT 2306 + +// Move caret right one character extending selection to new caret position. +#define wxSCI_CMD_CHARRIGHTEXTEND 2307 + +// Move caret left one word. +#define wxSCI_CMD_WORDLEFT 2308 + +// Move caret left one word extending selection to new caret position. +#define wxSCI_CMD_WORDLEFTEXTEND 2309 + +// Move caret right one word. +#define wxSCI_CMD_WORDRIGHT 2310 + +// Move caret right one word extending selection to new caret position. +#define wxSCI_CMD_WORDRIGHTEXTEND 2311 + +// Move caret to first position on line. +#define wxSCI_CMD_HOME 2312 + +// Move caret to first position on line extending selection to new caret position. +#define wxSCI_CMD_HOMEEXTEND 2313 + +// Move caret to last position on line. +#define wxSCI_CMD_LINEEND 2314 + +// Move caret to last position on line extending selection to new caret position. +#define wxSCI_CMD_LINEENDEXTEND 2315 + +// Move caret to first position in document. +#define wxSCI_CMD_DOCUMENTSTART 2316 + +// Move caret to first position in document extending selection to new caret position. +#define wxSCI_CMD_DOCUMENTSTARTEXTEND 2317 + +// Move caret to last position in document. +#define wxSCI_CMD_DOCUMENTEND 2318 + +// Move caret to last position in document extending selection to new caret position. +#define wxSCI_CMD_DOCUMENTENDEXTEND 2319 + +// Move caret one page up. +#define wxSCI_CMD_PAGEUP 2320 + +// Move caret one page up extending selection to new caret position. +#define wxSCI_CMD_PAGEUPEXTEND 2321 + +// Move caret one page down. +#define wxSCI_CMD_PAGEDOWN 2322 + +// Move caret one page down extending selection to new caret position. +#define wxSCI_CMD_PAGEDOWNEXTEND 2323 + +// Switch from insert to overtype mode or the reverse. +#define wxSCI_CMD_EDITTOGGLEOVERTYPE 2324 + +// Cancel any modes such as call tip or auto-completion list display. +#define wxSCI_CMD_CANCEL 2325 + +// Delete the selection or if no selection, the character before the caret. +#define wxSCI_CMD_DELETEBACK 2326 + +// If selection is empty or all on one line replace the selection with a tab character. +// If more than one line selected, indent the lines. +#define wxSCI_CMD_TAB 2327 + +// Dedent the selected lines. +#define wxSCI_CMD_BACKTAB 2328 + +// Insert a new line, may use a CRLF, CR or LF depending on EOL mode. +#define wxSCI_CMD_NEWLINE 2329 + +// Insert a Form Feed character. +#define wxSCI_CMD_FORMFEED 2330 + +// Move caret to before first visible character on line. +// If already there move to first character on line. +#define wxSCI_CMD_VCHOME 2331 + +// Like VCHome but extending selection to new caret position. +#define wxSCI_CMD_VCHOMEEXTEND 2332 + +// Magnify the displayed text by increasing the sizes by 1 point. +#define wxSCI_CMD_ZOOMIN 2333 + +// Make the displayed text smaller by decreasing the sizes by 1 point. +#define wxSCI_CMD_ZOOMOUT 2334 + +// Delete the word to the left of the caret. +#define wxSCI_CMD_DELWORDLEFT 2335 + +// Delete the word to the right of the caret. +#define wxSCI_CMD_DELWORDRIGHT 2336 + +// Cut the line containing the caret. +#define wxSCI_CMD_LINECUT 2337 + +// Delete the line containing the caret. +#define wxSCI_CMD_LINEDELETE 2338 + +// Switch the current line with the previous. +#define wxSCI_CMD_LINETRANSPOSE 2339 + +// Duplicate the current line. +#define wxSCI_CMD_LINEDUPLICATE 2404 + +// Transform the selection to lower case. +#define wxSCI_CMD_LOWERCASE 2340 + +// Transform the selection to upper case. +#define wxSCI_CMD_UPPERCASE 2341 + +// Scroll the document down, keeping the caret visible. +#define wxSCI_CMD_LINESCROLLDOWN 2342 + +// Scroll the document up, keeping the caret visible. +#define wxSCI_CMD_LINESCROLLUP 2343 + +// Delete the selection or if no selection, the character before the caret. +// Will not delete the character before at the start of a line. +#define wxSCI_CMD_DELETEBACKNOTLINE 2344 + +// Move caret to first position on display line. +#define wxSCI_CMD_HOMEDISPLAY 2345 + +// Move caret to first position on display line extending selection to +// new caret position. +#define wxSCI_CMD_HOMEDISPLAYEXTEND 2346 + +// Move caret to last position on display line. +#define wxSCI_CMD_LINEENDDISPLAY 2347 + +// Move caret to last position on display line extending selection to new +// caret position. +#define wxSCI_CMD_LINEENDDISPLAYEXTEND 2348 + +// These are like their namesakes Home(Extend)?, LineEnd(Extend)?, VCHome(Extend)? +// except they behave differently when word-wrap is enabled: +// They go first to the start / end of the display line, like (Home|LineEnd)Display +// The difference is that, the cursor is already at the point, it goes on to the start +// or end of the document line, as appropriate for (Home|LineEnd|VCHome)(Extend)?. +#define wxSCI_CMD_HOMEWRAP 2349 +#define wxSCI_CMD_HOMEWRAPEXTEND 2450 +#define wxSCI_CMD_LINEENDWRAP 2451 +#define wxSCI_CMD_LINEENDWRAPEXTEND 2452 +#define wxSCI_CMD_VCHOMEWRAP 2453 +#define wxSCI_CMD_VCHOMEWRAPEXTEND 2454 + +// Copy the line containing the caret. +#define wxSCI_CMD_LINECOPY 2455 + +// Move to the previous change in capitalisation. +#define wxSCI_CMD_WORDPARTLEFT 2390 + +// Move to the previous change in capitalisation extending selection +// to new caret position. +#define wxSCI_CMD_WORDPARTLEFTEXTEND 2391 + +// Move to the change next in capitalisation. +#define wxSCI_CMD_WORDPARTRIGHT 2392 + +// Move to the next change in capitalisation extending selection +// to new caret position. +#define wxSCI_CMD_WORDPARTRIGHTEXTEND 2393 + +// Delete back from the current position to the start of the line. +#define wxSCI_CMD_DELLINELEFT 2395 + +// Delete forwards from the current position to the end of the line. +#define wxSCI_CMD_DELLINERIGHT 2396 + +// Move caret between paragraphs (delimited by empty lines). +#define wxSCI_CMD_PARADOWN 2413 +#define wxSCI_CMD_PARADOWNEXTEND 2414 +#define wxSCI_CMD_PARAUP 2415 +#define wxSCI_CMD_PARAUPEXTEND 2416 + +// Move caret down one line, extending rectangular selection to new caret position. +#define wxSCI_CMD_LINEDOWNRECTEXTEND 2426 + +// Move caret up one line, extending rectangular selection to new caret position. +#define wxSCI_CMD_LINEUPRECTEXTEND 2427 + +// Move caret left one character, extending rectangular selection to new caret position. +#define wxSCI_CMD_CHARLEFTRECTEXTEND 2428 + +// Move caret right one character, extending rectangular selection to new caret position. +#define wxSCI_CMD_CHARRIGHTRECTEXTEND 2429 + +// Move caret to first position on line, extending rectangular selection to new caret position. +#define wxSCI_CMD_HOMERECTEXTEND 2430 + +// Move caret to before first visible character on line. +// If already there move to first character on line. +// In either case, extend rectangular selection to new caret position. +#define wxSCI_CMD_VCHOMERECTEXTEND 2431 + +// Move caret to last position on line, extending rectangular selection to new caret position. +#define wxSCI_CMD_LINEENDRECTEXTEND 2432 + +// Move caret one page up, extending rectangular selection to new caret position. +#define wxSCI_CMD_PAGEUPRECTEXTEND 2433 + +// Move caret one page down, extending rectangular selection to new caret position. +#define wxSCI_CMD_PAGEDOWNRECTEXTEND 2434 + +// Move caret to top of page, or one page up if already at top of page. +#define wxSCI_CMD_STUTTEREDPAGEUP 2435 + +// Move caret to top of page, or one page up if already at top of page, extending selection to new caret position. +#define wxSCI_CMD_STUTTEREDPAGEUPEXTEND 2436 + +// Move caret to bottom of page, or one page down if already at bottom of page. +#define wxSCI_CMD_STUTTEREDPAGEDOWN 2437 + +// Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position. +#define wxSCI_CMD_STUTTEREDPAGEDOWNEXTEND 2438 + +// Move caret left one word, position cursor at end of word. +#define wxSCI_CMD_WORDLEFTEND 2439 + +// Move caret left one word, position cursor at end of word, extending selection to new caret position. +#define wxSCI_CMD_WORDLEFTENDEXTEND 2440 + +// Move caret right one word, position cursor at end of word. +#define wxSCI_CMD_WORDRIGHTEND 2441 + +// Move caret right one word, position cursor at end of word, extending selection to new caret position. +#define wxSCI_CMD_WORDRIGHTENDEXTEND 2442 + + +// END of generated section +//---------------------------------------------------------------------- + +class ScintillaWX; // forward declare +class WordList; + +#ifdef SCI_NAMESPACE // begin [CHANGED] + #ifndef SCI_SCOPE + #define SCI_SCOPE( x ) Scintilla::x + #endif + namespace Scintilla{ +#else + #ifndef SCI_SCOPE + #define SCI_SCOPE( x ) x + #endif +#endif + +struct SCNotification; +#ifdef SCI_NAMESPACE +} +#endif // end [CHANGED] + +#ifndef SWIG +extern const wxChar* wxSCINameStr; +class WXDLLIMPEXP_SCI wxScintilla; +class WXDLLIMPEXP_SCI wxScintillaEvent; +#endif + +//---------------------------------------------------------------------- + +class WXDLLIMPEXP_SCI wxScintilla : public wxControl { +public: + +#ifdef SWIGPYTHON + %pythonAppend wxScintilla "self._setOORInfo(self)" + %pythonAppend wxScintilla() "" + + wxScintilla (wxWindow *parent, wxWindowID id=wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxString& name = wxSCINameStr); + %name(PreScintilla) wxScintilla(); + +#elif defined (SWIGRUBY) + wxScintilla (wxWindow *parent, wxWindowID id=wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxString& name = wxSCINameStr); + ~wxScintilla(); +#else + wxScintilla (wxWindow *parent, wxWindowID id=wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxString& name = wxSCINameStr); + wxScintilla() { m_swx = NULL; } + ~wxScintilla(); + +#endif + + bool Create (wxWindow *parent, wxWindowID id=wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, long style = 0, + const wxString& name = wxSCINameStr); + + +//---------------------------------------------------------------------- +// BEGIN generated section. The following code is automatically generated +// by gen_iface.py. Do not edit this file. Edit wxscintilla.h.in instead +// and regenerate + + + // Add text to the document. + void AddText (const wxString& text); + void AddText (const int length, const wxString& text); + + // Add array of cells to document. + void AddStyledText (const wxMemoryBuffer& data); + + // Insert string at a position. + void InsertText (int pos, const wxString& text); + + // Delete all text in the document. + void ClearAll(); + + // Set all style bytes to 0, remove all folding information. + void ClearDocumentStyle(); + + // The number of characters in the document. + int GetLength(); + + // Returns the character byte at the position. + int GetCharAt (int pos); + + // Returns the position of the caret. + int GetCurrentPos(); + + // Returns the position of the opposite end of the selection to the caret. + int GetAnchor(); + + // Returns the style byte at the position. + int GetStyleAt (int pos); + + // Redoes the next action on the undo history. + void Redo(); + + // Choose between collecting actions into the undo + // history and discarding them. + void SetUndoCollection (bool collectUndo); + + // Select all the text in the document. + void SelectAll(); + + // Remember the current position in the undo history as the position + // at which the document was saved. + void SetSavePoint(); + + // Retrieve a buffer of cells. + wxMemoryBuffer GetStyledText (int startPos, int endPos); + + // Are there any redoable actions in the undo history? + bool CanRedo(); + + // Retrieve the line number at which a particular marker is located. + int MarkerLineFromHandle (int handle); + + // Delete a marker. + void MarkerDeleteHandle (int handle); + + // Is undo history being collected? + bool GetUndoCollection(); + + // Are white space characters currently visible? + // Returns one of SCWS_* constants. + int GetViewWhiteSpace(); + + // Make white space characters invisible, always visible or visible outside indentation. + void SetViewWhiteSpace (int viewWS); + + // Find the position from a point within the window. + int PositionFromPoint (wxPoint pt); + + // Find the position from a point within the window but return + // INVALID_POSITION if not close to text. + int PositionFromPointClose (int x, int y); + + // Set caret to start of a line and ensure it is visible. + void GotoLine (int line); + + // Set caret to a position and ensure it is visible. + void GotoPos (int pos); + + // Set the selection anchor to a position. The anchor is the opposite + // end of the selection from the caret. + void SetAnchor (int posAnchor); + + // Retrieve the text of the line containing the caret. + // Returns the index of the caret on the line. +#ifdef SWIG + wxString GetCurLine (int* OUTPUT); +#else + wxString GetCurLine (int* linePos = NULL); +#endif + + // Retrieve the position of the last correctly styled character. + int GetEndStyled(); + + // Convert all line endings in the document to one mode. + void ConvertEOLs (int eolMode); + + // Retrieve the current end of line mode - one of CRLF, CR, or LF. + int GetEOLMode(); + + // Set the current end of line mode. + void SetEOLMode (int eolMode); + + // Set the current styling position to pos and the styling mask to mask. + // The styling mask can be used to protect some bits in each styling byte from modification. + void StartStyling (int pos, int mask); + + // Change style from current styling position for length characters to a style + // and move the current styling position to after this newly styled segment. + void SetStyling (int length, int style); + + // Is drawing done first into a buffer or direct to the screen? + bool GetBufferedDraw(); + + // If drawing is buffered then each line of text is drawn into a bitmap buffer + // before drawing it to the screen to avoid flicker. + void SetBufferedDraw (bool buffered); + + // Change the visible size of a tab to be a multiple of the width of a space character. + void SetTabWidth (int tabWidth); + + // Retrieve the visible size of a tab. + int GetTabWidth(); + + // Set the code page used to interpret the bytes of the document as characters. + void SetCodePage (int codePage); + + // Set the symbol used for a particular marker number, + void MarkerDefine (int markerNumber, int markerSymbol); + + // Set the foreground colour used for a particular marker number. + void MarkerSetForeground (int markerNumber, const wxColour& fore); + + // Set the background colour used for a particular marker number. + void MarkerSetBackground (int markerNumber, const wxColour& back); + + // Add a marker to a line, returning an ID which can be used to find or delete the marker. + int MarkerAdd (int line, int markerNumber); + + // Delete a marker from a line. + void MarkerDelete (int line, int markerNumber); + + // Delete a marker with a particular number from all lines. + void MarkerDeleteAll (int markerNumber); + + // Get a bit mask of all the markers set on a line. + int MarkerGet (int line); + + // Find the next line after lineStart that includes a marker in mask. + int MarkerNext (int lineStart, int markerMask); + + // Find the previous line before lineStart that includes a marker in mask. + int MarkerPrevious (int lineStart, int markerMask); + + // Define a marker from a bitmap + void MarkerDefineBitmap (int markerNumber, const wxBitmap& bmp); + + // Add a set of markers to a line. + void MarkerAddSet (int line, int markerSet); + + // Set the alpha used for a marker that is drawn in the text area, not the margin. + void MarkerSetAlpha (int markerNumber, int alpha); + + // Set a margin to be either numeric or symbolic. + void SetMarginType (int margin, int marginType); + + // Retrieve the type of a margin. + int GetMarginType (int margin); + + // Set the width of a margin to a width expressed in pixels. + void SetMarginWidth (int margin, int pixels); + + // Retrieve the width of a margin in pixels. + int GetMarginWidth (int margin); + + // Set a mask that determines which markers are displayed in a margin. + void SetMarginMask (int margin, int mask); + + // Retrieve the marker mask of a margin. + int GetMarginMask (int margin); + + // Make a margin sensitive or insensitive to mouse clicks. + void SetMarginSensitive (int margin, bool sensitive); + + // Retrieve the mouse click sensitivity of a margin. + bool GetMarginSensitive (int margin); + + // Clear all the styles and make equivalent to the global default style. + void StyleClearAll(); + + // Set the foreground colour of a style. + void StyleSetForeground (int style, const wxColour& fore); + + // Get the background colour of a style + wxColour StyleGetBackground(int style); + + // Get the foreground colour of a style + wxColour StyleGetForeground(int style); + + // Set the background colour of a style. + void StyleSetBackground (int style, const wxColour& back); + + // Set a style to be bold or not. + void StyleSetBold (int style, bool bold); + + // Set a style to be italic or not. + void StyleSetItalic (int style, bool italic); + + // Set the size of characters of a style. + void StyleSetSize (int style, int sizePoints); + + // Set the font of a style. + void StyleSetFaceName (int style, const wxString& fontName); + + // Set a style to have its end of line filled or not. + void StyleSetEOLFilled (int style, bool filled); + + // Reset the default style to its state at startup + void StyleResetDefault(); + + // Set a style to be underlined or not. + void StyleSetUnderline (int style, bool underline); + + // Set a style to be mixed case, or to force upper or lower case. + void StyleSetCase (int style, int caseMode); + + // Set a style to be a hotspot or not. + void StyleSetHotSpot (int style, bool hotspot); + + // Get the alpha of the selection. + int GetSelAlpha (); + + // Set the alpha of the selection. + void SetSelAlpha (int alpha); + + // Set the foreground colour of the selection and whether to use this setting. + void SetSelForeground (bool useSetting, const wxColour& fore); + + // Set the background colour of the selection and whether to use this setting. + void SetSelBackground (bool useSetting, const wxColour& back); + + // Set the foreground colour of the caret. + void SetCaretForeground (const wxColour& fore); + + // When key+modifier combination km is pressed perform msg. + void CmdKeyAssign (int key, int modifiers, int cmd); + + // When key+modifier combination km is pressed do nothing. + void CmdKeyClear (int key, int modifiers); + + // Drop all key mappings. + void CmdKeyClearAll(); + + // Set the styles for a segment of the document. + void SetStyleBytes (int length, char* styleBytes); + + // Set a style to be visible or not. + void StyleSetVisible (int style, bool visible); + + // Get the time in milliseconds that the caret is on and off. + int GetCaretPeriod(); + + // Get the time in milliseconds that the caret is on and off. 0 = steady on. + void SetCaretPeriod (int milliseconds); + + // Set the set of characters making up words for when moving or selecting by word. + // First sets deaults like SetCharsDefault. + void SetWordChars (const wxString& characters); + + // Start a sequence of actions that is undone and redone as a unit. + // May be nested. + void BeginUndoAction(); + + // End a sequence of actions that is undone and redone as a unit. + void EndUndoAction(); + + // Set an indicator to plain, squiggle or TT. + void IndicatorSetStyle (int indic, int style); + + // Retrieve the style of an indicator. + int IndicatorGetStyle (int indic); + + // Set the foreground colour of an indicator. + void IndicatorSetForeground (int indic, const wxColour& fore); + + // Retrieve the foreground colour of an indicator. + wxColour IndicatorGetForeground (int indic); + + // Set the foreground colour of all whitespace and whether to use this setting. + void SetWhitespaceForeground (bool useSetting, const wxColour& fore); + + // Set the background colour of all whitespace and whether to use this setting. + void SetWhitespaceBackground (bool useSetting, const wxColour& back); + + // Divide each styling byte into lexical class bits (default: 5) and indicator + // bits (default: 3). If a lexer requires more than 32 lexical states, then this + // is used to expand the possible states. + void SetStyleBits (int bits); + + // Retrieve number of bits in style bytes used to hold the lexical state. + int GetStyleBits(); + + // Used to hold extra styling information for each line. + void SetLineState (int line, int state); + + // Retrieve the extra styling information for a line. + int GetLineState (int line); + + // Retrieve the last line number that has line state. + int GetMaxLineState(); + + // Is the background of the line containing the caret in a different colour? + bool GetCaretLineVisible(); + + // Display the background of the line containing the caret in a different colour. + void SetCaretLineVisible (bool show); + + // Get the colour of the background of the line containing the caret. + wxColour GetCaretLineBackground(); + + // Set the colour of the background of the line containing the caret. + void SetCaretLineBackground (const wxColour& back); + + // Set a style to be changeable or not (read only). + // Experimental feature, currently buggy. + void StyleSetChangeable (int style, bool changeable); + + // Display a auto-completion list. + // The lenEntered parameter indicates how many characters before + // the caret should be used to provide context. + void AutoCompShow (int lenEntered, const wxString& itemList); + + // Remove the auto-completion list from the screen. + void AutoCompCancel(); + + // Is there an auto-completion list visible? + bool AutoCompActive(); + + // Retrieve the position of the caret when the auto-completion list was displayed. + int AutoCompPosStart(); + + // User has selected an item so remove the list and insert the selection. + void AutoCompComplete(); + + // Define a set of character that when typed cancel the auto-completion list. + void AutoCompStops (const wxString& characterSet); + + // Change the separator character in the string setting up an auto-completion list. + // Default is space but can be changed if items contain space. + void AutoCompSetSeparator (int separatorCharacter); + + // Retrieve the auto-completion list separator character. + int AutoCompGetSeparator(); + + // Select the item in the auto-completion list that starts with a string. + void AutoCompSelect (const wxString& text); + + // Should the auto-completion list be cancelled if the user backspaces to a + // position before where the box was created. + void AutoCompSetCancelAtStart (bool cancel); + + // Retrieve whether auto-completion cancelled by backspacing before start. + bool AutoCompGetCancelAtStart(); + + // Define a set of characters that when typed will cause the autocompletion to + // choose the selected item. + void AutoCompSetFillUps (const wxString& characterSet); + + // Should a single item auto-completion list automatically choose the item. + void AutoCompSetChooseSingle (bool chooseSingle); + + // Retrieve whether a single item auto-completion list automatically choose the item. + bool AutoCompGetChooseSingle(); + + // Set whether case is significant when performing auto-completion searches. + void AutoCompSetIgnoreCase (bool ignoreCase); + + // Retrieve state of ignore case flag. + bool AutoCompGetIgnoreCase(); + + // Display a list of strings and send notification when user chooses one. + void UserListShow (int listType, const wxString& itemList); + + // Set whether or not autocompletion is hidden automatically when nothing matches. + void AutoCompSetAutoHide (bool autoHide); + + // Retrieve whether or not autocompletion is hidden automatically when nothing matches. + bool AutoCompGetAutoHide(); + + // Set whether or not autocompletion deletes any word characters + // after the inserted text upon completion. + void AutoCompSetDropRestOfWord (bool dropRestOfWord); + + // Retrieve whether or not autocompletion deletes any word characters + // after the inserted text upon completion. + bool AutoCompGetDropRestOfWord(); + + // Register an image for use in autocompletion lists. + void RegisterImage (int type, const wxBitmap& bmp); + + // Clear all the registered images. + void ClearRegisteredImages(); + + // Retrieve the auto-completion list type-separator character. + int AutoCompGetTypeSeparator(); + + // Change the type-separator character in the string setting up an auto-completion list. + // Default is '?' but can be changed if items contain '?'. + void AutoCompSetTypeSeparator (int separatorCharacter); + + // Set the maximum width, in characters, of auto-completion and user lists. + // Set to 0 to autosize to fit longest item, which is the default. + void AutoCompSetMaxWidth (int characterCount); + + // Get the maximum width, in characters, of auto-completion and user lists. + int AutoCompGetMaxWidth(); + + // Set the maximum height, in rows, of auto-completion and user lists. + // The default is 5 rows. + void AutoCompSetMaxHeight (int rowCount); + + // Set the maximum height, in rows, of auto-completion and user lists. + int AutoCompGetMaxHeight(); + + // Set the number of spaces used for one level of indentation. + void SetIndent (int indentSize); + + // Retrieve indentation size. + int GetIndent(); + + // Indentation will only use space characters if useTabs is false, otherwise + // it will use a combination of tabs and spaces. + void SetUseTabs (bool useTabs); + + // Retrieve whether tabs will be used in indentation. + bool GetUseTabs(); + + // Change the indentation of a line to a number of columns. + void SetLineIndentation (int line, int indentSize); + + // Retrieve the number of columns that a line is indented. + int GetLineIndentation (int line); + + // Retrieve the position before the first non indentation character on a line. + int GetLineIndentPosition (int line); + + // Retrieve the column number of a position, taking tab width into account. + int GetColumn (int pos); + + // Returns the position of a column (max. end of line position if beyond) + // on a line taking the width of tabs into account. + int FindColumn (int line, int column); + + // Can the caret preferred x position only be changed by explicit movement commands? + bool GetCaretSticky (); + + // Stop the caret preferred x position changing when the user types. + void SetCaretSticky (bool useCaretStickyBehaviour); + + // Switch between sticky and non-sticky: meant to be bound to a key. + void ToggleCaretSticky (); + + // Enable/Disable convert-on-paste for line endings. + void SetPasteConvertEndings (bool convert); + + // Get convert-on-paste setting. + bool GetPasteConvertEndings (); + + // Duplicate the selection. If selection empty duplicate the line containing the caret. + void SelectionDuplicate (); + + // Get the background alpha of the caret line. + int GetCaretLineBackgroundAlpha (); + + // Set background alpha of the caret line. + void SetCaretLineBackgroundAlpha (int alpha); + + // Show or hide the horizontal scroll bar. + void SetUseHorizontalScrollBar (bool show); + + // Is the horizontal scroll bar visible? + bool GetUseHorizontalScrollBar(); + + // Show or hide indentation guides. + void SetIndentationGuides (int show); + + // Are the indentation guides visible? + int GetIndentationGuides(); + + // Set the highlighted indentation guide column. + // 0 = no highlighted guide. + void SetHighlightGuide (int column); + + // Get the highlighted indentation guide column. + int GetHighlightGuide(); + + // Get the position after the last visible characters on a line. + int GetLineEndPosition (int line); + + // Get the code page used to interpret the bytes of the document as characters. + int GetCodePage(); + + // Get the foreground colour of the caret. + wxColour GetCaretForeground(); + + // In read-only mode? + bool GetReadOnly(); + + // Sets the position of the caret. + void SetCurrentPos (int pos); + + // Sets the position that starts the selection - this becomes the anchor. + void SetSelectionStart (int pos); + + // Returns the position at the start of the selection. + virtual int GetSelectionStart(); + + // Sets the position that ends the selection - this becomes the currentPosition. + void SetSelectionEnd (int pos); + + // Returns the position at the end of the selection. + int GetSelectionEnd(); + + // Sets the print magnification added to the point size of each style for printing. + void SetPrintMagnification (int magnification); + + // Returns the print magnification. + int GetPrintMagnification(); + + // Modify colours when printing for clearer printed text. + void SetPrintColourMode (int mode); + + // Returns the print colour mode. + int GetPrintColourMode(); + + // Find some text in the document. + int FindText (int minPos, int maxPos, const wxString& text, int flags=0, int* lengthFound = NULL); + + // On Windows, will draw the document into a display context such as a printer. + int FormatRange (bool doDraw, int startPos, int endPos, wxDC* draw, wxDC* target, wxRect renderRect, wxRect pageRect); + + // Retrieve the display line at the top of the display. + int GetFirstVisibleLine(); + + // Retrieve the contents of a line. + wxString GetLine (int line); + + // Returns the number of lines in the document. There is always at least one. + int GetLineCount(); + + // Sets the size in pixels of the left margin. + void SetMarginLeft (int pixels); + + // Returns the size in pixels of the left margin. + int GetMarginLeft(); + + // Sets the size in pixels of the right margin. + void SetMarginRight (int pixels); + + // Returns the size in pixels of the right margin. + int GetMarginRight(); + + // Is the document different from when it was last saved? + bool GetModify(); + + // Select a range of text. + void SetSelection (int startPos, int endPos); + + // Retrieve the selected text. + wxString GetSelectedText(); + + // Retrieve a range of text. + wxString GetTextRange (int startPos, int endPos); + + // Draw the selection in normal style or with selection highlighted. + void HideSelection (bool hide); + + // Retrieve the line containing a position. + int LineFromPosition (int pos); + + // Retrieve the position at the start of a line. + int PositionFromLine (int line); + + // Scroll horizontally and vertically. + void LineScroll (int columns, int lines); + + // Ensure the caret is visible. + void EnsureCaretVisible(); + + // Replace the selected text with the argument text. + void ReplaceSelection (const wxString& text); + + // Set to read only or read write. + void SetReadOnly (bool readOnly); + + // Will a paste succeed? + bool CanPaste(); + + // Are there any undoable actions in the undo history? + bool CanUndo(); + + // Delete the undo history. + void EmptyUndoBuffer(); + + // Undo one action in the undo history. + void Undo(); + + // Cut the selection to the clipboard. + void Cut(); + + // Copy the selection to the clipboard. + void Copy(); + + // Paste the contents of the clipboard into the document replacing the selection. + void Paste(); + + // Clear the selection. + void Clear(); + + // Replace the contents of the document with the argument text. + void SetText (const wxString& text); + + // Retrieve all the text in the document. + wxString GetText(); + + // Retrieve the number of characters in the document. + int GetTextLength(); + + // Set to overtype (true) or insert mode. + void SetOvertype (bool overtype); + + // Returns true if overtype mode is active otherwise false is returned. + bool GetOvertype(); + + // Set the width of the insert mode caret. + void SetCaretWidth (int pixels); + + // Returns the width of the insert mode caret. + int GetCaretWidth(); + + // Sets the position that starts the target which is used for updating the + // document without affecting the scroll position. + void SetTargetStart (int pos); + + // Get the position that starts the target. + int GetTargetStart(); + + // Sets the position that ends the target which is used for updating the + // document without affecting the scroll position. + void SetTargetEnd (int pos); + + // Get the position that ends the target. + int GetTargetEnd(); + + // Replace the target text with the argument text. + // Text is counted so it can contain NULs. + // Returns the length of the replacement text. + int ReplaceTarget (const wxString& text); + + // Replace the target text with the argument text after \d processing. + // Text is counted so it can contain NULs. + // Looks for \d where d is between 1 and 9 and replaces these with the strings + // matched in the last search operation which were surrounded by \( and \). + // Returns the length of the replacement text including any change + // caused by processing the \d patterns. + int ReplaceTargetRE (const wxString& text); + + // Search for a counted string in the target and set the target to the found + // range. Text is counted so it can contain NULs. + // Returns length of range or -1 for failure in which case target is not moved. + int SearchInTarget (const wxString& text); + + // Set the search flags used by SearchInTarget. + void SetSearchFlags (int flags); + + // Get the search flags used by SearchInTarget. + int GetSearchFlags(); + + // Show a call tip containing a definition near position pos. + void CallTipShow (int pos, const wxString& definition); + + // CodeLite related: show call tip at given pos but 250pixles to the top / right + void CallTipShowExt (int pos, const wxString& definition); + + // Remove the call tip from the screen. + void CallTipCancel(); + + // Is there an active call tip? + bool CallTipActive(); + + // Retrieve the position where the caret was before displaying the call tip. + int CallTipPosAtStart(); + + // Highlight a segment of the definition. + void CallTipSetHighlight (int startPos, int endPos); + + // Set the background colour for the call tip. + void CallTipSetBackground (const wxColour& back); + + // Set the foreground colour for the call tip. + void CallTipSetForeground (const wxColour& fore); + + // Set the foreground colour for the highlighted part of the call tip. + void CallTipSetForegroundHighlight (const wxColour& fore); + + // Enable use of STYLE_CALLTIP and set call tip tab size in pixels. + void CallTipUseStyle (int tabSize); + + // Find the display line of a document line taking hidden lines into account. + int VisibleFromDocLine (int line); + + // Find the document line of a display line taking hidden lines into account. + int DocLineFromVisible (int lineDisplay); + + // The number of display lines needed to wrap a document line + int WrapCount (int line); + + // Set the fold level of a line. + // This encodes an integer level along with flags indicating whether the + // line is a header and whether it is effectively white space. + void SetFoldLevel (int line, int level); + + // Retrieve the fold level of a line. + int GetFoldLevel (int line); + + // Find the last child line of a header line. + int GetLastChild (int line, int level); + + // Find the parent line of a child line. + int GetFoldParent (int line); + + // Make a range of lines visible. + void ShowLines (int lineStart, int lineEnd); + + // Make a range of lines invisible. + void HideLines (int lineStart, int lineEnd); + + // Is a line visible? + bool GetLineVisible (int line); + + // Show the children of a header line. + void SetFoldExpanded (int line, bool expanded); + + // Is a header line expanded? + bool GetFoldExpanded (int line); + + // Switch a header line between expanded and contracted. + void ToggleFold (int line); + + // Ensure a particular line is visible by expanding any header line hiding it. + void EnsureVisible (int line); + + // Set some style options for folding. + void SetFoldFlags (int flags); + + // Ensure a particular line is visible by expanding any header line hiding it. + // Use the currently set visibility policy to determine which range to display. + void EnsureVisibleEnforcePolicy (int line); + + // Sets whether a tab pressed when caret is within indentation indents. + void SetTabIndents (bool tabIndents); + + // Does a tab pressed when caret is within indentation indent? + bool GetTabIndents(); + + // Sets whether a backspace pressed when caret is within indentation unindents. + void SetBackSpaceUnIndents (bool bsUnIndents); + + // Does a backspace pressed when caret is within indentation unindent? + bool GetBackSpaceUnIndents(); + + // Sets the time the mouse must sit still to generate a mouse dwell event. + void SetMouseDwellTime (int periodMilliseconds); + + // Retrieve the time the mouse must sit still to generate a mouse dwell event. + int GetMouseDwellTime(); + + // Get position of start of word. + int WordStartPosition (int pos, bool onlyWordCharacters); + + // Get position of end of word. + int WordEndPosition (int pos, bool onlyWordCharacters); + + // Sets whether text is word wrapped. + void SetWrapMode (int mode); + + // Retrieve whether text is word wrapped. + int GetWrapMode(); + + // Set the display mode of visual flags for wrapped lines. + void SetWrapVisualFlags (int wrapVisualFlags); + + // Retrive the display mode of visual flags for wrapped lines. + int GetWrapVisualFlags(); + + // Set the location of visual flags for wrapped lines. + void SetWrapVisualFlagsLocation (int wrapVisualFlagsLocation); + + // Retrive the location of visual flags for wrapped lines. + int GetWrapVisualFlagsLocation(); + + // Set the start indent for wrapped lines. + void SetWrapStartIndent (int indent); + + // Retrive the start indent for wrapped lines. + int GetWrapStartIndent(); + + // Sets the degree of caching of layout information. + void SetLayoutCache (int mode); + + // Retrieve the degree of caching of layout information. + int GetLayoutCache(); + + // Sets the document width assumed for scrolling. + void SetScrollWidth (int pixels); + + // Retrieve the document width assumed for scrolling. + int GetScrollWidth(); + + // Measure the pixel width of some text in a particular style. + // NUL terminated text argument. + // Does not handle tab or control characters. + int TextWidth (int style, const wxString& text); + + // Sets the scroll range so that maximum scroll position has + // the last line at the bottom of the view (default). + // Setting this to false allows scrolling one page below the last line. + void SetEndAtLastLine (bool endAtLastLine); + + // Retrieve whether the maximum scroll position has the last + // line at the bottom of the view. + bool GetEndAtLastLine(); + + // Retrieve the height of a particular line of text in pixels. + int TextHeight (int line); + + // Show or hide the vertical scroll bar. + void SetUseVerticalScrollBar (bool show); + + // Is the vertical scroll bar visible? + bool GetUseVerticalScrollBar(); + + // Append a string to the end of the document without changing the selection. + void AppendText (const wxString& text); + void AppendText (int length, const wxString& text); + + // Is drawing done in two phases with backgrounds drawn before foregrounds? + bool GetTwoPhaseDraw(); + + // In twoPhaseDraw mode, drawing is performed in two phases, first the background + // and then the foreground. This avoids chopping off characters that overlap the next run. + void SetTwoPhaseDraw (bool twoPhase); + + // Make the target range start and end be the same as the selection range start and end. + void TargetFromSelection(); + + // Join the lines in the target. + void LinesJoin(); + + // Split the lines in the target into lines that are less wide than pixelWidth + // where possible. + void LinesSplit (int pixels); + + // Set the colours used as a chequerboard pattern in the fold margin + void SetFoldMarginColour (bool useSetting, const wxColour& back); + void SetFoldMarginHiColour (bool useSetting, const wxColour& fore); + + // Move caret down one line. + void LineDown(); + + // Move caret down one line extending selection to new caret position. + void LineDownExtend(); + + // Move caret up one line. + void LineUp(); + + // Move caret up one line extending selection to new caret position. + void LineUpExtend(); + + // Move caret left one character. + void CharLeft(); + + // Move caret left one character extending selection to new caret position. + void CharLeftExtend(); + + // Move caret right one character. + void CharRight(); + + // Move caret right one character extending selection to new caret position. + void CharRightExtend(); + + // Move caret left one word. + void WordLeft(); + + // Move caret left one word extending selection to new caret position. + void WordLeftExtend(); + + // Move caret right one word. + void WordRight(); + + // Move caret right one word extending selection to new caret position. + void WordRightExtend(); + + // Move caret to first position on line. + void Home(); + + // Move caret to first position on line extending selection to new caret position. + void HomeExtend(); + + // Move caret to last position on line. + void LineEnd(); + + // Move caret to last position on line extending selection to new caret position. + void LineEndExtend(); + + // Move caret to first position in document. + void DocumentStart(); + + // Move caret to first position in document extending selection to new caret position. + void DocumentStartExtend(); + + // Move caret to last position in document. + void DocumentEnd(); + + // Move caret to last position in document extending selection to new caret position. + void DocumentEndExtend(); + + // Move caret one page up. + void PageUp(); + + // Move caret one page up extending selection to new caret position. + void PageUpExtend(); + + // Move caret one page down. + void PageDown(); + + // Move caret one page down extending selection to new caret position. + void PageDownExtend(); + + // Switch from insert to overtype mode or the reverse. + void EditToggleOvertype(); + + // Cancel any modes such as call tip or auto-completion list display. + void Cancel(); + + // Delete the selection or if no selection, the character before the caret. + void DeleteBack(); + + // If selection is empty or all on one line replace the selection with a tab character. + // If more than one line selected, indent the lines. + void Tab(); + + // Dedent the selected lines. + void BackTab(); + + // Insert a new line, may use a CRLF, CR or LF depending on EOL mode. + void NewLine(); + + // Insert a Form Feed character. + void FormFeed(); + + // Move caret to before first visible character on line. + // If already there move to first character on line. + void VCHome(); + + // Like VCHome but extending selection to new caret position. + void VCHomeExtend(); + + // Magnify the displayed text by increasing the sizes by 1 point. + void ZoomIn(); + + // Make the displayed text smaller by decreasing the sizes by 1 point. + void ZoomOut(); + + // Delete the word to the left of the caret. + void DelWordLeft(); + + // Delete the word to the right of the caret. + void DelWordRight(); + + // Cut the line containing the caret. + void LineCut(); + + // Delete the line containing the caret. + void LineDelete(); + + // Switch the current line with the previous. + void LineTranspose(); + + // Duplicate the current line. + void LineDuplicate(); + + // Transform the selection to lower case. + void LowerCase(); + + // Transform the selection to upper case. + void UpperCase(); + + // Scroll the document down, keeping the caret visible. + void LineScrollDown(); + + // Scroll the document up, keeping the caret visible. + void LineScrollUp(); + + // Delete the selection or if no selection, the character before the caret. + // Will not delete the character before at the start of a line. + void DeleteBackNotLine(); + + // Move caret to first position on display line. + void HomeDisplay(); + + // Move caret to first position on display line extending selection to + // new caret position. + void HomeDisplayExtend(); + + // Move caret to last position on display line. + void LineEndDisplay(); + + // Move caret to last position on display line extending selection to new + // caret position. + void LineEndDisplayExtend(); + + // These are like their namesakes Home(Extend)?, LineEnd(Extend)?, VCHome(Extend)? + // except they behave differently when word-wrap is enabled: + // They go first to the start / end of the display line, like (Home|LineEnd)Display + // The difference is that, the cursor is already at the point, it goes on to the start + // or end of the document line, as appropriate for (Home|LineEnd|VCHome)(Extend)?. + void HomeWrap(); + void HomeWrapExtend(); + void LineEndWrap(); + void LineEndWrapExtend(); + void VCHomeWrap(); + void VCHomeWrapExtend(); + + // Copy the line containing the caret. + void LineCopy(); + + // works the same as SCI_COPY except that if the selection is empty then the current line is copied. + // On Windows, an extra "MSDEVLineSelect" marker is added to the clipboard which is then used in SCI_PASTE to paste the whole line before the current line. + void CopyAllowLine(); + + // Move the caret inside current view if it's not there already. + void MoveCaretInsideView(); + + // How many characters are on a line, not including end of line characters? + int LineLength (int line); + + // Highlight the characters at two positions. + void BraceHighlight (int pos1, int pos2); + + // Highlight the character at a position indicating there is no matching brace. + void BraceBadLight (int pos); + + // Find the position of a matching brace or INVALID_POSITION if no match. + int BraceMatch (int pos); + + // Are the end of line characters visible? + bool GetViewEOL(); + + // Make the end of line characters visible or invisible. + void SetViewEOL (bool visible); + + // Retrieve a pointer to the document object. + void* GetDocPointer(); + + // Change the document object used. + void SetDocPointer (void* docPointer); + + // Set which document modification events are sent to the container. + void SetModEventMask (int mask); + + // Retrieve the column number which text should be kept within. + int GetEdgeColumn(); + + // Set the column number of the edge. + // If text goes past the edge then it is highlighted. + void SetEdgeColumn (int column); + + // Retrieve the edge highlight mode. + int GetEdgeMode(); + + // The edge may be displayed by a line (EDGE_LINE) or by highlighting text that + // goes beyond it (EDGE_BACKGROUND) or not displayed at all (EDGE_NONE). + void SetEdgeMode (int mode); + + // Retrieve the colour used in edge indication. + wxColour GetEdgeColour(); + + // Change the colour used in edge indication. + void SetEdgeColour (const wxColour& colour); + + // Sets the current caret position to be the search anchor. + void SearchAnchor(); + + // Find some text starting at the search anchor. + // Does not ensure the selection is visible. + int SearchNext (int flags, const wxString& text); + + // Find some text starting at the search anchor and moving backwards. + // Does not ensure the selection is visible. + int SearchPrev (int flags, const wxString& text); + + // Retrieves the number of lines completely visible. + int LinesOnScreen(); + + // Set whether a pop up menu is displayed automatically when the user presses + // the wrong mouse button. + void UsePopUp (bool allowPopUp); + + // Is the selection rectangular? The alternative is the more common stream selection. + bool SelectionIsRectangle(); + + // Set the zoom level. This number of points is added to the size of all fonts. + // It may be positive to magnify or negative to reduce. + void SetZoom (int zoom); + + // Retrieve the zoom level. + int GetZoom(); + + // Create a new document object. + // Starts with reference count of 1 and not selected into editor. + void* CreateDocument(); + + // Extend life of document. + void AddRefDocument (void* docPointer); + + // Release a reference to the document, deleting document if it fades to black. + void ReleaseDocument (void* docPointer); + + // Get which document modification events are sent to the container. + int GetModEventMask(); + + // Change internal focus flag. + void SetSCIFocus (bool focus); + + // Get internal focus flag. + bool GetSCIFocus(); + + // Change error status - 0 = OK. + void SetStatus (int status); + + // Get error status. + int GetStatus(); + + // Set whether the mouse is captured when its button is pressed. + void SetMouseDownCaptures (bool captures); + + // Get whether mouse gets captured. + bool GetMouseDownCaptures(); + + // Sets the cursor to one of the SC_CURSOR* values. + void SetCursorType (int cursorType); + + // Get cursor type. + int GetCursorType(); + + // Change the way control characters are displayed: + // If symbol is < 32, keep the drawn way, else, use the given character. + void SetControlCharSymbol (int symbol); + + // Get the way control characters are displayed. + int GetControlCharSymbol(); + + // Move to the previous change in capitalisation. + void WordPartLeft(); + + // Move to the previous change in capitalisation extending selection + // to new caret position. + void WordPartLeftExtend(); + + // Move to the change next in capitalisation. + void WordPartRight(); + + // Move to the next change in capitalisation extending selection + // to new caret position. + void WordPartRightExtend(); + + // Set the way the display area is determined when a particular line + // is to be moved to by Find, FindNext, GotoLine, etc. + void SetVisiblePolicy (int visiblePolicy, int visibleSlop); + + // Delete back from the current position to the start of the line. + void DelLineLeft(); + + // Delete forwards from the current position to the end of the line. + void DelLineRight(); + + // Get and Set the xOffset (ie, horizonal scroll position). + void SetXOffset (int newOffset); + int GetXOffset(); + + // Set the last x chosen value to be the caret x position. + void ChooseCaretX(); + + // Set the way the caret is kept visible when going sideway. + // The exclusion zone is given in pixels. + void SetXCaretPolicy (int caretPolicy, int caretSlop); + + // Set the way the line the caret is on is kept visible. + // The exclusion zone is given in lines. + void SetYCaretPolicy (int caretPolicy, int caretSlop); + + // Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE). + void SetPrintWrapMode (int mode); + + // Is printing line wrapped? + int GetPrintWrapMode(); + + // Set a fore colour for active hotspots. + void SetHotspotActiveForeground (bool useSetting, const wxColour& fore); + + // Set a back colour for active hotspots. + void SetHotspotActiveBackground (bool useSetting, const wxColour& back); + + // Enable / Disable underlining active hotspots. + void SetHotspotActiveUnderline (bool underline); + + // Limit hotspots to single line so hotspots on two lines don't merge. + void SetHotspotSingleLine (bool singleLine); + + // Move caret between paragraphs (delimited by empty lines). + void ParaDown(); + void ParaDownExtend(); + void ParaUp(); + void ParaUpExtend(); + + // Given a valid document position, return the previous position taking code + // page into account. Returns 0 if passed 0. + int PositionBefore (int pos); + + // Given a valid document position, return the next position taking code + // page into account. Maximum value returned is the last position in the document. + int PositionAfter (int pos); + + // Copy a range of text to the clipboard. Positions are clipped into the document. + void CopyRange (int startPos, int endPos); + + // Copy argument text to the clipboard. + void CopyText (int length, const wxString& text); + + // Set the selection mode to stream (SC_SEL_STREAM=1) or rectangular (SC_SEL_RECTANGLE=2) or + // by lines (SC_SEL_LINES=3). + void SetSelectionMode (int mode); + + // Get the mode of the current selection. + int GetSelectionMode(); + + // Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line). + int GetLineSelStartPosition (int line); + + // Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line). + int GetLineSelEndPosition (int line); + + // Move caret down one line, extending rectangular selection to new caret position. + void LineDownRectExtend(); + + // Move caret up one line, extending rectangular selection to new caret position. + void LineUpRectExtend(); + + // Move caret left one character, extending rectangular selection to new caret position. + void CharLeftRectExtend(); + + // Move caret right one character, extending rectangular selection to new caret position. + void CharRightRectExtend(); + + // Move caret to first position on line, extending rectangular selection to new caret position. + void HomeRectExtend(); + + // Move caret to before first visible character on line. + // If already there move to first character on line. + // In either case, extend rectangular selection to new caret position. + void VCHomeRectExtend(); + + // Move caret to last position on line, extending rectangular selection to new caret position. + void LineEndRectExtend(); + + // Move caret one page up, extending rectangular selection to new caret position. + void PageUpRectExtend(); + + // Move caret one page down, extending rectangular selection to new caret position. + void PageDownRectExtend(); + + // Move caret to top of page, or one page up if already at top of page. + void StutteredPageUp(); + + // Move caret to top of page, or one page up if already at top of page, extending selection to new caret position. + void StutteredPageUpExtend(); + + // Move caret to bottom of page, or one page down if already at bottom of page. + void StutteredPageDown(); + + // Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position. + void StutteredPageDownExtend(); + + // Move caret left one word, position cursor at end of word. + void WordLeftEnd(); + + // Move caret left one word, position cursor at end of word, extending selection to new caret position. + void WordLeftEndExtend(); + + // Move caret right one word, position cursor at end of word. + void WordRightEnd(); + + // Move caret right one word, position cursor at end of word, extending selection to new caret position. + void WordRightEndExtend(); + + // Set the set of characters making up whitespace for when moving or selecting by word. + // Should be called after SetWordChars. + void SetWhitespaceChars (const wxString& characters); + + // Reset the set of characters for whitespace and word characters to the defaults. + void SetCharsDefault(); + + // Get currently selected item position in the auto-completion list + int AutoCompGetCurrent(); + + // Enlarge the document to a particular size of text bytes. + void Allocate (int bytes); + + // Start notifying the container of all key presses and commands. + void StartRecord(); + + // Stop notifying the container of all key presses and commands. + void StopRecord(); + + // Set the lexing language of the document. + void SetLexer (int lexer); + + // Retrieve the lexing language of the document. + int GetLexer(); + + // Colourise a segment of the document using the current lexing language. + void Colourise (int startPos, int endPos); + + // Set up a value that may be used by a lexer for some optional feature. + void SetProperty (const wxString& key, const wxString& value); + + // Retrieve a value that may be used by a lexer for some optional feature. + wxString GetProperty (const wxString& key); + wxString GetPropertyExpanded (const wxString& key); + int GetPropertyInt (const wxString& key); + + // Retrieve the number of bits the current lexer needs for styling. + int GetStyleBitsNeeded (); + + // Set up the key words used by the lexer. + void SetKeyWords (int keywordSet, const wxString& keyWords); + + // Set the lexing language of the document based on string name. + void SetLexerLanguage (const wxString& language); + +// END of generated section +//---------------------------------------------------------------------- +// Others... + + + // Returns the line number of the line with the caret. + int GetCurrentLine(); + + // Extract style settings from a spec-string which is composed of one or + // more of the following comma separated elements: + // + // bold turns on bold + // italic turns on italics + // fore:[name or #RRGGBB] sets the foreground colour + // back:[name or #RRGGBB] sets the background colour + // face:[facename] sets the font face name to use + // size:[num] sets the font size in points + // eol turns on eol filling + // underline turns on underlining + // + void StyleSetSpec (int styleNum, const wxString& spec); + + // Set style size, face, bold, italic, and underline attributes from + // a wxFont's attributes. + void StyleSetFont (int styleNum, const wxFont& font); + + // Set all font style attributes at once. + void StyleSetFontAttr (int styleNum, int size,const wxString& faceName, + bool bold, bool italic, bool underline, + wxFontEncoding encoding = wxFONTENCODING_DEFAULT); + + // Set the character set of the font in a style. + void StyleSetCharacterSet (int style, int characterSet); + + // Set the font encoding to be used by a style. + void StyleSetFontEncoding (int style, wxFontEncoding encoding); + + // Perform one of the operations defined by the wxSCI_CMD_* constants. + void CmdKeyExecute (int cmd); + + // Set the left and right margin in the edit area, measured in pixels. + void SetMargins (int left, int right); + + // Retrieve the start and end positions of the current selection. +#ifdef SWIG + void GetSelection (int* OUTPUT, int* OUTPUT); +#else + void GetSelection (int* startPos, int* endPos); +#endif + + // Retrieve the point in the window where a position is displayed. + wxPoint PointFromPosition (int pos); + + // Scroll enough to make the given line visible + void ScrollToLine (int line); + + // Scroll enough to make the given column visible + void ScrollToColumn (int column); + + // Send a message to Scintilla + long SendMsg (int msg, long wp=0, long lp=0); + + + // Set the vertical scrollbar to use instead of the ont that's built-in. + void SetVScrollBar (wxScrollBar* bar); + + // Set the horizontal scrollbar to use instead of the ont that's built-in. + void SetHScrollBar (wxScrollBar* bar); + + // Can be used to prevent the EVT_CHAR handler from adding the char + bool GetLastKeydownProcessed() { return m_lastKeyDownConsumed; } + void SetLastKeydownProcessed (bool val) { m_lastKeyDownConsumed = val; } + + // Write the contents of the editor to filename + bool SaveFile (const wxString& filename); + + // Load the contents of filename into the editor + bool LoadFile (const wxString& filename); + +#ifdef SCI_USE_DND + // Allow for simulating a DnD DragOver + wxDragResult DoDragOver (wxCoord x, wxCoord y, wxDragResult def); + + // Allow for simulating a DnD DropText + bool DoDropText (long x, long y, const wxString& data); + + // Allow for simulating a DnD DragEnter + wxDragResult DoDragEnter (wxCoord x, wxCoord y, wxDragResult def); + + // Allow for simulating a DnD DragEnter + void DoDragLeave (); + +#endif + + // Specify whether anti-aliased fonts should be used. Will have no effect + // on some platforms, but on some (wxMac for example) can greatly improve + // performance. + void SetUseAntiAliasing (bool useAA); + + // Returns the current UseAntiAliasing setting. + bool GetUseAntiAliasing(); + + // [PATCH] Starts + void SetScrollWidthTracking(bool tracking); + bool GetScrollWidthTracking(); + + // Modern indicators + void SetIndicatorCurrent(int indicator); + int GetIndicatorCurrent(); + int IndicatorValueAt(int indicator, int position); + void SetInidicatorValue(int indicator, int value); + void IndicatorFillRange(int position, int len); + void IndicatorClearRange(int position, int len); + int IndicatorStart(int indicator, int position); + int IndicatorEnd(int indicator, int position); + void IndicatorSetUnder(int indicator, bool under); + void IndicatorSetAlpha(int indicatorNumber, int alpha); + int IndicatorGetAlpha(int indicatorNumber); + void AnnotationSetText(int line, const wxString &text); + wxString AnnotationGetText(int line); + void AnnotationSetStyle(int line, int style); + int AnnotationGetStyle(int line); + void AnnotationClearAll(); + void AnnotationSetVisible(int visible); + bool AnnotationGetVisible(); + void AnnotationSetStyleOffset(int style); + void AnnotationSetStyles(int line, const wxMemoryBuffer &styles); + void MarginSetText(int line, const wxString &text); + void MarginSetStyle(int line, int style); + void MarginTextClearAll(); + int MarginGetStyle(int line); + + // Multiple selection + void SetMultipleSelection(bool multipleSelection); + bool GetMultipleSelection(); + bool GetAdditionalSelectionTyping(); + void SetAdditionalSelectionTyping(bool additionalSelectionTyping); + void SetRectangularSelectionModifier(int mod); + int GetRectangularSelectionModifier(); + // [PATCH] END + +#if wxCHECK_VERSION(2, 5, 0) + // The following methods are nearly equivallent to their similarly named + // cousins above. The difference is that these methods bypass wxString + // and always use a char* even if used in a unicode build of wxWidgets. + // In that case the character data will be utf-8 encoded since that is + // what is used internally by Scintilla in unicode builds. + + // Add text to the document at current position. + void AddTextRaw (const char* text); + + // Insert string at a position. + void InsertTextRaw (int pos, const char* text); + + // Retrieve the text of the line containing the caret. + // Returns the index of the caret on the line. +#ifdef SWIG + wxCharBuffer GetCurLineRaw (int* OUTPUT); +#else + wxCharBuffer GetCurLineRaw (int* linePos = NULL); +#endif + + // Retrieve the contents of a line. + wxCharBuffer GetLineRaw (int line); + + // Retrieve the selected text. + wxCharBuffer GetSelectedTextRaw(); + + // Retrieve a range of text. + wxCharBuffer GetTextRangeRaw (int startPos, int endPos); + + // Replace the contents of the document with the argument text. + void SetTextRaw (const char* text); + + // Retrieve all the text in the document. + wxCharBuffer GetTextRaw(); + + // Append a string to the end of the document without changing the selection. + void AppendTextRaw (const char* text); + +#ifdef SWIG + %pythoncode "_stc_utf8_methods.py" +#endif +#endif + + +//---------------------------------------------------------------------- + +#ifndef SWIG +protected: + // Event handlers + void OnPaint (wxPaintEvent& evt); + void OnScrollWin (wxScrollWinEvent& evt); + void OnScroll (wxScrollEvent& evt); + void OnSize (wxSizeEvent& evt); + void OnMouseLeftDown (wxMouseEvent& evt); + void OnMouseMove (wxMouseEvent& evt); + void OnMouseLeftUp (wxMouseEvent& evt); + void OnMouseRightUp (wxMouseEvent& evt); + void OnMouseMiddleUp (wxMouseEvent& evt); + void OnContextMenu (wxContextMenuEvent& evt); + void OnMouseWheel (wxMouseEvent& evt); + void OnChar (wxKeyEvent& evt); + void OnKeyDown (wxKeyEvent& evt); + void OnLoseFocus (wxFocusEvent& evt); + void OnGainFocus (wxFocusEvent& evt); + void OnSysColourChanged (wxSysColourChangedEvent& evt); + void OnEraseBackground (wxEraseEvent& evt); + void OnMenu (wxCommandEvent& evt); + void OnListBox (wxCommandEvent& evt); + void OnIdle (wxIdleEvent& evt); + + virtual wxSize DoGetBestSize() const; + + // Turn notifications from Scintilla into events + void NotifyChange(); + void NotifyParent (SCI_SCOPE(SCNotification*) scn); // [CHAGED] + + ScintillaWX* m_swx; + wxStopWatch m_stopWatch; + wxScrollBar* m_vScrollBar; + wxScrollBar* m_hScrollBar; + bool m_lastKeyDownConsumed; + + // ERAN IFRAH +public: + wxPoint m_ccPoint; + bool m_isTipBgDark; + // END + friend class ScintillaWX; + friend class Platform; + +private: + DECLARE_EVENT_TABLE() + //DECLARE_CLASS(wxScintilla) +#endif +}; + +//---------------------------------------------------------------------- + +class WXDLLIMPEXP_SCI wxScintillaEvent : public wxCommandEvent { +public: + wxScintillaEvent (wxEventType commandType=0, int id=0); +#ifndef SWIG + wxScintillaEvent (const wxScintillaEvent& event); +#endif + ~wxScintillaEvent() {} + + void SetPosition (int pos) { m_position = pos; } + void SetKey (int k) { m_key = k; } + void SetModifiers (int m) { m_modifiers = m; } + void SetModificationType (int t) { m_modificationType = t; } + void SetText (const wxString& t) { m_text = t; } + void SetLength (int len) { m_length = len; } + void SetLinesAdded (int num) { m_linesAdded = num; } + void SetLine (int val) { m_line = val; } + void SetFoldLevelNow (int val) { m_foldLevelNow = val; } + void SetFoldLevelPrev (int val) { m_foldLevelPrev = val; } + void SetMargin (int val) { m_margin = val; } + void SetMessage (int val) { m_message = val; } + void SetWParam (int val) { m_wParam = val; } + void SetLParam (int val) { m_lParam = val; } + void SetListType (int val) { m_listType = val; } + void SetX (int val) { m_x = val; } + void SetY (int val) { m_y = val; } + void SetDragText (const wxString& val) { m_dragText = val; } + void SetDragAllowMove (bool val) { m_dragAllowMove = val; } +#ifdef SCI_USE_DND + void SetDragResult (wxDragResult val) { m_dragResult = val; } +#endif + + int GetPosition() const { return m_position; } + int GetKey() const { return m_key; } + int GetModifiers() const { return m_modifiers; } + int GetModificationType() const { return m_modificationType; } + wxString GetText() const { return m_text; } + int GetLength() const { return m_length; } + int GetLinesAdded() const { return m_linesAdded; } + int GetLine() const { return m_line; } + int GetFoldLevelNow() const { return m_foldLevelNow; } + int GetFoldLevelPrev() const { return m_foldLevelPrev; } + int GetMargin() const { return m_margin; } + int GetMessage() const { return m_message; } + int GetWParam() const { return m_wParam; } + int GetLParam() const { return m_lParam; } + int GetListType() const { return m_listType; } + int GetX() const { return m_x; } + int GetY() const { return m_y; } + wxString GetDragText() { return m_dragText; } + bool GetDragAllowMove() { return wxDrag_DefaultMove; } +#ifdef SCI_USE_DND + wxDragResult GetDragResult() { return m_dragResult; } +#endif + + bool GetShift() const; + bool GetControl() const; + bool GetAlt() const; + + virtual wxEvent* Clone() const { return new wxScintillaEvent (*this); } + +#ifndef SWIG +private: + //DECLARE_CLASS(wxScintillaEvent) + + int m_position; + int m_key; + int m_modifiers; + + int m_modificationType; // wxEVT_SCI_MODIFIED + wxString m_text; + int m_length; + int m_linesAdded; + int m_line; + int m_foldLevelNow; + int m_foldLevelPrev; + + int m_margin; // wxEVT_SCI_MARGINCLICK + + int m_message; // wxEVT_SCI_MACRORECORD + int m_wParam; + int m_lParam; + + int m_listType; + int m_x; + int m_y; + + wxString m_dragText; // wxEVT_SCI_START_DRAG, wxEVT_SCI_DO_DROP + bool m_dragAllowMove; // wxEVT_SCI_START_DRAG + +#if wxUSE_DRAG_AND_DROP + wxDragResult m_dragResult; // wxEVT_SCI_DRAG_OVER,wxEVT_SCI_DO_DROP +#endif +#endif +}; + + + +#ifndef SWIG +BEGIN_DECLARE_EVENT_TYPES() +#if !wxCHECK_VERSION(2, 5, 0) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_CHANGE, 1650) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_STYLENEEDED, 1651) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_CHARADDED, 1652) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_SAVEPOINTREACHED, 1653) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_SAVEPOINTLEFT, 1654) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_ROMODIFYATTEMPT, 1655) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_KEY, 1656) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_DOUBLECLICK, 1657) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_UPDATEUI, 1658) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_MODIFIED, 1659) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_MACRORECORD, 1660) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_MARGINCLICK, 1661) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_NEEDSHOWN, 1662) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_POSCHANGED, 1663) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_PAINTED, 1664) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_USERLISTSELECTION, 1665) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_URIDROPPED, 1666) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_DWELLSTART, 1667) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_DWELLEND, 1668) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_START_DRAG, 1669) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_DRAG_OVER, 1670) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_DO_DROP, 1671) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_ZOOM, 1672) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_HOTSPOT_CLICK, 1673) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_HOTSPOT_DCLICK, 1674) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_CALLTIP_CLICK, 1675) + DECLARE_EXPORTED_LOCAL_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_AUTOCOMP_SELECTION, 1676) +#else + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_CHANGE, 1650) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_STYLENEEDED, 1651) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_CHARADDED, 1652) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_SAVEPOINTREACHED, 1653) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_SAVEPOINTLEFT, 1654) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_ROMODIFYATTEMPT, 1655) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_KEY, 1656) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_DOUBLECLICK, 1657) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_UPDATEUI, 1658) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_MODIFIED, 1659) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_MACRORECORD, 1660) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_MARGINCLICK, 1661) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_NEEDSHOWN, 1662) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_PAINTED, 1664) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_USERLISTSELECTION, 1665) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_URIDROPPED, 1666) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_DWELLSTART, 1667) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_DWELLEND, 1668) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_START_DRAG, 1669) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_DRAG_OVER, 1670) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_DO_DROP, 1671) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_ZOOM, 1672) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_HOTSPOT_CLICK, 1673) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_HOTSPOT_DCLICK, 1674) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_CALLTIP_CLICK, 1675) + DECLARE_EXPORTED_EVENT_TYPE (WXDLLIMPEXP_SCI, wxEVT_SCI_AUTOCOMP_SELECTION, 1676) +#endif +END_DECLARE_EVENT_TYPES() +#else + enum { + wxEVT_SCI_CHANGE, + wxEVT_SCI_STYLENEEDED, + wxEVT_SCI_CHARADDED, + wxEVT_SCI_SAVEPOINTREACHED, + wxEVT_SCI_SAVEPOINTLEFT, + wxEVT_SCI_ROMODIFYATTEMPT, + wxEVT_SCI_KEY, + wxEVT_SCI_DOUBLECLICK, + wxEVT_SCI_UPDATEUI, + wxEVT_SCI_MODIFIED, + wxEVT_SCI_MACRORECORD, + wxEVT_SCI_MARGINCLICK, + wxEVT_SCI_NEEDSHOWN, + wxEVT_SCI_PAINTED, + wxEVT_SCI_USERLISTSELECTION, + wxEVT_SCI_URIDROPPED, + wxEVT_SCI_DWELLSTART, + wxEVT_SCI_DWELLEND, + wxEVT_SCI_START_DRAG, + wxEVT_SCI_DRAG_OVER, + wxEVT_SCI_DO_DROP, + wxEVT_SCI_ZOOM, + wxEVT_SCI_HOTSPOT_CLICK, + wxEVT_SCI_HOTSPOT_DCLICK, + wxEVT_SCI_CALLTIP_CLICK, + wxEVT_SCI_AUTOCOMP_SELECTION + }; +#endif + + + +#ifndef SWIG +typedef void (wxEvtHandler::*wxScintillaEventFunction)(wxScintillaEvent&); + +#if !wxCHECK_VERSION(2, 5, 0) +#define EVT_SCI_CHANGE(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_CHANGE, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_STYLENEEDED(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_STYLENEEDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_CHARADDED(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_CHARADDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_SAVEPOINTREACHED(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_SAVEPOINTREACHED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_SAVEPOINTLEFT(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_SAVEPOINTLEFT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_ROMODIFYATTEMPT(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_ROMODIFYATTEMPT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_KEY(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_KEY, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_DOUBLECLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_DOUBLECLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_UPDATEUI(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_UPDATEUI, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_MODIFIED(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_MODIFIED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_MACRORECORD(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_MACRORECORD, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_MARGINCLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_MARGINCLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_NEEDSHOWN(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_NEEDSHOWN, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_POSCHANGED(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_POSCHANGED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_PAINTED(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_PAINTED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_USERLISTSELECTION(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_USERLISTSELECTION, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_URIDROPPED(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_URIDROPPED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_DWELLSTART(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_DWELLSTART, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_DWELLEND(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_DWELLEND, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_START_DRAG(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_START_DRAG, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_DRAG_OVER(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_DRAG_OVER, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_DO_DROP(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_DO_DROP, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_ZOOM(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_ZOOM, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_HOTSPOT_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_HOTSPOT_CLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_HOTSPOT_DCLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_HOTSPOT_DCLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_CALLTIP_CLICK(id, fn)) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_CALLTIP_CLICK id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#define EVT_SCI_AUTOCOMP_SELECTION(id, fn)) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_AUTOCOMP_SELECTION id, -1, (wxObjectEventFunction) (wxEventFunction) (wxScintillaEventFunction) & fn, (wxObject *) NULL), +#else +#define EVT_SCI_CHANGE(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_CHANGE, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_STYLENEEDED(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_STYLENEEDED, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_CHARADDED(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_CHARADDED, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_SAVEPOINTREACHED(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_SAVEPOINTREACHED, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_SAVEPOINTLEFT(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_SAVEPOINTLEFT, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_ROMODIFYATTEMPT(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_ROMODIFYATTEMPT, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_KEY(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_KEY, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_DOUBLECLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_DOUBLECLICK, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_UPDATEUI(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_UPDATEUI, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_MODIFIED(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_MODIFIED, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_MACRORECORD(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_MACRORECORD, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_MARGINCLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_MARGINCLICK, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_NEEDSHOWN(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_NEEDSHOWN, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_PAINTED(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_PAINTED, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_USERLISTSELECTION(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_USERLISTSELECTION, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_URIDROPPED(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_URIDROPPED, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_DWELLSTART(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_DWELLSTART, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_DWELLEND(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_DWELLEND, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_START_DRAG(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_START_DRAG, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_DRAG_OVER(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_DRAG_OVER, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_DO_DROP(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_DO_DROP, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_ZOOM(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_ZOOM, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_HOTSPOT_CLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_HOTSPOT_CLICK, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_HOTSPOT_DCLICK(id, fn) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_HOTSPOT_DCLICK, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_CALLTIP_CLICK(id, fn)) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_CALLTIP_CLICK id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#define EVT_SCI_AUTOCOMP_SELECTION(id, fn)) DECLARE_EVENT_TABLE_ENTRY (wxEVT_SCI_AUTOCOMP_SELECTION id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxScintillaEventFunction, & fn ), (wxObject *) NULL), +#endif + +#endif + +//---------------------------------------------------------------------- +// Utility functions used within wxScintilla + +#ifndef SWIG + +inline wxString sci2wx (const char* str) { +#if wxUSE_UNICODE + return wxString (str, wxConvUTF8); +#else + return wxString (str); +#endif +} + +#if wxUSE_UNICODE +wxString sci2wx (const char* str, size_t len); +#else +inline wxString sci2wx (const char* str, size_t len) { + return wxString (str, len); +} +#endif + + +#if wxUSE_UNICODE +inline const wxWX2MBbuf wx2sci (const wxString& str) { + return str.mb_str (wxConvUTF8); +} +#else +inline const wxWX2MBbuf wx2sci (const wxString& str) { + return str.mbc_str(); +} +#endif + +#endif + + +//---------------------------------------------------------------------- +#endif // __WXSCINTILLA_H__ diff --git a/sdk/wxscintilla/src/PlatWX.cpp b/sdk/wxscintilla/src/PlatWX.cpp new file mode 100644 index 0000000..e28b6a3 --- /dev/null +++ b/sdk/wxscintilla/src/PlatWX.cpp @@ -0,0 +1,1647 @@ +// Scintilla source code edit control +// PlatWX.cxx - implementation of platform facilities on wxWidgets +// Copyright 1998-1999 by Neil Hodgson +// Robin Dunn +// The License.txt file describes the conditions under which this software may be distributed. + +#include + +#include +#include +#include +#include +#include +#include +#include +#ifdef wxHAVE_RAW_BITMAP +#include +#endif + +#include "Platform.h" +#include "PlatWX.h" +#include "wx/wxscintilla.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +namespace Scintilla +{ +#endif + +Point Point::FromLong(long lpoint) +{ + return Point(lpoint & 0xFFFF, lpoint >> 16); +} + +wxRect wxRectFromPRectangle(PRectangle prc) +{ + wxRect r(prc.left, prc.top, + prc.Width(), prc.Height()); + return r; +} + +PRectangle PRectangleFromwxRect(wxRect rc) +{ + return PRectangle(rc.GetLeft(), rc.GetTop(), + rc.GetRight()+1, rc.GetBottom()+1); +} + +wxColour wxColourFromCA(const ColourAllocated& ca) +{ + ColourDesired cd(ca.AsLong()); + return wxColour((unsigned char)cd.GetRed(), + (unsigned char)cd.GetGreen(), + (unsigned char)cd.GetBlue()); +} + +//---------------------------------------------------------------------- + +Palette::Palette() +{ + used = 0; + allowRealization = false; + size = 100; + entries = new ColourPair[size]; +} + +Palette::~Palette() +{ + Release(); + delete []entries; + entries = 0; +} + +void Palette::Release() +{ + used = 0; + delete []entries; + size = 100; + entries = new ColourPair[size]; +} + +// This method either adds a colour to the list of wanted colours (want==true) +// or retrieves the allocated colour back to the ColourPair. +// This is one method to make it easier to keep the code for wanting and retrieving in sync. +void Palette::WantFind(ColourPair &cp, bool want) +{ + if (want) { + for (int i=0; i < used; i++) { + if (entries[i].desired == cp.desired) + return; + } + + if (used >= size) { + int sizeNew = size * 2; + ColourPair *entriesNew = new ColourPair[sizeNew]; + for (int j=0; jSetNoAntiAliasing (!extraFontFlag); + fid = font; +} + + +void Font::Release() +{ + if (fid) + delete (wxFont*)fid; + fid = 0; +} + +//---------------------------------------------------------------------- +class SurfaceImpl : public Surface +{ +private: + wxDC* hdc; + bool hdcOwned; + wxBitmap* bitmap; + int x; + int y; + bool unicodeMode; + +public: + SurfaceImpl(); + ~SurfaceImpl(); + + virtual void Init(WindowID wid); + virtual void Init(SurfaceID sid, WindowID wid); + virtual void InitPixMap(int width, int height, Surface *surface_, WindowID wid); + + virtual void Release(); + virtual bool Initialised(); + virtual void PenColour(ColourAllocated fore); + virtual int LogPixelsY(); + virtual int DeviceHeightFont(int points); + virtual void MoveTo(int x_, int y_); + virtual void LineTo(int x_, int y_); + virtual void Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back); + virtual void RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back); + virtual void FillRectangle(PRectangle rc, ColourAllocated back); + virtual void FillRectangle(PRectangle rc, Surface &surfacePattern); + virtual void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back); + virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill, ColourAllocated outline, int alphaOutline, int flags); + virtual void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back); + virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource); + + virtual void DrawTextNoClip(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back); + virtual void DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back); + virtual void DrawTextTransparent(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore); + virtual void MeasureWidths(Font &font_, const char *s, int len, int *positions); + virtual int WidthText(Font &font_, const char *s, int len); + virtual int WidthChar(Font &font_, char ch); + virtual int Ascent(Font &font_); + virtual int Descent(Font &font_); + virtual int InternalLeading(Font &font_); + virtual int ExternalLeading(Font &font_); + virtual int Height(Font &font_); + virtual int AverageCharWidth(Font &font_); + + virtual int SetPalette(Palette *pal, bool inBackGround); + virtual void SetClip(PRectangle rc); + virtual void FlushCachedState(); + + virtual void SetUnicodeMode(bool unicodeMode_); + virtual void SetDBCSMode(int codePage); + + void BrushColour(ColourAllocated back); + void SetFont(Font &font_); +}; + +SurfaceImpl::SurfaceImpl() : + hdc(0), hdcOwned(0), bitmap(0), + x(0), y(0), unicodeMode(0) +{} + +SurfaceImpl::~SurfaceImpl() +{ + Release(); +} + +void SurfaceImpl::Init(WindowID wid) +{ +#if 0 + Release(); + hdc = new wxMemoryDC(); + hdcOwned = true; +#else + // On Mac and GTK the DC is not really valid until it has a bitmap + // selected into it. So instead of just creating the DC with no bitmap, + // go ahead and give it one. + InitPixMap(1,1,NULL,wid); +#endif +} + +void SurfaceImpl::Init(SurfaceID hdc_, WindowID) +{ + Release(); + hdc = (wxDC*)hdc_; +} + +void SurfaceImpl::InitPixMap(int width, int height, Surface *WXUNUSED(surface_), WindowID) +{ + Release(); + hdc = new wxMemoryDC(); + hdcOwned = true; + if (width < 1) width = 1; + if (height < 1) height = 1; + bitmap = new wxBitmap(width, height); + ((wxMemoryDC*)hdc)->SelectObject(*bitmap); +} + + +void SurfaceImpl::Release() +{ + if (bitmap) { + ((wxMemoryDC*)hdc)->SelectObject(wxNullBitmap); + delete bitmap; + bitmap = 0; + } + if (hdcOwned) { + delete hdc; + hdc = 0; + hdcOwned = false; + } +} + + +bool SurfaceImpl::Initialised() +{ + return hdc != 0; +} + + +void SurfaceImpl::PenColour(ColourAllocated fore) +{ + if( fore.AsLong() == -1 ) { + hdc->SetPen( *wxTRANSPARENT_PEN ); + } else { + hdc->SetPen(wxPen(wxColourFromCA(fore), 1, wxSOLID)); + } +} + +void SurfaceImpl::BrushColour(ColourAllocated back) +{ + if( back.AsLong() == -1 ) { + hdc->SetBrush( *wxTRANSPARENT_BRUSH ); + } else { + hdc->SetBrush(wxBrush(wxColourFromCA(back), wxSOLID)); + } +} + +void SurfaceImpl::SetFont(Font &font_) +{ + if (font_.GetID()) { + hdc->SetFont(*((wxFont*)font_.GetID())); + } +} + +int SurfaceImpl::LogPixelsY() +{ + return hdc->GetPPI().y; +} + +int SurfaceImpl::DeviceHeightFont(int points) +{ + return points; +} + +void SurfaceImpl::MoveTo(int x_, int y_) +{ + x = x_; + y = y_; +} + +void SurfaceImpl::LineTo(int x_, int y_) +{ + hdc->DrawLine(x,y, x_,y_); + x = x_; + y = y_; +} + +void SurfaceImpl::Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back) +{ + PenColour(fore); + BrushColour(back); + hdc->DrawPolygon(npts, (wxPoint*)pts); +} + +void SurfaceImpl::RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back) +{ + PenColour(fore); + BrushColour(back); + hdc->DrawRectangle(wxRectFromPRectangle(rc)); +} + +void SurfaceImpl::FillRectangle(PRectangle rc, ColourAllocated back) +{ + BrushColour(back); + hdc->SetPen(*wxTRANSPARENT_PEN); + hdc->DrawRectangle(wxRectFromPRectangle(rc)); +} + +void SurfaceImpl::FillRectangle(PRectangle rc, Surface &surfacePattern) +{ + wxBrush br; + if (((SurfaceImpl&)surfacePattern).bitmap) + br = wxBrush(*((SurfaceImpl&)surfacePattern).bitmap); + else // Something is wrong so display in red + br = wxBrush(*wxRED, wxSOLID); + hdc->SetPen(*wxTRANSPARENT_PEN); + hdc->SetBrush(br); + hdc->DrawRectangle(wxRectFromPRectangle(rc)); +} + +void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back) +{ + PenColour(fore); + BrushColour(back); + wxRect rr = wxRectFromPRectangle(rc); + hdc->DrawRoundedRectangle(rr, 1); +} + +void SurfaceImpl::AlphaRectangle (PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill, ColourAllocated outline, int alphaOutline, int WXUNUSED(flags)) +{ + +#ifdef wxHAVE_RAW_BITMAP + int x, y; + wxRect r = wxRectFromPRectangle(rc); + wxRect outlineRect (r); + + wxBitmap bmp(r.width, r.height, 32); + if(bmp.IsOk() == false) + return; + wxAlphaPixelData pixData(bmp); + pixData.UseAlpha(); + wxAlphaPixelData::Iterator p(pixData); + + // Set the fill pixels + ColourDesired cdf(fill.AsLong()); + int red = cdf.GetRed(); + int green = cdf.GetGreen(); + int blue = cdf.GetBlue(); +#ifdef __WXMSW__ + int aFill = alphaFill; +#else + int aFill = 0xff; +#endif + for (y=0; yDrawBitmap(bmp, r.x, r.y, true); + + // ERAN [START] + if (cornerSize) { + // Draw outline rounded-rectangle incase we got a cornerSizer > 0 + hdc->SetBrush(*wxTRANSPARENT_BRUSH); + hdc->SetPen(wxColour(cdo.GetRed(), cdo.GetGreen(), cdo.GetBlue())); +#ifdef __WXGTK__ + cornerSize = 0; +#endif + hdc->DrawRoundedRectangle(outlineRect, cornerSize); + } + // ERAN [END] +#else + wxUnusedVar(cornerSize); + wxUnusedVar(alphaFill); + wxUnusedVar(alphaOutline); + RoundedRectangle(rc, outline, fill); +#endif +} + +void SurfaceImpl::Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back) +{ + PenColour(fore); + BrushColour(back); + hdc->DrawEllipse(wxRectFromPRectangle(rc)); +} + +void SurfaceImpl::Copy(PRectangle rc, Point from, Surface &surfaceSource) +{ + wxRect r = wxRectFromPRectangle(rc); + hdc->Blit(r.x, r.y, r.width, r.height, + ((SurfaceImpl&)surfaceSource).hdc, + from.x, from.y, wxCOPY); +} + +void SurfaceImpl::DrawTextNoClip(PRectangle rc, Font &font, int ybase, + const char *s, int len, + ColourAllocated fore, ColourAllocated back) +{ + SetFont(font); + hdc->SetTextForeground(wxColourFromCA(fore)); + hdc->SetTextBackground(wxColourFromCA(back)); + FillRectangle(rc, back); + + // ybase is where the baseline should be, but wxWin uses the upper left + // corner, so I need to calculate the real position for the text... + hdc->DrawText(sci2wx(s, len), rc.left, ybase - font.ascent); +} + +void SurfaceImpl::DrawTextClipped(PRectangle rc, Font &font, int ybase, + const char *s, int len, + ColourAllocated fore, ColourAllocated back) +{ + SetFont(font); + hdc->SetTextForeground(wxColourFromCA(fore)); + hdc->SetTextBackground(wxColourFromCA(back)); + FillRectangle(rc, back); + hdc->SetClippingRegion(wxRectFromPRectangle(rc)); + + // see comments above + hdc->DrawText(sci2wx(s, len), rc.left, ybase - font.ascent); + hdc->DestroyClippingRegion(); +} + + +void SurfaceImpl::DrawTextTransparent(PRectangle rc, Font &font, int ybase, + const char *s, int len, + ColourAllocated fore) +{ + + SetFont(font); + hdc->SetTextForeground(wxColourFromCA(fore)); + hdc->SetBackgroundMode(wxTRANSPARENT); + + // ybase is where the baseline should be, but wxWin uses the upper left + // corner, so I need to calculate the real position for the text... + hdc->DrawText(sci2wx(s, len), rc.left, ybase - font.ascent); + + hdc->SetBackgroundMode(wxSOLID); +} + + +void SurfaceImpl::MeasureWidths(Font &font, const char *s, int len, int *positions) +{ + + wxString str = sci2wx(s, len); + SetFont(font); + +#if !wxCHECK_VERSION(2, 5, 0) +#ifndef __WXMAC__ + // Calculate the position of each character based on the widths of + // the previous characters + int* tpos = new int[len+1]; + int totalWidth = 0; + size_t i; + for (i=0; iGetTextExtent(str[i], &w, &h); + totalWidth += w; + tpos[i] = totalWidth; + } +#else + // Instead of a running total, remeasure from the begining of the + // text for each character's position. This is because with AA fonts + // on OS X widths can be fractions of pixels wide when more than one + // are drawn together, so the sum of all character widths is not necessarily + // (and probably not) the same as the whole string width. + int* tpos = new int[len+1]; + size_t i; + for (i=0; iGetTextExtent(str.Left(i+1), &w, &h); + tpos[i] = w; + } +#endif +#else + wxArrayInt tpos; + hdc->GetPartialTextExtents(str, tpos); +#endif + + +#if wxUSE_UNICODE + // Map the widths for UCS-2 characters back to the UTF-8 input string + // NOTE: I don't think this is right for when sizeof(wxChar) > 2, ie wxGTK2 + // so figure it out and fix it! + int j = 0; + size_t ui = 0; + while ((int)j < len) { + unsigned char uch = (unsigned char)s[j]; + positions[j++] = tpos[ui]; + if (uch >= 0x80) { + if (uch < (0x80 + 0x40 + 0x20)) { + positions[j++] = tpos[ui]; + } else { + positions[j++] = tpos[ui]; + positions[j++] = tpos[ui]; + } + } + ui++; + } +#else + + // If not unicode then just use the widths we have +#if !wxCHECK_VERSION(2, 5, 0) + memcpy(positions, tpos, len * sizeof(*tpos)); +#else +#if wxUSE_STL + std::copy(tpos.begin(), tpos.end(), positions); +#else + memcpy(positions, tpos.begin(), len * sizeof(int)); +#endif +#endif +#endif + +#if !wxCHECK_VERSION(2, 5, 0) + delete [] tpos; +#endif +} + + +int SurfaceImpl::WidthText(Font &font, const char *s, int len) +{ + SetFont(font); + int w; + int h; + + hdc->GetTextExtent(sci2wx(s, len), &w, &h); + return w; +} + + +int SurfaceImpl::WidthChar(Font &font, char ch) +{ + SetFont(font); + int w; + int h; + char s[2] = { ch, 0 }; + + hdc->GetTextExtent(sci2wx(s, 1), &w, &h); + return w; +} + +#define EXTENT_TEST wxT(" `~!@#$%^&*()-_=+\\|[]{};:\"\'<,>.?/1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") + +int SurfaceImpl::Ascent(Font &font) +{ + SetFont(font); + int w, h, d, e; + hdc->GetTextExtent(EXTENT_TEST, &w, &h, &d, &e); + font.ascent = h - d; + return font.ascent; +} + +int SurfaceImpl::Descent(Font &font) +{ + SetFont(font); + int w, h, d, e; + hdc->GetTextExtent(EXTENT_TEST, &w, &h, &d, &e); + return d; +} + +int SurfaceImpl::InternalLeading(Font &WXUNUSED(font)) +{ + return 0; +} + +int SurfaceImpl::ExternalLeading(Font &font) +{ + SetFont(font); + int w, h, d, e; + hdc->GetTextExtent(EXTENT_TEST, &w, &h, &d, &e); + return e; +} + +int SurfaceImpl::Height(Font &font) +{ + SetFont(font); + return hdc->GetCharHeight() + 1; +} + +int SurfaceImpl::AverageCharWidth(Font &font) +{ + SetFont(font); + return hdc->GetCharWidth(); +} + +int SurfaceImpl::SetPalette(Palette *WXUNUSED(pal), bool WXUNUSED(inBackGround)) +{ + return 0; +} + +void SurfaceImpl::SetClip(PRectangle rc) +{ + hdc->SetClippingRegion(wxRectFromPRectangle(rc)); +} + +void SurfaceImpl::FlushCachedState() +{ +} + +void SurfaceImpl::SetUnicodeMode(bool unicodeMode_) +{ + unicodeMode=unicodeMode_; +} + +void SurfaceImpl::SetDBCSMode(int WXUNUSED(codePage)) +{ + // dbcsMode = codePage == SC_CP_DBCS; +} + + +Surface *Surface::Allocate() +{ + return new SurfaceImpl; +} + + +//---------------------------------------------------------------------- + + +inline wxWindow* GETWIN(WindowID id) +{ + return (wxWindow*)id; +} + +Window::~Window() +{ +} + +void Window::Destroy() +{ + if (wid) { + Show(false); + GETWIN(wid)->Destroy(); + } + wid = 0; +} + +bool Window::HasFocus() +{ + return wxWindow::FindFocus() == GETWIN(wid); +} + +PRectangle Window::GetPosition() +{ + if (! wid) return PRectangle(); + wxRect rc(GETWIN(wid)->GetPosition(), GETWIN(wid)->GetSize()); + return PRectangleFromwxRect(rc); +} + +void Window::SetPosition(PRectangle rc) +{ + wxRect r = wxRectFromPRectangle(rc); + GETWIN(wid)->SetSize(r); +} + +void Window::SetPositionRelative(PRectangle rc, Window) +{ + SetPosition(rc); // ???? +} + +PRectangle Window::GetClientPosition() +{ + if (! wid) return PRectangle(); + wxSize sz = GETWIN(wid)->GetClientSize(); + return PRectangle(0, 0, sz.x, sz.y); +} + +void Window::Show(bool show) +{ + GETWIN(wid)->Show(show); +} + +void Window::InvalidateAll() +{ + GETWIN(wid)->Refresh(false); +} + +void Window::InvalidateRectangle(PRectangle rc) +{ + wxRect r = wxRectFromPRectangle(rc); + GETWIN(wid)->Refresh(false, &r); +} + +void Window::SetFont(Font &font) +{ + GETWIN(wid)->SetFont(*((wxFont*)font.GetID())); +} + +void Window::SetCursor(Cursor curs) +{ + int cursorId; + + switch (curs) { + case cursorText: + cursorId = wxCURSOR_IBEAM; + break; + case cursorArrow: + cursorId = wxCURSOR_ARROW; + break; + case cursorUp: + cursorId = wxCURSOR_ARROW; // ** no up arrow... wxCURSOR_UPARROW; + break; + case cursorWait: + cursorId = wxCURSOR_WAIT; + break; + case cursorHoriz: + cursorId = wxCURSOR_SIZEWE; + break; + case cursorVert: + cursorId = wxCURSOR_SIZENS; + break; + case cursorReverseArrow: + //ERAN - BEGIN + cursorId = wxCURSOR_ARROW; + //END - END + break; + case cursorHand: + cursorId = wxCURSOR_HAND; + break; + default: + cursorId = wxCURSOR_ARROW; + break; + } +#ifdef __WXMOTIF__ + wxCursor wc = wxStockCursor(cursorId) ; +#else + wxCursor wc = wxCursor(cursorId) ; +#endif + if (curs != cursorLast) { + GETWIN(wid)->SetCursor(wc); + cursorLast = curs; + } +} + + +void Window::SetTitle (const char *s) +{ + GETWIN(wid)->SetLabel (sci2wx(s)); +} + +PRectangle Window::GetMonitorRect(Point pt) +{ + return PRectangle(); +} + +#ifdef SCI_NAMESPACE +} +#endif + +//---------------------------------------------------------------------- +// Helper classes for ListBox + + +// This is a simple subclass of wxListView that just resets focus to the +// parent when it gets it. +class wxSCIListBox : public wxListView +{ +public: + wxSCIListBox (wxWindow* parent, wxWindowID id, + const wxPoint& pos, const wxSize& size, + long style) : wxListView() { +#ifdef __WXMSW__ + Hide(); // don't flicker as we move it around... +#endif + Create(parent, id, pos, size, style); + } + + void OnFocus(wxFocusEvent& event) { + GetParent()->SetFocus(); + event.Skip(); + } + + void OnKillFocus(wxFocusEvent& WXUNUSED(event)) { + // Do nothing. Prevents base class from resetting the colors... + } + +#ifdef __WXMAC__ + // For some reason I don't understand yet the focus doesn't really leave + // the listbox like it should, so if we get any events feed them back to + // the wxSintilla + void OnKeyDown(wxKeyEvent& event) { + GetGrandParent()->GetEventHandler()->ProcessEvent(event); + } + void OnChar(wxKeyEvent& event) { + GetGrandParent()->GetEventHandler()->ProcessEvent(event); + } + + // And we need to force the focus back when being destroyed + ~wxSCIListBox() { + GetGrandParent()->SetFocus(); + } +#endif + +private: + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxSCIListBox, wxListView) + EVT_SET_FOCUS( wxSCIListBox::OnFocus) + EVT_KILL_FOCUS(wxSCIListBox::OnKillFocus) + #ifdef __WXMAC__ + EVT_KEY_DOWN( wxSCIListBox::OnKeyDown) + EVT_CHAR( wxSCIListBox::OnChar) + #endif +END_EVENT_TABLE() + + +#if wxUSE_POPUPWIN //----------------------------------- +#include + +// TODO: Refactor these two classes to have a common base (or a mix-in) to get +// rid of the code duplication. (Either that or convince somebody to +// implement wxPopupWindow for the Mac!!) +// +// In the meantime, be careful to duplicate any changes as needed... + +// A popup window to place the wxSCIListBox upon +class wxSCIListBoxWin : public wxPopupWindow +{ +private: + wxListView* lv; + CallBackAction doubleClickAction; + void* doubleClickActionData; +public: + wxSCIListBoxWin(wxWindow* parent, wxWindowID id, Point WXUNUSED(location)) : + wxPopupWindow(parent, wxBORDER_NONE) { + SetBackgroundColour(*wxBLACK); // for our simple border + + lv = new wxSCIListBox(parent, id, wxDefaultPosition, wxDefaultSize, + wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_NO_HEADER | wxBORDER_NONE); + lv->SetCursor(wxCursor(wxCURSOR_ARROW)); + lv->InsertColumn(0, wxEmptyString); + lv->InsertColumn(1, wxEmptyString); + + // NOTE: We need to fool the wxListView into thinking that it has the + // focus so it will use the normal selection colour and will look + // "right" to the user. But since the wxPopupWindow or its children + // can't receive focus then we have to pull a fast one and temporarily + // parent the listctrl on the STC window and then call SetFocus and + // then reparent it back to the popup. + lv->SetFocus(); + lv->Reparent(this); +#ifdef __WXMSW__ + lv->Show(); +#endif + } + + + // Set position in client coords + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO) { +#if !wxCHECK_VERSION(2, 5, 0) + if (x != -1) { +#else + if (x != wxDefaultCoord) { +#endif + GetParent()->ClientToScreen(&x, NULL); + } +#if !wxCHECK_VERSION(2, 5, 0) + if (y != -1) { +#else + if (y != wxDefaultCoord) { +#endif + GetParent()->ClientToScreen(NULL, &y); + } + wxPopupWindow::DoSetSize(x, y, width, height, sizeFlags); + } + + // return position as if it were in client coords + virtual void DoGetPosition( int *x, int *y ) const { + int sx, sy; + wxPopupWindow::DoGetPosition(&sx, &sy); + GetParent()->ScreenToClient(&sx, &sy); + if (x) *x = sx; + if (y) *y = sy; + } + + + bool Destroy() { + if ( !wxPendingDelete.Member(this) ) + wxPendingDelete.Append(this); + return true; + } + + + int IconWidth() { + wxImageList* il = lv->GetImageList(wxIMAGE_LIST_SMALL); + if (il != NULL) { + int w, h; + il->GetSize(0, w, h); + return w; + } + return 0; + } + + + void SetDoubleClickAction(CallBackAction action, void *data) { + doubleClickAction = action; + doubleClickActionData = data; + } + + + void OnFocus(wxFocusEvent& event) { + GetParent()->SetFocus(); + event.Skip(); + } + + void OnSize(wxSizeEvent& event) { + // resize the child + wxSize sz = GetSize(); + sz.x -= 2; + sz.y -= 2; + lv->SetSize(1, 1, sz.x, sz.y); + // reset the column widths + lv->SetColumnWidth(0, IconWidth()+4); + lv->SetColumnWidth(1, sz.x - 2 - lv->GetColumnWidth(0) - + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X)); + event.Skip(); + } + + void OnActivate(wxListEvent& WXUNUSED(event)) { + doubleClickAction(doubleClickActionData); + } + + wxListView* GetLB() { + return lv; + } + +private: + DECLARE_EVENT_TABLE() + +}; + +BEGIN_EVENT_TABLE(wxSCIListBoxWin, wxPopupWindow) + EVT_SET_FOCUS ( wxSCIListBoxWin::OnFocus) + EVT_SIZE ( wxSCIListBoxWin::OnSize) + EVT_LIST_ITEM_ACTIVATED(wxID_ANY, wxSCIListBoxWin::OnActivate) +END_EVENT_TABLE() + +#else // wxUSE_POPUPWIN ----------------------------------- + +// A normal window to place the wxSCIListBox upon. +class wxSCIListBoxWin : public wxWindow +{ +private: + wxListView* lv; + CallBackAction doubleClickAction; + void* doubleClickActionData; +public: + wxSCIListBoxWin(wxWindow* parent, wxWindowID id, Point location) : + wxWindow(parent, id, wxPoint(location.x, location.y), wxSize(0,0), wxSIMPLE_BORDER) { + + lv = new wxSCIListBox(this, id, wxDefaultPosition, wxDefaultSize, + wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_NO_HEADER | wxNO_BORDER); + lv->SetCursor(wxCursor(wxCURSOR_ARROW)); + lv->InsertColumn(0, wxEmptyString); + lv->InsertColumn(1, wxEmptyString); + + // Eventhough we immediately reset the focus to the parent, this helps + // things to look right... + lv->SetFocus(); + + Hide(); + } + + + // On OSX and (possibly others) there can still be pending + // messages/events for the list control when Scintilla wants to + // close it, so do a pending delete of it instead of destroying + // immediately. + bool Destroy() { +#ifdef __WXMAC__ + // The bottom edge of this window is not getting properly + // refreshed upon deletion, so help it out... + wxWindow* p = GetParent(); + wxRect r(GetPosition(), GetSize()); + r.SetHeight(r.GetHeight()+1); + p->Refresh(false, &r); +#endif + if ( !wxPendingDelete.Member(this) ) + wxPendingDelete.Append(this); + return true; + } + + + int IconWidth() { + wxImageList* il = lv->GetImageList(wxIMAGE_LIST_SMALL); + if (il != NULL) { + int w, h; + il->GetSize(0, w, h); + return w; + } + return 0; + } + + + void SetDoubleClickAction(CallBackAction action, void *data) { + doubleClickAction = action; + doubleClickActionData = data; + } + + + void OnFocus(wxFocusEvent& event) { + GetParent()->SetFocus(); + event.Skip(); + } + + void OnSize(wxSizeEvent& event) { + // resize the child + wxSize sz = GetClientSize(); + lv->SetSize(sz); + // reset the column widths + lv->SetColumnWidth(0, IconWidth()+4); + lv->SetColumnWidth(1, sz.x - 2 - lv->GetColumnWidth(0) - + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X)); + event.Skip(); + } + +#ifdef __WXMAC__ + virtual bool Show(bool show = true) { + bool rv = wxWindow::Show(show); + GetParent()->Refresh(false); + return rv; + } +#endif + + void OnActivate(wxListEvent& WXUNUSED(event)) { + doubleClickAction(doubleClickActionData); + } + + wxListView* GetLB() { + return lv; + } + +private: + DECLARE_EVENT_TABLE() +}; + + +BEGIN_EVENT_TABLE(wxSCIListBoxWin, wxWindow) + EVT_SET_FOCUS ( wxSCIListBoxWin::OnFocus) + EVT_SIZE ( wxSCIListBoxWin::OnSize) + EVT_LIST_ITEM_ACTIVATED(wxID_ANY, wxSCIListBoxWin::OnActivate) +END_EVENT_TABLE() + +#endif // wxUSE_POPUPWIN ----------------------------------- + +inline wxSCIListBoxWin* GETLBW(WindowID win) { + return ((wxSCIListBoxWin*)win); +} + +inline wxListView* GETLB(WindowID win) { + return GETLBW(win)->GetLB(); +} + +//---------------------------------------------------------------------- + +class ListBoxImpl : public ListBox +{ +private: + int lineHeight; + bool unicodeMode; + int desiredVisibleRows; + int aveCharWidth; + size_t maxStrWidth; + Point location; // Caret location at which the list is opened + wxImageList* imgList; + wxArrayInt* imgTypeMap; + +public: + ListBoxImpl(); + ~ListBoxImpl(); + + virtual void SetFont(Font &font); + virtual void Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_); + virtual void SetAverageCharWidth(int width); + virtual void SetVisibleRows(int rows); + virtual int GetVisibleRows() const; + virtual PRectangle GetDesiredRect(); + virtual int CaretFromEdge(); + virtual void Clear(); + virtual void Append(char *s, int type = -1); + virtual void Append(const wxString& text, int type); + virtual int Length(); + virtual void Select(int n); + virtual int GetSelection(); + virtual int Find(const char *prefix); + virtual void GetValue(int n, char *value, int len); + virtual void RegisterImage(int type, const char *xpm_data); + virtual void ClearRegisteredImages(); + virtual void SetDoubleClickAction(CallBackAction, void *); + virtual void SetList(const char* list, char separator, char typesep); +}; + + +ListBoxImpl::ListBoxImpl() + : lineHeight(10), unicodeMode(false), + desiredVisibleRows(5), aveCharWidth(8), maxStrWidth(0), + imgList(NULL), imgTypeMap(NULL) { +} + +ListBoxImpl::~ListBoxImpl() { + if (imgList) { + delete imgList; + imgList = NULL; + } + if (imgTypeMap) { + delete imgTypeMap; + imgTypeMap = NULL; + } +} + + +void ListBoxImpl::SetFont(Font &font) { + GETLB(wid)->SetFont(*((wxFont*)font.GetID())); +} + + +void ListBoxImpl::Create (Window &parent, int ctrlID, Point location_, + int lineHeight_, bool unicodeMode_) { + lineHeight = lineHeight_; + unicodeMode = unicodeMode_; + maxStrWidth = 0; + wid = new wxSCIListBoxWin (GETWIN(parent.GetID()), ctrlID, location_); + if (imgList != NULL) GETLB(wid)->SetImageList (imgList, wxIMAGE_LIST_SMALL); +} + + +void ListBoxImpl::SetAverageCharWidth(int width) { + aveCharWidth = width; +} + + +void ListBoxImpl::SetVisibleRows(int rows) { + desiredVisibleRows = rows; +} + + +int ListBoxImpl::GetVisibleRows() const { + return desiredVisibleRows; +} + + +PRectangle ListBoxImpl::GetDesiredRect() { + // wxListCtrl doesn't have a DoGetBestSize, so instead we kept track of + // the max size in Append and calculate it here... + int maxw = maxStrWidth * aveCharWidth; + int maxh ; + + // give it a default if there are no lines, and/or add a bit more + if (maxw == 0) maxw = 100; + maxw += aveCharWidth * 3 + + GETLBW(wid)->IconWidth() + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); + if (maxw > 600) + maxw = 600; + + // estimate a desired height + int count = GETLB(wid)->GetItemCount(); + if (count) { + wxRect rect; + GETLB(wid)->GetItemRect(0, rect); + maxh = count * rect.GetHeight(); + if (maxh > 140) // TODO: Use desiredVisibleRows?? + maxh = 140; + + // Try to make the size an exact multiple of some number of lines + int lines = maxh / rect.GetHeight(); + maxh = (lines + 1) * rect.GetHeight() + 2; + } else + maxh = 100; + + PRectangle rc; + rc.top = 0; + rc.left = 0; + rc.right = maxw; + rc.bottom = maxh; + return rc; +} + + +int ListBoxImpl::CaretFromEdge() { + return 4 + GETLBW(wid)->IconWidth(); +} + + +void ListBoxImpl::Clear() { + GETLB(wid)->DeleteAllItems(); +} + + +void ListBoxImpl::Append(char *s, int type) { + Append(sci2wx(s), type); +} +void ListBoxImpl::Append(const wxString& text, int type) { + long count = GETLB(wid)->GetItemCount(); + long itemID = GETLB(wid)->InsertItem(count, wxEmptyString); + GETLB(wid)->SetItem(itemID, 1, text); + maxStrWidth = wxMax(maxStrWidth, text.length()); + if (type != -1) { + wxCHECK_RET(imgTypeMap, wxT("Unexpected NULL imgTypeMap")); + long idx = imgTypeMap->Item(type); + GETLB(wid)->SetItemImage(itemID, idx, idx); + } +} + + +int ListBoxImpl::Length() { + return GETLB(wid)->GetItemCount(); +} + + +void ListBoxImpl::Select(int n) { + bool select = true; + if (n == -1) { + n = 0; + select = false; + } + GETLB(wid)->Focus(n); + GETLB(wid)->Select(n, select); +} + + +int ListBoxImpl::GetSelection() { + return GETLB(wid)->GetFirstSelected(); +} + + +int ListBoxImpl::Find(const char *WXUNUSED(prefix)) { + // No longer used + return wxNOT_FOUND; +} + + +void ListBoxImpl::GetValue(int n, char *value, int len) { + wxListItem item; + item.SetId(n); + item.SetColumn(1); + item.SetMask(wxLIST_MASK_TEXT); + GETLB(wid)->GetItem(item); + strncpy(value, wx2sci(item.GetText()), len); + value[len-1] = '\0'; +} + + +void ListBoxImpl::RegisterImage(int type, const char *xpm_data) { + wxMemoryInputStream stream(xpm_data, strlen(xpm_data)+1); + wxImage img(stream, wxBITMAP_TYPE_XPM); + wxBitmap bmp(img); + + if (! imgList) { + // assumes all images are the same size + imgList = new wxImageList(bmp.GetWidth(), bmp.GetHeight(), true); + imgTypeMap = new wxArrayInt; + } + + int idx = imgList->Add(bmp); + + // do we need to extend the mapping array? + wxArrayInt& itm = *imgTypeMap; + if ( itm.GetCount() < (size_t)type+1) + itm.Add(-1, type - itm.GetCount() + 1); + + // Add an item that maps type to the image index + itm[type] = idx; +} + +void ListBoxImpl::ClearRegisteredImages() { + if (imgList) { + delete imgList; + imgList = NULL; + } + if (imgTypeMap) { + delete imgTypeMap; + imgTypeMap = NULL; + } + if (wid) GETLB(wid)->SetImageList(NULL, wxIMAGE_LIST_SMALL); +} + + +void ListBoxImpl::SetDoubleClickAction(CallBackAction action, void *data) { + GETLBW(wid)->SetDoubleClickAction(action, data); +} + +void ListBoxImpl::SetList(const char* list, char separator, char typesep) { + GETLB(wid)->Freeze(); + Clear(); + wxStringTokenizer tkzr(sci2wx(list), (wxChar)separator); + while (tkzr.HasMoreTokens()) { + wxString token = tkzr.GetNextToken(); + long type = -1; + int pos = token.Find(typesep); + if (pos != -1) { + token.Mid(pos+1).ToLong(&type); + token.Truncate(pos); + } + Append (token, (int)type); + } + GETLB(wid)->Thaw(); +} + + +ListBox::ListBox() { +} + +ListBox::~ListBox() { +} + +ListBox *ListBox::Allocate() { + return new ListBoxImpl(); +} + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +//---------------------------------------------------------------------- + +Menu::Menu() : mid(0) +{ +} + +void Menu::CreatePopUp() +{ + Destroy(); + mid = new wxMenu(); +} + +void Menu::Destroy() +{ + if (mid) + delete (wxMenu*)mid; + mid = 0; +} + +void Menu::Show(Point pt, Window &w) +{ + GETWIN(w.GetID())->PopupMenu((wxMenu*)mid, pt.x - 4, pt.y); + Destroy(); +} + +//---------------------------------------------------------------------- + +DynamicLibrary *DynamicLibrary::Load(const char *WXUNUSED(modulePath)) +{ + wxFAIL_MSG(wxT("Dynamic lexer loading not implemented yet")); + return NULL; +} + +//---------------------------------------------------------------------- + +ColourDesired Platform::Chrome() +{ + wxColour c; + c = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); + return ColourDesired(c.Red(), c.Green(), c.Blue()); +} + +ColourDesired Platform::ChromeHighlight() +{ + wxColour c; + c = wxSystemSettings::GetColour(wxSYS_COLOUR_3DHIGHLIGHT); + return ColourDesired(c.Red(), c.Green(), c.Blue()); +} + +const char *Platform::DefaultFont() +{ + static char buf[128]; + strcpy(buf, wxNORMAL_FONT->GetFaceName().mbc_str()); + return buf; +} + +int Platform::DefaultFontSize() +{ + return wxNORMAL_FONT->GetPointSize(); +} + +unsigned int Platform::DoubleClickTime() +{ + return 500; // **** ::GetDoubleClickTime(); +} + +bool Platform::MouseButtonBounce() +{ + return false; +} +void Platform::DebugDisplay(const char *s) +{ + wxLogDebug(sci2wx(s)); +} + +bool Platform::IsKeyDown(int WXUNUSED(key)) +{ + return false; // I don't think we'll need this. +} + +long Platform::SendScintilla(WindowID w, + unsigned int msg, + unsigned long wParam, + long lParam) +{ + + wxScintilla* sci = (wxScintilla*)w; + return sci->SendMsg(msg, wParam, lParam); +} + +long Platform::SendScintillaPointer(WindowID w, + unsigned int msg, + unsigned long wParam, + void *lParam) +{ + + wxScintilla* sci = (wxScintilla*)w; + return sci->SendMsg(msg, wParam, (long)lParam); +} + + +// These are utility functions not really tied to a platform + +int Platform::Minimum(int a, int b) +{ + if (a < b) + return a; + else + return b; +} + +int Platform::Maximum(int a, int b) +{ + if (a > b) + return a; + else + return b; +} + +#define TRACE + +void Platform::DebugPrintf(const char *format, ...) +{ +#ifdef TRACE + char buffer[2000]; + va_list pArguments; + va_start(pArguments, format); + vsprintf(buffer,format,pArguments); + va_end(pArguments); + Platform::DebugDisplay(buffer); +#endif +} + + +static bool assertionPopUps = true; + +bool Platform::ShowAssertionPopUps(bool assertionPopUps_) +{ + bool ret = assertionPopUps; + assertionPopUps = assertionPopUps_; + return ret; +} + +void Platform::Assert(const char *c, const char *file, int line) +{ + char buffer[2000]; + sprintf(buffer, "Assertion [%s] failed at %s %d", c, file, line); + if (assertionPopUps) { + /*int idButton = */ + wxMessageBox(sci2wx(buffer), + wxT("Assertion failure"), + wxICON_HAND | wxOK); +// if (idButton == IDRETRY) { +// ::DebugBreak(); +// } else if (idButton == IDIGNORE) { +// // all OK +// } else { +// abort(); +// } + } else { + strcat(buffer, "\r\n"); + Platform::DebugDisplay(buffer); + abort(); + } +} + + +int Platform::Clamp(int val, int minVal, int maxVal) +{ + if (val > maxVal) + val = maxVal; + if (val < minVal) + val = minVal; + return val; +} + + +bool Platform::IsDBCSLeadByte(int WXUNUSED(codePage), char WXUNUSED(ch)) +{ + return false; +} + +int Platform::DBCSCharLength(int WXUNUSED(codePage), const char *WXUNUSED(s)) +{ + return 1; +} + +int Platform::DBCSCharMaxLength() +{ + return 1; +} + +ElapsedTime::ElapsedTime() +{ + wxLongLong localTime = wxGetLocalTimeMillis(); + littleBit = localTime.GetLo(); + bigBit = localTime.GetHi(); +} + +double ElapsedTime::Duration(bool reset) +{ + wxLongLong prevTime(bigBit, littleBit); + wxLongLong localTime = wxGetLocalTimeMillis(); + if (reset) { + littleBit = localTime.GetLo(); + bigBit = localTime.GetHi(); + } + wxLongLong duration = localTime - prevTime; + double result = duration.ToDouble(); + result /= 1000.0; + return result; +} +#ifdef SCI_NAMESPACE +} // end namespace Scintilla +#endif +//---------------------------------------------------------------------- + +#if wxUSE_UNICODE + +#include "UniConversion.h" + +wxString sci2wx(const char* str, size_t len) { + if (!len) + return wxEmptyString; + + size_t wclen = UCS2Length(str, len); + wxWCharBuffer buffer(wclen+1); + + size_t actualLen = UCS2FromUTF8(str, len, buffer.data(), wclen+1); + return wxString(buffer.data(), actualLen); +} +#endif +//---------------------------------------------------------------------- diff --git a/sdk/wxscintilla/src/PlatWX.h b/sdk/wxscintilla/src/PlatWX.h new file mode 100644 index 0000000..a7c9102 --- /dev/null +++ b/sdk/wxscintilla/src/PlatWX.h @@ -0,0 +1,14 @@ +#ifndef PLATWX_H // [CHANGED] +#define PLATWX_H // [CHANGED] + +#ifdef SCI_NAMESPACE +namespace Scintilla +{ +#endif +wxRect wxRectFromPRectangle(PRectangle prc); +PRectangle PRectangleFromwxRect(wxRect rc); +wxColour wxColourFromCA(const ColourAllocated& ca); +#ifdef SCI_NAMESPACE +} +#endif +#endif // [CHANGED] diff --git a/sdk/wxscintilla/src/ScintillaWX.cpp b/sdk/wxscintilla/src/ScintillaWX.cpp new file mode 100644 index 0000000..599f902 --- /dev/null +++ b/sdk/wxscintilla/src/ScintillaWX.cpp @@ -0,0 +1,1359 @@ +//////////////////////////////////////////////////////////////////////////// +// Name: ScintillaWX.cxx +// Purpose: A wxWidgets implementation of Scintilla. A class derived +// from ScintillaBase that uses the "wx platform" defined in +// PlatformWX.cxx This class is one end of a bridge between +// the wx world and the Scintilla world. It needs a peer +// object of type wxScintilla to function. +// +// Author: Robin Dunn +// +// Created: 13-Jan-2000 +// RCS-ID: $Id: ScintillaWX.cpp,v 1.26 2006/09/22 19:42:14 wyo Exp $ +// Copyright: (c) 2000 by Total Control Software +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +#include "ScintillaWX.h" +//?#include "ExternalLexer.h" +#include "PlatWX.h" +#include "wx/wxscintilla.h" +#include +#ifdef __WXMSW__ +#include // GetHwndOf() +#endif + +#ifdef SCI_NAMESPACE // begin [CHANGED] +using namespace Scintilla; +#endif // end [CHANGED] + +//---------------------------------------------------------------------- +// Helper classes + +class wxSCITimer : public wxTimer { +public: + wxSCITimer(ScintillaWX* swx) { + this->swx = swx; + } + + void Notify() { + swx->DoTick(); + } + +private: + ScintillaWX* swx; +}; + + +#if wxUSE_DRAG_AND_DROP +class wxStartDragTimer : public wxTimer { +public: + wxStartDragTimer(ScintillaWX* swx) { + this->swx = swx; + } + + void Notify() { + swx->DoStartDrag(); + } + +private: + ScintillaWX* swx; +}; + +bool wxSCIDropTarget::OnDropText(wxCoord x, wxCoord y, const wxString& data) { + return swx->DoDropText(x, y, data); +} + +wxDragResult wxSCIDropTarget::OnEnter(wxCoord x, wxCoord y, wxDragResult def) { + return swx->DoDragEnter(x, y, def); +} + +wxDragResult wxSCIDropTarget::OnDragOver(wxCoord x, wxCoord y, wxDragResult def) { + return swx->DoDragOver(x, y, def); +} + +void wxSCIDropTarget::OnLeave() { + swx->DoDragLeave(); +} +#endif + + +#if wxUSE_POPUPWIN && wxSCI_USE_POPUP +#include +#define wxSCICallTipBase wxPopupWindow +#define param2 wxBORDER_NONE // popup's 2nd param is flags +#else +#define wxSCICallTipBase wxWindow +#define param2 -1 // wxWindow's 2nd param is ID +#endif + +#include + +class wxSCICallTip : public wxSCICallTipBase { +public: + wxSCICallTip(wxWindow* parent, CallTip* ct, ScintillaWX* swx) + : wxSCICallTipBase(parent, param2), + m_ct(ct), m_swx(swx), m_cx(-1), m_cy(-1) { + } + + ~wxSCICallTip() { +#if wxUSE_POPUPWIN && wxSCI_USE_POPUP && defined(__WXGTK__) + wxRect rect = GetRect(); + rect.x = m_cx; + rect.y = m_cy; + GetParent()->Refresh(false, &rect); +#endif + } + + bool AcceptsFocus() const { + return false; + } + + void OnPaint(wxPaintEvent& WXUNUSED(evt)) { + wxBufferedPaintDC dc(this); + Surface* surfaceWindow = Surface::Allocate(); + surfaceWindow->Init(&dc, m_ct->wDraw.GetID()); + m_ct->PaintCT(surfaceWindow); + surfaceWindow->Release(); + delete surfaceWindow; + } + + void OnFocus(wxFocusEvent& event) { + GetParent()->SetFocus(); + event.Skip(); + } + + void OnLeftDown(wxMouseEvent& event) { + wxPoint pt = event.GetPosition(); + Point p(pt.x, pt.y); + m_ct->MouseClick(p); + m_swx->CallTipClick(); + } + +#if wxUSE_POPUPWIN && wxSCI_USE_POPUP + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO) { + if (x != -1) { + m_cx = x; + GetParent()->ClientToScreen(&x, NULL); + } + if (y != -1) { + m_cy = y; + GetParent()->ClientToScreen(NULL, &y); + } + wxSCICallTipBase::DoSetSize(x, y, width, height, sizeFlags); + } +#endif + + wxPoint GetMyPosition() { + return wxPoint(m_cx, m_cy); + } + +private: + CallTip* m_ct; + ScintillaWX* m_swx; + int m_cx, m_cy; + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxSCICallTip, wxSCICallTipBase) + EVT_PAINT(wxSCICallTip::OnPaint) + EVT_SET_FOCUS(wxSCICallTip::OnFocus) + EVT_LEFT_DOWN(wxSCICallTip::OnLeftDown) +END_EVENT_TABLE() + + +//---------------------------------------------------------------------- + +#if wxUSE_DATAOBJ +static wxTextFileType wxConvertEOLMode(int scintillaMode) { + wxTextFileType type; + + switch (scintillaMode) { + case wxSCI_EOL_CRLF: + type = wxTextFileType_Dos; + break; + + case wxSCI_EOL_CR: + type = wxTextFileType_Mac; + break; + + case wxSCI_EOL_LF: + type = wxTextFileType_Unix; + break; + + default: + type = wxTextBuffer::typeDefault; + break; + } + return type; +} +#endif // wxUSE_DATAOBJ + + +static int wxCountLines(const char* text, int scintillaMode) { + char eolchar; + + switch (scintillaMode) { + case wxSCI_EOL_CRLF: + case wxSCI_EOL_LF: + eolchar = '\n'; + break; + case wxSCI_EOL_CR: + eolchar = '\r'; + break; + default: + return 0; + } + + int count = 0; + int i = 0; + while (text[i] != 0) { + if (text[i] == eolchar) { + count++; + } + i++; + } + + return count; +} + +//---------------------------------------------------------------------- +// Constructor/Destructor + + +ScintillaWX::ScintillaWX(wxScintilla* win) { + capturedMouse = false; + focusEvent = false; + wMain = win; + sci = win; + wheelRotation = 0; + Initialise(); +#ifdef __WXMSW__ +#if wxCHECK_VERSION(2, 5, 0) + sysCaretBitmap = 0; + sysCaretWidth = 0; + sysCaretHeight = 0; +#endif +#endif +#if wxUSE_DRAG_AND_DROP + startDragTimer = new wxStartDragTimer(this); +#endif +} + + +ScintillaWX::~ScintillaWX() { +#if wxUSE_DRAG_AND_DROP + delete startDragTimer; +#endif + Finalise(); +} + +//---------------------------------------------------------------------- +// base class virtuals + + +void ScintillaWX::Initialise() { + //ScintillaBase::Initialise(); +#if wxUSE_DRAG_AND_DROP + dropTarget = new wxSCIDropTarget; + dropTarget->SetScintilla(this); + sci->SetDropTarget(dropTarget); + dragRectangle = false; +#endif +#ifdef __WXMAC__ + vs.extraFontFlag = false; // UseAntiAliasing +#else + vs.extraFontFlag = true; // UseAntiAliasing +#endif +} + + +void ScintillaWX::Finalise() { + ScintillaBase::Finalise(); + SetTicking(false); + SetIdle(false); + DestroySystemCaret(); +} + + +void ScintillaWX::StartDrag() { +#if wxUSE_DRAG_AND_DROP +#if wxVERSION_NUMBER >= 2800 && defined(__WXGTK__) + // For recent wxGTKs, DnD won't work if we delay with the timer, so go there direct + DoStartDrag(); +#else + startDragTimer->Start (200, true); +#endif // wxVERSION_NUMBER >= 2701 && defined(__WXGTK20__) +#endif +} + +void ScintillaWX::DoStartDrag() { +#if wxUSE_DRAG_AND_DROP + wxString dragText = sci2wx (drag.s, drag.len); + + // Send an event to allow the drag text to be changed + wxScintillaEvent evt(wxEVT_SCI_START_DRAG, sci->GetId()); + evt.SetEventObject (sci); + evt.SetDragText (dragText); + evt.SetDragAllowMove (true); + evt.SetPosition (wxMin(sci->GetSelectionStart(), sci->GetSelectionEnd())); + sci->GetEventHandler()->ProcessEvent (evt); + + pdoc->BeginUndoAction(); + dragText = evt.GetDragText(); + dragRectangle = drag.rectangular; + if (dragText.Length()) { + wxDropSource source(sci); + wxTextDataObject data(dragText); + source.SetData(data); + + inDragDrop = ddDragging; + source.DoDragDrop(wxDrag_DefaultMove); + inDragDrop = ddNone; + SetDragPosition (SelectionPosition(invalidPosition)); + } + pdoc->EndUndoAction(); +#endif +} + + +bool ScintillaWX::SetIdle(bool on) { + if (idler.state != on) { + // connect or disconnect the EVT_IDLE handler + if (on) + sci->Connect(wxID_ANY, wxEVT_IDLE, + (wxObjectEventFunction) (wxEventFunction) (wxIdleEventFunction) &wxScintilla::OnIdle); + else + sci->Disconnect(wxID_ANY, wxEVT_IDLE, + (wxObjectEventFunction) (wxEventFunction) (wxIdleEventFunction) &wxScintilla::OnIdle); + idler.state = on; + } + return idler.state; +} + + +void ScintillaWX::SetTicking(bool on) { + wxSCITimer* stiTimer; + if (timer.ticking != on) { + timer.ticking = on; + if (timer.ticking) { + stiTimer = new wxSCITimer(this); + stiTimer->Start(timer.tickSize); + timer.tickerID = stiTimer; + } else { + stiTimer = (wxSCITimer*)timer.tickerID; + stiTimer->Stop(); + delete stiTimer; + timer.tickerID = 0; + } + } + timer.ticksToWait = caret.period; +} + + +void ScintillaWX::SetMouseCapture(bool on) { + if (mouseDownCaptures) { + if (on && !capturedMouse) + sci->CaptureMouse(); + else if (!on && capturedMouse && sci->HasCapture()) + sci->ReleaseMouse(); + capturedMouse = on; + } +} + + +bool ScintillaWX::HaveMouseCapture() { + return capturedMouse; +} + + +void ScintillaWX::ScrollText(int linesToMove) { + int dy = vs.lineHeight * (linesToMove); + sci->ScrollWindow(0, dy); + sci->Update(); +} + +void ScintillaWX::SetVerticalScrollPos() { + if (sci->m_vScrollBar == NULL) { // Use built-in scrollbar + sci->SetScrollPos(wxVERTICAL, topLine); + } else { // otherwise use the one that's been given to us + sci->m_vScrollBar->SetThumbPosition(topLine); + } +} + +void ScintillaWX::SetHorizontalScrollPos() { + if (sci->m_hScrollBar == NULL) { // Use built-in scrollbar + sci->SetScrollPos(wxHORIZONTAL, xOffset); + } else { // otherwise use the one that's been given to us + sci->m_hScrollBar->SetThumbPosition(xOffset); + } +} + + +const int H_SCROLL_STEP = 20; + +bool ScintillaWX::ModifyScrollBars(int nMax, int nPage) { + bool modified = false; + + int vertEnd = nMax; + if (!verticalScrollBarVisible) + vertEnd = 0; + + // Check the vertical scrollbar + if (sci->m_vScrollBar == NULL) { // Use built-in scrollbar + int sbMax = sci->GetScrollRange(wxVERTICAL); + int sbThumb = sci->GetScrollThumb(wxVERTICAL); + int sbPos = sci->GetScrollPos(wxVERTICAL); + if (sbMax != vertEnd || sbThumb != nPage) { + sci->SetScrollbar(wxVERTICAL, sbPos, nPage, vertEnd+1); + modified = true; + } + } else { // otherwise use the one that's been given to us + int sbMax = sci->m_vScrollBar->GetRange(); + int sbPage = sci->m_vScrollBar->GetPageSize(); + int sbPos = sci->m_vScrollBar->GetThumbPosition(); + if (sbMax != vertEnd || sbPage != nPage) { + sci->m_vScrollBar->SetScrollbar(sbPos, nPage, vertEnd+1, nPage); + modified = true; + } + } + + + // Check the horizontal scrollbar + PRectangle rcText = GetTextRectangle(); + int horizEnd = scrollWidth; + if (horizEnd < 0) + horizEnd = 0; + if (!horizontalScrollBarVisible || (wrapState != eWrapNone)) + horizEnd = 0; + int pageWidth = rcText.Width(); + + if (sci->m_hScrollBar == NULL) { // Use built-in scrollbar + int sbMax = sci->GetScrollRange(wxHORIZONTAL); + int sbThumb = sci->GetScrollThumb(wxHORIZONTAL); + int sbPos = sci->GetScrollPos(wxHORIZONTAL); + if ((sbMax != horizEnd) || (sbThumb != pageWidth) || (sbPos != 0)) { + sci->SetScrollbar(wxHORIZONTAL, sbPos, pageWidth, horizEnd); + modified = true; + if (scrollWidth < pageWidth) { + HorizontalScrollTo(0); + } + } + } else { // otherwise use the one that's been given to us + int sbMax = sci->m_hScrollBar->GetRange(); + int sbThumb = sci->m_hScrollBar->GetPageSize(); + int sbPos = sci->m_hScrollBar->GetThumbPosition(); + if ((sbMax != horizEnd) || (sbThumb != pageWidth) || (sbPos != 0)) { + sci->m_hScrollBar->SetScrollbar(sbPos, pageWidth, horizEnd, pageWidth); + modified = true; + if (scrollWidth < pageWidth) { + HorizontalScrollTo(0); + } + } + } + + return modified; +} + + +void ScintillaWX::NotifyChange() { + sci->NotifyChange(); +} + + +void ScintillaWX::NotifyParent(SCNotification scn) { + sci->NotifyParent(&scn); +} + + +// This method is overloaded from ScintillaBase in order to prevent the +// AutoComplete window from being destroyed when it gets the focus. There is +// a side effect that the AutoComp will also not be destroyed when switching +// to another window, but I think that is okay. +void ScintillaWX::CancelModes() { + if (! focusEvent) + AutoCompleteCancel(); + ct.CallTipCancel(); + Editor::CancelModes(); +} + + +void ScintillaWX::Copy() { + if ( !sel.Empty() ) { + SelectionText st; + CopySelectionRange(&st); +#ifdef __WXGTK__ + for(int i=0; i<5; i++) { + //wxPrintf(wxT("Copying to clipboard %ld\n"), i); + CopyToClipboard(st); + } +#else + CopyToClipboard(st); +#endif + } +} + + +void ScintillaWX::Paste() { + pdoc->BeginUndoAction(); + ClearSelection(); + +#if wxUSE_DATAOBJ + wxTextDataObject data; + wxString textString; + + wxWX2MBbuf buf; + int len = 0; + bool rectangular = false; + + wxTheClipboard->UsePrimarySelection(false); + if (wxTheClipboard->Open()) { + wxCustomDataObject selData(wxDataFormat(wxString(wxT("application/x-cbrectdata")))); + bool gotRectData = wxTheClipboard->GetData(selData); + + if (gotRectData && selData.GetSize()>1) { + const char* rectBuf = (const char*)selData.GetData(); + rectangular = rectBuf[0] == (char)1; + len = selData.GetDataSize()-1; + char* buffer = new char[len]; + memcpy (buffer, rectBuf+1, len); + textString = sci2wx(buffer, len); + delete [] buffer; + } else { + bool gotData = wxTheClipboard->GetData(data); + if (gotData) { + textString = wxTextBuffer::Translate (data.GetText(), + wxConvertEOLMode(pdoc->eolMode)); + } + } + data.SetText(wxEmptyString); // free the data object content + wxTheClipboard->Close(); + } + + // Check to see if the Copy() command inserted a '\r\n' at the begining of the textString + bool allowCopyLines(false); + + buf = (wxWX2MBbuf)wx2sci(textString); + len = strlen(buf); + + // Eran: Allow copy-line to be inserted at the begining of the next line instead + // of at the current caret position + if(len > 0 && buf.data()[len-1] == '\n') { + allowCopyLines = true; + } + + int newPos = 0; + int caretMain = sel.MainCaret(); + if (rectangular) { + SelectionPosition selStart = sel.Range(sel.Main()).Start(); + int newLine = pdoc->LineFromPosition (caretMain) + wxCountLines (buf, pdoc->eolMode); + int newCol = pdoc->GetColumn(caretMain); + PasteRectangular (selStart, buf, len); + newPos = pdoc->FindColumn (newLine, newCol); + } else { + bool allowCopyLineSuccess(false); + if(allowCopyLines) { + // copied text ends with \r\n OR \n + int lineNum = pdoc->LineFromPosition(caretMain); + if(lineNum != wxNOT_FOUND) { + int where = pdoc->LineStart(lineNum); + if(where != wxNOT_FOUND) { + pdoc->InsertString(where, buf, len); + newPos = where + len; + + allowCopyLineSuccess = true; + } + } + } + + if(!allowCopyLineSuccess) { + // Simple copy paste block + pdoc->InsertString (caretMain, buf, len); + newPos = caretMain + len; + } + } + SetEmptySelection (newPos); +#endif // wxUSE_DATAOBJ + + pdoc->EndUndoAction(); + NotifyChange(); + Redraw(); +} + + +void ScintillaWX::CopyToClipboard (const SelectionText& st) { +#if wxUSE_CLIPBOARD + wxTheClipboard->UsePrimarySelection(false); + if (wxTheClipboard->Open()) { + wxString text = wxTextBuffer::Translate (sci2wx(st.s, st.len-1)); + + // composite object will hold "plain text" for pasting in other programs and a custom + // object for local use that remembers what kind of selection was made (stream or + // rectangular). + wxDataObjectComposite* obj = new wxDataObjectComposite(); + wxCustomDataObject* rectData = new wxCustomDataObject (wxDataFormat(wxString(wxT("application/x-cbrectdata")))); + + char* buffer = new char[st.len+1]; + buffer[0] = (st.rectangular)? (char)1 : (char)0; + memcpy (buffer+1, st.s, st.len); + rectData->SetData (st.len+1, buffer); + delete [] buffer; + + obj->Add (rectData, true); + obj->Add (new wxTextDataObject (text)); + wxTheClipboard->SetData (obj); + wxTheClipboard->Close(); + } +#else + wxUnusedVar(st); +#endif // wxUSE_CLIPBOARD +} + + +bool ScintillaWX::CanPaste() { + wxTheClipboard->UsePrimarySelection(false); +#if wxUSE_CLIPBOARD + bool canPaste = false; + bool didOpen; + + if (Editor::CanPaste()) { + didOpen = !wxTheClipboard->IsOpened(); + if ( didOpen ) + wxTheClipboard->Open(); + + if (wxTheClipboard->IsOpened()) { + canPaste = wxTheClipboard->IsSupported(wxUSE_UNICODE ? wxDF_UNICODETEXT : wxDF_TEXT); + if (didOpen) + wxTheClipboard->Close(); + } + } + return canPaste; +#else + return false; +#endif // wxUSE_CLIPBOARD +} + +void ScintillaWX::CreateCallTipWindow(PRectangle) { + if (! ct.wCallTip.Created() ) { + ct.wCallTip = new wxSCICallTip(sci, &ct, this); + ct.wDraw = ct.wCallTip; + } +} + + +void ScintillaWX::AddToPopUp(const char *label, int cmd, bool enabled) { + if (!label[0]) + ((wxMenu*)popup.GetID())->AppendSeparator(); + else + ((wxMenu*)popup.GetID())->Append(cmd, wxGetTranslation(sci2wx(label))); + + if (!enabled) + ((wxMenu*)popup.GetID())->Enable(cmd, enabled); +} + +// [CHANGED] +// This is called by the Editor base class whenever something is selected. +// For wxGTK we can put this text in the primary selection and then other apps +// can paste with the middle button. +void ScintillaWX::ClaimSelection() { + +#if defined(__WXGTK__) && wxCHECK_VERSION(2,9,0) + // Put the selected text in the PRIMARY selection + if (!sel.Empty()) { + SelectionText st; + CopySelectionRange(&st); + wxTheClipboard->UsePrimarySelection(true); + if (wxTheClipboard->Open()) { + wxString text = sci2wx(st.s, st.len); + wxTheClipboard->SetData(new wxTextDataObject(text)); + wxTheClipboard->Close(); + } + wxTheClipboard->UsePrimarySelection(false); + } +#endif +} + + +void ScintillaWX::UpdateSystemCaret() { +#ifdef __WXMSW__ + if (hasFocus) { + if (HasCaretSizeChanged()) { + DestroySystemCaret(); + CreateSystemCaret(); + } + Point pos = LocationFromPosition(sel.MainCaret()); +#if wxCHECK_VERSION(2, 5, 0) + ::SetCaretPos(pos.x, pos.y); +#endif + } +#endif +} + + +bool ScintillaWX::HasCaretSizeChanged() { +#ifdef __WXMSW__ +#if !wxCHECK_VERSION(2, 5, 0) + return false; +#else + if (( (0 != vs.caretWidth) && (sysCaretWidth != vs.caretWidth) ) + || (0 != vs.lineHeight) && (sysCaretHeight != vs.lineHeight)) { + return true; + } +#endif +#endif + return false; +} + +bool ScintillaWX::CreateSystemCaret() { +#ifdef __WXMSW__ +#if !wxCHECK_VERSION(2, 5, 0) + return false; +#else + sysCaretWidth = vs.caretWidth; + if (0 == sysCaretWidth) { + sysCaretWidth = 1; + } + sysCaretHeight = vs.lineHeight; + int bitmapSize = (((sysCaretWidth + 15) & ~15) >> 3) * sysCaretHeight; + char *bits = new char[bitmapSize]; + memset(bits, 0, bitmapSize); + sysCaretBitmap = ::CreateBitmap(sysCaretWidth, sysCaretHeight, 1, + 1, reinterpret_cast(bits)); + delete [] bits; + BOOL retval = ::CreateCaret(GetHwndOf(sci), sysCaretBitmap, + sysCaretWidth, sysCaretHeight); + ::ShowCaret(GetHwndOf(sci)); + return retval != 0; +#endif +#else + return false; +#endif +} + +bool ScintillaWX::DestroySystemCaret() { +#ifdef __WXMSW__ +#if !wxCHECK_VERSION(2, 5, 0) + return false; +#else + ::HideCaret(GetHwndOf(sci)); + BOOL retval = ::DestroyCaret(); + if (sysCaretBitmap) { + ::DeleteObject(sysCaretBitmap); + sysCaretBitmap = 0; + } + return retval != 0; +#endif +#else + return false; +#endif +} + + +//---------------------------------------------------------------------- + +long ScintillaWX::DefWndProc(unsigned int /*iMessage*/, unsigned long /*wParam*/, long /*lParam*/) { + return 0; +} + +long ScintillaWX::WndProc(unsigned int iMessage, unsigned long wParam, long lParam) { + switch (iMessage) { + case SCI_CALLTIPSHOWEXT: { + Point pt = LocationFromPosition(wParam); + char* defn = reinterpret_cast(lParam); + AutoCompleteCancel(); + + // If container knows about STYLE_CALLTIP then use it in place of the + // STYLE_DEFAULT for the face name, size and character set. Also use it + // for the foreground and background colour. + int ctStyle = ct.UseStyleCallTip() ? STYLE_CALLTIP : STYLE_DEFAULT; + + PRectangle rc = ct.CallTipStart(sel.MainCaret(), pt, + defn, + vs.styles[ctStyle].fontName, + vs.styles[ctStyle].sizeZoomed, + CodePage(), + vs.styles[ctStyle].characterSet, + wMain); + int tipHeight = rc.Height(); + int tipWidth = rc.Width(); + + // handle the Y axis + int h = rc.Height(); + rc.top = sci->m_ccPoint.y; + rc.bottom = rc.top + h; + + // Adjust the X coordinates of the tip + rc.left = sci->m_ccPoint.x + 250; + rc.right = rc.left + tipWidth; + rc.top = sci->m_ccPoint.y; + rc.bottom = rc.top + tipHeight; + + // If the call-tip window would be out of the client + // space, adjust so it displays above the text. + + // Convert the cilent position to screen position + // and perform all calculations based on screen size + // once done, convert the result back to client coords + static int ww(-1); + static int hh(-1); + if(hh == -1 || ww == -1) + ::wxDisplaySize(&ww, &hh); + + wxRect rr = wxRectFromPRectangle(rc); + wxPoint parentPt = sci->ClientToScreen(rr.GetLeftTop()); + wxPoint parentCCBoxPt = sci->ClientToScreen(sci->m_ccPoint); + + rr.SetTopLeft( parentPt ); + + ///////////////////////////////////////////////////////// + // Adjust the Y axis + ///////////////////////////////////////////////////////// + + if (rr.GetBottom() > hh) { + int offset = (rr.GetBottom()- hh); + rr.y -= offset; + + if(rr.y < 0) { + rr.y = 0; + } + } + + if(rr.GetRight() > ww) { + int fallbackX = rr.x; + rr.x = parentCCBoxPt.x; + rr.x -= tipWidth; + + if(rr.x < 0) { + // moving the tip to the left is not good also + // fallback + rr.x = fallbackX; + } + } + + // Convert the 'rr' into Client Coords + wxPoint clientPt = sci->ScreenToClient(rr.GetTopLeft()); + rr.SetTopLeft( clientPt ); + rc = PRectangle(rr.GetLeft(), rr.GetTop(), rr.GetRight()+1, rr.GetBottom()+1); + + if(sci->m_isTipBgDark) { + ct.colourDoxyHighlight = ColourAllocated( ColourDesired(0, 255, 0).AsLong() ); + ct.colourDivider = ColourAllocated( ColourDesired(255, 255, 255).AsLong() ); + } + + // Now display the window. + CreateCallTipWindow(rc); + ct.wCallTip.SetPositionRelative(rc, wMain); + ct.wCallTip.Show(); + break; + } + case SCI_CALLTIPSHOW: { + // NOTE: This is copied here from scintilla/src/ScintillaBase.cxx + // because of the little tweak that needs done below for wxGTK. + // When updating new versions double check that this is still + // needed, and that any new code there is copied here too. + Point pt = LocationFromPosition(wParam); + char* defn = reinterpret_cast(lParam); + AutoCompleteCancel(); + pt.y += vs.lineHeight; + + int ctStyle = ct.UseStyleCallTip() ? STYLE_CALLTIP : STYLE_DEFAULT; + PRectangle rc = ct.CallTipStart(sel.MainCaret(), pt, + defn, + vs.styles[ctStyle].fontName, + vs.styles[ctStyle].sizeZoomed, + CodePage(), + vs.styles[ctStyle].characterSet, + wMain); + // If the call-tip window would be out of the client + // space, adjust so it displays above the text. + PRectangle rcClient = GetClientRectangle(); + if (rc.bottom > rcClient.bottom) { +#ifdef __WXGTK__ + int offset = int(vs.lineHeight * 1.25) + rc.Height(); +#else + int offset = vs.lineHeight + rc.Height(); +#endif + rc.top -= offset; + rc.bottom -= offset; + } + // Now display the window. + CreateCallTipWindow(rc); + ct.wCallTip.SetPositionRelative(rc, wMain); + ct.wCallTip.Show(); + break; + } + /*? TODO + #ifdef SCI_LEXER + case SCI_LOADLEXERLIBRARY: + LexerManager::GetInstance()->Load((const char*)lParam); + break; + #endif ?*/ + default: + return ScintillaBase::WndProc(iMessage, wParam, lParam); + } + return 0; +} + + + +//---------------------------------------------------------------------- +// Event delegates + +void ScintillaWX::DoPaint(wxDC* dc, wxRect rect) { + + paintState = painting; + Surface* surfaceWindow = Surface::Allocate(); + surfaceWindow->Init(dc, wMain.GetID()); + rcPaint = PRectangleFromwxRect(rect); + PRectangle rcClient = GetClientRectangle(); + paintingAllText = rcPaint.Contains(rcClient); + + ClipChildren(*dc, rcPaint); + Paint(surfaceWindow, rcPaint); + + delete surfaceWindow; + if (paintState == paintAbandoned) { + // Painting area was insufficient to cover new styling or brace + // highlight positions + FullPaint(); + } + paintState = notPainting; +} + + +void ScintillaWX::DoHScroll(int type, int pos) { + int xPos = xOffset; + PRectangle rcText = GetTextRectangle(); + int pageWidth = rcText.Width() * 2 / 3; + if (type == wxEVT_SCROLLWIN_LINEUP || type == wxEVT_SCROLL_LINEUP) + xPos -= H_SCROLL_STEP; + else if (type == wxEVT_SCROLLWIN_LINEDOWN || type == wxEVT_SCROLL_LINEDOWN) + xPos += H_SCROLL_STEP; + else if (type == wxEVT_SCROLLWIN_PAGEUP || type == wxEVT_SCROLL_PAGEUP) + xPos -= pageWidth; + else if (type == wxEVT_SCROLLWIN_PAGEDOWN || type == wxEVT_SCROLL_PAGEDOWN) { + xPos += pageWidth; + if (xPos > scrollWidth - rcText.Width()) { + xPos = scrollWidth - rcText.Width(); + } + } else if (type == wxEVT_SCROLLWIN_TOP || type == wxEVT_SCROLL_TOP) + xPos = 0; + else if (type == wxEVT_SCROLLWIN_BOTTOM || type == wxEVT_SCROLL_BOTTOM) + xPos = scrollWidth; + else if (type == wxEVT_SCROLLWIN_THUMBTRACK || type == wxEVT_SCROLL_THUMBTRACK) + xPos = pos; + + HorizontalScrollTo(xPos); +} + +void ScintillaWX::DoVScroll(int type, int pos) { + int topLineNew = topLine; + if (type == wxEVT_SCROLLWIN_LINEUP || type == wxEVT_SCROLL_LINEUP) + topLineNew -= 1; + else if (type == wxEVT_SCROLLWIN_LINEDOWN || type == wxEVT_SCROLL_LINEDOWN) + topLineNew += 1; + else if (type == wxEVT_SCROLLWIN_PAGEUP || type == wxEVT_SCROLL_PAGEUP) + topLineNew -= LinesToScroll(); + else if (type == wxEVT_SCROLLWIN_PAGEDOWN || type == wxEVT_SCROLL_PAGEDOWN) + topLineNew += LinesToScroll(); + else if (type == wxEVT_SCROLLWIN_TOP || type == wxEVT_SCROLL_TOP) + topLineNew = 0; + else if (type == wxEVT_SCROLLWIN_BOTTOM || type == wxEVT_SCROLL_BOTTOM) + topLineNew = MaxScrollPos(); + else if (type == wxEVT_SCROLLWIN_THUMBTRACK || type == wxEVT_SCROLL_THUMBTRACK) + topLineNew = pos; + + ScrollTo(topLineNew); +} + +void ScintillaWX::DoMouseWheel(int rotation, int delta, + int linesPerAction, int ctrlDown, + bool isPageScroll ) { + int topLineNew = topLine; + int lines; + + if (ctrlDown) { // Zoom the fonts if Ctrl key down + if (rotation < 0) { + KeyCommand(SCI_ZOOMIN); + } else { + KeyCommand(SCI_ZOOMOUT); + } + } else { // otherwise just scroll the window + if ( !delta ) + delta = 120; + wheelRotation += rotation; + lines = wheelRotation / delta; + wheelRotation -= lines * delta; + if (lines != 0) { + if (isPageScroll) + lines = lines * LinesOnScreen(); // lines is either +1 or -1 + else + lines *= linesPerAction; + topLineNew -= lines; + ScrollTo(topLineNew); + } + } +} + + +void ScintillaWX::DoSize(int WXUNUSED(width), int WXUNUSED(height)) { + ChangeSize(); +} + +void ScintillaWX::DoLoseFocus() { + focusEvent = true; + SetFocusState(false); + focusEvent = false; + DestroySystemCaret(); +} + +void ScintillaWX::DoGainFocus() { + focusEvent = true; + SetFocusState(true); + focusEvent = false; + DestroySystemCaret(); + CreateSystemCaret(); +} + +void ScintillaWX::DoSysColourChange() { + InvalidateStyleData(); +} + +void ScintillaWX::DoLeftButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) { + ButtonDown(pt, curTime, shift, ctrl, alt); +} + +void ScintillaWX::DoLeftButtonUp(Point pt, unsigned int curTime, bool ctrl) { + ButtonUp(pt, curTime, ctrl); +#if wxUSE_DRAG_AND_DROP + if (startDragTimer->IsRunning()) { + startDragTimer->Stop(); + SetDragPosition(SelectionPosition(invalidPosition)); + SetEmptySelection(PositionFromLocation(pt)); + ShowCaretAtCurrentPosition(); + } +#endif +} + +void ScintillaWX::DoLeftButtonMove(Point pt) { + ButtonMove(pt); +} + +#ifdef __WXGTK__ +void ScintillaWX::DoMiddleButtonUp(Point pt) { + // Set the current position to the mouse click point and + // then paste in the PRIMARY selection, if any. wxGTK only. + int newPos = PositionFromLocation(pt); + MovePositionTo(newPos, Selection::noSel, true); + + pdoc->BeginUndoAction(); + wxTextDataObject data; + bool gotData = false; + wxTheClipboard->UsePrimarySelection(true); + if (wxTheClipboard->Open()) { + gotData = wxTheClipboard->GetData(data); + wxTheClipboard->Close(); + } + wxTheClipboard->UsePrimarySelection(false); + if (gotData) { + wxString text = wxTextBuffer::Translate (data.GetText(), + wxConvertEOLMode(pdoc->eolMode)); + data.SetText(wxEmptyString); // free the data object content + wxWX2MBbuf buf = (wxWX2MBbuf)wx2sci(text); + int len = strlen(buf); + pdoc->InsertString(sel.MainCaret(), buf, len); + SetEmptySelection(sel.MainCaret() + len); + } + pdoc->EndUndoAction(); + NotifyChange(); + Redraw(); + + ShowCaretAtCurrentPosition(); + EnsureCaretVisible(); +} +#else +void ScintillaWX::DoMiddleButtonUp(Point WXUNUSED(pt)) { +} +#endif + + +void ScintillaWX::DoAddChar(int key) { +#if wxUSE_UNICODE + wxChar wszChars[2]; + wszChars[0] = (wxChar)key; + wszChars[1] = 0; + wxWX2MBbuf buf = (wxWX2MBbuf)wx2sci(wszChars); + AddCharUTF((char*)buf.data(), strlen(buf)); +#else + AddChar((char)key); +#endif +} + + +int ScintillaWX::DoKeyDown(const wxKeyEvent& evt, bool* consumed) { + int key = evt.GetKeyCode(); + bool shift = evt.ShiftDown(), + ctrl = evt.ControlDown(), + alt = evt.AltDown(); + + if (ctrl && key >= 1 && key <= 26 && key != WXK_BACK) + key += 'A' - 1; + + switch (key) { + case WXK_DOWN: // fall through + case WXK_NUMPAD_DOWN: + key = SCK_DOWN; + break; + case WXK_UP: // fall through + case WXK_NUMPAD_UP: + key = SCK_UP; + break; + case WXK_LEFT: // fall through + case WXK_NUMPAD_LEFT: + key = SCK_LEFT; + break; + case WXK_RIGHT: // fall through + case WXK_NUMPAD_RIGHT: + key = SCK_RIGHT; + break; + case WXK_HOME: // fall through + case WXK_NUMPAD_HOME: + key = SCK_HOME; + break; + case WXK_END: // fall through + case WXK_NUMPAD_END: + key = SCK_END; + break; +#if !wxCHECK_VERSION(2, 7, 0) + case WXK_PRIOR: // fall through + case WXK_NUMPAD_PRIOR: // fall through +#endif + case WXK_PAGEUP: // fall through + case WXK_NUMPAD_PAGEUP: + key = SCK_PRIOR; + break; +#if !wxCHECK_VERSION(2, 7, 0) + case WXK_NEXT: // fall through + case WXK_NUMPAD_NEXT: // fall through +#endif + case WXK_PAGEDOWN: // fall through + case WXK_NUMPAD_PAGEDOWN: + key = SCK_NEXT; + break; + //Eran - BEGIN + case WXK_NUMPAD_DELETE: //fall through + //Eran - END + case WXK_DELETE: + key = SCK_DELETE; + break; + + //Eran - BEGIN + case WXK_NUMPAD_INSERT://fall through + //Eran - END + case WXK_INSERT: + key = SCK_INSERT; + break; + case WXK_ESCAPE: + key = SCK_ESCAPE; + break; + case WXK_BACK: + key = SCK_BACK; + break; + case WXK_TAB: + key = SCK_TAB; + break; + case WXK_RETURN: // fall through + case WXK_NUMPAD_ENTER: + key = SCK_RETURN; + break; + case WXK_ADD: // fall through + case WXK_NUMPAD_ADD: + key = SCK_ADD; + break; + case WXK_SUBTRACT: // fall through + case WXK_NUMPAD_SUBTRACT: + key = SCK_SUBTRACT; + break; + case WXK_DIVIDE: // fall through + case WXK_NUMPAD_DIVIDE: + key = SCK_DIVIDE; + break; + case WXK_CONTROL: + key = 0; + break; + case WXK_ALT: + key = 0; + break; + case WXK_SHIFT: + key = 0; + break; + case WXK_MENU: + key = 0; + break; + } + +#ifdef __WXMAC__ + if ( evt.MetaDown() ) { + // check for a few common Mac Meta-key combos and remap them to Ctrl + // for Scintilla + switch ( key ) { + case 'Z': // Undo + case 'X': // Cut + case 'C': // Copy + case 'V': // Paste + case 'A': // Select All + ctrl = true; + break; + } + } +#endif + + int rv = KeyDown(key, shift, ctrl, alt, consumed); + + if (key) + return rv; + else + return 1; +} + + +void ScintillaWX::DoCommand(int ID) { + Command(ID); +} + + +void ScintillaWX::DoContextMenu(Point pt) { + if (displayPopupMenu) + ContextMenu(pt); +} + +void ScintillaWX::DoOnListBox() { + AutoCompleteCompleted(); +} + + +void ScintillaWX::DoOnIdle(wxIdleEvent& evt) { + + if ( Idle() ) + evt.RequestMore(); + else + SetIdle(false); +} + +//---------------------------------------------------------------------- + +#if wxUSE_DRAG_AND_DROP +bool ScintillaWX::DoDropText(long x, long y, const wxString& data) { + SetDragPosition(SelectionPosition(invalidPosition)); + + wxString text = wxTextBuffer::Translate (data, wxConvertEOLMode(pdoc->eolMode)); + + // Send an event to allow the drag details to be changed + wxScintillaEvent evt(wxEVT_SCI_DO_DROP, sci->GetId()); + evt.SetEventObject(sci); + evt.SetDragResult(dragResult); + evt.SetX(x); + evt.SetY(y); + evt.SetPosition(PositionFromLocation(Point(x,y))); + evt.SetDragText(text); + sci->GetEventHandler()->ProcessEvent(evt); + + dragResult = evt.GetDragResult(); + if (dragResult == wxDragMove || dragResult == wxDragCopy) { + DropAt( SelectionPosition(evt.GetPosition()), + wx2sci(evt.GetDragText()), + dragResult == wxDragMove, + dragRectangle); + return true; + } + return false; +} + + +wxDragResult ScintillaWX::DoDragEnter(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), wxDragResult def) { + dragResult = def; + return dragResult; +} + + +wxDragResult ScintillaWX::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) { + SetDragPosition(SelectionPosition( PositionFromLocation(Point(x, y)) ) ); + + // Send an event to allow the drag result to be changed + wxScintillaEvent evt(wxEVT_SCI_DRAG_OVER, sci->GetId()); + evt.SetEventObject(sci); + evt.SetDragResult(def); + evt.SetX(x); + evt.SetY(y); + evt.SetPosition(PositionFromLocation(Point(x,y))); + sci->GetEventHandler()->ProcessEvent(evt); + + dragResult = evt.GetDragResult(); + return dragResult; +} + + +void ScintillaWX::DoDragLeave() { + SetDragPosition(SelectionPosition(invalidPosition)); +} +#endif +//---------------------------------------------------------------------- + +// Force the whole window to be repainted +void ScintillaWX::FullPaint() { +#ifndef __WXMAC__ + sci->Refresh(false); +#endif + sci->Update(); +} + + +void ScintillaWX::DoScrollToLine(int line) { + ScrollTo(line); +} + + +void ScintillaWX::DoScrollToColumn(int column) { + HorizontalScrollTo(column * vs.spaceWidth); +} + +#ifdef __WXGTK__ +void ScintillaWX::ClipChildren(wxDC& dc, PRectangle rect) { +// wxGTK > 2.5 doesn't appear to need this explicit clipping code any longer +#if !wxCHECK_VERSION(2, 5, 0) + wxRegion rgn(wxRectFromPRectangle(rect)); + if (ac.Active()) { + wxRect childRect = ((wxWindow*)ac.lb->GetID())->GetRect(); + rgn.Subtract(childRect); + } + if (ct.inCallTipMode) { + wxSCICallTip* tip = (wxSCICallTip*)ct.wCallTip.GetID(); + wxRect childRect = tip->GetRect(); +#if wxUSE_POPUPWIN && wxSCI_USE_POPUP + childRect.SetPosition(tip->GetMyPosition()); +#endif + rgn.Subtract(childRect); + } + + dc.SetClippingRegion(rgn); +#endif +} +#else +void ScintillaWX::ClipChildren(wxDC& WXUNUSED(dc), PRectangle WXUNUSED(rect)) { +} +#endif + + +void ScintillaWX::SetUseAntiAliasing(bool useAA) { + vs.extraFontFlag = useAA; + InvalidateStyleRedraw(); +} + +bool ScintillaWX::GetUseAntiAliasing() { + return vs.extraFontFlag; +} + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- diff --git a/sdk/wxscintilla/src/ScintillaWX.h b/sdk/wxscintilla/src/ScintillaWX.h new file mode 100644 index 0000000..2aef4a5 --- /dev/null +++ b/sdk/wxscintilla/src/ScintillaWX.h @@ -0,0 +1,214 @@ +//////////////////////////////////////////////////////////////////////////// +// Name: ScintillaWX.h +// Purpose: A wxWidgets implementation of Scintilla. A class derived +// from ScintillaBase that uses the "wx platform" defined in +// PlatWX.cpp. This class is one end of a bridge between +// the wx world and the Scintilla world. It needs a peer +// object of type wxScintilla to function. +// +// Author: Robin Dunn +// +// Created: 13-Jan-2000 +// RCS-ID: $Id: ScintillaWX.h,v 1.9 2006/06/06 19:16:25 wyo Exp $ +// Copyright: (c) 2000 by Total Control Software +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +#ifndef __ScintillaWX_h__ +#define __ScintillaWX_h__ +// [CHANGED] BEGIN +#include +#include +#include +#include +#include +#include "Platform.h" +#include "SplitVector.h" +#include "Partitioning.h" +#include "RunStyles.h" +#include "Scintilla.h" +#include "ScintillaWidget.h" +#ifdef SCI_LEXER +#include "SciLexer.h" +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#endif +#include "ContractionState.h" +#include "SVector.h" +#include "CellBuffer.h" +#include "CallTip.h" +#include "KeyMap.h" +#include "Indicator.h" +#include "XPM.h" +#include "LineMarker.h" +#include "Style.h" +#include "AutoComplete.h" +#include "ViewStyle.h" +#include "CharClassify.h" +#include "Decoration.h" +#include "Document.h" +#include "Selection.h" +#include "PositionCache.h" +#include "Editor.h" +#include "SString.h" +#include "PropSetSimple.h" +#include "ScintillaBase.h" +#include +#include +#include +#include +// [CHANGED] END + +#ifdef WXMAKINGDLL_SCI + #define WXDLLIMPEXP_SCI WXEXPORT +#elif defined(WXUSINGDLL_SCI) + #define WXDLLIMPEXP_SCI WXIMPORT +#else // not making nor using DLL + #define WXDLLIMPEXP_SCI +#endif + +class WXDLLIMPEXP_SCI wxScintilla; // forward +class ScintillaWX; + +#ifndef SCI_SCOPE // begin [CHANGED] + #ifdef SCI_NAMESPACE + #define SCI_SCOPE( x ) Scintilla::x + #else + #define SCI_SCOPE( x ) x + #endif +#endif // end [CHANGED] +//---------------------------------------------------------------------- +// Helper classes + +#if wxUSE_DRAG_AND_DROP +class wxSCIDropTarget : public wxTextDropTarget { +public: + void SetScintilla(ScintillaWX* swx) { + this->swx = swx; + } + + bool OnDropText(wxCoord x, wxCoord y, const wxString& data); + wxDragResult OnEnter(wxCoord x, wxCoord y, wxDragResult def); + wxDragResult OnDragOver(wxCoord x, wxCoord y, wxDragResult def); + void OnLeave(); + +private: + ScintillaWX* swx; +}; +#endif + +//---------------------------------------------------------------------- + +class ScintillaWX : public SCI_SCOPE( ScintillaBase ) { +public: + + ScintillaWX(wxScintilla* win); + ~ScintillaWX(); + + // base class virtuals + virtual void Initialise(); + virtual void Finalise(); + virtual void StartDrag(); + virtual bool SetIdle(bool on); + virtual void SetTicking(bool on); + virtual void SetMouseCapture(bool on); + virtual bool HaveMouseCapture(); + virtual void ScrollText(int linesToMove); + virtual void SetVerticalScrollPos(); + virtual void SetHorizontalScrollPos(); + virtual bool ModifyScrollBars(int nMax, int nPage); + virtual void Copy(); + virtual void Paste(); + virtual void CopyToClipboard(const SCI_SCOPE(SelectionText) &selectedText); + + virtual void CreateCallTipWindow( SCI_SCOPE(PRectangle) rc); + virtual void AddToPopUp(const char *label, int cmd = 0, bool enabled = true); + virtual void ClaimSelection(); + + virtual long DefWndProc(unsigned int iMessage, + unsigned long wParam, + long lParam); + virtual long WndProc(unsigned int iMessage, + unsigned long wParam, + long lParam); + + virtual void NotifyChange(); + virtual void NotifyParent( SCI_SCOPE(SCNotification) scn); + + virtual void CancelModes(); + + virtual void UpdateSystemCaret(); + + // Event delegates + void DoPaint(wxDC* dc, wxRect rect); + void DoHScroll(int type, int pos); + void DoVScroll(int type, int pos); + void DoSize(int width, int height); + void DoLoseFocus(); + void DoGainFocus(); + void DoSysColourChange(); + void DoLeftButtonDown( SCI_SCOPE(Point) pt, unsigned int curTime, bool shift, bool ctrl, bool alt); // [CHANGED] + void DoLeftButtonUp(SCI_SCOPE(Point) pt, unsigned int curTime, bool ctrl); // [CHANGED] + void DoLeftButtonMove(SCI_SCOPE(Point) pt); // [CHANGED] + void DoMiddleButtonUp(SCI_SCOPE(Point) pt); // [CHANGED] + void DoMouseWheel(int rotation, int delta, int linesPerAction, int ctrlDown, bool isPageScroll); + void DoAddChar(int key); + int DoKeyDown(const wxKeyEvent& event, bool* consumed); + void DoTick() { Tick(); } + void DoOnIdle(wxIdleEvent& evt); + void DoStartDrag(); + +#if wxUSE_DRAG_AND_DROP + bool DoDropText(long x, long y, const wxString& data); + wxDragResult DoDragEnter(wxCoord x, wxCoord y, wxDragResult def); + wxDragResult DoDragOver(wxCoord x, wxCoord y, wxDragResult def); + void DoDragLeave(); +#endif + + void DoCommand(int ID); + void DoContextMenu(SCI_SCOPE(Point) pt); // [CHANGED] + void DoOnListBox(); + + + // helpers + void FullPaint(); + bool CanPaste(); + bool GetHideSelection() { return hideSelection; } + void DoScrollToLine(int line); + void DoScrollToColumn(int column); + void ClipChildren(wxDC& dc, SCI_SCOPE(PRectangle) rect); + void SetUseAntiAliasing(bool useAA); + bool GetUseAntiAliasing(); + +private: + bool capturedMouse; + bool focusEvent; + wxScintilla* sci; + +#if wxUSE_DRAG_AND_DROP + wxSCIDropTarget* dropTarget; + wxDragResult dragResult; + bool dragRectangle; + wxTimer* startDragTimer; +#endif + + int wheelRotation; + + // For use in creating a system caret + bool HasCaretSizeChanged(); + bool CreateSystemCaret(); + bool DestroySystemCaret(); +#ifdef __WXMSW__ +#if wxCHECK_VERSION(2, 5, 0) + HBITMAP sysCaretBitmap; + int sysCaretWidth; + int sysCaretHeight; +#endif +#endif + + friend class wxSCICallTip; +}; + +//---------------------------------------------------------------------- +#endif diff --git a/sdk/wxscintilla/src/gtkstring.h b/sdk/wxscintilla/src/gtkstring.h new file mode 100644 index 0000000..38e4482 --- /dev/null +++ b/sdk/wxscintilla/src/gtkstring.h @@ -0,0 +1,39 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/private/string.h +// Purpose: MyGtkString class declaration +// Author: Vadim Zeitlin +// Created: 2006-10-19 +// RCS-ID: $Id$ +// Copyright: (c) 2006 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// +#ifdef __WXGTK__ +#ifndef _GTK_PRIVATE_STRING_H_ +#define _GTK_PRIVATE_STRING_H_ + +// ---------------------------------------------------------------------------- +// Convenience class for g_freeing a gchar* on scope exit automatically +// ---------------------------------------------------------------------------- +#ifdef __WXGTK20__ +#include +#endif +class MyGtkString +{ +public: + explicit MyGtkString(gchar *s) : m_str(s) { } + ~MyGtkString() { g_free(m_str); } + + const gchar *c_str() const { return m_str; } + + operator gchar *() const { return m_str; } + +private: + gchar *m_str; + + DECLARE_NO_COPY_CLASS(MyGtkString) +}; + +#endif // _WX_GTK_PRIVATE_STRING_H_ + + +#endif //__WXGTK__ diff --git a/sdk/wxscintilla/src/scintilla/License.txt b/sdk/wxscintilla/src/scintilla/License.txt new file mode 100644 index 0000000..cbe25b2 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/License.txt @@ -0,0 +1,20 @@ +License for Scintilla and SciTE + +Copyright 1998-2003 by Neil Hodgson + +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation. + +NEIL HODGSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS, IN NO EVENT SHALL NEIL HODGSON BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE +OR PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/sdk/wxscintilla/src/scintilla/README.txt b/sdk/wxscintilla/src/scintilla/README.txt new file mode 100644 index 0000000..498a29c --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/README.txt @@ -0,0 +1,5 @@ +This directory contains copies of the scintilla/src and +scintilla/include directories from the Scintilla source +distribution. + +The current version of the Scintilla code is 1.62 diff --git a/sdk/wxscintilla/src/scintilla/include/Accessor.h b/sdk/wxscintilla/src/scintilla/include/Accessor.h new file mode 100644 index 0000000..bfe4d4d --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/include/Accessor.h @@ -0,0 +1,79 @@ +// Scintilla source code edit control +/** @file Accessor.h + ** Rapid easy access to contents of a Scintilla. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +enum { wsSpace = 1, wsTab = 2, wsSpaceTab = 4, wsInconsistent=8}; + +class Accessor; + +typedef bool (*PFNIsCommentLeader)(Accessor &styler, int pos, int len); + +/** + * Interface to data in a Scintilla. + */ +class Accessor { +protected: + enum {extremePosition=0x7FFFFFFF}; + /** @a bufferSize is a trade off between time taken to copy the characters + * and retrieval overhead. + * @a slopSize positions the buffer before the desired position + * in case there is some backtracking. */ + enum {bufferSize=4000, slopSize=bufferSize/8}; + char buf[bufferSize+1]; + int startPos; + int endPos; + int codePage; + + virtual bool InternalIsLeadByte(char ch)=0; + virtual void Fill(int position)=0; + +public: + Accessor() : startPos(extremePosition), endPos(0), codePage(0) {} + virtual ~Accessor() {} + char operator[](int position) { + if (position < startPos || position >= endPos) { + Fill(position); + } + return buf[position - startPos]; + } + /** Safe version of operator[], returning a defined value for invalid position. */ + char SafeGetCharAt(int position, char chDefault=' ') { + if (position < startPos || position >= endPos) { + Fill(position); + if (position < startPos || position >= endPos) { + // Position is outside range of document + return chDefault; + } + } + return buf[position - startPos]; + } + bool IsLeadByte(char ch) { + return codePage && InternalIsLeadByte(ch); + } + void SetCodePage(int codePage_) { codePage = codePage_; } + + virtual bool Match(int pos, const char *s)=0; + virtual char StyleAt(int position)=0; + virtual int GetLine(int position)=0; + virtual int LineStart(int line)=0; + virtual int LevelAt(int line)=0; + virtual int Length()=0; + virtual void Flush()=0; + virtual int GetLineState(int line)=0; + virtual int SetLineState(int line, int state)=0; + virtual int GetPropertyInt(const char *key, int defaultValue=0)=0; + virtual char *GetProperties()=0; + + // Style setting + virtual void StartAt(unsigned int start, char chMask=31)=0; + virtual void SetFlags(char chFlags_, char chWhile_)=0; + virtual unsigned int GetStartSegment()=0; + virtual void StartSegment(unsigned int pos)=0; + virtual void ColourTo(unsigned int pos, int chAttr)=0; + virtual void SetLevel(int line, int level)=0; + virtual int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0)=0; + virtual void IndicatorFill(int start, int end, int indicator, int value)=0; +}; diff --git a/sdk/wxscintilla/src/scintilla/include/Face.py b/sdk/wxscintilla/src/scintilla/include/Face.py new file mode 100644 index 0000000..52c9b8d --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/include/Face.py @@ -0,0 +1,110 @@ +# Module for reading and parsing Scintilla.iface file + +def sanitiseLine(line): + if line[-1:] == '\n': line = line[:-1] + if line.find("##") != -1: + line = line[:line.find("##")] + line = line.strip() + return line + +def decodeFunction(featureVal): + retType, rest = featureVal.split(" ", 1) + nameIdent, params = rest.split("(") + name, value = nameIdent.split("=") + params, rest = params.split(")") + param1, param2 = params.split(",")[0:2] + return retType, name, value, param1, param2 + +def decodeEvent(featureVal): + retType, rest = featureVal.split(" ", 1) + nameIdent, params = rest.split("(") + name, value = nameIdent.split("=") + return retType, name, value + +def decodeParam(p): + param = p.strip() + type = "" + name = "" + value = "" + if " " in param: + type, nv = param.split(" ") + if "=" in nv: + name, value = nv.split("=") + else: + name = nv + return type, name, value + +class Face: + + def __init__(self): + self.order = [] + self.features = {} + self.values = {} + self.events = {} + + def ReadFromFile(self, name): + currentCategory = "" + currentComment = [] + currentCommentFinished = 0 + file = open(name) + for line in file.readlines(): + line = sanitiseLine(line) + if line: + if line[0] == "#": + if line[1] == " ": + if currentCommentFinished: + currentComment = [] + currentCommentFinished = 0 + currentComment.append(line[2:]) + else: + currentCommentFinished = 1 + featureType, featureVal = line.split(" ", 1) + if featureType in ["fun", "get", "set"]: + retType, name, value, param1, param2 = decodeFunction(featureVal) + p1 = decodeParam(param1) + p2 = decodeParam(param2) + self.features[name] = { + "FeatureType": featureType, + "ReturnType": retType, + "Value": value, + "Param1Type": p1[0], "Param1Name": p1[1], "Param1Value": p1[2], + "Param2Type": p2[0], "Param2Name": p2[1], "Param2Value": p2[2], + "Category": currentCategory, "Comment": currentComment + } + if value in self.values: + raise "Duplicate value " + value + " " + name + self.values[value] = 1 + self.order.append(name) + elif featureType == "evt": + retType, name, value = decodeEvent(featureVal) + self.features[name] = { + "FeatureType": featureType, + "ReturnType": retType, + "Value": value, + "Category": currentCategory, "Comment": currentComment + } + if value in self.events: + raise "Duplicate event " + value + " " + name + self.events[value] = 1 + self.order.append(name) + elif featureType == "cat": + currentCategory = featureVal + elif featureType == "val": + try: + name, value = featureVal.split("=", 1) + except ValueError: + print("Failure %s" % featureVal) + raise + self.features[name] = { + "FeatureType": featureType, + "Category": currentCategory, + "Value": value } + self.order.append(name) + elif featureType == "enu" or featureType == "lex": + name, value = featureVal.split("=", 1) + self.features[name] = { + "FeatureType": featureType, + "Category": currentCategory, + "Value": value } + self.order.append(name) + diff --git a/sdk/wxscintilla/src/scintilla/include/HFacer.py b/sdk/wxscintilla/src/scintilla/include/HFacer.py new file mode 100644 index 0000000..62a8273 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/include/HFacer.py @@ -0,0 +1,75 @@ +# HFacer.py - regenerate the Scintilla.h and SciLexer.h files from the Scintilla.iface interface +# definition file. +# The header files are copied to a temporary file apart from the section between a /* ++Autogenerated*/ +# comment and a /* --Autogenerated*/ comment which is generated by the printHFile and printLexHFile +# functions. After the temporary file is created, it is copied back to the original file name. + +import sys +import os +import Face + +def Contains(s,sub): + return s.find(sub) != -1 + +def printLexHFile(f,out): + for name in f.order: + v = f.features[name] + if v["FeatureType"] in ["val"]: + if Contains(name, "SCE_") or Contains(name, "SCLEX_"): + out.write("#define " + name + " " + v["Value"] + "\n") + +def printHFile(f,out): + for name in f.order: + v = f.features[name] + if v["Category"] != "Deprecated": + if v["FeatureType"] in ["fun", "get", "set"]: + featureDefineName = "SCI_" + name.upper() + out.write("#define " + featureDefineName + " " + v["Value"] + "\n") + elif v["FeatureType"] in ["evt"]: + featureDefineName = "SCN_" + name.upper() + out.write("#define " + featureDefineName + " " + v["Value"] + "\n") + elif v["FeatureType"] in ["val"]: + if not (Contains(name, "SCE_") or Contains(name, "SCLEX_")): + out.write("#define " + name + " " + v["Value"] + "\n") + +def CopyWithInsertion(input, output, genfn, definition): + copying = 1 + for line in input.readlines(): + if copying: + output.write(line) + if Contains(line, "/* ++Autogenerated"): + copying = 0 + genfn(definition, output) + if Contains(line, "/* --Autogenerated"): + copying = 1 + output.write(line) + +def contents(filename): + f = open(filename) + t = f.read() + f.close() + return t + +def Regenerate(filename, genfn, definition): + inText = contents(filename) + tempname = "HFacer.tmp" + out = open(tempname,"w") + hfile = open(filename) + CopyWithInsertion(hfile, out, genfn, definition) + out.close() + hfile.close() + outText = contents(tempname) + if inText == outText: + os.unlink(tempname) + else: + os.unlink(filename) + os.rename(tempname, filename) + +f = Face.Face() +try: + f.ReadFromFile("Scintilla.iface") + Regenerate("Scintilla.h", printHFile, f) + Regenerate("SciLexer.h", printLexHFile, f) + print("Maximum ID is %s" % max([x for x in f.values if int(x) < 3000])) +except: + raise diff --git a/sdk/wxscintilla/src/scintilla/include/KeyWords.h b/sdk/wxscintilla/src/scintilla/include/KeyWords.h new file mode 100644 index 0000000..5593b7d --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/include/KeyWords.h @@ -0,0 +1,113 @@ +// Scintilla source code edit control +/** @file KeyWords.h + ** Colourise for particular languages. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +/** + */ +class WordList { +public: + // Each word contains at least one character - a empty word acts as sentinel at the end. + char **words; + char *list; + int len; + bool onlyLineEnds; ///< Delimited by any white space or only line ends + bool sorted; + int starts[256]; + WordList(bool onlyLineEnds_ = false) : + words(0), list(0), len(0), onlyLineEnds(onlyLineEnds_), + sorted(false) + {} + ~WordList() { Clear(); } + operator bool() { return len ? true : false; } + void Clear(); + void Set(const char *s); + bool InList(const char *s); + bool InListAbbreviated(const char *s, const char marker); +}; + +typedef void (*LexerFunction)(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler); + +/** + * A LexerModule is responsible for lexing and folding a particular language. + * The class maintains a list of LexerModules which can be searched to find a + * module appropriate to a particular language. + */ +class LexerModule { +protected: + const LexerModule *next; + int language; + LexerFunction fnLexer; + LexerFunction fnFolder; + const char * const * wordListDescriptions; + int styleBits; + + static const LexerModule *base; + static int nextLanguage; + +public: + const char *languageName; + LexerModule(int language_, + LexerFunction fnLexer_, + const char *languageName_=0, + LexerFunction fnFolder_=0, + const char * const wordListDescriptions_[] = NULL, + int styleBits_=5); + virtual ~LexerModule() { + } + int GetLanguage() const { return language; } + + // -1 is returned if no WordList information is available + int GetNumWordLists() const; + const char *GetWordListDescription(int index) const; + + int GetStyleBitsNeeded() const; + + virtual void Lex(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const; + virtual void Fold(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const; + static const LexerModule *Find(int language); + static const LexerModule *Find(const char *languageName); +}; + +#ifdef SCI_NAMESPACE +} +#endif + +/** + * Check if a character is a space. + * This is ASCII specific but is safe with chars >= 0x80. + */ +inline bool isspacechar(unsigned char ch) { + return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); +} + +inline bool iswordchar(char ch) { + return isascii(ch) && (isalnum(ch) || ch == '.' || ch == '_'); +} + +inline bool iswordstart(char ch) { + return isascii(ch) && (isalnum(ch) || ch == '_'); +} + +inline bool isoperator(char ch) { + if (isascii(ch) && isalnum(ch)) + return false; + // '.' left out as it is used to make up numbers + if (ch == '%' || ch == '^' || ch == '&' || ch == '*' || + ch == '(' || ch == ')' || ch == '-' || ch == '+' || + ch == '=' || ch == '|' || ch == '{' || ch == '}' || + ch == '[' || ch == ']' || ch == ':' || ch == ';' || + ch == '<' || ch == '>' || ch == ',' || ch == '/' || + ch == '?' || ch == '!' || ch == '.' || ch == '~') + return true; + return false; +} diff --git a/sdk/wxscintilla/src/scintilla/include/Platform.h b/sdk/wxscintilla/src/scintilla/include/Platform.h new file mode 100644 index 0000000..b37f956 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/include/Platform.h @@ -0,0 +1,558 @@ +// Scintilla source code edit control +/** @file Platform.h + ** Interface to platform facilities. Also includes some basic utilities. + ** Implemented in PlatGTK.cxx for GTK+/Linux, PlatWin.cxx for Windows, and PlatWX.cxx for wxWindows. + **/ +// Copyright 1998-2009 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef PLATFORM_H +#define PLATFORM_H + +// PLAT_GTK = GTK+ on Linux or Win32 +// PLAT_GTK_WIN32 is defined additionally when running PLAT_GTK under Win32 +// PLAT_WIN = Win32 API on Win32 OS +// PLAT_WX is wxWindows on any supported platform + +#define PLAT_GTK 0 +#define PLAT_GTK_WIN32 0 +#define PLAT_MACOSX 0 +#define PLAT_WIN 0 +#define PLAT_WX 0 +#define PLAT_FOX 0 + +#if defined(FOX) +#undef PLAT_FOX +#define PLAT_FOX 1 + +#elif defined(__WX__) +#undef PLAT_WX +#define PLAT_WX 1 + +#elif defined(GTK) +#undef PLAT_GTK +#define PLAT_GTK 1 + +#if defined(__WIN32__) || defined(_MSC_VER) +#undef PLAT_GTK_WIN32 +#define PLAT_GTK_WIN32 1 +#endif + +#elif defined(__APPLE__) + +#undef PLAT_MACOSX +#define PLAT_MACOSX 1 + +#else +#undef PLAT_WIN +#define PLAT_WIN 1 + +#endif + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +// Underlying the implementation of the platform classes are platform specific types. +// Sometimes these need to be passed around by client code so they are defined here + +typedef void *FontID; +typedef void *SurfaceID; +typedef void *WindowID; +typedef void *MenuID; +typedef void *TickerID; +typedef void *Function; +typedef void *IdlerID; + +/** + * A geometric point class. + * Point is exactly the same as the Win32 POINT and GTK+ GdkPoint so can be used interchangeably. + */ +class Point { +public: + int x; + int y; + + explicit Point(int x_=0, int y_=0) : x(x_), y(y_) { + } + + // Other automatically defined methods (assignment, copy constructor, destructor) are fine + + static Point FromLong(long lpoint); +}; + +/** + * A geometric rectangle class. + * PRectangle is exactly the same as the Win32 RECT so can be used interchangeably. + * PRectangles contain their top and left sides, but not their right and bottom sides. + */ +class PRectangle { +public: + int left; + int top; + int right; + int bottom; + + PRectangle(int left_=0, int top_=0, int right_=0, int bottom_ = 0) : + left(left_), top(top_), right(right_), bottom(bottom_) { + } + + // Other automatically defined methods (assignment, copy constructor, destructor) are fine + + bool operator==(PRectangle &rc) { + return (rc.left == left) && (rc.right == right) && + (rc.top == top) && (rc.bottom == bottom); + } + bool Contains(Point pt) { + return (pt.x >= left) && (pt.x <= right) && + (pt.y >= top) && (pt.y <= bottom); + } + bool Contains(PRectangle rc) { + return (rc.left >= left) && (rc.right <= right) && + (rc.top >= top) && (rc.bottom <= bottom); + } + bool Intersects(PRectangle other) { + return (right > other.left) && (left < other.right) && + (bottom > other.top) && (top < other.bottom); + } + void Move(int xDelta, int yDelta) { + left += xDelta; + top += yDelta; + right += xDelta; + bottom += yDelta; + } + int Width() { return right - left; } + int Height() { return bottom - top; } + bool Empty() { + return (Height() <= 0) || (Width() <= 0); + } +}; + +/** + * In some circumstances, including Win32 in paletted mode and GTK+, each colour + * must be allocated before use. The desired colours are held in the ColourDesired class, + * and after allocation the allocation entry is stored in the ColourAllocated class. In other + * circumstances, such as Win32 in true colour mode, the allocation process just copies + * the RGB values from the desired to the allocated class. + * As each desired colour requires allocation before it can be used, the ColourPair class + * holds both a ColourDesired and a ColourAllocated + * The Palette class is responsible for managing the palette of colours which contains a + * list of ColourPair objects and performs the allocation. + */ + +/** + * Holds a desired RGB colour. + */ +class ColourDesired { + long co; +public: + ColourDesired(long lcol=0) { + co = lcol; + } + + ColourDesired(unsigned int red, unsigned int green, unsigned int blue) { + Set(red, green, blue); + } + + bool operator==(const ColourDesired &other) const { + return co == other.co; + } + + void Set(long lcol) { + co = lcol; + } + + void Set(unsigned int red, unsigned int green, unsigned int blue) { + co = red | (green << 8) | (blue << 16); + } + + static inline unsigned int ValueOfHex(const char ch) { + if (ch >= '0' && ch <= '9') + return ch - '0'; + else if (ch >= 'A' && ch <= 'F') + return ch - 'A' + 10; + else if (ch >= 'a' && ch <= 'f') + return ch - 'a' + 10; + else + return 0; + } + + void Set(const char *val) { + if (*val == '#') { + val++; + } + unsigned int r = ValueOfHex(val[0]) * 16 + ValueOfHex(val[1]); + unsigned int g = ValueOfHex(val[2]) * 16 + ValueOfHex(val[3]); + unsigned int b = ValueOfHex(val[4]) * 16 + ValueOfHex(val[5]); + Set(r, g, b); + } + + long AsLong() const { + return co; + } + + unsigned int GetRed() { + return co & 0xff; + } + + unsigned int GetGreen() { + return (co >> 8) & 0xff; + } + + unsigned int GetBlue() { + return (co >> 16) & 0xff; + } +}; + +/** + * Holds an allocated RGB colour which may be an approximation to the desired colour. + */ +class ColourAllocated { + long coAllocated; + +public: + + ColourAllocated(long lcol=0) { + coAllocated = lcol; + } + + void Set(long lcol) { + coAllocated = lcol; + } + + long AsLong() const { + return coAllocated; + } +}; + +/** + * Colour pairs hold a desired colour and an allocated colour. + */ +struct ColourPair { + ColourDesired desired; + ColourAllocated allocated; + + ColourPair(ColourDesired desired_=ColourDesired(0,0,0)) { + desired = desired_; + allocated.Set(desired.AsLong()); + } + void Copy() { + allocated.Set(desired.AsLong()); + } +}; + +class Window; // Forward declaration for Palette + +/** + * Colour palette management. + */ +class Palette { + int used; + int size; + ColourPair *entries; +#if PLAT_GTK + void *allocatedPalette; // GdkColor * + int allocatedLen; +#endif + // Private so Palette objects can not be copied + Palette(const Palette &) {} + Palette &operator=(const Palette &) { return *this; } +public: +#if PLAT_WIN + void *hpal; +#endif + bool allowRealization; + + Palette(); + ~Palette(); + + void Release(); + + /** + * This method either adds a colour to the list of wanted colours (want==true) + * or retrieves the allocated colour back to the ColourPair. + * This is one method to make it easier to keep the code for wanting and retrieving in sync. + */ + void WantFind(ColourPair &cp, bool want); + + void Allocate(Window &w); +}; + +/** + * Font management. + */ +class Font { +protected: + FontID fid; +#if PLAT_WX + int ascent; +#endif + // Private so Font objects can not be copied + Font(const Font &) {} + Font &operator=(const Font &) { fid=0; return *this; } +public: + Font(); + virtual ~Font(); + + virtual void Create(const char *faceName, int characterSet, int size, + bool bold, bool italic, int extraFontFlag=0); + virtual void Release(); + + FontID GetID() { return fid; } + // Alias another font - caller guarantees not to Release + void SetID(FontID fid_) { fid = fid_; } + friend class Surface; + friend class SurfaceImpl; +}; + +/** + * A surface abstracts a place to draw. + */ +class Surface { +private: + // Private so Surface objects can not be copied + Surface(const Surface &) {} + Surface &operator=(const Surface &) { return *this; } +public: + Surface() {} + virtual ~Surface() {} + static Surface *Allocate(); + + virtual void Init(WindowID wid)=0; + virtual void Init(SurfaceID sid, WindowID wid)=0; + virtual void InitPixMap(int width, int height, Surface *surface_, WindowID wid)=0; + + virtual void Release()=0; + virtual bool Initialised()=0; + virtual void PenColour(ColourAllocated fore)=0; + virtual int LogPixelsY()=0; + virtual int DeviceHeightFont(int points)=0; + virtual void MoveTo(int x_, int y_)=0; + virtual void LineTo(int x_, int y_)=0; + virtual void Polygon(Point *pts, int npts, ColourAllocated fore, ColourAllocated back)=0; + virtual void RectangleDraw(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0; + virtual void FillRectangle(PRectangle rc, ColourAllocated back)=0; + virtual void FillRectangle(PRectangle rc, Surface &surfacePattern)=0; + virtual void RoundedRectangle(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0; + virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourAllocated fill, int alphaFill, + ColourAllocated outline, int alphaOutline, int flags)=0; + virtual void Ellipse(PRectangle rc, ColourAllocated fore, ColourAllocated back)=0; + virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource)=0; + + virtual void DrawTextNoClip(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back)=0; + virtual void DrawTextClipped(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore, ColourAllocated back)=0; + virtual void DrawTextTransparent(PRectangle rc, Font &font_, int ybase, const char *s, int len, ColourAllocated fore)=0; + virtual void MeasureWidths(Font &font_, const char *s, int len, int *positions)=0; + virtual int WidthText(Font &font_, const char *s, int len)=0; + virtual int WidthChar(Font &font_, char ch)=0; + virtual int Ascent(Font &font_)=0; + virtual int Descent(Font &font_)=0; + virtual int InternalLeading(Font &font_)=0; + virtual int ExternalLeading(Font &font_)=0; + virtual int Height(Font &font_)=0; + virtual int AverageCharWidth(Font &font_)=0; + + virtual int SetPalette(Palette *pal, bool inBackGround)=0; + virtual void SetClip(PRectangle rc)=0; + virtual void FlushCachedState()=0; + + virtual void SetUnicodeMode(bool unicodeMode_)=0; + virtual void SetDBCSMode(int codePage)=0; +}; + +/** + * A simple callback action passing one piece of untyped user data. + */ +typedef void (*CallBackAction)(void*); + +/** + * Class to hide the details of window manipulation. + * Does not own the window which will normally have a longer life than this object. + */ +class Window { +protected: + WindowID wid; +#if PLAT_MACOSX + void *windowRef; + void *control; +#endif +public: + Window() : wid(0), cursorLast(cursorInvalid) { +#if PLAT_MACOSX + windowRef = 0; + control = 0; +#endif + } + Window(const Window &source) : wid(source.wid), cursorLast(cursorInvalid) { +#if PLAT_MACOSX + windowRef = 0; + control = 0; +#endif + } + virtual ~Window(); + Window &operator=(WindowID wid_) { + wid = wid_; + return *this; + } + WindowID GetID() const { return wid; } + bool Created() const { return wid != 0; } + void Destroy(); + bool HasFocus(); + PRectangle GetPosition(); + void SetPosition(PRectangle rc); + void SetPositionRelative(PRectangle rc, Window relativeTo); + PRectangle GetClientPosition(); + void Show(bool show=true); + void InvalidateAll(); + void InvalidateRectangle(PRectangle rc); + virtual void SetFont(Font &font); + enum Cursor { cursorInvalid, cursorText, cursorArrow, cursorUp, cursorWait, cursorHoriz, cursorVert, cursorReverseArrow, cursorHand }; + void SetCursor(Cursor curs); + void SetTitle(const char *s); + PRectangle GetMonitorRect(Point pt); +#if PLAT_MACOSX + void SetWindow(void *ref) { windowRef = ref; }; + void SetControl(void *_control) { control = _control; }; +#endif +private: + Cursor cursorLast; +}; + +/** + * Listbox management. + */ + +class ListBox : public Window { +public: + ListBox(); + virtual ~ListBox(); + static ListBox *Allocate(); + + virtual void SetFont(Font &font)=0; + virtual void Create(Window &parent, int ctrlID, Point location, int lineHeight_, bool unicodeMode_)=0; + virtual void SetAverageCharWidth(int width)=0; + virtual void SetVisibleRows(int rows)=0; + virtual int GetVisibleRows() const=0; + virtual PRectangle GetDesiredRect()=0; + virtual int CaretFromEdge()=0; + virtual void Clear()=0; + virtual void Append(char *s, int type = -1)=0; + virtual int Length()=0; + virtual void Select(int n)=0; + virtual int GetSelection()=0; + virtual int Find(const char *prefix)=0; + virtual void GetValue(int n, char *value, int len)=0; + virtual void RegisterImage(int type, const char *xpm_data)=0; + virtual void ClearRegisteredImages()=0; + virtual void SetDoubleClickAction(CallBackAction, void *)=0; + virtual void SetList(const char* list, char separator, char typesep)=0; +}; + +/** + * Menu management. + */ +class Menu { + MenuID mid; +public: + Menu(); + MenuID GetID() { return mid; } + void CreatePopUp(); + void Destroy(); + void Show(Point pt, Window &w); +}; + +class ElapsedTime { + long bigBit; + long littleBit; +public: + ElapsedTime(); + double Duration(bool reset=false); +}; + +/** + * Dynamic Library (DLL/SO/...) loading + */ +class DynamicLibrary { +public: + virtual ~DynamicLibrary() {} + + /// @return Pointer to function "name", or NULL on failure. + virtual Function FindFunction(const char *name) = 0; + + /// @return true if the library was loaded successfully. + virtual bool IsValid() = 0; + + /// @return An instance of a DynamicLibrary subclass with "modulePath" loaded. + static DynamicLibrary *Load(const char *modulePath); +}; + +/** + * Platform class used to retrieve system wide parameters such as double click speed + * and chrome colour. Not a creatable object, more of a module with several functions. + */ +class Platform { + // Private so Platform objects can not be copied + Platform(const Platform &) {} + Platform &operator=(const Platform &) { return *this; } +public: + // Should be private because no new Platforms are ever created + // but gcc warns about this + Platform() {} + ~Platform() {} + static ColourDesired Chrome(); + static ColourDesired ChromeHighlight(); + static const char *DefaultFont(); + static int DefaultFontSize(); + static unsigned int DoubleClickTime(); + static bool MouseButtonBounce(); + static void DebugDisplay(const char *s); + static bool IsKeyDown(int key); + static long SendScintilla( + WindowID w, unsigned int msg, unsigned long wParam=0, long lParam=0); + static long SendScintillaPointer( + WindowID w, unsigned int msg, unsigned long wParam=0, void *lParam=0); + static bool IsDBCSLeadByte(int codePage, char ch); + static int DBCSCharLength(int codePage, const char *s); + static int DBCSCharMaxLength(); + + // These are utility functions not really tied to a platform + static int Minimum(int a, int b); + static int Maximum(int a, int b); + // Next three assume 16 bit shorts and 32 bit longs + static long LongFromTwoShorts(short a,short b) { + return (a) | ((b) << 16); + } + static short HighShortFromLong(long x) { + return static_cast(x >> 16); + } + static short LowShortFromLong(long x) { + return static_cast(x & 0xffff); + } + static void DebugPrintf(const char *format, ...); + static bool ShowAssertionPopUps(bool assertionPopUps_); + static void Assert(const char *c, const char *file, int line); + static int Clamp(int val, int minVal, int maxVal); +}; + +//#ifdef NDEBUG +#if 1 +#define PLATFORM_ASSERT(c) ((void)0) +#else + +#ifdef SCI_NAMESPACE +#define PLATFORM_ASSERT(c) ((c) ? (void)(0) : Scintilla::Platform::Assert(#c, __FILE__, __LINE__)) +#else +#define PLATFORM_ASSERT(c) ((c) ? (void)(0) : Platform::Assert(#c, __FILE__, __LINE__)) +#endif +#endif + +#ifdef SCI_NAMESPACE +} +#endif + +// Shut up annoying Visual C++ warnings: +#ifdef _MSC_VER +#pragma warning(disable: 4244 4309 4514 4710) +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/include/PropSet.h b/sdk/wxscintilla/src/scintilla/include/PropSet.h new file mode 100644 index 0000000..c952021 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/include/PropSet.h @@ -0,0 +1,26 @@ +// Scintilla source code edit control +/** @file PropSet.h + ** An interface to the methods needed for access to property sets inside lexers. + **/ +// Copyright 1998-2009 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef PROPSET_H +#define PROPSET_H + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +class PropertyGet { +public: + virtual char *ToString() const=0; // Caller must delete[] the return value + virtual int GetInt(const char *key, int defaultValue=0) const=0; + virtual ~PropertyGet() {} +}; + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/include/SString.h b/sdk/wxscintilla/src/scintilla/include/SString.h new file mode 100644 index 0000000..e376f59 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/include/SString.h @@ -0,0 +1,289 @@ +// SciTE - Scintilla based Text Editor +/** @file SString.h + ** A simple string class. + **/ +// Copyright 1998-2004 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef SSTRING_H +#define SSTRING_H + + +// These functions are implemented because each platform calls them something different. +int CompareCaseInsensitive(const char *a, const char *b); +int CompareNCaseInsensitive(const char *a, const char *b, size_t len); +bool EqualCaseInsensitive(const char *a, const char *b); + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +// Define another string class. +// While it would be 'better' to use std::string, that doubles the executable size. +// An SString may contain embedded nul characters. + +/** + * Base class from which the two other classes (SBuffer & SString) + * are derived. + */ +class SContainer { +public: + /** Type of string lengths (sizes) and positions (indexes). */ + typedef size_t lenpos_t; + /** Out of bounds value indicating that the string argument should be measured. */ + enum { measure_length=0xffffffffU}; + +protected: + char *s; ///< The C string + lenpos_t sSize; ///< The size of the buffer, less 1: ie. the maximum size of the string + + SContainer() : s(0), sSize(0) {} + ~SContainer() { + delete []s; // Suppose it was allocated using StringAllocate + s = 0; + sSize = 0; + } + /** Size of buffer. */ + lenpos_t size() const { + if (s) { + return sSize; + } else { + return 0; + } + } +public: + /** + * Allocate uninitialized memory big enough to fit a string of the given length. + * @return the pointer to the new string + */ + static char *StringAllocate(lenpos_t len); + /** + * Duplicate a buffer/C string. + * Allocate memory of the given size, or big enough to fit the string if length isn't given; + * then copy the given string in the allocated memory. + * @return the pointer to the new string + */ + static char *StringAllocate( + const char *s, ///< The string to duplicate + lenpos_t len=measure_length); ///< The length of memory to allocate. Optional. +}; + + +/** + * @brief A string buffer class. + * + * Main use is to ask an API the length of a string it can provide, + * then to allocate a buffer of the given size, and to provide this buffer + * to the API to put the string. + * This class is intended to be shortlived, to be transformed as SString + * as soon as it holds the string, so it has little members. + * Note: we assume the buffer is filled by the API. If the length can be shorter, + * we should set sLen to strlen(sb.ptr()) in related SString constructor and assignment. + */ +class SBuffer : protected SContainer { +public: + SBuffer(lenpos_t len) { + s = StringAllocate(len); + if (s) { + *s = '\0'; + sSize = len; + } else { + sSize = 0; + } + } +private: + /// Copy constructor + // Here only to be on the safe size, user should avoid returning SBuffer values. + SBuffer(const SBuffer &source) : SContainer() { + s = StringAllocate(source.s, source.sSize); + sSize = (s) ? source.sSize : 0; + } + /// Default assignment operator + // Same here, shouldn't be used + SBuffer &operator=(const SBuffer &source) { + if (this != &source) { + delete []s; + s = StringAllocate(source.s, source.sSize); + sSize = (s) ? source.sSize : 0; + } + return *this; + } +public: + /** Provide direct read/write access to buffer. */ + char *ptr() { + return s; + } + /** Ownership of the buffer have been taken, so release it. */ + void reset() { + s = 0; + sSize = 0; + } + /** Size of buffer. */ + lenpos_t size() const { + return SContainer::size(); + } +}; + + +/** + * @brief A simple string class. + * + * Hold the length of the string for quick operations, + * can have a buffer bigger than the string to avoid too many memory allocations and copies. + * May have embedded zeroes as a result of @a substitute, but relies too heavily on C string + * functions to allow reliable manipulations of these strings, other than simple appends, etc. + */ +class SString : protected SContainer { + lenpos_t sLen; ///< The size of the string in s + lenpos_t sizeGrowth; ///< Minimum growth size when appending strings + enum { sizeGrowthDefault = 64 }; + + bool grow(lenpos_t lenNew); + SString &assign(const char *sOther, lenpos_t sSize_=measure_length); + +public: + SString() : sLen(0), sizeGrowth(sizeGrowthDefault) {} + SString(const SString &source) : SContainer(), sizeGrowth(sizeGrowthDefault) { + s = StringAllocate(source.s, source.sLen); + sSize = sLen = (s) ? source.sLen : 0; + } + SString(const char *s_) : sizeGrowth(sizeGrowthDefault) { + s = StringAllocate(s_); + sSize = sLen = (s) ? strlen(s) : 0; + } + SString(SBuffer &buf) : sizeGrowth(sizeGrowthDefault) { + s = buf.ptr(); + sSize = sLen = buf.size(); + // Consumes the given buffer! + buf.reset(); + } + SString(const char *s_, lenpos_t first, lenpos_t last) : sizeGrowth(sizeGrowthDefault) { + // note: expects the "last" argument to point one beyond the range end (a la STL iterators) + s = StringAllocate(s_ + first, last - first); + sSize = sLen = (s) ? last - first : 0; + } + SString(int i); + SString(double d, int precision); + ~SString() { + sLen = 0; + } + void clear() { + if (s) { + *s = '\0'; + } + sLen = 0; + } + /** Size of buffer. */ + lenpos_t size() const { + return SContainer::size(); + } + /** Size of string in buffer. */ + lenpos_t length() const { + return sLen; + } + /** Read access to a character of the string. */ + char operator[](lenpos_t i) const { + return (s && i < sSize) ? s[i] : '\0'; + } + SString &operator=(const char *source) { + return assign(source); + } + SString &operator=(const SString &source) { + if (this != &source) { + assign(source.s, source.sLen); + } + return *this; + } + bool operator==(const SString &sOther) const; + bool operator!=(const SString &sOther) const { + return !operator==(sOther); + } + bool operator==(const char *sOther) const; + bool operator!=(const char *sOther) const { + return !operator==(sOther); + } + bool contains(char ch) const { + return (s && *s) ? strchr(s, ch) != 0 : false; + } + void setsizegrowth(lenpos_t sizeGrowth_) { + sizeGrowth = sizeGrowth_; + } + const char *c_str() const { + return s ? s : ""; + } + /** Give ownership of buffer to caller which must use delete[] to free buffer. */ + char *detach() { + char *sRet = s; + s = 0; + sSize = 0; + sLen = 0; + return sRet; + } + SString substr(lenpos_t subPos, lenpos_t subLen=measure_length) const; + SString &lowercase(lenpos_t subPos = 0, lenpos_t subLen=measure_length); + SString &uppercase(lenpos_t subPos = 0, lenpos_t subLen=measure_length); + SString &append(const char *sOther, lenpos_t sLenOther=measure_length, char sep = '\0'); + SString &operator+=(const char *sOther) { + return append(sOther, static_cast(measure_length)); + } + SString &operator+=(const SString &sOther) { + return append(sOther.s, sOther.sLen); + } + SString &operator+=(char ch) { + return append(&ch, 1); + } + SString &appendwithseparator(const char *sOther, char sep) { + return append(sOther, strlen(sOther), sep); + } + SString &insert(lenpos_t pos, const char *sOther, lenpos_t sLenOther=measure_length); + + /** + * Remove @a len characters from the @a pos position, included. + * Characters at pos + len and beyond replace characters at pos. + * If @a len is 0, or greater than the length of the string + * starting at @a pos, the string is just truncated at @a pos. + */ + void remove(lenpos_t pos, lenpos_t len); + + SString &change(lenpos_t pos, char ch) { + if (pos < sLen) { // character changed must be in string bounds + *(s + pos) = ch; + } + return *this; + } + /** Read an integral numeric value from the string. */ + int value() const { + return s ? atoi(s) : 0; + } + bool startswith(const char *prefix); + bool endswith(const char *suffix); + int search(const char *sFind, lenpos_t start=0) const; + bool contains(const char *sFind) const { + return search(sFind) >= 0; + } + int substitute(char chFind, char chReplace); + int substitute(const char *sFind, const char *sReplace); + int remove(const char *sFind) { + return substitute(sFind, ""); + } +}; + + +/** + * Duplicate a C string. + * Allocate memory of the given size, or big enough to fit the string if length isn't given; + * then copy the given string in the allocated memory. + * @return the pointer to the new string + */ +inline char *StringDup( + const char *s, ///< The string to duplicate + SContainer::lenpos_t len=SContainer::measure_length) ///< The length of memory to allocate. Optional. +{ + return SContainer::StringAllocate(s, len); +} + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/include/SciLexer.h b/sdk/wxscintilla/src/scintilla/include/SciLexer.h new file mode 100644 index 0000000..1fd036b --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/include/SciLexer.h @@ -0,0 +1,1446 @@ +/* Scintilla source code edit control */ +/** @file SciLexer.h + ** Interface to the added lexer functions in the SciLexer version of the edit control. + **/ +/* Copyright 1998-2002 by Neil Hodgson + * The License.txt file describes the conditions under which this software may be distributed. */ + +/* Most of this file is automatically generated from the Scintilla.iface interface definition + * file which contains any comments about the definitions. HFacer.py does the generation. */ + +#ifndef SCILEXER_H +#define SCILEXER_H + +/* SciLexer features - not in standard Scintilla */ + +/* ++Autogenerated -- start of section automatically generated from Scintilla.iface */ +#define SCLEX_CONTAINER 0 +#define SCLEX_NULL 1 +#define SCLEX_PYTHON 2 +#define SCLEX_CPP 3 +#define SCLEX_HTML 4 +#define SCLEX_XML 5 +#define SCLEX_PERL 6 +#define SCLEX_SQL 7 +#define SCLEX_VB 8 +#define SCLEX_PROPERTIES 9 +#define SCLEX_ERRORLIST 10 +#define SCLEX_MAKEFILE 11 +#define SCLEX_BATCH 12 +#define SCLEX_XCODE 13 +#define SCLEX_LATEX 14 +#define SCLEX_LUA 15 +#define SCLEX_DIFF 16 +#define SCLEX_CONF 17 +#define SCLEX_PASCAL 18 +#define SCLEX_AVE 19 +#define SCLEX_ADA 20 +#define SCLEX_LISP 21 +#define SCLEX_RUBY 22 +#define SCLEX_EIFFEL 23 +#define SCLEX_EIFFELKW 24 +#define SCLEX_TCL 25 +#define SCLEX_NNCRONTAB 26 +#define SCLEX_BULLANT 27 +#define SCLEX_VBSCRIPT 28 +#define SCLEX_BAAN 31 +#define SCLEX_MATLAB 32 +#define SCLEX_SCRIPTOL 33 +#define SCLEX_ASM 34 +#define SCLEX_CPPNOCASE 35 +#define SCLEX_FORTRAN 36 +#define SCLEX_F77 37 +#define SCLEX_CSS 38 +#define SCLEX_POV 39 +#define SCLEX_LOUT 40 +#define SCLEX_ESCRIPT 41 +#define SCLEX_PS 42 +#define SCLEX_NSIS 43 +#define SCLEX_MMIXAL 44 +#define SCLEX_CLW 45 +#define SCLEX_CLWNOCASE 46 +#define SCLEX_LOT 47 +#define SCLEX_YAML 48 +#define SCLEX_TEX 49 +#define SCLEX_METAPOST 50 +#define SCLEX_POWERBASIC 51 +#define SCLEX_FORTH 52 +#define SCLEX_ERLANG 53 +#define SCLEX_OCTAVE 54 +#define SCLEX_MSSQL 55 +#define SCLEX_VERILOG 56 +#define SCLEX_KIX 57 +#define SCLEX_GUI4CLI 58 +#define SCLEX_SPECMAN 59 +#define SCLEX_AU3 60 +#define SCLEX_APDL 61 +#define SCLEX_BASH 62 +#define SCLEX_ASN1 63 +#define SCLEX_VHDL 64 +#define SCLEX_CAML 65 +#define SCLEX_BLITZBASIC 66 +#define SCLEX_PUREBASIC 67 +#define SCLEX_HASKELL 68 +#define SCLEX_PHPSCRIPT 69 +#define SCLEX_TADS3 70 +#define SCLEX_REBOL 71 +#define SCLEX_SMALLTALK 72 +#define SCLEX_FLAGSHIP 73 +#define SCLEX_CSOUND 74 +#define SCLEX_FREEBASIC 75 +#define SCLEX_INNOSETUP 76 +#define SCLEX_OPAL 77 +#define SCLEX_SPICE 78 +#define SCLEX_D 79 +#define SCLEX_CMAKE 80 +#define SCLEX_GAP 81 +#define SCLEX_PLM 82 +#define SCLEX_PROGRESS 83 +#define SCLEX_ABAQUS 84 +#define SCLEX_ASYMPTOTE 85 +#define SCLEX_R 86 +#define SCLEX_MAGIK 87 +#define SCLEX_POWERSHELL 88 +#define SCLEX_MYSQL 89 +#define SCLEX_PO 90 +#define SCLEX_TAL 91 +#define SCLEX_COBOL 92 +#define SCLEX_TACL 93 +#define SCLEX_SORCUS 94 +#define SCLEX_POWERPRO 95 +#define SCLEX_NIMROD 96 +#define SCLEX_SML 97 +#define SCLEX_MARKDOWN 98 + +//Eran - START +#define SCLEX_GCC 150 +#define SCLEX_CPPCHECK 153 +#define SCLEX_GCC_DEFAULT 0 +#define SCLEX_GCC_ERROR 1 +#define SCLEX_GCC_WARNING 2 +#define SCLEX_GCC_BUILDING 3 +#define SCLEX_GCC_FILE_LINK 4 +#define SCLEX_GCC_OUTPUT 5 +#define SCLEX_GCC_MAKE_ENTER 6 +#define SCLEX_GCC_MAKE_LEAVING 7 + +#define SCLEX_FIF 151 +#define SCLEX_FIF_DEFAULT 0 +#define SCLEX_FIF_FILE 1 +#define SCLEX_FIF_MATCH 2 +#define SCLEX_FIF_FILE_SHORT 3 +#define SCLEX_FIF_PROJECT 4 +#define SCLEX_FIF_SCOPE 5 + +#define SCLEX_SVN 152 +#define SCLEX_SVN_DEFAULT 0 +#define SCLEX_SVN_UPDATED 1 +#define SCLEX_SVN_CONFLICT 2 +#define SCLEX_SVN_MERGED 3 +#define SCLEX_SVN_DELETED 4 +#define SCLEX_SVN_ADDED 5 +#define SCLEX_SVN_INFO 6 +//Eran - END + +//EPOCH - START +#define SCLEX_ALTARICA 154 +#define SCE_ALTARICA_DEFAULT 0 +#define SCE_ALTARICA_COMMENT 1 +#define SCE_ALTARICA_COMMENTLINE 2 +#define SCE_ALTARICA_KEYWORD 3 +#define SCE_ALTARICA_TYPE 4 +#define SCE_ALTARICA_IDENTIFIER 5 +#define SCE_ALTARICA_OPERATOR 6 +#define SCE_ALTARICA_NUMBER 7 +#define SCE_ALTARICA_FORBIDDEN 8 + +#define SCLEX_PRISM 155 +#define SCE_PRISM_DEFAULT 0 +#define SCE_PRISM_COMMENT 1 +#define SCE_PRISM_KEYWORD 2 +#define SCE_PRISM_FUNCTION 3 +#define SCE_PRISM_TYPE 4 +#define SCE_PRISM_IDENTIFIER 5 +#define SCE_PRISM_OPERATOR 6 +#define SCE_PRISM_NUMBER 7 +#define SCE_PRISM_STRING 8 +#define SCE_PRISM_FORBIDDEN 9 +//EPOCH - END + +#define SCLEX_AUTOMATIC 1000 +#define SCE_P_DEFAULT 0 +#define SCE_P_COMMENTLINE 1 +#define SCE_P_NUMBER 2 +#define SCE_P_STRING 3 +#define SCE_P_CHARACTER 4 +#define SCE_P_WORD 5 +#define SCE_P_TRIPLE 6 +#define SCE_P_TRIPLEDOUBLE 7 +#define SCE_P_CLASSNAME 8 +#define SCE_P_DEFNAME 9 +#define SCE_P_OPERATOR 10 +#define SCE_P_IDENTIFIER 11 +#define SCE_P_COMMENTBLOCK 12 +#define SCE_P_STRINGEOL 13 +#define SCE_P_WORD2 14 +#define SCE_P_DECORATOR 15 +#define SCE_C_DEFAULT 0 +#define SCE_C_COMMENT 1 +#define SCE_C_COMMENTLINE 2 +#define SCE_C_COMMENTDOC 3 +#define SCE_C_NUMBER 4 +#define SCE_C_WORD 5 +#define SCE_C_STRING 6 +#define SCE_C_CHARACTER 7 +#define SCE_C_UUID 8 +#define SCE_C_PREPROCESSOR 9 +#define SCE_C_OPERATOR 10 +#define SCE_C_IDENTIFIER 11 +#define SCE_C_STRINGEOL 12 +#define SCE_C_VERBATIM 13 +#define SCE_C_REGEX 14 +#define SCE_C_COMMENTLINEDOC 15 +#define SCE_C_WORD2 16 +#define SCE_C_COMMENTDOCKEYWORD 17 +#define SCE_C_COMMENTDOCKEYWORDERROR 18 +#define SCE_C_GLOBALCLASS 19 +#define SCE_D_DEFAULT 0 +#define SCE_D_COMMENT 1 +#define SCE_D_COMMENTLINE 2 +#define SCE_D_COMMENTDOC 3 +#define SCE_D_COMMENTNESTED 4 +#define SCE_D_NUMBER 5 +#define SCE_D_WORD 6 +#define SCE_D_WORD2 7 +#define SCE_D_WORD3 8 +#define SCE_D_TYPEDEF 9 +#define SCE_D_STRING 10 +#define SCE_D_STRINGEOL 11 +#define SCE_D_CHARACTER 12 +#define SCE_D_OPERATOR 13 +#define SCE_D_IDENTIFIER 14 +#define SCE_D_COMMENTLINEDOC 15 +#define SCE_D_COMMENTDOCKEYWORD 16 +#define SCE_D_COMMENTDOCKEYWORDERROR 17 +#define SCE_D_STRINGB 18 +#define SCE_D_STRINGR 19 +#define SCE_D_WORD5 20 +#define SCE_D_WORD6 21 +#define SCE_D_WORD7 22 +#define SCE_TCL_DEFAULT 0 +#define SCE_TCL_COMMENT 1 +#define SCE_TCL_COMMENTLINE 2 +#define SCE_TCL_NUMBER 3 +#define SCE_TCL_WORD_IN_QUOTE 4 +#define SCE_TCL_IN_QUOTE 5 +#define SCE_TCL_OPERATOR 6 +#define SCE_TCL_IDENTIFIER 7 +#define SCE_TCL_SUBSTITUTION 8 +#define SCE_TCL_SUB_BRACE 9 +#define SCE_TCL_MODIFIER 10 +#define SCE_TCL_EXPAND 11 +#define SCE_TCL_WORD 12 +#define SCE_TCL_WORD2 13 +#define SCE_TCL_WORD3 14 +#define SCE_TCL_WORD4 15 +#define SCE_TCL_WORD5 16 +#define SCE_TCL_WORD6 17 +#define SCE_TCL_WORD7 18 +#define SCE_TCL_WORD8 19 +#define SCE_TCL_COMMENT_BOX 20 +#define SCE_TCL_BLOCK_COMMENT 21 +#define SCE_H_DEFAULT 0 +#define SCE_H_TAG 1 +#define SCE_H_TAGUNKNOWN 2 +#define SCE_H_ATTRIBUTE 3 +#define SCE_H_ATTRIBUTEUNKNOWN 4 +#define SCE_H_NUMBER 5 +#define SCE_H_DOUBLESTRING 6 +#define SCE_H_SINGLESTRING 7 +#define SCE_H_OTHER 8 +#define SCE_H_COMMENT 9 +#define SCE_H_ENTITY 10 +#define SCE_H_TAGEND 11 +#define SCE_H_XMLSTART 12 +#define SCE_H_XMLEND 13 +#define SCE_H_SCRIPT 14 +#define SCE_H_ASP 15 +#define SCE_H_ASPAT 16 +#define SCE_H_CDATA 17 +#define SCE_H_QUESTION 18 +#define SCE_H_VALUE 19 +#define SCE_H_XCCOMMENT 20 +#define SCE_H_SGML_DEFAULT 21 +#define SCE_H_SGML_COMMAND 22 +#define SCE_H_SGML_1ST_PARAM 23 +#define SCE_H_SGML_DOUBLESTRING 24 +#define SCE_H_SGML_SIMPLESTRING 25 +#define SCE_H_SGML_ERROR 26 +#define SCE_H_SGML_SPECIAL 27 +#define SCE_H_SGML_ENTITY 28 +#define SCE_H_SGML_COMMENT 29 +#define SCE_H_SGML_1ST_PARAM_COMMENT 30 +#define SCE_H_SGML_BLOCK_DEFAULT 31 +#define SCE_HJ_START 40 +#define SCE_HJ_DEFAULT 41 +#define SCE_HJ_COMMENT 42 +#define SCE_HJ_COMMENTLINE 43 +#define SCE_HJ_COMMENTDOC 44 +#define SCE_HJ_NUMBER 45 +#define SCE_HJ_WORD 46 +#define SCE_HJ_KEYWORD 47 +#define SCE_HJ_DOUBLESTRING 48 +#define SCE_HJ_SINGLESTRING 49 +#define SCE_HJ_SYMBOLS 50 +#define SCE_HJ_STRINGEOL 51 +#define SCE_HJ_REGEX 52 +#define SCE_HJA_START 55 +#define SCE_HJA_DEFAULT 56 +#define SCE_HJA_COMMENT 57 +#define SCE_HJA_COMMENTLINE 58 +#define SCE_HJA_COMMENTDOC 59 +#define SCE_HJA_NUMBER 60 +#define SCE_HJA_WORD 61 +#define SCE_HJA_KEYWORD 62 +#define SCE_HJA_DOUBLESTRING 63 +#define SCE_HJA_SINGLESTRING 64 +#define SCE_HJA_SYMBOLS 65 +#define SCE_HJA_STRINGEOL 66 +#define SCE_HJA_REGEX 67 +#define SCE_HB_START 70 +#define SCE_HB_DEFAULT 71 +#define SCE_HB_COMMENTLINE 72 +#define SCE_HB_NUMBER 73 +#define SCE_HB_WORD 74 +#define SCE_HB_STRING 75 +#define SCE_HB_IDENTIFIER 76 +#define SCE_HB_STRINGEOL 77 +#define SCE_HBA_START 80 +#define SCE_HBA_DEFAULT 81 +#define SCE_HBA_COMMENTLINE 82 +#define SCE_HBA_NUMBER 83 +#define SCE_HBA_WORD 84 +#define SCE_HBA_STRING 85 +#define SCE_HBA_IDENTIFIER 86 +#define SCE_HBA_STRINGEOL 87 +#define SCE_HP_START 90 +#define SCE_HP_DEFAULT 91 +#define SCE_HP_COMMENTLINE 92 +#define SCE_HP_NUMBER 93 +#define SCE_HP_STRING 94 +#define SCE_HP_CHARACTER 95 +#define SCE_HP_WORD 96 +#define SCE_HP_TRIPLE 97 +#define SCE_HP_TRIPLEDOUBLE 98 +#define SCE_HP_CLASSNAME 99 +#define SCE_HP_DEFNAME 100 +#define SCE_HP_OPERATOR 101 +#define SCE_HP_IDENTIFIER 102 +#define SCE_HPHP_COMPLEX_VARIABLE 104 +#define SCE_HPA_START 105 +#define SCE_HPA_DEFAULT 106 +#define SCE_HPA_COMMENTLINE 107 +#define SCE_HPA_NUMBER 108 +#define SCE_HPA_STRING 109 +#define SCE_HPA_CHARACTER 110 +#define SCE_HPA_WORD 111 +#define SCE_HPA_TRIPLE 112 +#define SCE_HPA_TRIPLEDOUBLE 113 +#define SCE_HPA_CLASSNAME 114 +#define SCE_HPA_DEFNAME 115 +#define SCE_HPA_OPERATOR 116 +#define SCE_HPA_IDENTIFIER 117 +#define SCE_HPHP_DEFAULT 118 +#define SCE_HPHP_HSTRING 119 +#define SCE_HPHP_SIMPLESTRING 120 +#define SCE_HPHP_WORD 121 +#define SCE_HPHP_NUMBER 122 +#define SCE_HPHP_VARIABLE 123 +#define SCE_HPHP_COMMENT 124 +#define SCE_HPHP_COMMENTLINE 125 +#define SCE_HPHP_HSTRING_VARIABLE 126 +#define SCE_HPHP_OPERATOR 127 +#define SCE_PL_DEFAULT 0 +#define SCE_PL_ERROR 1 +#define SCE_PL_COMMENTLINE 2 +#define SCE_PL_POD 3 +#define SCE_PL_NUMBER 4 +#define SCE_PL_WORD 5 +#define SCE_PL_STRING 6 +#define SCE_PL_CHARACTER 7 +#define SCE_PL_PUNCTUATION 8 +#define SCE_PL_PREPROCESSOR 9 +#define SCE_PL_OPERATOR 10 +#define SCE_PL_IDENTIFIER 11 +#define SCE_PL_SCALAR 12 +#define SCE_PL_ARRAY 13 +#define SCE_PL_HASH 14 +#define SCE_PL_SYMBOLTABLE 15 +#define SCE_PL_VARIABLE_INDEXER 16 +#define SCE_PL_REGEX 17 +#define SCE_PL_REGSUBST 18 +#define SCE_PL_LONGQUOTE 19 +#define SCE_PL_BACKTICKS 20 +#define SCE_PL_DATASECTION 21 +#define SCE_PL_HERE_DELIM 22 +#define SCE_PL_HERE_Q 23 +#define SCE_PL_HERE_QQ 24 +#define SCE_PL_HERE_QX 25 +#define SCE_PL_STRING_Q 26 +#define SCE_PL_STRING_QQ 27 +#define SCE_PL_STRING_QX 28 +#define SCE_PL_STRING_QR 29 +#define SCE_PL_STRING_QW 30 +#define SCE_PL_POD_VERB 31 +#define SCE_PL_SUB_PROTOTYPE 40 +#define SCE_PL_FORMAT_IDENT 41 +#define SCE_PL_FORMAT 42 +#define SCE_RB_DEFAULT 0 +#define SCE_RB_ERROR 1 +#define SCE_RB_COMMENTLINE 2 +#define SCE_RB_POD 3 +#define SCE_RB_NUMBER 4 +#define SCE_RB_WORD 5 +#define SCE_RB_STRING 6 +#define SCE_RB_CHARACTER 7 +#define SCE_RB_CLASSNAME 8 +#define SCE_RB_DEFNAME 9 +#define SCE_RB_OPERATOR 10 +#define SCE_RB_IDENTIFIER 11 +#define SCE_RB_REGEX 12 +#define SCE_RB_GLOBAL 13 +#define SCE_RB_SYMBOL 14 +#define SCE_RB_MODULE_NAME 15 +#define SCE_RB_INSTANCE_VAR 16 +#define SCE_RB_CLASS_VAR 17 +#define SCE_RB_BACKTICKS 18 +#define SCE_RB_DATASECTION 19 +#define SCE_RB_HERE_DELIM 20 +#define SCE_RB_HERE_Q 21 +#define SCE_RB_HERE_QQ 22 +#define SCE_RB_HERE_QX 23 +#define SCE_RB_STRING_Q 24 +#define SCE_RB_STRING_QQ 25 +#define SCE_RB_STRING_QX 26 +#define SCE_RB_STRING_QR 27 +#define SCE_RB_STRING_QW 28 +#define SCE_RB_WORD_DEMOTED 29 +#define SCE_RB_STDIN 30 +#define SCE_RB_STDOUT 31 +#define SCE_RB_STDERR 40 +#define SCE_RB_UPPER_BOUND 41 +#define SCE_B_DEFAULT 0 +#define SCE_B_COMMENT 1 +#define SCE_B_NUMBER 2 +#define SCE_B_KEYWORD 3 +#define SCE_B_STRING 4 +#define SCE_B_PREPROCESSOR 5 +#define SCE_B_OPERATOR 6 +#define SCE_B_IDENTIFIER 7 +#define SCE_B_DATE 8 +#define SCE_B_STRINGEOL 9 +#define SCE_B_KEYWORD2 10 +#define SCE_B_KEYWORD3 11 +#define SCE_B_KEYWORD4 12 +#define SCE_B_CONSTANT 13 +#define SCE_B_ASM 14 +#define SCE_B_LABEL 15 +#define SCE_B_ERROR 16 +#define SCE_B_HEXNUMBER 17 +#define SCE_B_BINNUMBER 18 +#define SCE_PROPS_DEFAULT 0 +#define SCE_PROPS_COMMENT 1 +#define SCE_PROPS_SECTION 2 +#define SCE_PROPS_ASSIGNMENT 3 +#define SCE_PROPS_DEFVAL 4 +#define SCE_PROPS_KEY 5 +#define SCE_L_DEFAULT 0 +#define SCE_L_COMMAND 1 +#define SCE_L_TAG 2 +#define SCE_L_MATH 3 +#define SCE_L_COMMENT 4 +#define SCE_LUA_DEFAULT 0 +#define SCE_LUA_COMMENT 1 +#define SCE_LUA_COMMENTLINE 2 +#define SCE_LUA_COMMENTDOC 3 +#define SCE_LUA_NUMBER 4 +#define SCE_LUA_WORD 5 +#define SCE_LUA_STRING 6 +#define SCE_LUA_CHARACTER 7 +#define SCE_LUA_LITERALSTRING 8 +#define SCE_LUA_PREPROCESSOR 9 +#define SCE_LUA_OPERATOR 10 +#define SCE_LUA_IDENTIFIER 11 +#define SCE_LUA_STRINGEOL 12 +#define SCE_LUA_WORD2 13 +#define SCE_LUA_WORD3 14 +#define SCE_LUA_WORD4 15 +#define SCE_LUA_WORD5 16 +#define SCE_LUA_WORD6 17 +#define SCE_LUA_WORD7 18 +#define SCE_LUA_WORD8 19 +#define SCE_ERR_DEFAULT 0 +#define SCE_ERR_PYTHON 1 +#define SCE_ERR_GCC 2 +#define SCE_ERR_MS 3 +#define SCE_ERR_CMD 4 +#define SCE_ERR_BORLAND 5 +#define SCE_ERR_PERL 6 +#define SCE_ERR_NET 7 +#define SCE_ERR_LUA 8 +#define SCE_ERR_CTAG 9 +#define SCE_ERR_DIFF_CHANGED 10 +#define SCE_ERR_DIFF_ADDITION 11 +#define SCE_ERR_DIFF_DELETION 12 +#define SCE_ERR_DIFF_MESSAGE 13 +#define SCE_ERR_PHP 14 +#define SCE_ERR_ELF 15 +#define SCE_ERR_IFC 16 +#define SCE_ERR_IFORT 17 +#define SCE_ERR_ABSF 18 +#define SCE_ERR_TIDY 19 +#define SCE_ERR_JAVA_STACK 20 +#define SCE_ERR_VALUE 21 +#define SCE_BAT_DEFAULT 0 +#define SCE_BAT_COMMENT 1 +#define SCE_BAT_WORD 2 +#define SCE_BAT_LABEL 3 +#define SCE_BAT_HIDE 4 +#define SCE_BAT_COMMAND 5 +#define SCE_BAT_IDENTIFIER 6 +#define SCE_BAT_OPERATOR 7 +#define SCE_MAKE_DEFAULT 0 +#define SCE_MAKE_COMMENT 1 +#define SCE_MAKE_PREPROCESSOR 2 +#define SCE_MAKE_IDENTIFIER 3 +#define SCE_MAKE_OPERATOR 4 +#define SCE_MAKE_TARGET 5 +#define SCE_MAKE_IDEOL 9 +#define SCE_DIFF_DEFAULT 0 +#define SCE_DIFF_COMMENT 1 +#define SCE_DIFF_COMMAND 2 +#define SCE_DIFF_HEADER 3 +#define SCE_DIFF_POSITION 4 +#define SCE_DIFF_DELETED 5 +#define SCE_DIFF_ADDED 6 +#define SCE_DIFF_CHANGED 7 +#define SCE_CONF_DEFAULT 0 +#define SCE_CONF_COMMENT 1 +#define SCE_CONF_NUMBER 2 +#define SCE_CONF_IDENTIFIER 3 +#define SCE_CONF_EXTENSION 4 +#define SCE_CONF_PARAMETER 5 +#define SCE_CONF_STRING 6 +#define SCE_CONF_OPERATOR 7 +#define SCE_CONF_IP 8 +#define SCE_CONF_DIRECTIVE 9 +#define SCE_AVE_DEFAULT 0 +#define SCE_AVE_COMMENT 1 +#define SCE_AVE_NUMBER 2 +#define SCE_AVE_WORD 3 +#define SCE_AVE_STRING 6 +#define SCE_AVE_ENUM 7 +#define SCE_AVE_STRINGEOL 8 +#define SCE_AVE_IDENTIFIER 9 +#define SCE_AVE_OPERATOR 10 +#define SCE_AVE_WORD1 11 +#define SCE_AVE_WORD2 12 +#define SCE_AVE_WORD3 13 +#define SCE_AVE_WORD4 14 +#define SCE_AVE_WORD5 15 +#define SCE_AVE_WORD6 16 +#define SCE_ADA_DEFAULT 0 +#define SCE_ADA_WORD 1 +#define SCE_ADA_IDENTIFIER 2 +#define SCE_ADA_NUMBER 3 +#define SCE_ADA_DELIMITER 4 +#define SCE_ADA_CHARACTER 5 +#define SCE_ADA_CHARACTEREOL 6 +#define SCE_ADA_STRING 7 +#define SCE_ADA_STRINGEOL 8 +#define SCE_ADA_LABEL 9 +#define SCE_ADA_COMMENTLINE 10 +#define SCE_ADA_ILLEGAL 11 +#define SCE_BAAN_DEFAULT 0 +#define SCE_BAAN_COMMENT 1 +#define SCE_BAAN_COMMENTDOC 2 +#define SCE_BAAN_NUMBER 3 +#define SCE_BAAN_WORD 4 +#define SCE_BAAN_STRING 5 +#define SCE_BAAN_PREPROCESSOR 6 +#define SCE_BAAN_OPERATOR 7 +#define SCE_BAAN_IDENTIFIER 8 +#define SCE_BAAN_STRINGEOL 9 +#define SCE_BAAN_WORD2 10 +#define SCE_LISP_DEFAULT 0 +#define SCE_LISP_COMMENT 1 +#define SCE_LISP_NUMBER 2 +#define SCE_LISP_KEYWORD 3 +#define SCE_LISP_KEYWORD_KW 4 +#define SCE_LISP_SYMBOL 5 +#define SCE_LISP_STRING 6 +#define SCE_LISP_STRINGEOL 8 +#define SCE_LISP_IDENTIFIER 9 +#define SCE_LISP_OPERATOR 10 +#define SCE_LISP_SPECIAL 11 +#define SCE_LISP_MULTI_COMMENT 12 +#define SCE_EIFFEL_DEFAULT 0 +#define SCE_EIFFEL_COMMENTLINE 1 +#define SCE_EIFFEL_NUMBER 2 +#define SCE_EIFFEL_WORD 3 +#define SCE_EIFFEL_STRING 4 +#define SCE_EIFFEL_CHARACTER 5 +#define SCE_EIFFEL_OPERATOR 6 +#define SCE_EIFFEL_IDENTIFIER 7 +#define SCE_EIFFEL_STRINGEOL 8 +#define SCE_NNCRONTAB_DEFAULT 0 +#define SCE_NNCRONTAB_COMMENT 1 +#define SCE_NNCRONTAB_TASK 2 +#define SCE_NNCRONTAB_SECTION 3 +#define SCE_NNCRONTAB_KEYWORD 4 +#define SCE_NNCRONTAB_MODIFIER 5 +#define SCE_NNCRONTAB_ASTERISK 6 +#define SCE_NNCRONTAB_NUMBER 7 +#define SCE_NNCRONTAB_STRING 8 +#define SCE_NNCRONTAB_ENVIRONMENT 9 +#define SCE_NNCRONTAB_IDENTIFIER 10 +#define SCE_FORTH_DEFAULT 0 +#define SCE_FORTH_COMMENT 1 +#define SCE_FORTH_COMMENT_ML 2 +#define SCE_FORTH_IDENTIFIER 3 +#define SCE_FORTH_CONTROL 4 +#define SCE_FORTH_KEYWORD 5 +#define SCE_FORTH_DEFWORD 6 +#define SCE_FORTH_PREWORD1 7 +#define SCE_FORTH_PREWORD2 8 +#define SCE_FORTH_NUMBER 9 +#define SCE_FORTH_STRING 10 +#define SCE_FORTH_LOCALE 11 +#define SCE_MATLAB_DEFAULT 0 +#define SCE_MATLAB_COMMENT 1 +#define SCE_MATLAB_COMMAND 2 +#define SCE_MATLAB_NUMBER 3 +#define SCE_MATLAB_KEYWORD 4 +#define SCE_MATLAB_STRING 5 +#define SCE_MATLAB_OPERATOR 6 +#define SCE_MATLAB_IDENTIFIER 7 +#define SCE_MATLAB_DOUBLEQUOTESTRING 8 +#define SCE_SCRIPTOL_DEFAULT 0 +#define SCE_SCRIPTOL_WHITE 1 +#define SCE_SCRIPTOL_COMMENTLINE 2 +#define SCE_SCRIPTOL_PERSISTENT 3 +#define SCE_SCRIPTOL_CSTYLE 4 +#define SCE_SCRIPTOL_COMMENTBLOCK 5 +#define SCE_SCRIPTOL_NUMBER 6 +#define SCE_SCRIPTOL_STRING 7 +#define SCE_SCRIPTOL_CHARACTER 8 +#define SCE_SCRIPTOL_STRINGEOL 9 +#define SCE_SCRIPTOL_KEYWORD 10 +#define SCE_SCRIPTOL_OPERATOR 11 +#define SCE_SCRIPTOL_IDENTIFIER 12 +#define SCE_SCRIPTOL_TRIPLE 13 +#define SCE_SCRIPTOL_CLASSNAME 14 +#define SCE_SCRIPTOL_PREPROCESSOR 15 +#define SCE_ASM_DEFAULT 0 +#define SCE_ASM_COMMENT 1 +#define SCE_ASM_NUMBER 2 +#define SCE_ASM_STRING 3 +#define SCE_ASM_OPERATOR 4 +#define SCE_ASM_IDENTIFIER 5 +#define SCE_ASM_CPUINSTRUCTION 6 +#define SCE_ASM_MATHINSTRUCTION 7 +#define SCE_ASM_REGISTER 8 +#define SCE_ASM_DIRECTIVE 9 +#define SCE_ASM_DIRECTIVEOPERAND 10 +#define SCE_ASM_COMMENTBLOCK 11 +#define SCE_ASM_CHARACTER 12 +#define SCE_ASM_STRINGEOL 13 +#define SCE_ASM_EXTINSTRUCTION 14 +#define SCE_F_DEFAULT 0 +#define SCE_F_COMMENT 1 +#define SCE_F_NUMBER 2 +#define SCE_F_STRING1 3 +#define SCE_F_STRING2 4 +#define SCE_F_STRINGEOL 5 +#define SCE_F_OPERATOR 6 +#define SCE_F_IDENTIFIER 7 +#define SCE_F_WORD 8 +#define SCE_F_WORD2 9 +#define SCE_F_WORD3 10 +#define SCE_F_PREPROCESSOR 11 +#define SCE_F_OPERATOR2 12 +#define SCE_F_LABEL 13 +#define SCE_F_CONTINUATION 14 +#define SCE_CSS_DEFAULT 0 +#define SCE_CSS_TAG 1 +#define SCE_CSS_CLASS 2 +#define SCE_CSS_PSEUDOCLASS 3 +#define SCE_CSS_UNKNOWN_PSEUDOCLASS 4 +#define SCE_CSS_OPERATOR 5 +#define SCE_CSS_IDENTIFIER 6 +#define SCE_CSS_UNKNOWN_IDENTIFIER 7 +#define SCE_CSS_VALUE 8 +#define SCE_CSS_COMMENT 9 +#define SCE_CSS_ID 10 +#define SCE_CSS_IMPORTANT 11 +#define SCE_CSS_DIRECTIVE 12 +#define SCE_CSS_DOUBLESTRING 13 +#define SCE_CSS_SINGLESTRING 14 +#define SCE_CSS_IDENTIFIER2 15 +#define SCE_CSS_ATTRIBUTE 16 +#define SCE_CSS_IDENTIFIER3 17 +#define SCE_CSS_PSEUDOELEMENT 18 +#define SCE_CSS_EXTENDED_IDENTIFIER 19 +#define SCE_CSS_EXTENDED_PSEUDOCLASS 20 +#define SCE_CSS_EXTENDED_PSEUDOELEMENT 21 +#define SCE_CSS_MEDIA 22 +#define SCE_POV_DEFAULT 0 +#define SCE_POV_COMMENT 1 +#define SCE_POV_COMMENTLINE 2 +#define SCE_POV_NUMBER 3 +#define SCE_POV_OPERATOR 4 +#define SCE_POV_IDENTIFIER 5 +#define SCE_POV_STRING 6 +#define SCE_POV_STRINGEOL 7 +#define SCE_POV_DIRECTIVE 8 +#define SCE_POV_BADDIRECTIVE 9 +#define SCE_POV_WORD2 10 +#define SCE_POV_WORD3 11 +#define SCE_POV_WORD4 12 +#define SCE_POV_WORD5 13 +#define SCE_POV_WORD6 14 +#define SCE_POV_WORD7 15 +#define SCE_POV_WORD8 16 +#define SCE_LOUT_DEFAULT 0 +#define SCE_LOUT_COMMENT 1 +#define SCE_LOUT_NUMBER 2 +#define SCE_LOUT_WORD 3 +#define SCE_LOUT_WORD2 4 +#define SCE_LOUT_WORD3 5 +#define SCE_LOUT_WORD4 6 +#define SCE_LOUT_STRING 7 +#define SCE_LOUT_OPERATOR 8 +#define SCE_LOUT_IDENTIFIER 9 +#define SCE_LOUT_STRINGEOL 10 +#define SCE_ESCRIPT_DEFAULT 0 +#define SCE_ESCRIPT_COMMENT 1 +#define SCE_ESCRIPT_COMMENTLINE 2 +#define SCE_ESCRIPT_COMMENTDOC 3 +#define SCE_ESCRIPT_NUMBER 4 +#define SCE_ESCRIPT_WORD 5 +#define SCE_ESCRIPT_STRING 6 +#define SCE_ESCRIPT_OPERATOR 7 +#define SCE_ESCRIPT_IDENTIFIER 8 +#define SCE_ESCRIPT_BRACE 9 +#define SCE_ESCRIPT_WORD2 10 +#define SCE_ESCRIPT_WORD3 11 +#define SCE_PS_DEFAULT 0 +#define SCE_PS_COMMENT 1 +#define SCE_PS_DSC_COMMENT 2 +#define SCE_PS_DSC_VALUE 3 +#define SCE_PS_NUMBER 4 +#define SCE_PS_NAME 5 +#define SCE_PS_KEYWORD 6 +#define SCE_PS_LITERAL 7 +#define SCE_PS_IMMEVAL 8 +#define SCE_PS_PAREN_ARRAY 9 +#define SCE_PS_PAREN_DICT 10 +#define SCE_PS_PAREN_PROC 11 +#define SCE_PS_TEXT 12 +#define SCE_PS_HEXSTRING 13 +#define SCE_PS_BASE85STRING 14 +#define SCE_PS_BADSTRINGCHAR 15 +#define SCE_NSIS_DEFAULT 0 +#define SCE_NSIS_COMMENT 1 +#define SCE_NSIS_STRINGDQ 2 +#define SCE_NSIS_STRINGLQ 3 +#define SCE_NSIS_STRINGRQ 4 +#define SCE_NSIS_FUNCTION 5 +#define SCE_NSIS_VARIABLE 6 +#define SCE_NSIS_LABEL 7 +#define SCE_NSIS_USERDEFINED 8 +#define SCE_NSIS_SECTIONDEF 9 +#define SCE_NSIS_SUBSECTIONDEF 10 +#define SCE_NSIS_IFDEFINEDEF 11 +#define SCE_NSIS_MACRODEF 12 +#define SCE_NSIS_STRINGVAR 13 +#define SCE_NSIS_NUMBER 14 +#define SCE_NSIS_SECTIONGROUP 15 +#define SCE_NSIS_PAGEEX 16 +#define SCE_NSIS_FUNCTIONDEF 17 +#define SCE_NSIS_COMMENTBOX 18 +#define SCE_MMIXAL_LEADWS 0 +#define SCE_MMIXAL_COMMENT 1 +#define SCE_MMIXAL_LABEL 2 +#define SCE_MMIXAL_OPCODE 3 +#define SCE_MMIXAL_OPCODE_PRE 4 +#define SCE_MMIXAL_OPCODE_VALID 5 +#define SCE_MMIXAL_OPCODE_UNKNOWN 6 +#define SCE_MMIXAL_OPCODE_POST 7 +#define SCE_MMIXAL_OPERANDS 8 +#define SCE_MMIXAL_NUMBER 9 +#define SCE_MMIXAL_REF 10 +#define SCE_MMIXAL_CHAR 11 +#define SCE_MMIXAL_STRING 12 +#define SCE_MMIXAL_REGISTER 13 +#define SCE_MMIXAL_HEX 14 +#define SCE_MMIXAL_OPERATOR 15 +#define SCE_MMIXAL_SYMBOL 16 +#define SCE_MMIXAL_INCLUDE 17 +#define SCE_CLW_DEFAULT 0 +#define SCE_CLW_LABEL 1 +#define SCE_CLW_COMMENT 2 +#define SCE_CLW_STRING 3 +#define SCE_CLW_USER_IDENTIFIER 4 +#define SCE_CLW_INTEGER_CONSTANT 5 +#define SCE_CLW_REAL_CONSTANT 6 +#define SCE_CLW_PICTURE_STRING 7 +#define SCE_CLW_KEYWORD 8 +#define SCE_CLW_COMPILER_DIRECTIVE 9 +#define SCE_CLW_RUNTIME_EXPRESSIONS 10 +#define SCE_CLW_BUILTIN_PROCEDURES_FUNCTION 11 +#define SCE_CLW_STRUCTURE_DATA_TYPE 12 +#define SCE_CLW_ATTRIBUTE 13 +#define SCE_CLW_STANDARD_EQUATE 14 +#define SCE_CLW_ERROR 15 +#define SCE_CLW_DEPRECATED 16 +#define SCE_LOT_DEFAULT 0 +#define SCE_LOT_HEADER 1 +#define SCE_LOT_BREAK 2 +#define SCE_LOT_SET 3 +#define SCE_LOT_PASS 4 +#define SCE_LOT_FAIL 5 +#define SCE_LOT_ABORT 6 +#define SCE_YAML_DEFAULT 0 +#define SCE_YAML_COMMENT 1 +#define SCE_YAML_IDENTIFIER 2 +#define SCE_YAML_KEYWORD 3 +#define SCE_YAML_NUMBER 4 +#define SCE_YAML_REFERENCE 5 +#define SCE_YAML_DOCUMENT 6 +#define SCE_YAML_TEXT 7 +#define SCE_YAML_ERROR 8 +#define SCE_YAML_OPERATOR 9 +#define SCE_TEX_DEFAULT 0 +#define SCE_TEX_SPECIAL 1 +#define SCE_TEX_GROUP 2 +#define SCE_TEX_SYMBOL 3 +#define SCE_TEX_COMMAND 4 +#define SCE_TEX_TEXT 5 +#define SCE_METAPOST_DEFAULT 0 +#define SCE_METAPOST_SPECIAL 1 +#define SCE_METAPOST_GROUP 2 +#define SCE_METAPOST_SYMBOL 3 +#define SCE_METAPOST_COMMAND 4 +#define SCE_METAPOST_TEXT 5 +#define SCE_METAPOST_EXTRA 6 +#define SCE_ERLANG_DEFAULT 0 +#define SCE_ERLANG_COMMENT 1 +#define SCE_ERLANG_VARIABLE 2 +#define SCE_ERLANG_NUMBER 3 +#define SCE_ERLANG_KEYWORD 4 +#define SCE_ERLANG_STRING 5 +#define SCE_ERLANG_OPERATOR 6 +#define SCE_ERLANG_ATOM 7 +#define SCE_ERLANG_FUNCTION_NAME 8 +#define SCE_ERLANG_CHARACTER 9 +#define SCE_ERLANG_MACRO 10 +#define SCE_ERLANG_RECORD 11 +#define SCE_ERLANG_PREPROC 12 +#define SCE_ERLANG_NODE_NAME 13 +#define SCE_ERLANG_COMMENT_FUNCTION 14 +#define SCE_ERLANG_COMMENT_MODULE 15 +#define SCE_ERLANG_COMMENT_DOC 16 +#define SCE_ERLANG_COMMENT_DOC_MACRO 17 +#define SCE_ERLANG_ATOM_QUOTED 18 +#define SCE_ERLANG_MACRO_QUOTED 19 +#define SCE_ERLANG_RECORD_QUOTED 20 +#define SCE_ERLANG_NODE_NAME_QUOTED 21 +#define SCE_ERLANG_BIFS 22 +#define SCE_ERLANG_MODULES 23 +#define SCE_ERLANG_MODULES_ATT 24 +#define SCE_ERLANG_UNKNOWN 31 +#define SCE_MSSQL_DEFAULT 0 +#define SCE_MSSQL_COMMENT 1 +#define SCE_MSSQL_LINE_COMMENT 2 +#define SCE_MSSQL_NUMBER 3 +#define SCE_MSSQL_STRING 4 +#define SCE_MSSQL_OPERATOR 5 +#define SCE_MSSQL_IDENTIFIER 6 +#define SCE_MSSQL_VARIABLE 7 +#define SCE_MSSQL_COLUMN_NAME 8 +#define SCE_MSSQL_STATEMENT 9 +#define SCE_MSSQL_DATATYPE 10 +#define SCE_MSSQL_SYSTABLE 11 +#define SCE_MSSQL_GLOBAL_VARIABLE 12 +#define SCE_MSSQL_FUNCTION 13 +#define SCE_MSSQL_STORED_PROCEDURE 14 +#define SCE_MSSQL_DEFAULT_PREF_DATATYPE 15 +#define SCE_MSSQL_COLUMN_NAME_2 16 +#define SCE_V_DEFAULT 0 +#define SCE_V_COMMENT 1 +#define SCE_V_COMMENTLINE 2 +#define SCE_V_COMMENTLINEBANG 3 +#define SCE_V_NUMBER 4 +#define SCE_V_WORD 5 +#define SCE_V_STRING 6 +#define SCE_V_WORD2 7 +#define SCE_V_WORD3 8 +#define SCE_V_PREPROCESSOR 9 +#define SCE_V_OPERATOR 10 +#define SCE_V_IDENTIFIER 11 +#define SCE_V_STRINGEOL 12 +#define SCE_V_USER 19 +#define SCE_KIX_DEFAULT 0 +#define SCE_KIX_COMMENT 1 +#define SCE_KIX_STRING1 2 +#define SCE_KIX_STRING2 3 +#define SCE_KIX_NUMBER 4 +#define SCE_KIX_VAR 5 +#define SCE_KIX_MACRO 6 +#define SCE_KIX_KEYWORD 7 +#define SCE_KIX_FUNCTIONS 8 +#define SCE_KIX_OPERATOR 9 +#define SCE_KIX_IDENTIFIER 31 +#define SCE_GC_DEFAULT 0 +#define SCE_GC_COMMENTLINE 1 +#define SCE_GC_COMMENTBLOCK 2 +#define SCE_GC_GLOBAL 3 +#define SCE_GC_EVENT 4 +#define SCE_GC_ATTRIBUTE 5 +#define SCE_GC_CONTROL 6 +#define SCE_GC_COMMAND 7 +#define SCE_GC_STRING 8 +#define SCE_GC_OPERATOR 9 +#define SCE_SN_DEFAULT 0 +#define SCE_SN_CODE 1 +#define SCE_SN_COMMENTLINE 2 +#define SCE_SN_COMMENTLINEBANG 3 +#define SCE_SN_NUMBER 4 +#define SCE_SN_WORD 5 +#define SCE_SN_STRING 6 +#define SCE_SN_WORD2 7 +#define SCE_SN_WORD3 8 +#define SCE_SN_PREPROCESSOR 9 +#define SCE_SN_OPERATOR 10 +#define SCE_SN_IDENTIFIER 11 +#define SCE_SN_STRINGEOL 12 +#define SCE_SN_REGEXTAG 13 +#define SCE_SN_SIGNAL 14 +#define SCE_SN_USER 19 +#define SCE_AU3_DEFAULT 0 +#define SCE_AU3_COMMENT 1 +#define SCE_AU3_COMMENTBLOCK 2 +#define SCE_AU3_NUMBER 3 +#define SCE_AU3_FUNCTION 4 +#define SCE_AU3_KEYWORD 5 +#define SCE_AU3_MACRO 6 +#define SCE_AU3_STRING 7 +#define SCE_AU3_OPERATOR 8 +#define SCE_AU3_VARIABLE 9 +#define SCE_AU3_SENT 10 +#define SCE_AU3_PREPROCESSOR 11 +#define SCE_AU3_SPECIAL 12 +#define SCE_AU3_EXPAND 13 +#define SCE_AU3_COMOBJ 14 +#define SCE_AU3_UDF 15 +#define SCE_APDL_DEFAULT 0 +#define SCE_APDL_COMMENT 1 +#define SCE_APDL_COMMENTBLOCK 2 +#define SCE_APDL_NUMBER 3 +#define SCE_APDL_STRING 4 +#define SCE_APDL_OPERATOR 5 +#define SCE_APDL_WORD 6 +#define SCE_APDL_PROCESSOR 7 +#define SCE_APDL_COMMAND 8 +#define SCE_APDL_SLASHCOMMAND 9 +#define SCE_APDL_STARCOMMAND 10 +#define SCE_APDL_ARGUMENT 11 +#define SCE_APDL_FUNCTION 12 +#define SCE_SH_DEFAULT 0 +#define SCE_SH_ERROR 1 +#define SCE_SH_COMMENTLINE 2 +#define SCE_SH_NUMBER 3 +#define SCE_SH_WORD 4 +#define SCE_SH_STRING 5 +#define SCE_SH_CHARACTER 6 +#define SCE_SH_OPERATOR 7 +#define SCE_SH_IDENTIFIER 8 +#define SCE_SH_SCALAR 9 +#define SCE_SH_PARAM 10 +#define SCE_SH_BACKTICKS 11 +#define SCE_SH_HERE_DELIM 12 +#define SCE_SH_HERE_Q 13 +#define SCE_ASN1_DEFAULT 0 +#define SCE_ASN1_COMMENT 1 +#define SCE_ASN1_IDENTIFIER 2 +#define SCE_ASN1_STRING 3 +#define SCE_ASN1_OID 4 +#define SCE_ASN1_SCALAR 5 +#define SCE_ASN1_KEYWORD 6 +#define SCE_ASN1_ATTRIBUTE 7 +#define SCE_ASN1_DESCRIPTOR 8 +#define SCE_ASN1_TYPE 9 +#define SCE_ASN1_OPERATOR 10 +#define SCE_VHDL_DEFAULT 0 +#define SCE_VHDL_COMMENT 1 +#define SCE_VHDL_COMMENTLINEBANG 2 +#define SCE_VHDL_NUMBER 3 +#define SCE_VHDL_STRING 4 +#define SCE_VHDL_OPERATOR 5 +#define SCE_VHDL_IDENTIFIER 6 +#define SCE_VHDL_STRINGEOL 7 +#define SCE_VHDL_KEYWORD 8 +#define SCE_VHDL_STDOPERATOR 9 +#define SCE_VHDL_ATTRIBUTE 10 +#define SCE_VHDL_STDFUNCTION 11 +#define SCE_VHDL_STDPACKAGE 12 +#define SCE_VHDL_STDTYPE 13 +#define SCE_VHDL_USERWORD 14 +#define SCE_CAML_DEFAULT 0 +#define SCE_CAML_IDENTIFIER 1 +#define SCE_CAML_TAGNAME 2 +#define SCE_CAML_KEYWORD 3 +#define SCE_CAML_KEYWORD2 4 +#define SCE_CAML_KEYWORD3 5 +#define SCE_CAML_LINENUM 6 +#define SCE_CAML_OPERATOR 7 +#define SCE_CAML_NUMBER 8 +#define SCE_CAML_CHAR 9 +#define SCE_CAML_WHITE 10 +#define SCE_CAML_STRING 11 +#define SCE_CAML_COMMENT 12 +#define SCE_CAML_COMMENT1 13 +#define SCE_CAML_COMMENT2 14 +#define SCE_CAML_COMMENT3 15 +#define SCE_HA_DEFAULT 0 +#define SCE_HA_IDENTIFIER 1 +#define SCE_HA_KEYWORD 2 +#define SCE_HA_NUMBER 3 +#define SCE_HA_STRING 4 +#define SCE_HA_CHARACTER 5 +#define SCE_HA_CLASS 6 +#define SCE_HA_MODULE 7 +#define SCE_HA_CAPITAL 8 +#define SCE_HA_DATA 9 +#define SCE_HA_IMPORT 10 +#define SCE_HA_OPERATOR 11 +#define SCE_HA_INSTANCE 12 +#define SCE_HA_COMMENTLINE 13 +#define SCE_HA_COMMENTBLOCK 14 +#define SCE_HA_COMMENTBLOCK2 15 +#define SCE_HA_COMMENTBLOCK3 16 +#define SCE_T3_DEFAULT 0 +#define SCE_T3_X_DEFAULT 1 +#define SCE_T3_PREPROCESSOR 2 +#define SCE_T3_BLOCK_COMMENT 3 +#define SCE_T3_LINE_COMMENT 4 +#define SCE_T3_OPERATOR 5 +#define SCE_T3_KEYWORD 6 +#define SCE_T3_NUMBER 7 +#define SCE_T3_IDENTIFIER 8 +#define SCE_T3_S_STRING 9 +#define SCE_T3_D_STRING 10 +#define SCE_T3_X_STRING 11 +#define SCE_T3_LIB_DIRECTIVE 12 +#define SCE_T3_MSG_PARAM 13 +#define SCE_T3_HTML_TAG 14 +#define SCE_T3_HTML_DEFAULT 15 +#define SCE_T3_HTML_STRING 16 +#define SCE_T3_USER1 17 +#define SCE_T3_USER2 18 +#define SCE_T3_USER3 19 +#define SCE_T3_BRACE 20 +#define SCE_REBOL_DEFAULT 0 +#define SCE_REBOL_COMMENTLINE 1 +#define SCE_REBOL_COMMENTBLOCK 2 +#define SCE_REBOL_PREFACE 3 +#define SCE_REBOL_OPERATOR 4 +#define SCE_REBOL_CHARACTER 5 +#define SCE_REBOL_QUOTEDSTRING 6 +#define SCE_REBOL_BRACEDSTRING 7 +#define SCE_REBOL_NUMBER 8 +#define SCE_REBOL_PAIR 9 +#define SCE_REBOL_TUPLE 10 +#define SCE_REBOL_BINARY 11 +#define SCE_REBOL_MONEY 12 +#define SCE_REBOL_ISSUE 13 +#define SCE_REBOL_TAG 14 +#define SCE_REBOL_FILE 15 +#define SCE_REBOL_EMAIL 16 +#define SCE_REBOL_URL 17 +#define SCE_REBOL_DATE 18 +#define SCE_REBOL_TIME 19 +#define SCE_REBOL_IDENTIFIER 20 +#define SCE_REBOL_WORD 21 +#define SCE_REBOL_WORD2 22 +#define SCE_REBOL_WORD3 23 +#define SCE_REBOL_WORD4 24 +#define SCE_REBOL_WORD5 25 +#define SCE_REBOL_WORD6 26 +#define SCE_REBOL_WORD7 27 +#define SCE_REBOL_WORD8 28 +#define SCE_SQL_DEFAULT 0 +#define SCE_SQL_COMMENT 1 +#define SCE_SQL_COMMENTLINE 2 +#define SCE_SQL_COMMENTDOC 3 +#define SCE_SQL_NUMBER 4 +#define SCE_SQL_WORD 5 +#define SCE_SQL_STRING 6 +#define SCE_SQL_CHARACTER 7 +#define SCE_SQL_SQLPLUS 8 +#define SCE_SQL_SQLPLUS_PROMPT 9 +#define SCE_SQL_OPERATOR 10 +#define SCE_SQL_IDENTIFIER 11 +#define SCE_SQL_SQLPLUS_COMMENT 13 +#define SCE_SQL_COMMENTLINEDOC 15 +#define SCE_SQL_WORD2 16 +#define SCE_SQL_COMMENTDOCKEYWORD 17 +#define SCE_SQL_COMMENTDOCKEYWORDERROR 18 +#define SCE_SQL_USER1 19 +#define SCE_SQL_USER2 20 +#define SCE_SQL_USER3 21 +#define SCE_SQL_USER4 22 +#define SCE_SQL_QUOTEDIDENTIFIER 23 +#define SCE_ST_DEFAULT 0 +#define SCE_ST_STRING 1 +#define SCE_ST_NUMBER 2 +#define SCE_ST_COMMENT 3 +#define SCE_ST_SYMBOL 4 +#define SCE_ST_BINARY 5 +#define SCE_ST_BOOL 6 +#define SCE_ST_SELF 7 +#define SCE_ST_SUPER 8 +#define SCE_ST_NIL 9 +#define SCE_ST_GLOBAL 10 +#define SCE_ST_RETURN 11 +#define SCE_ST_SPECIAL 12 +#define SCE_ST_KWSEND 13 +#define SCE_ST_ASSIGN 14 +#define SCE_ST_CHARACTER 15 +#define SCE_ST_SPEC_SEL 16 +#define SCE_FS_DEFAULT 0 +#define SCE_FS_COMMENT 1 +#define SCE_FS_COMMENTLINE 2 +#define SCE_FS_COMMENTDOC 3 +#define SCE_FS_COMMENTLINEDOC 4 +#define SCE_FS_COMMENTDOCKEYWORD 5 +#define SCE_FS_COMMENTDOCKEYWORDERROR 6 +#define SCE_FS_KEYWORD 7 +#define SCE_FS_KEYWORD2 8 +#define SCE_FS_KEYWORD3 9 +#define SCE_FS_KEYWORD4 10 +#define SCE_FS_NUMBER 11 +#define SCE_FS_STRING 12 +#define SCE_FS_PREPROCESSOR 13 +#define SCE_FS_OPERATOR 14 +#define SCE_FS_IDENTIFIER 15 +#define SCE_FS_DATE 16 +#define SCE_FS_STRINGEOL 17 +#define SCE_FS_CONSTANT 18 +#define SCE_FS_WORDOPERATOR 19 +#define SCE_FS_DISABLEDCODE 20 +#define SCE_FS_DEFAULT_C 21 +#define SCE_FS_COMMENTDOC_C 22 +#define SCE_FS_COMMENTLINEDOC_C 23 +#define SCE_FS_KEYWORD_C 24 +#define SCE_FS_KEYWORD2_C 25 +#define SCE_FS_NUMBER_C 26 +#define SCE_FS_STRING_C 27 +#define SCE_FS_PREPROCESSOR_C 28 +#define SCE_FS_OPERATOR_C 29 +#define SCE_FS_IDENTIFIER_C 30 +#define SCE_FS_STRINGEOL_C 31 +#define SCE_CSOUND_DEFAULT 0 +#define SCE_CSOUND_COMMENT 1 +#define SCE_CSOUND_NUMBER 2 +#define SCE_CSOUND_OPERATOR 3 +#define SCE_CSOUND_INSTR 4 +#define SCE_CSOUND_IDENTIFIER 5 +#define SCE_CSOUND_OPCODE 6 +#define SCE_CSOUND_HEADERSTMT 7 +#define SCE_CSOUND_USERKEYWORD 8 +#define SCE_CSOUND_COMMENTBLOCK 9 +#define SCE_CSOUND_PARAM 10 +#define SCE_CSOUND_ARATE_VAR 11 +#define SCE_CSOUND_KRATE_VAR 12 +#define SCE_CSOUND_IRATE_VAR 13 +#define SCE_CSOUND_GLOBAL_VAR 14 +#define SCE_CSOUND_STRINGEOL 15 +#define SCE_INNO_DEFAULT 0 +#define SCE_INNO_COMMENT 1 +#define SCE_INNO_KEYWORD 2 +#define SCE_INNO_PARAMETER 3 +#define SCE_INNO_SECTION 4 +#define SCE_INNO_PREPROC 5 +#define SCE_INNO_INLINE_EXPANSION 6 +#define SCE_INNO_COMMENT_PASCAL 7 +#define SCE_INNO_KEYWORD_PASCAL 8 +#define SCE_INNO_KEYWORD_USER 9 +#define SCE_INNO_STRING_DOUBLE 10 +#define SCE_INNO_STRING_SINGLE 11 +#define SCE_INNO_IDENTIFIER 12 +#define SCE_OPAL_SPACE 0 +#define SCE_OPAL_COMMENT_BLOCK 1 +#define SCE_OPAL_COMMENT_LINE 2 +#define SCE_OPAL_INTEGER 3 +#define SCE_OPAL_KEYWORD 4 +#define SCE_OPAL_SORT 5 +#define SCE_OPAL_STRING 6 +#define SCE_OPAL_PAR 7 +#define SCE_OPAL_BOOL_CONST 8 +#define SCE_OPAL_DEFAULT 32 +#define SCE_SPICE_DEFAULT 0 +#define SCE_SPICE_IDENTIFIER 1 +#define SCE_SPICE_KEYWORD 2 +#define SCE_SPICE_KEYWORD2 3 +#define SCE_SPICE_KEYWORD3 4 +#define SCE_SPICE_NUMBER 5 +#define SCE_SPICE_DELIMITER 6 +#define SCE_SPICE_VALUE 7 +#define SCE_SPICE_COMMENTLINE 8 +#define SCE_CMAKE_DEFAULT 0 +#define SCE_CMAKE_COMMENT 1 +#define SCE_CMAKE_STRINGDQ 2 +#define SCE_CMAKE_STRINGLQ 3 +#define SCE_CMAKE_STRINGRQ 4 +#define SCE_CMAKE_COMMANDS 5 +#define SCE_CMAKE_PARAMETERS 6 +#define SCE_CMAKE_VARIABLE 7 +#define SCE_CMAKE_USERDEFINED 8 +#define SCE_CMAKE_WHILEDEF 9 +#define SCE_CMAKE_FOREACHDEF 10 +#define SCE_CMAKE_IFDEFINEDEF 11 +#define SCE_CMAKE_MACRODEF 12 +#define SCE_CMAKE_STRINGVAR 13 +#define SCE_CMAKE_NUMBER 14 +#define SCE_GAP_DEFAULT 0 +#define SCE_GAP_IDENTIFIER 1 +#define SCE_GAP_KEYWORD 2 +#define SCE_GAP_KEYWORD2 3 +#define SCE_GAP_KEYWORD3 4 +#define SCE_GAP_KEYWORD4 5 +#define SCE_GAP_STRING 6 +#define SCE_GAP_CHAR 7 +#define SCE_GAP_OPERATOR 8 +#define SCE_GAP_COMMENT 9 +#define SCE_GAP_NUMBER 10 +#define SCE_GAP_STRINGEOL 11 +#define SCE_PLM_DEFAULT 0 +#define SCE_PLM_COMMENT 1 +#define SCE_PLM_STRING 2 +#define SCE_PLM_NUMBER 3 +#define SCE_PLM_IDENTIFIER 4 +#define SCE_PLM_OPERATOR 5 +#define SCE_PLM_CONTROL 6 +#define SCE_PLM_KEYWORD 7 +#define SCE_4GL_DEFAULT 0 +#define SCE_4GL_NUMBER 1 +#define SCE_4GL_WORD 2 +#define SCE_4GL_STRING 3 +#define SCE_4GL_CHARACTER 4 +#define SCE_4GL_PREPROCESSOR 5 +#define SCE_4GL_OPERATOR 6 +#define SCE_4GL_IDENTIFIER 7 +#define SCE_4GL_BLOCK 8 +#define SCE_4GL_END 9 +#define SCE_4GL_COMMENT1 10 +#define SCE_4GL_COMMENT2 11 +#define SCE_4GL_COMMENT3 12 +#define SCE_4GL_COMMENT4 13 +#define SCE_4GL_COMMENT5 14 +#define SCE_4GL_COMMENT6 15 +#define SCE_4GL_DEFAULT_ 16 +#define SCE_4GL_NUMBER_ 17 +#define SCE_4GL_WORD_ 18 +#define SCE_4GL_STRING_ 19 +#define SCE_4GL_CHARACTER_ 20 +#define SCE_4GL_PREPROCESSOR_ 21 +#define SCE_4GL_OPERATOR_ 22 +#define SCE_4GL_IDENTIFIER_ 23 +#define SCE_4GL_BLOCK_ 24 +#define SCE_4GL_END_ 25 +#define SCE_4GL_COMMENT1_ 26 +#define SCE_4GL_COMMENT2_ 27 +#define SCE_4GL_COMMENT3_ 28 +#define SCE_4GL_COMMENT4_ 29 +#define SCE_4GL_COMMENT5_ 30 +#define SCE_4GL_COMMENT6_ 31 +#define SCE_ABAQUS_DEFAULT 0 +#define SCE_ABAQUS_COMMENT 1 +#define SCE_ABAQUS_COMMENTBLOCK 2 +#define SCE_ABAQUS_NUMBER 3 +#define SCE_ABAQUS_STRING 4 +#define SCE_ABAQUS_OPERATOR 5 +#define SCE_ABAQUS_WORD 6 +#define SCE_ABAQUS_PROCESSOR 7 +#define SCE_ABAQUS_COMMAND 8 +#define SCE_ABAQUS_SLASHCOMMAND 9 +#define SCE_ABAQUS_STARCOMMAND 10 +#define SCE_ABAQUS_ARGUMENT 11 +#define SCE_ABAQUS_FUNCTION 12 +#define SCE_ASY_DEFAULT 0 +#define SCE_ASY_COMMENT 1 +#define SCE_ASY_COMMENTLINE 2 +#define SCE_ASY_NUMBER 3 +#define SCE_ASY_WORD 4 +#define SCE_ASY_STRING 5 +#define SCE_ASY_CHARACTER 6 +#define SCE_ASY_OPERATOR 7 +#define SCE_ASY_IDENTIFIER 8 +#define SCE_ASY_STRINGEOL 9 +#define SCE_ASY_COMMENTLINEDOC 10 +#define SCE_ASY_WORD2 11 +#define SCE_R_DEFAULT 0 +#define SCE_R_COMMENT 1 +#define SCE_R_KWORD 2 +#define SCE_R_BASEKWORD 3 +#define SCE_R_OTHERKWORD 4 +#define SCE_R_NUMBER 5 +#define SCE_R_STRING 6 +#define SCE_R_STRING2 7 +#define SCE_R_OPERATOR 8 +#define SCE_R_IDENTIFIER 9 +#define SCE_R_INFIX 10 +#define SCE_R_INFIXEOL 11 +#define SCE_MAGIK_DEFAULT 0 +#define SCE_MAGIK_COMMENT 1 +#define SCE_MAGIK_HYPER_COMMENT 16 +#define SCE_MAGIK_STRING 2 +#define SCE_MAGIK_CHARACTER 3 +#define SCE_MAGIK_NUMBER 4 +#define SCE_MAGIK_IDENTIFIER 5 +#define SCE_MAGIK_OPERATOR 6 +#define SCE_MAGIK_FLOW 7 +#define SCE_MAGIK_CONTAINER 8 +#define SCE_MAGIK_BRACKET_BLOCK 9 +#define SCE_MAGIK_BRACE_BLOCK 10 +#define SCE_MAGIK_SQBRACKET_BLOCK 11 +#define SCE_MAGIK_UNKNOWN_KEYWORD 12 +#define SCE_MAGIK_KEYWORD 13 +#define SCE_MAGIK_PRAGMA 14 +#define SCE_MAGIK_SYMBOL 15 +#define SCE_POWERSHELL_DEFAULT 0 +#define SCE_POWERSHELL_COMMENT 1 +#define SCE_POWERSHELL_STRING 2 +#define SCE_POWERSHELL_CHARACTER 3 +#define SCE_POWERSHELL_NUMBER 4 +#define SCE_POWERSHELL_VARIABLE 5 +#define SCE_POWERSHELL_OPERATOR 6 +#define SCE_POWERSHELL_IDENTIFIER 7 +#define SCE_POWERSHELL_KEYWORD 8 +#define SCE_POWERSHELL_CMDLET 9 +#define SCE_POWERSHELL_ALIAS 10 +#define SCE_MYSQL_DEFAULT 0 +#define SCE_MYSQL_COMMENT 1 +#define SCE_MYSQL_COMMENTLINE 2 +#define SCE_MYSQL_VARIABLE 3 +#define SCE_MYSQL_SYSTEMVARIABLE 4 +#define SCE_MYSQL_KNOWNSYSTEMVARIABLE 5 +#define SCE_MYSQL_NUMBER 6 +#define SCE_MYSQL_MAJORKEYWORD 7 +#define SCE_MYSQL_KEYWORD 8 +#define SCE_MYSQL_DATABASEOBJECT 9 +#define SCE_MYSQL_PROCEDUREKEYWORD 10 +#define SCE_MYSQL_STRING 11 +#define SCE_MYSQL_SQSTRING 12 +#define SCE_MYSQL_DQSTRING 13 +#define SCE_MYSQL_OPERATOR 14 +#define SCE_MYSQL_FUNCTION 15 +#define SCE_MYSQL_IDENTIFIER 16 +#define SCE_MYSQL_QUOTEDIDENTIFIER 17 +#define SCE_MYSQL_USER1 18 +#define SCE_MYSQL_USER2 19 +#define SCE_MYSQL_USER3 20 +#define SCE_MYSQL_HIDDENCOMMAND 21 +#define SCE_PO_DEFAULT 0 +#define SCE_PO_COMMENT 1 +#define SCE_PO_MSGID 2 +#define SCE_PO_MSGID_TEXT 3 +#define SCE_PO_MSGSTR 4 +#define SCE_PO_MSGSTR_TEXT 5 +#define SCE_PO_MSGCTXT 6 +#define SCE_PO_MSGCTXT_TEXT 7 +#define SCE_PO_FUZZY 8 +#define SCE_PAS_DEFAULT 0 +#define SCE_PAS_IDENTIFIER 1 +#define SCE_PAS_COMMENT 2 +#define SCE_PAS_COMMENT2 3 +#define SCE_PAS_COMMENTLINE 4 +#define SCE_PAS_PREPROCESSOR 5 +#define SCE_PAS_PREPROCESSOR2 6 +#define SCE_PAS_NUMBER 7 +#define SCE_PAS_HEXNUMBER 8 +#define SCE_PAS_WORD 9 +#define SCE_PAS_STRING 10 +#define SCE_PAS_STRINGEOL 11 +#define SCE_PAS_CHARACTER 12 +#define SCE_PAS_OPERATOR 13 +#define SCE_PAS_ASM 14 +#define SCE_SORCUS_DEFAULT 0 +#define SCE_SORCUS_COMMAND 1 +#define SCE_SORCUS_PARAMETER 2 +#define SCE_SORCUS_COMMENTLINE 3 +#define SCE_SORCUS_STRING 4 +#define SCE_SORCUS_STRINGEOL 5 +#define SCE_SORCUS_IDENTIFIER 6 +#define SCE_SORCUS_OPERATOR 7 +#define SCE_SORCUS_NUMBER 8 +#define SCE_SORCUS_CONSTANT 9 +#define SCE_POWERPRO_DEFAULT 0 +#define SCE_POWERPRO_COMMENTBLOCK 1 +#define SCE_POWERPRO_COMMENTLINE 2 +#define SCE_POWERPRO_NUMBER 3 +#define SCE_POWERPRO_WORD 4 +#define SCE_POWERPRO_WORD2 5 +#define SCE_POWERPRO_WORD3 6 +#define SCE_POWERPRO_WORD4 7 +#define SCE_POWERPRO_DOUBLEQUOTEDSTRING 8 +#define SCE_POWERPRO_SINGLEQUOTEDSTRING 9 +#define SCE_POWERPRO_LINECONTINUE 10 +#define SCE_POWERPRO_OPERATOR 11 +#define SCE_POWERPRO_IDENTIFIER 12 +#define SCE_POWERPRO_STRINGEOL 13 +#define SCE_POWERPRO_VERBATIM 14 +#define SCE_POWERPRO_ALTQUOTE 15 +#define SCE_POWERPRO_FUNCTION 16 +#define SCE_SML_DEFAULT 0 +#define SCE_SML_IDENTIFIER 1 +#define SCE_SML_TAGNAME 2 +#define SCE_SML_KEYWORD 3 +#define SCE_SML_KEYWORD2 4 +#define SCE_SML_KEYWORD3 5 +#define SCE_SML_LINENUM 6 +#define SCE_SML_OPERATOR 7 +#define SCE_SML_NUMBER 8 +#define SCE_SML_CHAR 9 +#define SCE_SML_STRING 11 +#define SCE_SML_COMMENT 12 +#define SCE_SML_COMMENT1 13 +#define SCE_SML_COMMENT2 14 +#define SCE_SML_COMMENT3 15 +#define SCE_MARKDOWN_DEFAULT 0 +#define SCE_MARKDOWN_LINE_BEGIN 1 +#define SCE_MARKDOWN_STRONG1 2 +#define SCE_MARKDOWN_STRONG2 3 +#define SCE_MARKDOWN_EM1 4 +#define SCE_MARKDOWN_EM2 5 +#define SCE_MARKDOWN_HEADER1 6 +#define SCE_MARKDOWN_HEADER2 7 +#define SCE_MARKDOWN_HEADER3 8 +#define SCE_MARKDOWN_HEADER4 9 +#define SCE_MARKDOWN_HEADER5 10 +#define SCE_MARKDOWN_HEADER6 11 +#define SCE_MARKDOWN_PRECHAR 12 +#define SCE_MARKDOWN_ULIST_ITEM 13 +#define SCE_MARKDOWN_OLIST_ITEM 14 +#define SCE_MARKDOWN_BLOCKQUOTE 15 +#define SCE_MARKDOWN_STRIKEOUT 16 +#define SCE_MARKDOWN_HRULE 17 +#define SCE_MARKDOWN_LINK 18 +#define SCE_MARKDOWN_CODE 19 +#define SCE_MARKDOWN_CODE2 20 +#define SCE_MARKDOWN_CODEBK 21 +/* --Autogenerated -- end of section automatically generated from Scintilla.iface */ + +#endif diff --git a/sdk/wxscintilla/src/scintilla/include/Scintilla.h b/sdk/wxscintilla/src/scintilla/include/Scintilla.h new file mode 100644 index 0000000..c5e6a1e --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/include/Scintilla.h @@ -0,0 +1,974 @@ +/* Scintilla source code edit control */ +/** @file Scintilla.h + ** Interface to the edit control. + **/ +/* Copyright 1998-2003 by Neil Hodgson + * The License.txt file describes the conditions under which this software may be distributed. */ + +/* Most of this file is automatically generated from the Scintilla.iface interface definition + * file which contains any comments about the definitions. HFacer.py does the generation. */ + +#ifndef SCINTILLA_H +#define SCINTILLA_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32) +/* Return false on failure: */ +int Scintilla_RegisterClasses(void *hInstance); +int Scintilla_ReleaseResources(); +#endif +int Scintilla_LinkLexers(); + +#ifdef __cplusplus +} +#endif + +/* Here should be placed typedefs for uptr_t, an unsigned integer type large enough to + * hold a pointer and sptr_t, a signed integer large enough to hold a pointer. + * May need to be changed for 64 bit platforms. */ +#if defined(_WIN32) +#include +#endif +#ifdef MAXULONG_PTR +typedef ULONG_PTR uptr_t; +typedef LONG_PTR sptr_t; +#else +typedef unsigned long uptr_t; +typedef long sptr_t; +#endif + +typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam, sptr_t lParam); + +/* ++Autogenerated -- start of section automatically generated from Scintilla.iface */ +#define INVALID_POSITION -1 +#define SCI_START 2000 +#define SCI_OPTIONAL_START 3000 +#define SCI_LEXER_START 4000 +#define SCI_ADDTEXT 2001 +#define SCI_ADDSTYLEDTEXT 2002 +#define SCI_INSERTTEXT 2003 +#define SCI_CLEARALL 2004 +#define SCI_CLEARDOCUMENTSTYLE 2005 +#define SCI_GETLENGTH 2006 +#define SCI_GETCHARAT 2007 +#define SCI_GETCURRENTPOS 2008 +#define SCI_GETANCHOR 2009 +#define SCI_GETSTYLEAT 2010 +#define SCI_REDO 2011 +#define SCI_SETUNDOCOLLECTION 2012 +#define SCI_SELECTALL 2013 +#define SCI_SETSAVEPOINT 2014 +#define SCI_GETSTYLEDTEXT 2015 +#define SCI_CANREDO 2016 +#define SCI_MARKERLINEFROMHANDLE 2017 +#define SCI_MARKERDELETEHANDLE 2018 +#define SCI_GETUNDOCOLLECTION 2019 +#define SCWS_INVISIBLE 0 +#define SCWS_VISIBLEALWAYS 1 +#define SCWS_VISIBLEAFTERINDENT 2 +#define SCI_GETVIEWWS 2020 +#define SCI_SETVIEWWS 2021 +#define SCI_POSITIONFROMPOINT 2022 +#define SCI_POSITIONFROMPOINTCLOSE 2023 +#define SCI_GOTOLINE 2024 +#define SCI_GOTOPOS 2025 +#define SCI_SETANCHOR 2026 +#define SCI_GETCURLINE 2027 +#define SCI_GETENDSTYLED 2028 +#define SC_EOL_CRLF 0 +#define SC_EOL_CR 1 +#define SC_EOL_LF 2 +#define SCI_CONVERTEOLS 2029 +#define SCI_GETEOLMODE 2030 +#define SCI_SETEOLMODE 2031 +#define SCI_STARTSTYLING 2032 +#define SCI_SETSTYLING 2033 +#define SCI_GETBUFFEREDDRAW 2034 +#define SCI_SETBUFFEREDDRAW 2035 +#define SCI_SETTABWIDTH 2036 +#define SCI_GETTABWIDTH 2121 +#define SC_CP_UTF8 65001 +#define SC_CP_DBCS 1 +#define SCI_SETCODEPAGE 2037 +#define SCI_SETUSEPALETTE 2039 +#define MARKER_MAX 31 +#define SC_MARK_CIRCLE 0 +#define SC_MARK_ROUNDRECT 1 +#define SC_MARK_ARROW 2 +#define SC_MARK_SMALLRECT 3 +#define SC_MARK_SHORTARROW 4 +#define SC_MARK_EMPTY 5 +#define SC_MARK_ARROWDOWN 6 +#define SC_MARK_MINUS 7 +#define SC_MARK_PLUS 8 +#define SC_MARK_VLINE 9 +#define SC_MARK_LCORNER 10 +#define SC_MARK_TCORNER 11 +#define SC_MARK_BOXPLUS 12 +#define SC_MARK_BOXPLUSCONNECTED 13 +#define SC_MARK_BOXMINUS 14 +#define SC_MARK_BOXMINUSCONNECTED 15 +#define SC_MARK_LCORNERCURVE 16 +#define SC_MARK_TCORNERCURVE 17 +#define SC_MARK_CIRCLEPLUS 18 +#define SC_MARK_CIRCLEPLUSCONNECTED 19 +#define SC_MARK_CIRCLEMINUS 20 +#define SC_MARK_CIRCLEMINUSCONNECTED 21 +#define SC_MARK_BACKGROUND 22 +#define SC_MARK_DOTDOTDOT 23 +#define SC_MARK_ARROWS 24 +#define SC_MARK_PIXMAP 25 +#define SC_MARK_FULLRECT 26 +#define SC_MARK_LEFTRECT 27 +#define SC_MARK_AVAILABLE 28 +#define SC_MARK_UNDERLINE 29 +#define SC_MARK_ARROW_IN_BOX 100 +#define SC_MARK_ARROWDOWN_IN_BOX 101 +#define SC_MARK_FULLRECT_TAIL 102 +#define SC_MARK_PLUS_IN_BOX 103 +#define SC_MARK_MINUS_IN_BOX 104 + +#define SC_MARK_CHARACTER 10000 +#define SC_MARKNUM_FOLDEREND 25 +#define SC_MARKNUM_FOLDEROPENMID 26 +#define SC_MARKNUM_FOLDERMIDTAIL 27 +#define SC_MARKNUM_FOLDERTAIL 28 +#define SC_MARKNUM_FOLDERSUB 29 +#define SC_MARKNUM_FOLDER 30 +#define SC_MARKNUM_FOLDEROPEN 31 +#define SC_MASK_FOLDERS 0xFE000000 +#define SCI_MARKERDEFINE 2040 +#define SCI_MARKERSETFORE 2041 +#define SCI_MARKERSETBACK 2042 +#define SCI_MARKERADD 2043 +#define SCI_MARKERDELETE 2044 +#define SCI_MARKERDELETEALL 2045 +#define SCI_MARKERGET 2046 +#define SCI_MARKERNEXT 2047 +#define SCI_MARKERPREVIOUS 2048 +#define SCI_MARKERDEFINEPIXMAP 2049 +#define SCI_MARKERADDSET 2466 +#define SCI_MARKERSETALPHA 2476 +#define SC_MARGIN_SYMBOL 0 +#define SC_MARGIN_NUMBER 1 +#define SC_MARGIN_BACK 2 +#define SC_MARGIN_FORE 3 +#define SC_MARGIN_TEXT 4 +#define SC_MARGIN_RTEXT 5 +#define SCI_SETMARGINTYPEN 2240 +#define SCI_GETMARGINTYPEN 2241 +#define SCI_SETMARGINWIDTHN 2242 +#define SCI_GETMARGINWIDTHN 2243 +#define SCI_SETMARGINMASKN 2244 +#define SCI_GETMARGINMASKN 2245 +#define SCI_SETMARGINSENSITIVEN 2246 +#define SCI_GETMARGINSENSITIVEN 2247 +#define STYLE_DEFAULT 32 +#define STYLE_LINENUMBER 33 +#define STYLE_BRACELIGHT 34 +#define STYLE_BRACEBAD 35 +#define STYLE_CONTROLCHAR 36 +#define STYLE_INDENTGUIDE 37 +#define STYLE_CALLTIP 38 +#define STYLE_LASTPREDEFINED 39 +#define STYLE_MAX 255 +#define SC_CHARSET_ANSI 0 +#define SC_CHARSET_DEFAULT 1 +#define SC_CHARSET_BALTIC 186 +#define SC_CHARSET_CHINESEBIG5 136 +#define SC_CHARSET_EASTEUROPE 238 +#define SC_CHARSET_GB2312 134 +#define SC_CHARSET_GREEK 161 +#define SC_CHARSET_HANGUL 129 +#define SC_CHARSET_MAC 77 +#define SC_CHARSET_OEM 255 +#define SC_CHARSET_RUSSIAN 204 +#define SC_CHARSET_CYRILLIC 1251 +#define SC_CHARSET_SHIFTJIS 128 +#define SC_CHARSET_SYMBOL 2 +#define SC_CHARSET_TURKISH 162 +#define SC_CHARSET_JOHAB 130 +#define SC_CHARSET_HEBREW 177 +#define SC_CHARSET_ARABIC 178 +#define SC_CHARSET_VIETNAMESE 163 +#define SC_CHARSET_THAI 222 +#define SC_CHARSET_8859_15 1000 +#define SCI_STYLECLEARALL 2050 +#define SCI_STYLESETFORE 2051 +#define SCI_STYLESETBACK 2052 +#define SCI_STYLESETBOLD 2053 +#define SCI_STYLESETITALIC 2054 +#define SCI_STYLESETSIZE 2055 +#define SCI_STYLESETFONT 2056 +#define SCI_STYLESETEOLFILLED 2057 +#define SCI_STYLERESETDEFAULT 2058 +#define SCI_STYLESETUNDERLINE 2059 +#define SC_CASE_MIXED 0 +#define SC_CASE_UPPER 1 +#define SC_CASE_LOWER 2 +#define SCI_STYLEGETFORE 2481 +#define SCI_STYLEGETBACK 2482 +#define SCI_STYLEGETBOLD 2483 +#define SCI_STYLEGETITALIC 2484 +#define SCI_STYLEGETSIZE 2485 +#define SCI_STYLEGETFONT 2486 +#define SCI_STYLEGETEOLFILLED 2487 +#define SCI_STYLEGETUNDERLINE 2488 +#define SCI_STYLEGETCASE 2489 +#define SCI_STYLEGETCHARACTERSET 2490 +#define SCI_STYLEGETVISIBLE 2491 +#define SCI_STYLEGETCHANGEABLE 2492 +#define SCI_STYLEGETHOTSPOT 2493 +#define SCI_STYLESETCASE 2060 +#define SCI_STYLESETCHARACTERSET 2066 +#define SCI_STYLESETHOTSPOT 2409 +#define SCI_SETSELFORE 2067 +#define SCI_SETSELBACK 2068 +#define SCI_GETSELALPHA 2477 +#define SCI_SETSELALPHA 2478 +#define SCI_GETSELEOLFILLED 2479 +#define SCI_SETSELEOLFILLED 2480 +#define SCI_SETCARETFORE 2069 +#define SCI_ASSIGNCMDKEY 2070 +#define SCI_CLEARCMDKEY 2071 +#define SCI_CLEARALLCMDKEYS 2072 +#define SCI_SETSTYLINGEX 2073 +#define SCI_STYLESETVISIBLE 2074 +#define SCI_GETCARETPERIOD 2075 +#define SCI_SETCARETPERIOD 2076 +#define SCI_SETWORDCHARS 2077 +#define SCI_BEGINUNDOACTION 2078 +#define SCI_ENDUNDOACTION 2079 +#define INDIC_PLAIN 0 +#define INDIC_SQUIGGLE 1 +#define INDIC_TT 2 +#define INDIC_DIAGONAL 3 +#define INDIC_STRIKE 4 +#define INDIC_HIDDEN 5 +#define INDIC_BOX 6 +#define INDIC_ROUNDBOX 7 +#define INDIC_MAX 31 +#define INDIC_CONTAINER 8 +#define INDIC0_MASK 0x20 +#define INDIC1_MASK 0x40 +#define INDIC2_MASK 0x80 +#define INDICS_MASK 0xE0 +#define SCI_INDICSETSTYLE 2080 +#define SCI_INDICGETSTYLE 2081 +#define SCI_INDICSETFORE 2082 +#define SCI_INDICGETFORE 2083 +#define SCI_INDICSETUNDER 2510 +#define SCI_INDICGETUNDER 2511 +#define SCI_SETWHITESPACEFORE 2084 +#define SCI_SETWHITESPACEBACK 2085 +#define SCI_SETWHITESPACESIZE 2086 +#define SCI_GETWHITESPACESIZE 2087 +#define SCI_SETSTYLEBITS 2090 +#define SCI_GETSTYLEBITS 2091 +#define SCI_SETLINESTATE 2092 +#define SCI_GETLINESTATE 2093 +#define SCI_GETMAXLINESTATE 2094 +#define SCI_GETCARETLINEVISIBLE 2095 +#define SCI_SETCARETLINEVISIBLE 2096 +#define SCI_GETCARETLINEBACK 2097 +#define SCI_SETCARETLINEBACK 2098 +#define SCI_STYLESETCHANGEABLE 2099 +#define SCI_AUTOCSHOW 2100 +#define SCI_AUTOCCANCEL 2101 +#define SCI_AUTOCACTIVE 2102 +#define SCI_AUTOCPOSSTART 2103 +#define SCI_AUTOCCOMPLETE 2104 +#define SCI_AUTOCSTOPS 2105 +#define SCI_AUTOCSETSEPARATOR 2106 +#define SCI_AUTOCGETSEPARATOR 2107 +#define SCI_AUTOCSELECT 2108 +#define SCI_AUTOCSETCANCELATSTART 2110 +#define SCI_AUTOCGETCANCELATSTART 2111 +#define SCI_AUTOCSETFILLUPS 2112 +#define SCI_AUTOCSETCHOOSESINGLE 2113 +#define SCI_AUTOCGETCHOOSESINGLE 2114 +#define SCI_AUTOCSETIGNORECASE 2115 +#define SCI_AUTOCGETIGNORECASE 2116 +#define SCI_USERLISTSHOW 2117 +#define SCI_AUTOCSETAUTOHIDE 2118 +#define SCI_AUTOCGETAUTOHIDE 2119 +#define SCI_AUTOCSETDROPRESTOFWORD 2270 +#define SCI_AUTOCGETDROPRESTOFWORD 2271 +#define SCI_REGISTERIMAGE 2405 +#define SCI_CLEARREGISTEREDIMAGES 2408 +#define SCI_AUTOCGETTYPESEPARATOR 2285 +#define SCI_AUTOCSETTYPESEPARATOR 2286 +#define SCI_AUTOCSETMAXWIDTH 2208 +#define SCI_AUTOCGETMAXWIDTH 2209 +#define SCI_AUTOCSETMAXHEIGHT 2210 +#define SCI_AUTOCGETMAXHEIGHT 2211 +#define SCI_SETINDENT 2122 +#define SCI_GETINDENT 2123 +#define SCI_SETUSETABS 2124 +#define SCI_GETUSETABS 2125 +#define SCI_SETLINEINDENTATION 2126 +#define SCI_GETLINEINDENTATION 2127 +#define SCI_GETLINEINDENTPOSITION 2128 +#define SCI_GETCOLUMN 2129 +#define SCI_SETHSCROLLBAR 2130 +#define SCI_GETHSCROLLBAR 2131 +#define SC_IV_NONE 0 +#define SC_IV_REAL 1 +#define SC_IV_LOOKFORWARD 2 +#define SC_IV_LOOKBOTH 3 +#define SCI_SETINDENTATIONGUIDES 2132 +#define SCI_GETINDENTATIONGUIDES 2133 +#define SCI_SETHIGHLIGHTGUIDE 2134 +#define SCI_GETHIGHLIGHTGUIDE 2135 +#define SCI_GETLINEENDPOSITION 2136 +#define SCI_GETCODEPAGE 2137 +#define SCI_GETCARETFORE 2138 +#define SCI_GETUSEPALETTE 2139 +#define SCI_GETREADONLY 2140 +#define SCI_SETCURRENTPOS 2141 +#define SCI_SETSELECTIONSTART 2142 +#define SCI_GETSELECTIONSTART 2143 +#define SCI_SETSELECTIONEND 2144 +#define SCI_GETSELECTIONEND 2145 +#define SCI_SETPRINTMAGNIFICATION 2146 +#define SCI_GETPRINTMAGNIFICATION 2147 +#define SC_PRINT_NORMAL 0 +#define SC_PRINT_INVERTLIGHT 1 +#define SC_PRINT_BLACKONWHITE 2 +#define SC_PRINT_COLOURONWHITE 3 +#define SC_PRINT_COLOURONWHITEDEFAULTBG 4 +#define SCI_SETPRINTCOLOURMODE 2148 +#define SCI_GETPRINTCOLOURMODE 2149 +#define SCFIND_WHOLEWORD 2 +#define SCFIND_MATCHCASE 4 +#define SCFIND_WORDSTART 0x00100000 +#define SCFIND_REGEXP 0x00200000 +#define SCFIND_POSIX 0x00400000 +#define SCI_FINDTEXT 2150 +#define SCI_FORMATRANGE 2151 +#define SCI_GETFIRSTVISIBLELINE 2152 +#define SCI_GETLINE 2153 +#define SCI_GETLINECOUNT 2154 +#define SCI_SETMARGINLEFT 2155 +#define SCI_GETMARGINLEFT 2156 +#define SCI_SETMARGINRIGHT 2157 +#define SCI_GETMARGINRIGHT 2158 +#define SCI_GETMODIFY 2159 +#define SCI_SETSEL 2160 +#define SCI_GETSELTEXT 2161 +#define SCI_GETTEXTRANGE 2162 +#define SCI_HIDESELECTION 2163 +#define SCI_POINTXFROMPOSITION 2164 +#define SCI_POINTYFROMPOSITION 2165 +#define SCI_LINEFROMPOSITION 2166 +#define SCI_POSITIONFROMLINE 2167 +#define SCI_LINESCROLL 2168 +#define SCI_SCROLLCARET 2169 +#define SCI_REPLACESEL 2170 +#define SCI_SETREADONLY 2171 +#define SCI_NULL 2172 +#define SCI_CANPASTE 2173 +#define SCI_CANUNDO 2174 +#define SCI_EMPTYUNDOBUFFER 2175 +#define SCI_UNDO 2176 +#define SCI_CUT 2177 +#define SCI_COPY 2178 +#define SCI_PASTE 2179 +#define SCI_CLEAR 2180 +#define SCI_SETTEXT 2181 +#define SCI_GETTEXT 2182 +#define SCI_GETTEXTLENGTH 2183 +#define SCI_GETDIRECTFUNCTION 2184 +#define SCI_GETDIRECTPOINTER 2185 +#define SCI_SETOVERTYPE 2186 +#define SCI_GETOVERTYPE 2187 +#define SCI_SETCARETWIDTH 2188 +#define SCI_GETCARETWIDTH 2189 +#define SCI_SETTARGETSTART 2190 +#define SCI_GETTARGETSTART 2191 +#define SCI_SETTARGETEND 2192 +#define SCI_GETTARGETEND 2193 +#define SCI_REPLACETARGET 2194 +#define SCI_REPLACETARGETRE 2195 +#define SCI_SEARCHINTARGET 2197 +#define SCI_SETSEARCHFLAGS 2198 +#define SCI_GETSEARCHFLAGS 2199 +#define SCI_CALLTIPSHOW 2200 +#define SCI_CALLTIPCANCEL 2201 +#define SCI_CALLTIPACTIVE 2202 +#define SCI_CALLTIPPOSSTART 2203 +#define SCI_CALLTIPSETHLT 2204 +#define SCI_CALLTIPSETBACK 2205 +#define SCI_CALLTIPSETFORE 2206 +#define SCI_CALLTIPSETFOREHLT 2207 +#define SCI_CALLTIPUSESTYLE 2212 +#define SCI_VISIBLEFROMDOCLINE 2220 +#define SCI_DOCLINEFROMVISIBLE 2221 +#define SCI_WRAPCOUNT 2235 +//ERAN IFRAH +#define SCI_CALLTIPSHOWEXT 22250 +// END +#define SC_FOLDLEVELBASE 0x400 +#define SC_FOLDLEVELWHITEFLAG 0x1000 +#define SC_FOLDLEVELHEADERFLAG 0x2000 +#define SC_FOLDLEVELNUMBERMASK 0x0FFF +#define SCI_SETFOLDLEVEL 2222 +#define SCI_GETFOLDLEVEL 2223 +#define SCI_GETLASTCHILD 2224 +#define SCI_GETFOLDPARENT 2225 +#define SCI_SHOWLINES 2226 +#define SCI_HIDELINES 2227 +#define SCI_GETLINEVISIBLE 2228 +#define SCI_SETFOLDEXPANDED 2229 +#define SCI_GETFOLDEXPANDED 2230 +#define SCI_TOGGLEFOLD 2231 +#define SCI_ENSUREVISIBLE 2232 +#define SC_FOLDFLAG_LINEBEFORE_EXPANDED 0x0002 +#define SC_FOLDFLAG_LINEBEFORE_CONTRACTED 0x0004 +#define SC_FOLDFLAG_LINEAFTER_EXPANDED 0x0008 +#define SC_FOLDFLAG_LINEAFTER_CONTRACTED 0x0010 +#define SC_FOLDFLAG_LEVELNUMBERS 0x0040 +#define SCI_SETFOLDFLAGS 2233 +#define SCI_ENSUREVISIBLEENFORCEPOLICY 2234 +#define SCI_SETTABINDENTS 2260 +#define SCI_GETTABINDENTS 2261 +#define SCI_SETBACKSPACEUNINDENTS 2262 +#define SCI_GETBACKSPACEUNINDENTS 2263 +#define SC_TIME_FOREVER 10000000 +#define SCI_SETMOUSEDWELLTIME 2264 +#define SCI_GETMOUSEDWELLTIME 2265 +#define SCI_WORDSTARTPOSITION 2266 +#define SCI_WORDENDPOSITION 2267 +#define SC_WRAP_NONE 0 +#define SC_WRAP_WORD 1 +#define SC_WRAP_CHAR 2 +#define SCI_SETWRAPMODE 2268 +#define SCI_GETWRAPMODE 2269 +#define SC_WRAPVISUALFLAG_NONE 0x0000 +#define SC_WRAPVISUALFLAG_END 0x0001 +#define SC_WRAPVISUALFLAG_START 0x0002 +#define SCI_SETWRAPVISUALFLAGS 2460 +#define SCI_GETWRAPVISUALFLAGS 2461 +#define SC_WRAPVISUALFLAGLOC_DEFAULT 0x0000 +#define SC_WRAPVISUALFLAGLOC_END_BY_TEXT 0x0001 +#define SC_WRAPVISUALFLAGLOC_START_BY_TEXT 0x0002 +#define SCI_SETWRAPVISUALFLAGSLOCATION 2462 +#define SCI_GETWRAPVISUALFLAGSLOCATION 2463 +#define SCI_SETWRAPSTARTINDENT 2464 +#define SCI_GETWRAPSTARTINDENT 2465 +#define SC_WRAPINDENT_FIXED 0 +#define SC_WRAPINDENT_SAME 1 +#define SC_WRAPINDENT_INDENT 2 +#define SCI_SETWRAPINDENTMODE 2472 +#define SCI_GETWRAPINDENTMODE 2473 +#define SC_CACHE_NONE 0 +#define SC_CACHE_CARET 1 +#define SC_CACHE_PAGE 2 +#define SC_CACHE_DOCUMENT 3 +#define SCI_SETLAYOUTCACHE 2272 +#define SCI_GETLAYOUTCACHE 2273 +#define SCI_SETSCROLLWIDTH 2274 +#define SCI_GETSCROLLWIDTH 2275 +#define SCI_SETSCROLLWIDTHTRACKING 2516 +#define SCI_GETSCROLLWIDTHTRACKING 2517 +#define SCI_TEXTWIDTH 2276 +#define SCI_SETENDATLASTLINE 2277 +#define SCI_GETENDATLASTLINE 2278 +#define SCI_TEXTHEIGHT 2279 +#define SCI_SETVSCROLLBAR 2280 +#define SCI_GETVSCROLLBAR 2281 +#define SCI_APPENDTEXT 2282 +#define SCI_GETTWOPHASEDRAW 2283 +#define SCI_SETTWOPHASEDRAW 2284 +#define SC_EFF_QUALITY_MASK 0xF +#define SC_EFF_QUALITY_DEFAULT 0 +#define SC_EFF_QUALITY_NON_ANTIALIASED 1 +#define SC_EFF_QUALITY_ANTIALIASED 2 +#define SC_EFF_QUALITY_LCD_OPTIMIZED 3 +#define SCI_SETFONTQUALITY 2611 +#define SCI_GETFONTQUALITY 2612 +#define SCI_SETFIRSTVISIBLELINE 2613 +#define SC_MULTIPASTE_ONCE 0 +#define SC_MULTIPASTE_EACH 1 +#define SCI_SETMULTIPASTE 2614 +#define SCI_GETMULTIPASTE 2615 +#define SCI_GETTAG 2616 +#define SCI_TARGETFROMSELECTION 2287 +#define SCI_LINESJOIN 2288 +#define SCI_LINESSPLIT 2289 +#define SCI_SETFOLDMARGINCOLOUR 2290 +#define SCI_SETFOLDMARGINHICOLOUR 2291 +#define SCI_LINEDOWN 2300 +#define SCI_LINEDOWNEXTEND 2301 +#define SCI_LINEUP 2302 +#define SCI_LINEUPEXTEND 2303 +#define SCI_CHARLEFT 2304 +#define SCI_CHARLEFTEXTEND 2305 +#define SCI_CHARRIGHT 2306 +#define SCI_CHARRIGHTEXTEND 2307 +#define SCI_WORDLEFT 2308 +#define SCI_WORDLEFTEXTEND 2309 +#define SCI_WORDRIGHT 2310 +#define SCI_WORDRIGHTEXTEND 2311 +#define SCI_HOME 2312 +#define SCI_HOMEEXTEND 2313 +#define SCI_LINEEND 2314 +#define SCI_LINEENDEXTEND 2315 +#define SCI_DOCUMENTSTART 2316 +#define SCI_DOCUMENTSTARTEXTEND 2317 +#define SCI_DOCUMENTEND 2318 +#define SCI_DOCUMENTENDEXTEND 2319 +#define SCI_PAGEUP 2320 +#define SCI_PAGEUPEXTEND 2321 +#define SCI_PAGEDOWN 2322 +#define SCI_PAGEDOWNEXTEND 2323 +#define SCI_EDITTOGGLEOVERTYPE 2324 +#define SCI_CANCEL 2325 +#define SCI_DELETEBACK 2326 +#define SCI_TAB 2327 +#define SCI_BACKTAB 2328 +#define SCI_NEWLINE 2329 +#define SCI_FORMFEED 2330 +#define SCI_VCHOME 2331 +#define SCI_VCHOMEEXTEND 2332 +#define SCI_ZOOMIN 2333 +#define SCI_ZOOMOUT 2334 +#define SCI_DELWORDLEFT 2335 +#define SCI_DELWORDRIGHT 2336 +#define SCI_DELWORDRIGHTEND 2518 +#define SCI_LINECUT 2337 +#define SCI_LINEDELETE 2338 +#define SCI_LINETRANSPOSE 2339 +#define SCI_LINEDUPLICATE 2404 +#define SCI_LOWERCASE 2340 +#define SCI_UPPERCASE 2341 +#define SCI_LINESCROLLDOWN 2342 +#define SCI_LINESCROLLUP 2343 +#define SCI_DELETEBACKNOTLINE 2344 +#define SCI_HOMEDISPLAY 2345 +#define SCI_HOMEDISPLAYEXTEND 2346 +#define SCI_LINEENDDISPLAY 2347 +#define SCI_LINEENDDISPLAYEXTEND 2348 +#define SCI_HOMEWRAP 2349 +#define SCI_HOMEWRAPEXTEND 2450 +#define SCI_LINEENDWRAP 2451 +#define SCI_LINEENDWRAPEXTEND 2452 +#define SCI_VCHOMEWRAP 2453 +#define SCI_VCHOMEWRAPEXTEND 2454 +#define SCI_LINECOPY 2455 +#define SCI_MOVECARETINSIDEVIEW 2401 +#define SCI_LINELENGTH 2350 +#define SCI_BRACEHIGHLIGHT 2351 +#define SCI_BRACEBADLIGHT 2352 +#define SCI_BRACEMATCH 2353 +#define SCI_GETVIEWEOL 2355 +#define SCI_SETVIEWEOL 2356 +#define SCI_GETDOCPOINTER 2357 +#define SCI_SETDOCPOINTER 2358 +#define SCI_SETMODEVENTMASK 2359 +#define EDGE_NONE 0 +#define EDGE_LINE 1 +#define EDGE_BACKGROUND 2 +#define SCI_GETEDGECOLUMN 2360 +#define SCI_SETEDGECOLUMN 2361 +#define SCI_GETEDGEMODE 2362 +#define SCI_SETEDGEMODE 2363 +#define SCI_GETEDGECOLOUR 2364 +#define SCI_SETEDGECOLOUR 2365 +#define SCI_SEARCHANCHOR 2366 +#define SCI_SEARCHNEXT 2367 +#define SCI_SEARCHPREV 2368 +#define SCI_LINESONSCREEN 2370 +#define SCI_USEPOPUP 2371 +#define SCI_SELECTIONISRECTANGLE 2372 +#define SCI_SETZOOM 2373 +#define SCI_GETZOOM 2374 +#define SCI_CREATEDOCUMENT 2375 +#define SCI_ADDREFDOCUMENT 2376 +#define SCI_RELEASEDOCUMENT 2377 +#define SCI_GETMODEVENTMASK 2378 +#define SCI_SETFOCUS 2380 +#define SCI_GETFOCUS 2381 +#define SC_STATUS_OK 0 +#define SC_STATUS_FAILURE 1 +#define SC_STATUS_BADALLOC 2 +#define SCI_SETSTATUS 2382 +#define SCI_GETSTATUS 2383 +#define SCI_SETMOUSEDOWNCAPTURES 2384 +#define SCI_GETMOUSEDOWNCAPTURES 2385 +#define SC_CURSORNORMAL -1 +#define SC_CURSORWAIT 4 +#define SCI_SETCURSOR 2386 +#define SCI_GETCURSOR 2387 +#define SCI_SETCONTROLCHARSYMBOL 2388 +#define SCI_GETCONTROLCHARSYMBOL 2389 +#define SCI_WORDPARTLEFT 2390 +#define SCI_WORDPARTLEFTEXTEND 2391 +#define SCI_WORDPARTRIGHT 2392 +#define SCI_WORDPARTRIGHTEXTEND 2393 +#define VISIBLE_SLOP 0x01 +#define VISIBLE_STRICT 0x04 +#define SCI_SETVISIBLEPOLICY 2394 +#define SCI_DELLINELEFT 2395 +#define SCI_DELLINERIGHT 2396 +#define SCI_SETXOFFSET 2397 +#define SCI_GETXOFFSET 2398 +#define SCI_CHOOSECARETX 2399 +#define SCI_GRABFOCUS 2400 +#define CARET_SLOP 0x01 +#define CARET_STRICT 0x04 +#define CARET_JUMPS 0x10 +#define CARET_EVEN 0x08 +#define SCI_SETXCARETPOLICY 2402 +#define SCI_SETYCARETPOLICY 2403 +#define SCI_SETPRINTWRAPMODE 2406 +#define SCI_GETPRINTWRAPMODE 2407 +#define SCI_SETHOTSPOTACTIVEFORE 2410 +#define SCI_GETHOTSPOTACTIVEFORE 2494 +#define SCI_SETHOTSPOTACTIVEBACK 2411 +#define SCI_GETHOTSPOTACTIVEBACK 2495 +#define SCI_SETHOTSPOTACTIVEUNDERLINE 2412 +#define SCI_GETHOTSPOTACTIVEUNDERLINE 2496 +#define SCI_SETHOTSPOTSINGLELINE 2421 +#define SCI_GETHOTSPOTSINGLELINE 2497 +#define SCI_PARADOWN 2413 +#define SCI_PARADOWNEXTEND 2414 +#define SCI_PARAUP 2415 +#define SCI_PARAUPEXTEND 2416 +#define SCI_POSITIONBEFORE 2417 +#define SCI_POSITIONAFTER 2418 +#define SCI_COPYRANGE 2419 +#define SCI_COPYTEXT 2420 +#define SC_SEL_STREAM 0 +#define SC_SEL_RECTANGLE 1 +#define SC_SEL_LINES 2 +#define SC_SEL_THIN 3 +#define SCI_SETSELECTIONMODE 2422 +#define SCI_GETSELECTIONMODE 2423 +#define SCI_GETLINESELSTARTPOSITION 2424 +#define SCI_GETLINESELENDPOSITION 2425 +#define SCI_LINEDOWNRECTEXTEND 2426 +#define SCI_LINEUPRECTEXTEND 2427 +#define SCI_CHARLEFTRECTEXTEND 2428 +#define SCI_CHARRIGHTRECTEXTEND 2429 +#define SCI_HOMERECTEXTEND 2430 +#define SCI_VCHOMERECTEXTEND 2431 +#define SCI_LINEENDRECTEXTEND 2432 +#define SCI_PAGEUPRECTEXTEND 2433 +#define SCI_PAGEDOWNRECTEXTEND 2434 +#define SCI_STUTTEREDPAGEUP 2435 +#define SCI_STUTTEREDPAGEUPEXTEND 2436 +#define SCI_STUTTEREDPAGEDOWN 2437 +#define SCI_STUTTEREDPAGEDOWNEXTEND 2438 +#define SCI_WORDLEFTEND 2439 +#define SCI_WORDLEFTENDEXTEND 2440 +#define SCI_WORDRIGHTEND 2441 +#define SCI_WORDRIGHTENDEXTEND 2442 +#define SCI_SETWHITESPACECHARS 2443 +#define SCI_SETCHARSDEFAULT 2444 +#define SCI_AUTOCGETCURRENT 2445 +#define SCI_AUTOCGETCURRENTTEXT 2610 +#define SCI_ALLOCATE 2446 +#define SCI_TARGETASUTF8 2447 +#define SCI_SETLENGTHFORENCODE 2448 +#define SCI_ENCODEDFROMUTF8 2449 +#define SCI_FINDCOLUMN 2456 +#define SCI_GETCARETSTICKY 2457 +#define SCI_SETCARETSTICKY 2458 +#define SCI_TOGGLECARETSTICKY 2459 +#define SCI_SETPASTECONVERTENDINGS 2467 +#define SCI_GETPASTECONVERTENDINGS 2468 +#define SCI_SELECTIONDUPLICATE 2469 +#define SC_ALPHA_TRANSPARENT 0 +#define SC_ALPHA_OPAQUE 255 +#define SC_ALPHA_NOALPHA 256 +#define SCI_SETCARETLINEBACKALPHA 2470 +#define SCI_GETCARETLINEBACKALPHA 2471 +#define CARETSTYLE_INVISIBLE 0 +#define CARETSTYLE_LINE 1 +#define CARETSTYLE_BLOCK 2 +#define SCI_SETCARETSTYLE 2512 +#define SCI_GETCARETSTYLE 2513 +#define SCI_SETINDICATORCURRENT 2500 +#define SCI_GETINDICATORCURRENT 2501 +#define SCI_SETINDICATORVALUE 2502 +#define SCI_GETINDICATORVALUE 2503 +#define SCI_INDICATORFILLRANGE 2504 +#define SCI_INDICATORCLEARRANGE 2505 +#define SCI_INDICATORALLONFOR 2506 +#define SCI_INDICATORVALUEAT 2507 +#define SCI_INDICATORSTART 2508 +#define SCI_INDICATOREND 2509 +#define SCI_SETPOSITIONCACHE 2514 +#define SCI_GETPOSITIONCACHE 2515 +#define SCI_COPYALLOWLINE 2519 +#define SCI_GETCHARACTERPOINTER 2520 +#define SCI_SETKEYSUNICODE 2521 +#define SCI_GETKEYSUNICODE 2522 +#define SCI_INDICSETALPHA 2523 +#define SCI_INDICGETALPHA 2524 +#define SCI_SETEXTRAASCENT 2525 +#define SCI_GETEXTRAASCENT 2526 +#define SCI_SETEXTRADESCENT 2527 +#define SCI_GETEXTRADESCENT 2528 +#define SCI_MARKERSYMBOLDEFINED 2529 +#define SCI_MARGINSETTEXT 2530 +#define SCI_MARGINGETTEXT 2531 +#define SCI_MARGINSETSTYLE 2532 +#define SCI_MARGINGETSTYLE 2533 +#define SCI_MARGINSETSTYLES 2534 +#define SCI_MARGINGETSTYLES 2535 +#define SCI_MARGINTEXTCLEARALL 2536 +#define SCI_MARGINSETSTYLEOFFSET 2537 +#define SCI_MARGINGETSTYLEOFFSET 2538 +#define SCI_ANNOTATIONSETTEXT 2540 +#define SCI_ANNOTATIONGETTEXT 2541 +#define SCI_ANNOTATIONSETSTYLE 2542 +#define SCI_ANNOTATIONGETSTYLE 2543 +#define SCI_ANNOTATIONSETSTYLES 2544 +#define SCI_ANNOTATIONGETSTYLES 2545 +#define SCI_ANNOTATIONGETLINES 2546 +#define SCI_ANNOTATIONCLEARALL 2547 +#define ANNOTATION_HIDDEN 0 +#define ANNOTATION_STANDARD 1 +#define ANNOTATION_BOXED 2 +#define SCI_ANNOTATIONSETVISIBLE 2548 +#define SCI_ANNOTATIONGETVISIBLE 2549 +#define SCI_ANNOTATIONSETSTYLEOFFSET 2550 +#define SCI_ANNOTATIONGETSTYLEOFFSET 2551 +#define UNDO_MAY_COALESCE 1 +#define SCI_ADDUNDOACTION 2560 +#define SCI_CHARPOSITIONFROMPOINT 2561 +#define SCI_CHARPOSITIONFROMPOINTCLOSE 2562 +#define SCI_SETMULTIPLESELECTION 2563 +#define SCI_GETMULTIPLESELECTION 2564 +#define SCI_SETADDITIONALSELECTIONTYPING 2565 +#define SCI_GETADDITIONALSELECTIONTYPING 2566 +#define SCI_SETADDITIONALCARETSBLINK 2567 +#define SCI_GETADDITIONALCARETSBLINK 2568 +#define SCI_SETADDITIONALCARETSVISIBLE 2608 +#define SCI_GETADDITIONALCARETSVISIBLE 2609 +#define SCI_GETSELECTIONS 2570 +#define SCI_CLEARSELECTIONS 2571 +#define SCI_SETSELECTION 2572 +#define SCI_ADDSELECTION 2573 +#define SCI_SETMAINSELECTION 2574 +#define SCI_GETMAINSELECTION 2575 +#define SCI_SETSELECTIONNCARET 2576 +#define SCI_GETSELECTIONNCARET 2577 +#define SCI_SETSELECTIONNANCHOR 2578 +#define SCI_GETSELECTIONNANCHOR 2579 +#define SCI_SETSELECTIONNCARETVIRTUALSPACE 2580 +#define SCI_GETSELECTIONNCARETVIRTUALSPACE 2581 +#define SCI_SETSELECTIONNANCHORVIRTUALSPACE 2582 +#define SCI_GETSELECTIONNANCHORVIRTUALSPACE 2583 +#define SCI_SETSELECTIONNSTART 2584 +#define SCI_GETSELECTIONNSTART 2585 +#define SCI_SETSELECTIONNEND 2586 +#define SCI_GETSELECTIONNEND 2587 +#define SCI_SETRECTANGULARSELECTIONCARET 2588 +#define SCI_GETRECTANGULARSELECTIONCARET 2589 +#define SCI_SETRECTANGULARSELECTIONANCHOR 2590 +#define SCI_GETRECTANGULARSELECTIONANCHOR 2591 +#define SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE 2592 +#define SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE 2593 +#define SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE 2594 +#define SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE 2595 +#define SCVS_NONE 0 +#define SCVS_RECTANGULARSELECTION 1 +#define SCVS_USERACCESSIBLE 2 +#define SCI_SETVIRTUALSPACEOPTIONS 2596 +#define SCI_GETVIRTUALSPACEOPTIONS 2597 +#define SCI_SETRECTANGULARSELECTIONMODIFIER 2598 +#define SCI_GETRECTANGULARSELECTIONMODIFIER 2599 +#define SCI_SETADDITIONALSELFORE 2600 +#define SCI_SETADDITIONALSELBACK 2601 +#define SCI_SETADDITIONALSELALPHA 2602 +#define SCI_GETADDITIONALSELALPHA 2603 +#define SCI_SETADDITIONALCARETFORE 2604 +#define SCI_GETADDITIONALCARETFORE 2605 +#define SCI_ROTATESELECTION 2606 +#define SCI_SWAPMAINANCHORCARET 2607 +#define SCI_STARTRECORD 3001 +#define SCI_STOPRECORD 3002 +#define SCI_SETLEXER 4001 +#define SCI_GETLEXER 4002 +#define SCI_COLOURISE 4003 +#define SCI_SETPROPERTY 4004 +#define KEYWORDSET_MAX 8 +#define SCI_SETKEYWORDS 4005 +#define SCI_SETLEXERLANGUAGE 4006 +#define SCI_LOADLEXERLIBRARY 4007 +#define SCI_GETPROPERTY 4008 +#define SCI_GETPROPERTYEXPANDED 4009 +#define SCI_GETPROPERTYINT 4010 +#define SCI_GETSTYLEBITSNEEDED 4011 +#define SCI_GETLEXERLANGUAGE 4012 +#define SC_MOD_INSERTTEXT 0x1 +#define SC_MOD_DELETETEXT 0x2 +#define SC_MOD_CHANGESTYLE 0x4 +#define SC_MOD_CHANGEFOLD 0x8 +#define SC_PERFORMED_USER 0x10 +#define SC_PERFORMED_UNDO 0x20 +#define SC_PERFORMED_REDO 0x40 +#define SC_MULTISTEPUNDOREDO 0x80 +#define SC_LASTSTEPINUNDOREDO 0x100 +#define SC_MOD_CHANGEMARKER 0x200 +#define SC_MOD_BEFOREINSERT 0x400 +#define SC_MOD_BEFOREDELETE 0x800 +#define SC_MULTILINEUNDOREDO 0x1000 +#define SC_STARTACTION 0x2000 +#define SC_MOD_CHANGEINDICATOR 0x4000 +#define SC_MOD_CHANGELINESTATE 0x8000 +#define SC_MOD_CHANGEMARGIN 0x10000 +#define SC_MOD_CHANGEANNOTATION 0x20000 +#define SC_MOD_CONTAINER 0x40000 +#define SC_MODEVENTMASKALL 0x7FFFF +#define SCEN_CHANGE 768 +#define SCEN_SETFOCUS 512 +#define SCEN_KILLFOCUS 256 +#define SCK_DOWN 300 +#define SCK_UP 301 +#define SCK_LEFT 302 +#define SCK_RIGHT 303 +#define SCK_HOME 304 +#define SCK_END 305 +#define SCK_PRIOR 306 +#define SCK_NEXT 307 +#define SCK_DELETE 308 +#define SCK_INSERT 309 +#define SCK_ESCAPE 7 +#define SCK_BACK 8 +#define SCK_TAB 9 +#define SCK_RETURN 13 +#define SCK_ADD 310 +#define SCK_SUBTRACT 311 +#define SCK_DIVIDE 312 +#define SCK_WIN 313 +#define SCK_RWIN 314 +#define SCK_MENU 315 +#define SCMOD_NORM 0 +#define SCMOD_SHIFT 1 +#define SCMOD_CTRL 2 +#define SCMOD_ALT 4 +#define SCMOD_SUPER 8 +#define SCN_STYLENEEDED 2000 +#define SCN_CHARADDED 2001 +#define SCN_SAVEPOINTREACHED 2002 +#define SCN_SAVEPOINTLEFT 2003 +#define SCN_MODIFYATTEMPTRO 2004 +#define SCN_KEY 2005 +#define SCN_DOUBLECLICK 2006 +#define SCN_UPDATEUI 2007 +#define SCN_MODIFIED 2008 +#define SCN_MACRORECORD 2009 +#define SCN_MARGINCLICK 2010 +#define SCN_NEEDSHOWN 2011 +#define SCN_PAINTED 2013 +#define SCN_USERLISTSELECTION 2014 +#define SCN_URIDROPPED 2015 +#define SCN_DWELLSTART 2016 +#define SCN_DWELLEND 2017 +#define SCN_ZOOM 2018 +#define SCN_HOTSPOTCLICK 2019 +#define SCN_HOTSPOTDOUBLECLICK 2020 +#define SCN_CALLTIPCLICK 2021 +#define SCN_AUTOCSELECTION 2022 +#define SCN_INDICATORCLICK 2023 +#define SCN_INDICATORRELEASE 2024 +#define SCN_AUTOCCANCELLED 2025 +#define SCN_AUTOCCHARDELETED 2026 +/* --Autogenerated -- end of section automatically generated from Scintilla.iface */ + +/* These structures are defined to be exactly the same shape as the Win32 + * CHARRANGE, TEXTRANGE, FINDTEXTEX, FORMATRANGE, and NMHDR structs. + * So older code that treats Scintilla as a RichEdit will work. */ + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +struct Sci_CharacterRange { + long cpMin; + long cpMax; +}; + +struct Sci_TextRange { + struct Sci_CharacterRange chrg; + char *lpstrText; +}; + +struct Sci_TextToFind { + struct Sci_CharacterRange chrg; + char *lpstrText; + struct Sci_CharacterRange chrgText; +}; + +#define CharacterRange Sci_CharacterRange +#define TextRange Sci_TextRange +#define TextToFind Sci_TextToFind + +typedef void *Sci_SurfaceID; + +struct Sci_Rectangle { + int left; + int top; + int right; + int bottom; +}; + +/* This structure is used in printing and requires some of the graphics types + * from Platform.h. Not needed by most client code. */ + +struct Sci_RangeToFormat { + Sci_SurfaceID hdc; + Sci_SurfaceID hdcTarget; + struct Sci_Rectangle rc; + struct Sci_Rectangle rcPage; + struct Sci_CharacterRange chrg; +}; + +#define RangeToFormat Sci_RangeToFormat + +struct Sci_NotifyHeader { + /* Compatible with Windows NMHDR. + * hwndFrom is really an environment specific window handle or pointer + * but most clients of Scintilla.h do not have this type visible. */ + void *hwndFrom; + uptr_t idFrom; + unsigned int code; +}; + +#define NotifyHeader Sci_NotifyHeader + +struct SCNotification { + struct Sci_NotifyHeader nmhdr; + int position; /* SCN_STYLENEEDED, SCN_MODIFIED, SCN_DWELLSTART, SCN_DWELLEND */ + int ch; /* SCN_CHARADDED, SCN_KEY */ + int modifiers; /* SCN_KEY */ + int modificationType; /* SCN_MODIFIED */ + const char *text; /* SCN_MODIFIED, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION */ + int length; /* SCN_MODIFIED */ + int linesAdded; /* SCN_MODIFIED */ + int message; /* SCN_MACRORECORD */ + uptr_t wParam; /* SCN_MACRORECORD */ + sptr_t lParam; /* SCN_MACRORECORD */ + int line; /* SCN_MODIFIED */ + int foldLevelNow; /* SCN_MODIFIED */ + int foldLevelPrev; /* SCN_MODIFIED */ + int margin; /* SCN_MARGINCLICK */ + int listType; /* SCN_USERLISTSELECTION */ + int x; /* SCN_DWELLSTART, SCN_DWELLEND */ + int y; /* SCN_DWELLSTART, SCN_DWELLEND */ + int token; /* SCN_MODIFIED with SC_MOD_CONTAINER */ + int annotationLinesAdded; /* SC_MOD_CHANGEANNOTATION */ +}; + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/include/Scintilla.iface b/sdk/wxscintilla/src/scintilla/include/Scintilla.iface new file mode 100644 index 0000000..7d64f2d --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/include/Scintilla.iface @@ -0,0 +1,3784 @@ +## First line may be used for shbang + +## This file defines the interface to Scintilla + +## Copyright 2000-2003 by Neil Hodgson +## The License.txt file describes the conditions under which this software may be distributed. + +## A line starting with ## is a pure comment and should be stripped by readers. +## A line starting with #! is for future shbang use +## A line starting with # followed by a space is a documentation comment and refers +## to the next feature definition. + +## Each feature is defined by a line starting with fun, get, set, val or evt. +## cat -> start a category +## fun -> a function +## get -> a property get function +## set -> a property set function +## val -> definition of a constant +## evt -> an event +## enu -> associate an enumeration with a set of vals with a prefix +## lex -> associate a lexer with the lexical classes it produces +## +## All other feature names should be ignored. They may be defined in the future. +## A property may have a set function, a get function or both. Each will have +## "Get" or "Set" in their names and the corresponding name will have the obvious switch. +## A property may be subscripted, in which case the first parameter is the subscript. +## fun, get, and set features have a strict syntax: +## [=,) +## where stands for white space. +## param may be empty (null value) or is [=] +## Additional white space is allowed between elements. +## The syntax for evt is [=[,]*]) +## Feature names that contain an underscore are defined by Windows, so in these +## cases, using the Windows definition is preferred where available. +## The feature numbers are stable so features will not be renumbered. +## Features may be removed but they will go through a period of deprecation +## before removal which is signalled by moving them into the Deprecated category. +## +## enu has the syntax enu=[]* where all the val +## features in this file starting with a given are considered part of the +## enumeration. +## +## lex has the syntax lex=[]* +## where name is a reasonably capitalised (Python, XML) identifier or UI name, +## lexerVal is the val used to specify the lexer, and the list of prefixes is similar +## to enu. The name may not be the same as that used within the lexer so the lexerVal +## should be used to tie these entities together. + +## Types: +## void +## int +## bool -> integer, 1=true, 0=false +## position -> integer position in a document +## colour -> colour integer containing red, green and blue bytes. +## string -> pointer to const character +## stringresult -> pointer to character, NULL-> return size of result +## cells -> pointer to array of cells, each cell containing a style byte and character byte +## textrange -> range of a min and a max position with an output string +## findtext -> searchrange, text -> foundposition +## keymod -> integer containing key in low half and modifiers in high half +## formatrange +## Types no longer used: +## findtextex -> searchrange +## charrange -> range of a min and a max position +## charrangeresult -> like charrange, but output param +## countedstring +## point -> x,y +## pointresult -> like point, but output param +## rectangle -> left,top,right,bottom +## Client code should ignore definitions containing types it does not understand, except +## for possibly #defining the constants + +## Line numbers and positions start at 0. +## String arguments may contain NUL ('\0') characters where the calls provide a length +## argument and retrieve NUL characters. All retrieved strings except for those retrieved +## by GetLine also have a NUL appended but client code should calculate the size that +## will be returned rather than relying upon the NUL whenever possible. Allow for the +## extra NUL character when allocating buffers. The size to allocate for a stringresult +## can be determined by calling with a NULL (0) pointer. + +cat Basics + +################################################ +## For Scintilla.h +val INVALID_POSITION=-1 +# Define start of Scintilla messages to be greater than all Windows edit (EM_*) messages +# as many EM_ messages can be used although that use is deprecated. +val SCI_START=2000 +val SCI_OPTIONAL_START=3000 +val SCI_LEXER_START=4000 + +# Add text to the document at current position. +fun void AddText=2001(int length, string text) + +# Add array of cells to document. +fun void AddStyledText=2002(int length, cells c) + +# Insert string at a position. +fun void InsertText=2003(position pos, string text) + +# Delete all text in the document. +fun void ClearAll=2004(,) + +# Set all style bytes to 0, remove all folding information. +fun void ClearDocumentStyle=2005(,) + +# Returns the number of bytes in the document. +get int GetLength=2006(,) + +# Returns the character byte at the position. +get int GetCharAt=2007(position pos,) + +# Returns the position of the caret. +get position GetCurrentPos=2008(,) + +# Returns the position of the opposite end of the selection to the caret. +get position GetAnchor=2009(,) + +# Returns the style byte at the position. +get int GetStyleAt=2010(position pos,) + +# Redoes the next action on the undo history. +fun void Redo=2011(,) + +# Choose between collecting actions into the undo +# history and discarding them. +set void SetUndoCollection=2012(bool collectUndo,) + +# Select all the text in the document. +fun void SelectAll=2013(,) + +# Remember the current position in the undo history as the position +# at which the document was saved. +fun void SetSavePoint=2014(,) + +# Retrieve a buffer of cells. +# Returns the number of bytes in the buffer not including terminating NULs. +fun int GetStyledText=2015(, textrange tr) + +# Are there any redoable actions in the undo history? +fun bool CanRedo=2016(,) + +# Retrieve the line number at which a particular marker is located. +fun int MarkerLineFromHandle=2017(int handle,) + +# Delete a marker. +fun void MarkerDeleteHandle=2018(int handle,) + +# Is undo history being collected? +get bool GetUndoCollection=2019(,) + +enu WhiteSpace=SCWS_ +val SCWS_INVISIBLE=0 +val SCWS_VISIBLEALWAYS=1 +val SCWS_VISIBLEAFTERINDENT=2 + +# Are white space characters currently visible? +# Returns one of SCWS_* constants. +get int GetViewWS=2020(,) + +# Make white space characters invisible, always visible or visible outside indentation. +set void SetViewWS=2021(int viewWS,) + +# Find the position from a point within the window. +fun position PositionFromPoint=2022(int x, int y) + +# Find the position from a point within the window but return +# INVALID_POSITION if not close to text. +fun position PositionFromPointClose=2023(int x, int y) + +# Set caret to start of a line and ensure it is visible. +fun void GotoLine=2024(int line,) + +# Set caret to a position and ensure it is visible. +fun void GotoPos=2025(position pos,) + +# Set the selection anchor to a position. The anchor is the opposite +# end of the selection from the caret. +set void SetAnchor=2026(position posAnchor,) + +# Retrieve the text of the line containing the caret. +# Returns the index of the caret on the line. +fun int GetCurLine=2027(int length, stringresult text) + +# Retrieve the position of the last correctly styled character. +get position GetEndStyled=2028(,) + +enu EndOfLine=SC_EOL_ +val SC_EOL_CRLF=0 +val SC_EOL_CR=1 +val SC_EOL_LF=2 + +# Convert all line endings in the document to one mode. +fun void ConvertEOLs=2029(int eolMode,) + +# Retrieve the current end of line mode - one of CRLF, CR, or LF. +get int GetEOLMode=2030(,) + +# Set the current end of line mode. +set void SetEOLMode=2031(int eolMode,) + +# Set the current styling position to pos and the styling mask to mask. +# The styling mask can be used to protect some bits in each styling byte from modification. +fun void StartStyling=2032(position pos, int mask) + +# Change style from current styling position for length characters to a style +# and move the current styling position to after this newly styled segment. +fun void SetStyling=2033(int length, int style) + +# Is drawing done first into a buffer or direct to the screen? +get bool GetBufferedDraw=2034(,) + +# If drawing is buffered then each line of text is drawn into a bitmap buffer +# before drawing it to the screen to avoid flicker. +set void SetBufferedDraw=2035(bool buffered,) + +# Change the visible size of a tab to be a multiple of the width of a space character. +set void SetTabWidth=2036(int tabWidth,) + +# Retrieve the visible size of a tab. +get int GetTabWidth=2121(,) + +# The SC_CP_UTF8 value can be used to enter Unicode mode. +# This is the same value as CP_UTF8 in Windows +val SC_CP_UTF8=65001 + +# The SC_CP_DBCS value can be used to indicate a DBCS mode for GTK+. +val SC_CP_DBCS=1 + +# Set the code page used to interpret the bytes of the document as characters. +# The SC_CP_UTF8 value can be used to enter Unicode mode. +set void SetCodePage=2037(int codePage,) + +# In palette mode, Scintilla uses the environment's palette calls to display +# more colours. This may lead to ugly displays. +set void SetUsePalette=2039(bool usePalette,) + +enu MarkerSymbol=SC_MARK_ +val MARKER_MAX=31 +val SC_MARK_CIRCLE=0 +val SC_MARK_ROUNDRECT=1 +val SC_MARK_ARROW=2 +val SC_MARK_SMALLRECT=3 +val SC_MARK_SHORTARROW=4 +val SC_MARK_EMPTY=5 +val SC_MARK_ARROWDOWN=6 +val SC_MARK_MINUS=7 +val SC_MARK_PLUS=8 + +# Shapes used for outlining column. +val SC_MARK_VLINE=9 +val SC_MARK_LCORNER=10 +val SC_MARK_TCORNER=11 +val SC_MARK_BOXPLUS=12 +val SC_MARK_BOXPLUSCONNECTED=13 +val SC_MARK_BOXMINUS=14 +val SC_MARK_BOXMINUSCONNECTED=15 +val SC_MARK_LCORNERCURVE=16 +val SC_MARK_TCORNERCURVE=17 +val SC_MARK_CIRCLEPLUS=18 +val SC_MARK_CIRCLEPLUSCONNECTED=19 +val SC_MARK_CIRCLEMINUS=20 +val SC_MARK_CIRCLEMINUSCONNECTED=21 + +# Invisible mark that only sets the line background color. +val SC_MARK_BACKGROUND=22 +val SC_MARK_DOTDOTDOT=23 +val SC_MARK_ARROWS=24 +val SC_MARK_PIXMAP=25 +val SC_MARK_FULLRECT=26 +val SC_MARK_LEFTRECT=27 +val SC_MARK_AVAILABLE=28 +val SC_MARK_UNDERLINE=29 + +val SC_MARK_CHARACTER=10000 + +enu MarkerOutline=SC_MARKNUM_ +# Markers used for outlining column. +val SC_MARKNUM_FOLDEREND=25 +val SC_MARKNUM_FOLDEROPENMID=26 +val SC_MARKNUM_FOLDERMIDTAIL=27 +val SC_MARKNUM_FOLDERTAIL=28 +val SC_MARKNUM_FOLDERSUB=29 +val SC_MARKNUM_FOLDER=30 +val SC_MARKNUM_FOLDEROPEN=31 + +val SC_MASK_FOLDERS=0xFE000000 + +# Set the symbol used for a particular marker number. +fun void MarkerDefine=2040(int markerNumber, int markerSymbol) + +# Set the foreground colour used for a particular marker number. +fun void MarkerSetFore=2041(int markerNumber, colour fore) + +# Set the background colour used for a particular marker number. +fun void MarkerSetBack=2042(int markerNumber, colour back) + +# Add a marker to a line, returning an ID which can be used to find or delete the marker. +fun int MarkerAdd=2043(int line, int markerNumber) + +# Delete a marker from a line. +fun void MarkerDelete=2044(int line, int markerNumber) + +# Delete all markers with a particular number from all lines. +fun void MarkerDeleteAll=2045(int markerNumber,) + +# Get a bit mask of all the markers set on a line. +fun int MarkerGet=2046(int line,) + +# Find the next line after lineStart that includes a marker in mask. +fun int MarkerNext=2047(int lineStart, int markerMask) + +# Find the previous line before lineStart that includes a marker in mask. +fun int MarkerPrevious=2048(int lineStart, int markerMask) + +# Define a marker from a pixmap. +fun void MarkerDefinePixmap=2049(int markerNumber, string pixmap) + +# Add a set of markers to a line. +fun void MarkerAddSet=2466(int line, int set) + +# Set the alpha used for a marker that is drawn in the text area, not the margin. +fun void MarkerSetAlpha=2476(int markerNumber, int alpha) + +enu MarginType=SC_MARGIN_ +val SC_MARGIN_SYMBOL=0 +val SC_MARGIN_NUMBER=1 +val SC_MARGIN_BACK=2 +val SC_MARGIN_FORE=3 +val SC_MARGIN_TEXT=4 +val SC_MARGIN_RTEXT=5 + +# Set a margin to be either numeric or symbolic. +set void SetMarginTypeN=2240(int margin, int marginType) + +# Retrieve the type of a margin. +get int GetMarginTypeN=2241(int margin,) + +# Set the width of a margin to a width expressed in pixels. +set void SetMarginWidthN=2242(int margin, int pixelWidth) + +# Retrieve the width of a margin in pixels. +get int GetMarginWidthN=2243(int margin,) + +# Set a mask that determines which markers are displayed in a margin. +set void SetMarginMaskN=2244(int margin, int mask) + +# Retrieve the marker mask of a margin. +get int GetMarginMaskN=2245(int margin,) + +# Make a margin sensitive or insensitive to mouse clicks. +set void SetMarginSensitiveN=2246(int margin, bool sensitive) + +# Retrieve the mouse click sensitivity of a margin. +get bool GetMarginSensitiveN=2247(int margin,) + +# Styles in range 32..38 are predefined for parts of the UI and are not used as normal styles. +# Style 39 is for future use. +enu StylesCommon=STYLE_ +val STYLE_DEFAULT=32 +val STYLE_LINENUMBER=33 +val STYLE_BRACELIGHT=34 +val STYLE_BRACEBAD=35 +val STYLE_CONTROLCHAR=36 +val STYLE_INDENTGUIDE=37 +val STYLE_CALLTIP=38 +val STYLE_LASTPREDEFINED=39 +val STYLE_MAX=255 + +# Character set identifiers are used in StyleSetCharacterSet. +# The values are the same as the Windows *_CHARSET values. +enu CharacterSet=SC_CHARSET_ +val SC_CHARSET_ANSI=0 +val SC_CHARSET_DEFAULT=1 +val SC_CHARSET_BALTIC=186 +val SC_CHARSET_CHINESEBIG5=136 +val SC_CHARSET_EASTEUROPE=238 +val SC_CHARSET_GB2312=134 +val SC_CHARSET_GREEK=161 +val SC_CHARSET_HANGUL=129 +val SC_CHARSET_MAC=77 +val SC_CHARSET_OEM=255 +val SC_CHARSET_RUSSIAN=204 +val SC_CHARSET_CYRILLIC=1251 +val SC_CHARSET_SHIFTJIS=128 +val SC_CHARSET_SYMBOL=2 +val SC_CHARSET_TURKISH=162 +val SC_CHARSET_JOHAB=130 +val SC_CHARSET_HEBREW=177 +val SC_CHARSET_ARABIC=178 +val SC_CHARSET_VIETNAMESE=163 +val SC_CHARSET_THAI=222 +val SC_CHARSET_8859_15=1000 + +# Clear all the styles and make equivalent to the global default style. +set void StyleClearAll=2050(,) + +# Set the foreground colour of a style. +set void StyleSetFore=2051(int style, colour fore) + +# Set the background colour of a style. +set void StyleSetBack=2052(int style, colour back) + +# Set a style to be bold or not. +set void StyleSetBold=2053(int style, bool bold) + +# Set a style to be italic or not. +set void StyleSetItalic=2054(int style, bool italic) + +# Set the size of characters of a style. +set void StyleSetSize=2055(int style, int sizePoints) + +# Set the font of a style. +set void StyleSetFont=2056(int style, string fontName) + +# Set a style to have its end of line filled or not. +set void StyleSetEOLFilled=2057(int style, bool filled) + +# Reset the default style to its state at startup +fun void StyleResetDefault=2058(,) + +# Set a style to be underlined or not. +set void StyleSetUnderline=2059(int style, bool underline) + +enu CaseVisible=SC_CASE_ +val SC_CASE_MIXED=0 +val SC_CASE_UPPER=1 +val SC_CASE_LOWER=2 + +# Get the foreground colour of a style. +get colour StyleGetFore=2481(int style,) + +# Get the background colour of a style. +get colour StyleGetBack=2482(int style,) + +# Get is a style bold or not. +get bool StyleGetBold=2483(int style,) + +# Get is a style italic or not. +get bool StyleGetItalic=2484(int style,) + +# Get the size of characters of a style. +get int StyleGetSize=2485(int style,) + +# Get the font of a style. +# Returns the length of the fontName +fun int StyleGetFont=2486(int style, stringresult fontName) + +# Get is a style to have its end of line filled or not. +get bool StyleGetEOLFilled=2487(int style,) + +# Get is a style underlined or not. +get bool StyleGetUnderline=2488(int style,) + +# Get is a style mixed case, or to force upper or lower case. +get int StyleGetCase=2489(int style,) + +# Get the character get of the font in a style. +get int StyleGetCharacterSet=2490(int style,) + +# Get is a style visible or not. +get bool StyleGetVisible=2491(int style,) + +# Get is a style changeable or not (read only). +# Experimental feature, currently buggy. +get bool StyleGetChangeable=2492(int style,) + +# Get is a style a hotspot or not. +get bool StyleGetHotSpot=2493(int style,) + +# Set a style to be mixed case, or to force upper or lower case. +set void StyleSetCase=2060(int style, int caseForce) + +# Set the character set of the font in a style. +set void StyleSetCharacterSet=2066(int style, int characterSet) + +# Set a style to be a hotspot or not. +set void StyleSetHotSpot=2409(int style, bool hotspot) + +# Set the foreground colour of the main and additional selections and whether to use this setting. +fun void SetSelFore=2067(bool useSetting, colour fore) + +# Set the background colour of the main and additional selections and whether to use this setting. +fun void SetSelBack=2068(bool useSetting, colour back) + +# Get the alpha of the selection. +get int GetSelAlpha=2477(,) + +# Set the alpha of the selection. +set void SetSelAlpha=2478(int alpha,) + +# Is the selection end of line filled? +get bool GetSelEOLFilled=2479(,) + +# Set the selection to have its end of line filled or not. +set void SetSelEOLFilled=2480(bool filled,) + +# Set the foreground colour of the caret. +set void SetCaretFore=2069(colour fore,) + +# When key+modifier combination km is pressed perform msg. +fun void AssignCmdKey=2070(keymod km, int msg) + +# When key+modifier combination km is pressed do nothing. +fun void ClearCmdKey=2071(keymod km,) + +# Drop all key mappings. +fun void ClearAllCmdKeys=2072(,) + +# Set the styles for a segment of the document. +fun void SetStylingEx=2073(int length, string styles) + +# Set a style to be visible or not. +set void StyleSetVisible=2074(int style, bool visible) + +# Get the time in milliseconds that the caret is on and off. +get int GetCaretPeriod=2075(,) + +# Get the time in milliseconds that the caret is on and off. 0 = steady on. +set void SetCaretPeriod=2076(int periodMilliseconds,) + +# Set the set of characters making up words for when moving or selecting by word. +# First sets defaults like SetCharsDefault. +set void SetWordChars=2077(, string characters) + +# Start a sequence of actions that is undone and redone as a unit. +# May be nested. +fun void BeginUndoAction=2078(,) + +# End a sequence of actions that is undone and redone as a unit. +fun void EndUndoAction=2079(,) + +# Indicator style enumeration and some constants +enu IndicatorStyle=INDIC_ +val INDIC_PLAIN=0 +val INDIC_SQUIGGLE=1 +val INDIC_TT=2 +val INDIC_DIAGONAL=3 +val INDIC_STRIKE=4 +val INDIC_HIDDEN=5 +val INDIC_BOX=6 +val INDIC_ROUNDBOX=7 +val INDIC_MAX=31 +val INDIC_CONTAINER=8 +val INDIC0_MASK=0x20 +val INDIC1_MASK=0x40 +val INDIC2_MASK=0x80 +val INDICS_MASK=0xE0 + +# Set an indicator to plain, squiggle or TT. +set void IndicSetStyle=2080(int indic, int style) + +# Retrieve the style of an indicator. +get int IndicGetStyle=2081(int indic,) + +# Set the foreground colour of an indicator. +set void IndicSetFore=2082(int indic, colour fore) + +# Retrieve the foreground colour of an indicator. +get colour IndicGetFore=2083(int indic,) + +# Set an indicator to draw under text or over(default). +set void IndicSetUnder=2510(int indic, bool under) + +# Retrieve whether indicator drawn under or over text. +get bool IndicGetUnder=2511(int indic,) + +# Set the foreground colour of all whitespace and whether to use this setting. +fun void SetWhitespaceFore=2084(bool useSetting, colour fore) + +# Set the background colour of all whitespace and whether to use this setting. +fun void SetWhitespaceBack=2085(bool useSetting, colour back) + +# Set the size of the dots used to mark space characters. +set void SetWhitespaceSize=2086(int size,) + +# Get the size of the dots used to mark space characters. +get int GetWhitespaceSize=2087(,) + +# Divide each styling byte into lexical class bits (default: 5) and indicator +# bits (default: 3). If a lexer requires more than 32 lexical states, then this +# is used to expand the possible states. +set void SetStyleBits=2090(int bits,) + +# Retrieve number of bits in style bytes used to hold the lexical state. +get int GetStyleBits=2091(,) + +# Used to hold extra styling information for each line. +set void SetLineState=2092(int line, int state) + +# Retrieve the extra styling information for a line. +get int GetLineState=2093(int line,) + +# Retrieve the last line number that has line state. +get int GetMaxLineState=2094(,) + +# Is the background of the line containing the caret in a different colour? +get bool GetCaretLineVisible=2095(,) + +# Display the background of the line containing the caret in a different colour. +set void SetCaretLineVisible=2096(bool show,) + +# Get the colour of the background of the line containing the caret. +get colour GetCaretLineBack=2097(,) + +# Set the colour of the background of the line containing the caret. +set void SetCaretLineBack=2098(colour back,) + +# Set a style to be changeable or not (read only). +# Experimental feature, currently buggy. +set void StyleSetChangeable=2099(int style, bool changeable) + +# Display a auto-completion list. +# The lenEntered parameter indicates how many characters before +# the caret should be used to provide context. +fun void AutoCShow=2100(int lenEntered, string itemList) + +# Remove the auto-completion list from the screen. +fun void AutoCCancel=2101(,) + +# Is there an auto-completion list visible? +fun bool AutoCActive=2102(,) + +# Retrieve the position of the caret when the auto-completion list was displayed. +fun position AutoCPosStart=2103(,) + +# User has selected an item so remove the list and insert the selection. +fun void AutoCComplete=2104(,) + +# Define a set of character that when typed cancel the auto-completion list. +fun void AutoCStops=2105(, string characterSet) + +# Change the separator character in the string setting up an auto-completion list. +# Default is space but can be changed if items contain space. +set void AutoCSetSeparator=2106(int separatorCharacter,) + +# Retrieve the auto-completion list separator character. +get int AutoCGetSeparator=2107(,) + +# Select the item in the auto-completion list that starts with a string. +fun void AutoCSelect=2108(, string text) + +# Should the auto-completion list be cancelled if the user backspaces to a +# position before where the box was created. +set void AutoCSetCancelAtStart=2110(bool cancel,) + +# Retrieve whether auto-completion cancelled by backspacing before start. +get bool AutoCGetCancelAtStart=2111(,) + +# Define a set of characters that when typed will cause the autocompletion to +# choose the selected item. +set void AutoCSetFillUps=2112(, string characterSet) + +# Should a single item auto-completion list automatically choose the item. +set void AutoCSetChooseSingle=2113(bool chooseSingle,) + +# Retrieve whether a single item auto-completion list automatically choose the item. +get bool AutoCGetChooseSingle=2114(,) + +# Set whether case is significant when performing auto-completion searches. +set void AutoCSetIgnoreCase=2115(bool ignoreCase,) + +# Retrieve state of ignore case flag. +get bool AutoCGetIgnoreCase=2116(,) + +# Display a list of strings and send notification when user chooses one. +fun void UserListShow=2117(int listType, string itemList) + +# Set whether or not autocompletion is hidden automatically when nothing matches. +set void AutoCSetAutoHide=2118(bool autoHide,) + +# Retrieve whether or not autocompletion is hidden automatically when nothing matches. +get bool AutoCGetAutoHide=2119(,) + +# Set whether or not autocompletion deletes any word characters +# after the inserted text upon completion. +set void AutoCSetDropRestOfWord=2270(bool dropRestOfWord,) + +# Retrieve whether or not autocompletion deletes any word characters +# after the inserted text upon completion. +get bool AutoCGetDropRestOfWord=2271(,) + +# Register an XPM image for use in autocompletion lists. +fun void RegisterImage=2405(int type, string xpmData) + +# Clear all the registered XPM images. +fun void ClearRegisteredImages=2408(,) + +# Retrieve the auto-completion list type-separator character. +get int AutoCGetTypeSeparator=2285(,) + +# Change the type-separator character in the string setting up an auto-completion list. +# Default is '?' but can be changed if items contain '?'. +set void AutoCSetTypeSeparator=2286(int separatorCharacter,) + +# Set the maximum width, in characters, of auto-completion and user lists. +# Set to 0 to autosize to fit longest item, which is the default. +set void AutoCSetMaxWidth=2208(int characterCount,) + +# Get the maximum width, in characters, of auto-completion and user lists. +get int AutoCGetMaxWidth=2209(,) + +# Set the maximum height, in rows, of auto-completion and user lists. +# The default is 5 rows. +set void AutoCSetMaxHeight=2210(int rowCount,) + +# Set the maximum height, in rows, of auto-completion and user lists. +get int AutoCGetMaxHeight=2211(,) + +# Set the number of spaces used for one level of indentation. +set void SetIndent=2122(int indentSize,) + +# Retrieve indentation size. +get int GetIndent=2123(,) + +# Indentation will only use space characters if useTabs is false, otherwise +# it will use a combination of tabs and spaces. +set void SetUseTabs=2124(bool useTabs,) + +# Retrieve whether tabs will be used in indentation. +get bool GetUseTabs=2125(,) + +# Change the indentation of a line to a number of columns. +set void SetLineIndentation=2126(int line, int indentSize) + +# Retrieve the number of columns that a line is indented. +get int GetLineIndentation=2127(int line,) + +# Retrieve the position before the first non indentation character on a line. +get position GetLineIndentPosition=2128(int line,) + +# Retrieve the column number of a position, taking tab width into account. +get int GetColumn=2129(position pos,) + +# Show or hide the horizontal scroll bar. +set void SetHScrollBar=2130(bool show,) + +# Is the horizontal scroll bar visible? +get bool GetHScrollBar=2131(,) + +enu IndentView=SC_IV_ +val SC_IV_NONE=0 +val SC_IV_REAL=1 +val SC_IV_LOOKFORWARD=2 +val SC_IV_LOOKBOTH=3 + +# Show or hide indentation guides. +set void SetIndentationGuides=2132(int indentView,) + +# Are the indentation guides visible? +get int GetIndentationGuides=2133(,) + +# Set the highlighted indentation guide column. +# 0 = no highlighted guide. +set void SetHighlightGuide=2134(int column,) + +# Get the highlighted indentation guide column. +get int GetHighlightGuide=2135(,) + +# Get the position after the last visible characters on a line. +get int GetLineEndPosition=2136(int line,) + +# Get the code page used to interpret the bytes of the document as characters. +get int GetCodePage=2137(,) + +# Get the foreground colour of the caret. +get colour GetCaretFore=2138(,) + +# In palette mode? +get bool GetUsePalette=2139(,) + +# In read-only mode? +get bool GetReadOnly=2140(,) + +# Sets the position of the caret. +set void SetCurrentPos=2141(position pos,) + +# Sets the position that starts the selection - this becomes the anchor. +set void SetSelectionStart=2142(position pos,) + +# Returns the position at the start of the selection. +get position GetSelectionStart=2143(,) + +# Sets the position that ends the selection - this becomes the currentPosition. +set void SetSelectionEnd=2144(position pos,) + +# Returns the position at the end of the selection. +get position GetSelectionEnd=2145(,) + +# Sets the print magnification added to the point size of each style for printing. +set void SetPrintMagnification=2146(int magnification,) + +# Returns the print magnification. +get int GetPrintMagnification=2147(,) + +enu PrintOption=SC_PRINT_ +# PrintColourMode - use same colours as screen. +val SC_PRINT_NORMAL=0 +# PrintColourMode - invert the light value of each style for printing. +val SC_PRINT_INVERTLIGHT=1 +# PrintColourMode - force black text on white background for printing. +val SC_PRINT_BLACKONWHITE=2 +# PrintColourMode - text stays coloured, but all background is forced to be white for printing. +val SC_PRINT_COLOURONWHITE=3 +# PrintColourMode - only the default-background is forced to be white for printing. +val SC_PRINT_COLOURONWHITEDEFAULTBG=4 + +# Modify colours when printing for clearer printed text. +set void SetPrintColourMode=2148(int mode,) + +# Returns the print colour mode. +get int GetPrintColourMode=2149(,) + +enu FindOption=SCFIND_ +val SCFIND_WHOLEWORD=2 +val SCFIND_MATCHCASE=4 +val SCFIND_WORDSTART=0x00100000 +val SCFIND_REGEXP=0x00200000 +val SCFIND_POSIX=0x00400000 + +# Find some text in the document. +fun position FindText=2150(int flags, findtext ft) + +# On Windows, will draw the document into a display context such as a printer. +fun position FormatRange=2151(bool draw, formatrange fr) + +# Retrieve the display line at the top of the display. +get int GetFirstVisibleLine=2152(,) + +# Retrieve the contents of a line. +# Returns the length of the line. +fun int GetLine=2153(int line, stringresult text) + +# Returns the number of lines in the document. There is always at least one. +get int GetLineCount=2154(,) + +# Sets the size in pixels of the left margin. +set void SetMarginLeft=2155(, int pixelWidth) + +# Returns the size in pixels of the left margin. +get int GetMarginLeft=2156(,) + +# Sets the size in pixels of the right margin. +set void SetMarginRight=2157(, int pixelWidth) + +# Returns the size in pixels of the right margin. +get int GetMarginRight=2158(,) + +# Is the document different from when it was last saved? +get bool GetModify=2159(,) + +# Select a range of text. +fun void SetSel=2160(position start, position end) + +# Retrieve the selected text. +# Return the length of the text. +fun int GetSelText=2161(, stringresult text) + +# Retrieve a range of text. +# Return the length of the text. +fun int GetTextRange=2162(, textrange tr) + +# Draw the selection in normal style or with selection highlighted. +fun void HideSelection=2163(bool normal,) + +# Retrieve the x value of the point in the window where a position is displayed. +fun int PointXFromPosition=2164(, position pos) + +# Retrieve the y value of the point in the window where a position is displayed. +fun int PointYFromPosition=2165(, position pos) + +# Retrieve the line containing a position. +fun int LineFromPosition=2166(position pos,) + +# Retrieve the position at the start of a line. +fun position PositionFromLine=2167(int line,) + +# Scroll horizontally and vertically. +fun void LineScroll=2168(int columns, int lines) + +# Ensure the caret is visible. +fun void ScrollCaret=2169(,) + +# Replace the selected text with the argument text. +fun void ReplaceSel=2170(, string text) + +# Set to read only or read write. +set void SetReadOnly=2171(bool readOnly,) + +# Null operation. +fun void Null=2172(,) + +# Will a paste succeed? +fun bool CanPaste=2173(,) + +# Are there any undoable actions in the undo history? +fun bool CanUndo=2174(,) + +# Delete the undo history. +fun void EmptyUndoBuffer=2175(,) + +# Undo one action in the undo history. +fun void Undo=2176(,) + +# Cut the selection to the clipboard. +fun void Cut=2177(,) + +# Copy the selection to the clipboard. +fun void Copy=2178(,) + +# Paste the contents of the clipboard into the document replacing the selection. +fun void Paste=2179(,) + +# Clear the selection. +fun void Clear=2180(,) + +# Replace the contents of the document with the argument text. +fun void SetText=2181(, string text) + +# Retrieve all the text in the document. +# Returns number of characters retrieved. +fun int GetText=2182(int length, stringresult text) + +# Retrieve the number of characters in the document. +get int GetTextLength=2183(,) + +# Retrieve a pointer to a function that processes messages for this Scintilla. +get int GetDirectFunction=2184(,) + +# Retrieve a pointer value to use as the first argument when calling +# the function returned by GetDirectFunction. +get int GetDirectPointer=2185(,) + +# Set to overtype (true) or insert mode. +set void SetOvertype=2186(bool overtype,) + +# Returns true if overtype mode is active otherwise false is returned. +get bool GetOvertype=2187(,) + +# Set the width of the insert mode caret. +set void SetCaretWidth=2188(int pixelWidth,) + +# Returns the width of the insert mode caret. +get int GetCaretWidth=2189(,) + +# Sets the position that starts the target which is used for updating the +# document without affecting the scroll position. +set void SetTargetStart=2190(position pos,) + +# Get the position that starts the target. +get position GetTargetStart=2191(,) + +# Sets the position that ends the target which is used for updating the +# document without affecting the scroll position. +set void SetTargetEnd=2192(position pos,) + +# Get the position that ends the target. +get position GetTargetEnd=2193(,) + +# Replace the target text with the argument text. +# Text is counted so it can contain NULs. +# Returns the length of the replacement text. +fun int ReplaceTarget=2194(int length, string text) + +# Replace the target text with the argument text after \d processing. +# Text is counted so it can contain NULs. +# Looks for \d where d is between 1 and 9 and replaces these with the strings +# matched in the last search operation which were surrounded by \( and \). +# Returns the length of the replacement text including any change +# caused by processing the \d patterns. +fun int ReplaceTargetRE=2195(int length, string text) + +# Search for a counted string in the target and set the target to the found +# range. Text is counted so it can contain NULs. +# Returns length of range or -1 for failure in which case target is not moved. +fun int SearchInTarget=2197(int length, string text) + +# Set the search flags used by SearchInTarget. +set void SetSearchFlags=2198(int flags,) + +# Get the search flags used by SearchInTarget. +get int GetSearchFlags=2199(,) + +# Show a call tip containing a definition near position pos. +fun void CallTipShow=2200(position pos, string definition) + +# Remove the call tip from the screen. +fun void CallTipCancel=2201(,) + +# Is there an active call tip? +fun bool CallTipActive=2202(,) + +# Retrieve the position where the caret was before displaying the call tip. +fun position CallTipPosStart=2203(,) + +# Highlight a segment of the definition. +fun void CallTipSetHlt=2204(int start, int end) + +# Set the background colour for the call tip. +set void CallTipSetBack=2205(colour back,) + +# Set the foreground colour for the call tip. +set void CallTipSetFore=2206(colour fore,) + +# Set the foreground colour for the highlighted part of the call tip. +set void CallTipSetForeHlt=2207(colour fore,) + +# Enable use of STYLE_CALLTIP and set call tip tab size in pixels. +set void CallTipUseStyle=2212(int tabSize,) + +# Find the display line of a document line taking hidden lines into account. +fun int VisibleFromDocLine=2220(int line,) + +# Find the document line of a display line taking hidden lines into account. +fun int DocLineFromVisible=2221(int lineDisplay,) + +# The number of display lines needed to wrap a document line +fun int WrapCount=2235(int line,) + +enu FoldLevel=SC_FOLDLEVEL +val SC_FOLDLEVELBASE=0x400 +val SC_FOLDLEVELWHITEFLAG=0x1000 +val SC_FOLDLEVELHEADERFLAG=0x2000 +val SC_FOLDLEVELNUMBERMASK=0x0FFF + +# Set the fold level of a line. +# This encodes an integer level along with flags indicating whether the +# line is a header and whether it is effectively white space. +set void SetFoldLevel=2222(int line, int level) + +# Retrieve the fold level of a line. +get int GetFoldLevel=2223(int line,) + +# Find the last child line of a header line. +get int GetLastChild=2224(int line, int level) + +# Find the parent line of a child line. +get int GetFoldParent=2225(int line,) + +# Make a range of lines visible. +fun void ShowLines=2226(int lineStart, int lineEnd) + +# Make a range of lines invisible. +fun void HideLines=2227(int lineStart, int lineEnd) + +# Is a line visible? +get bool GetLineVisible=2228(int line,) + +# Show the children of a header line. +set void SetFoldExpanded=2229(int line, bool expanded) + +# Is a header line expanded? +get bool GetFoldExpanded=2230(int line,) + +# Switch a header line between expanded and contracted. +fun void ToggleFold=2231(int line,) + +# Ensure a particular line is visible by expanding any header line hiding it. +fun void EnsureVisible=2232(int line,) + +enu FoldFlag=SC_FOLDFLAG_ +val SC_FOLDFLAG_LINEBEFORE_EXPANDED=0x0002 +val SC_FOLDFLAG_LINEBEFORE_CONTRACTED=0x0004 +val SC_FOLDFLAG_LINEAFTER_EXPANDED=0x0008 +val SC_FOLDFLAG_LINEAFTER_CONTRACTED=0x0010 +val SC_FOLDFLAG_LEVELNUMBERS=0x0040 + +# Set some style options for folding. +fun void SetFoldFlags=2233(int flags,) + +# Ensure a particular line is visible by expanding any header line hiding it. +# Use the currently set visibility policy to determine which range to display. +fun void EnsureVisibleEnforcePolicy=2234(int line,) + +# Sets whether a tab pressed when caret is within indentation indents. +set void SetTabIndents=2260(bool tabIndents,) + +# Does a tab pressed when caret is within indentation indent? +get bool GetTabIndents=2261(,) + +# Sets whether a backspace pressed when caret is within indentation unindents. +set void SetBackSpaceUnIndents=2262(bool bsUnIndents,) + +# Does a backspace pressed when caret is within indentation unindent? +get bool GetBackSpaceUnIndents=2263(,) + +val SC_TIME_FOREVER=10000000 + +# Sets the time the mouse must sit still to generate a mouse dwell event. +set void SetMouseDwellTime=2264(int periodMilliseconds,) + +# Retrieve the time the mouse must sit still to generate a mouse dwell event. +get int GetMouseDwellTime=2265(,) + +# Get position of start of word. +fun int WordStartPosition=2266(position pos, bool onlyWordCharacters) + +# Get position of end of word. +fun int WordEndPosition=2267(position pos, bool onlyWordCharacters) + +enu Wrap=SC_WRAP_ +val SC_WRAP_NONE=0 +val SC_WRAP_WORD=1 +val SC_WRAP_CHAR=2 + +# Sets whether text is word wrapped. +set void SetWrapMode=2268(int mode,) + +# Retrieve whether text is word wrapped. +get int GetWrapMode=2269(,) + +enu WrapVisualFlag=SC_WRAPVISUALFLAG_ +val SC_WRAPVISUALFLAG_NONE=0x0000 +val SC_WRAPVISUALFLAG_END=0x0001 +val SC_WRAPVISUALFLAG_START=0x0002 + +# Set the display mode of visual flags for wrapped lines. +set void SetWrapVisualFlags=2460(int wrapVisualFlags,) + +# Retrive the display mode of visual flags for wrapped lines. +get int GetWrapVisualFlags=2461(,) + +enu WrapVisualLocation=SC_WRAPVISUALFLAGLOC_ +val SC_WRAPVISUALFLAGLOC_DEFAULT=0x0000 +val SC_WRAPVISUALFLAGLOC_END_BY_TEXT=0x0001 +val SC_WRAPVISUALFLAGLOC_START_BY_TEXT=0x0002 + +# Set the location of visual flags for wrapped lines. +set void SetWrapVisualFlagsLocation=2462(int wrapVisualFlagsLocation,) + +# Retrive the location of visual flags for wrapped lines. +get int GetWrapVisualFlagsLocation=2463(,) + +# Set the start indent for wrapped lines. +set void SetWrapStartIndent=2464(int indent,) + +# Retrive the start indent for wrapped lines. +get int GetWrapStartIndent=2465(,) + +enu WrapIndentMode=SC_WRAPINDENT_ +val SC_WRAPINDENT_FIXED=0 +val SC_WRAPINDENT_SAME=1 +val SC_WRAPINDENT_INDENT=2 + +# Sets how wrapped sublines are placed. Default is fixed. +set void SetWrapIndentMode=2472(int mode,) + +# Retrieve how wrapped sublines are placed. Default is fixed. +get int GetWrapIndentMode=2473(,) + +enu LineCache=SC_CACHE_ +val SC_CACHE_NONE=0 +val SC_CACHE_CARET=1 +val SC_CACHE_PAGE=2 +val SC_CACHE_DOCUMENT=3 + +# Sets the degree of caching of layout information. +set void SetLayoutCache=2272(int mode,) + +# Retrieve the degree of caching of layout information. +get int GetLayoutCache=2273(,) + +# Sets the document width assumed for scrolling. +set void SetScrollWidth=2274(int pixelWidth,) + +# Retrieve the document width assumed for scrolling. +get int GetScrollWidth=2275(,) + +# Sets whether the maximum width line displayed is used to set scroll width. +set void SetScrollWidthTracking=2516(bool tracking,) + +# Retrieve whether the scroll width tracks wide lines. +get bool GetScrollWidthTracking=2517(,) + +# Measure the pixel width of some text in a particular style. +# NUL terminated text argument. +# Does not handle tab or control characters. +fun int TextWidth=2276(int style, string text) + +# Sets the scroll range so that maximum scroll position has +# the last line at the bottom of the view (default). +# Setting this to false allows scrolling one page below the last line. +set void SetEndAtLastLine=2277(bool endAtLastLine,) + +# Retrieve whether the maximum scroll position has the last +# line at the bottom of the view. +get bool GetEndAtLastLine=2278(,) + +# Retrieve the height of a particular line of text in pixels. +fun int TextHeight=2279(int line,) + +# Show or hide the vertical scroll bar. +set void SetVScrollBar=2280(bool show,) + +# Is the vertical scroll bar visible? +get bool GetVScrollBar=2281(,) + +# Append a string to the end of the document without changing the selection. +fun void AppendText=2282(int length, string text) + +# Is drawing done in two phases with backgrounds drawn before faoregrounds? +get bool GetTwoPhaseDraw=2283(,) + +# In twoPhaseDraw mode, drawing is performed in two phases, first the background +# and then the foreground. This avoids chopping off characters that overlap the next run. +set void SetTwoPhaseDraw=2284(bool twoPhase,) + +# Control font anti-aliasing. + +enu FontQuality=SC_EFF_ +val SC_EFF_QUALITY_MASK=0xF +val SC_EFF_QUALITY_DEFAULT=0 +val SC_EFF_QUALITY_NON_ANTIALIASED=1 +val SC_EFF_QUALITY_ANTIALIASED=2 +val SC_EFF_QUALITY_LCD_OPTIMIZED=3 + +# Choose the quality level for text from the FontQuality enumeration. +set void SetFontQuality=2611(int fontQuality,) + +# Retrieve the quality level for text. +get int GetFontQuality=2612(,) + +# Scroll so that a display line is at the top of the display. +set void SetFirstVisibleLine=2613(int lineDisplay,) + +enu MultiPaste=SC_MULTIPASTE_ +val SC_MULTIPASTE_ONCE=0 +val SC_MULTIPASTE_EACH=1 + +# Change the effect of pasting when there are multiple selections. +set void SetMultiPaste=2614(int multiPaste,) + +# Retrieve the effect of pasting when there are multiple selections.. +get int GetMultiPaste=2615(,) + +# Retrieve the value of a tag from a regular expression search. +fun int GetTag=2616(int tagNumber, stringresult tagValue) + +# Make the target range start and end be the same as the selection range start and end. +fun void TargetFromSelection=2287(,) + +# Join the lines in the target. +fun void LinesJoin=2288(,) + +# Split the lines in the target into lines that are less wide than pixelWidth +# where possible. +fun void LinesSplit=2289(int pixelWidth,) + +# Set the colours used as a chequerboard pattern in the fold margin +fun void SetFoldMarginColour=2290(bool useSetting, colour back) +fun void SetFoldMarginHiColour=2291(bool useSetting, colour fore) + +## New messages go here + +## Start of key messages +# Move caret down one line. +fun void LineDown=2300(,) + +# Move caret down one line extending selection to new caret position. +fun void LineDownExtend=2301(,) + +# Move caret up one line. +fun void LineUp=2302(,) + +# Move caret up one line extending selection to new caret position. +fun void LineUpExtend=2303(,) + +# Move caret left one character. +fun void CharLeft=2304(,) + +# Move caret left one character extending selection to new caret position. +fun void CharLeftExtend=2305(,) + +# Move caret right one character. +fun void CharRight=2306(,) + +# Move caret right one character extending selection to new caret position. +fun void CharRightExtend=2307(,) + +# Move caret left one word. +fun void WordLeft=2308(,) + +# Move caret left one word extending selection to new caret position. +fun void WordLeftExtend=2309(,) + +# Move caret right one word. +fun void WordRight=2310(,) + +# Move caret right one word extending selection to new caret position. +fun void WordRightExtend=2311(,) + +# Move caret to first position on line. +fun void Home=2312(,) + +# Move caret to first position on line extending selection to new caret position. +fun void HomeExtend=2313(,) + +# Move caret to last position on line. +fun void LineEnd=2314(,) + +# Move caret to last position on line extending selection to new caret position. +fun void LineEndExtend=2315(,) + +# Move caret to first position in document. +fun void DocumentStart=2316(,) + +# Move caret to first position in document extending selection to new caret position. +fun void DocumentStartExtend=2317(,) + +# Move caret to last position in document. +fun void DocumentEnd=2318(,) + +# Move caret to last position in document extending selection to new caret position. +fun void DocumentEndExtend=2319(,) + +# Move caret one page up. +fun void PageUp=2320(,) + +# Move caret one page up extending selection to new caret position. +fun void PageUpExtend=2321(,) + +# Move caret one page down. +fun void PageDown=2322(,) + +# Move caret one page down extending selection to new caret position. +fun void PageDownExtend=2323(,) + +# Switch from insert to overtype mode or the reverse. +fun void EditToggleOvertype=2324(,) + +# Cancel any modes such as call tip or auto-completion list display. +fun void Cancel=2325(,) + +# Delete the selection or if no selection, the character before the caret. +fun void DeleteBack=2326(,) + +# If selection is empty or all on one line replace the selection with a tab character. +# If more than one line selected, indent the lines. +fun void Tab=2327(,) + +# Dedent the selected lines. +fun void BackTab=2328(,) + +# Insert a new line, may use a CRLF, CR or LF depending on EOL mode. +fun void NewLine=2329(,) + +# Insert a Form Feed character. +fun void FormFeed=2330(,) + +# Move caret to before first visible character on line. +# If already there move to first character on line. +fun void VCHome=2331(,) + +# Like VCHome but extending selection to new caret position. +fun void VCHomeExtend=2332(,) + +# Magnify the displayed text by increasing the sizes by 1 point. +fun void ZoomIn=2333(,) + +# Make the displayed text smaller by decreasing the sizes by 1 point. +fun void ZoomOut=2334(,) + +# Delete the word to the left of the caret. +fun void DelWordLeft=2335(,) + +# Delete the word to the right of the caret. +fun void DelWordRight=2336(,) + +# Delete the word to the right of the caret, but not the trailing non-word characters. +fun void DelWordRightEnd=2518(,) + +# Cut the line containing the caret. +fun void LineCut=2337(,) + +# Delete the line containing the caret. +fun void LineDelete=2338(,) + +# Switch the current line with the previous. +fun void LineTranspose=2339(,) + +# Duplicate the current line. +fun void LineDuplicate=2404(,) + +# Transform the selection to lower case. +fun void LowerCase=2340(,) + +# Transform the selection to upper case. +fun void UpperCase=2341(,) + +# Scroll the document down, keeping the caret visible. +fun void LineScrollDown=2342(,) + +# Scroll the document up, keeping the caret visible. +fun void LineScrollUp=2343(,) + +# Delete the selection or if no selection, the character before the caret. +# Will not delete the character before at the start of a line. +fun void DeleteBackNotLine=2344(,) + +# Move caret to first position on display line. +fun void HomeDisplay=2345(,) + +# Move caret to first position on display line extending selection to +# new caret position. +fun void HomeDisplayExtend=2346(,) + +# Move caret to last position on display line. +fun void LineEndDisplay=2347(,) + +# Move caret to last position on display line extending selection to new +# caret position. +fun void LineEndDisplayExtend=2348(,) + +# These are like their namesakes Home(Extend)?, LineEnd(Extend)?, VCHome(Extend)? +# except they behave differently when word-wrap is enabled: +# They go first to the start / end of the display line, like (Home|LineEnd)Display +# The difference is that, the cursor is already at the point, it goes on to the start +# or end of the document line, as appropriate for (Home|LineEnd|VCHome)(Extend)?. + +fun void HomeWrap=2349(,) +fun void HomeWrapExtend=2450(,) +fun void LineEndWrap=2451(,) +fun void LineEndWrapExtend=2452(,) +fun void VCHomeWrap=2453(,) +fun void VCHomeWrapExtend=2454(,) + +# Copy the line containing the caret. +fun void LineCopy=2455(,) + +# Move the caret inside current view if it's not there already. +fun void MoveCaretInsideView=2401(,) + +# How many characters are on a line, including end of line characters? +fun int LineLength=2350(int line,) + +# Highlight the characters at two positions. +fun void BraceHighlight=2351(position pos1, position pos2) + +# Highlight the character at a position indicating there is no matching brace. +fun void BraceBadLight=2352(position pos,) + +# Find the position of a matching brace or INVALID_POSITION if no match. +fun position BraceMatch=2353(position pos,) + +# Are the end of line characters visible? +get bool GetViewEOL=2355(,) + +# Make the end of line characters visible or invisible. +set void SetViewEOL=2356(bool visible,) + +# Retrieve a pointer to the document object. +get int GetDocPointer=2357(,) + +# Change the document object used. +set void SetDocPointer=2358(, int pointer) + +# Set which document modification events are sent to the container. +set void SetModEventMask=2359(int mask,) + +enu EdgeVisualStyle=EDGE_ +val EDGE_NONE=0 +val EDGE_LINE=1 +val EDGE_BACKGROUND=2 + +# Retrieve the column number which text should be kept within. +get int GetEdgeColumn=2360(,) + +# Set the column number of the edge. +# If text goes past the edge then it is highlighted. +set void SetEdgeColumn=2361(int column,) + +# Retrieve the edge highlight mode. +get int GetEdgeMode=2362(,) + +# The edge may be displayed by a line (EDGE_LINE) or by highlighting text that +# goes beyond it (EDGE_BACKGROUND) or not displayed at all (EDGE_NONE). +set void SetEdgeMode=2363(int mode,) + +# Retrieve the colour used in edge indication. +get colour GetEdgeColour=2364(,) + +# Change the colour used in edge indication. +set void SetEdgeColour=2365(colour edgeColour,) + +# Sets the current caret position to be the search anchor. +fun void SearchAnchor=2366(,) + +# Find some text starting at the search anchor. +# Does not ensure the selection is visible. +fun int SearchNext=2367(int flags, string text) + +# Find some text starting at the search anchor and moving backwards. +# Does not ensure the selection is visible. +fun int SearchPrev=2368(int flags, string text) + +# Retrieves the number of lines completely visible. +get int LinesOnScreen=2370(,) + +# Set whether a pop up menu is displayed automatically when the user presses +# the wrong mouse button. +fun void UsePopUp=2371(bool allowPopUp,) + +# Is the selection rectangular? The alternative is the more common stream selection. +get bool SelectionIsRectangle=2372(,) + +# Set the zoom level. This number of points is added to the size of all fonts. +# It may be positive to magnify or negative to reduce. +set void SetZoom=2373(int zoom,) +# Retrieve the zoom level. +get int GetZoom=2374(,) + +# Create a new document object. +# Starts with reference count of 1 and not selected into editor. +fun int CreateDocument=2375(,) +# Extend life of document. +fun void AddRefDocument=2376(, int doc) +# Release a reference to the document, deleting document if it fades to black. +fun void ReleaseDocument=2377(, int doc) + +# Get which document modification events are sent to the container. +get int GetModEventMask=2378(,) + +# Change internal focus flag. +set void SetFocus=2380(bool focus,) +# Get internal focus flag. +get bool GetFocus=2381(,) + +enu Status=SC_STATUS_ +val SC_STATUS_OK=0 +val SC_STATUS_FAILURE=1 +val SC_STATUS_BADALLOC=2 + +# Change error status - 0 = OK. +set void SetStatus=2382(int statusCode,) +# Get error status. +get int GetStatus=2383(,) + +# Set whether the mouse is captured when its button is pressed. +set void SetMouseDownCaptures=2384(bool captures,) +# Get whether mouse gets captured. +get bool GetMouseDownCaptures=2385(,) + +enu CursorShape=SC_CURSOR +val SC_CURSORNORMAL=-1 +val SC_CURSORWAIT=4 +# Sets the cursor to one of the SC_CURSOR* values. +set void SetCursor=2386(int cursorType,) +# Get cursor type. +get int GetCursor=2387(,) + +# Change the way control characters are displayed: +# If symbol is < 32, keep the drawn way, else, use the given character. +set void SetControlCharSymbol=2388(int symbol,) +# Get the way control characters are displayed. +get int GetControlCharSymbol=2389(,) + +# Move to the previous change in capitalisation. +fun void WordPartLeft=2390(,) +# Move to the previous change in capitalisation extending selection +# to new caret position. +fun void WordPartLeftExtend=2391(,) +# Move to the change next in capitalisation. +fun void WordPartRight=2392(,) +# Move to the next change in capitalisation extending selection +# to new caret position. +fun void WordPartRightExtend=2393(,) + +# Constants for use with SetVisiblePolicy, similar to SetCaretPolicy. +val VISIBLE_SLOP=0x01 +val VISIBLE_STRICT=0x04 +# Set the way the display area is determined when a particular line +# is to be moved to by Find, FindNext, GotoLine, etc. +fun void SetVisiblePolicy=2394(int visiblePolicy, int visibleSlop) + +# Delete back from the current position to the start of the line. +fun void DelLineLeft=2395(,) + +# Delete forwards from the current position to the end of the line. +fun void DelLineRight=2396(,) + +# Get and Set the xOffset (ie, horizonal scroll position). +set void SetXOffset=2397(int newOffset,) +get int GetXOffset=2398(,) + +# Set the last x chosen value to be the caret x position. +fun void ChooseCaretX=2399(,) + +# Set the focus to this Scintilla widget. +fun void GrabFocus=2400(,) + +enu CaretPolicy=CARET_ +# Caret policy, used by SetXCaretPolicy and SetYCaretPolicy. +# If CARET_SLOP is set, we can define a slop value: caretSlop. +# This value defines an unwanted zone (UZ) where the caret is... unwanted. +# This zone is defined as a number of pixels near the vertical margins, +# and as a number of lines near the horizontal margins. +# By keeping the caret away from the edges, it is seen within its context, +# so it is likely that the identifier that the caret is on can be completely seen, +# and that the current line is seen with some of the lines following it which are +# often dependent on that line. +val CARET_SLOP=0x01 +# If CARET_STRICT is set, the policy is enforced... strictly. +# The caret is centred on the display if slop is not set, +# and cannot go in the UZ if slop is set. +val CARET_STRICT=0x04 +# If CARET_JUMPS is set, the display is moved more energetically +# so the caret can move in the same direction longer before the policy is applied again. +val CARET_JUMPS=0x10 +# If CARET_EVEN is not set, instead of having symmetrical UZs, +# the left and bottom UZs are extended up to right and top UZs respectively. +# This way, we favour the displaying of useful information: the begining of lines, +# where most code reside, and the lines after the caret, eg. the body of a function. +val CARET_EVEN=0x08 + +# Set the way the caret is kept visible when going sideway. +# The exclusion zone is given in pixels. +fun void SetXCaretPolicy=2402(int caretPolicy, int caretSlop) + +# Set the way the line the caret is on is kept visible. +# The exclusion zone is given in lines. +fun void SetYCaretPolicy=2403(int caretPolicy, int caretSlop) + +# Set printing to line wrapped (SC_WRAP_WORD) or not line wrapped (SC_WRAP_NONE). +set void SetPrintWrapMode=2406(int mode,) + +# Is printing line wrapped? +get int GetPrintWrapMode=2407(,) + +# Set a fore colour for active hotspots. +set void SetHotspotActiveFore=2410(bool useSetting, colour fore) + +# Get the fore colour for active hotspots. +get colour GetHotspotActiveFore=2494(,) + +# Set a back colour for active hotspots. +set void SetHotspotActiveBack=2411(bool useSetting, colour back) + +# Get the back colour for active hotspots. +get colour GetHotspotActiveBack=2495(,) + +# Enable / Disable underlining active hotspots. +set void SetHotspotActiveUnderline=2412(bool underline,) + +# Get whether underlining for active hotspots. +get bool GetHotspotActiveUnderline=2496(,) + +# Limit hotspots to single line so hotspots on two lines don't merge. +set void SetHotspotSingleLine=2421(bool singleLine,) + +# Get the HotspotSingleLine property +get bool GetHotspotSingleLine=2497(,) + +# Move caret between paragraphs (delimited by empty lines). +fun void ParaDown=2413(,) +fun void ParaDownExtend=2414(,) +fun void ParaUp=2415(,) +fun void ParaUpExtend=2416(,) + +# Given a valid document position, return the previous position taking code +# page into account. Returns 0 if passed 0. +fun position PositionBefore=2417(position pos,) + +# Given a valid document position, return the next position taking code +# page into account. Maximum value returned is the last position in the document. +fun position PositionAfter=2418(position pos,) + +# Copy a range of text to the clipboard. Positions are clipped into the document. +fun void CopyRange=2419(position start, position end) + +# Copy argument text to the clipboard. +fun void CopyText=2420(int length, string text) + +enu SelectionMode=SC_SEL_ +val SC_SEL_STREAM=0 +val SC_SEL_RECTANGLE=1 +val SC_SEL_LINES=2 +val SC_SEL_THIN=3 + +# Set the selection mode to stream (SC_SEL_STREAM) or rectangular (SC_SEL_RECTANGLE/SC_SEL_THIN) or +# by lines (SC_SEL_LINES). +set void SetSelectionMode=2422(int mode,) + +# Get the mode of the current selection. +get int GetSelectionMode=2423(,) + +# Retrieve the position of the start of the selection at the given line (INVALID_POSITION if no selection on this line). +fun position GetLineSelStartPosition=2424(int line,) + +# Retrieve the position of the end of the selection at the given line (INVALID_POSITION if no selection on this line). +fun position GetLineSelEndPosition=2425(int line,) + +## RectExtended rectangular selection moves +# Move caret down one line, extending rectangular selection to new caret position. +fun void LineDownRectExtend=2426(,) + +# Move caret up one line, extending rectangular selection to new caret position. +fun void LineUpRectExtend=2427(,) + +# Move caret left one character, extending rectangular selection to new caret position. +fun void CharLeftRectExtend=2428(,) + +# Move caret right one character, extending rectangular selection to new caret position. +fun void CharRightRectExtend=2429(,) + +# Move caret to first position on line, extending rectangular selection to new caret position. +fun void HomeRectExtend=2430(,) + +# Move caret to before first visible character on line. +# If already there move to first character on line. +# In either case, extend rectangular selection to new caret position. +fun void VCHomeRectExtend=2431(,) + +# Move caret to last position on line, extending rectangular selection to new caret position. +fun void LineEndRectExtend=2432(,) + +# Move caret one page up, extending rectangular selection to new caret position. +fun void PageUpRectExtend=2433(,) + +# Move caret one page down, extending rectangular selection to new caret position. +fun void PageDownRectExtend=2434(,) + + +# Move caret to top of page, or one page up if already at top of page. +fun void StutteredPageUp=2435(,) + +# Move caret to top of page, or one page up if already at top of page, extending selection to new caret position. +fun void StutteredPageUpExtend=2436(,) + +# Move caret to bottom of page, or one page down if already at bottom of page. +fun void StutteredPageDown=2437(,) + +# Move caret to bottom of page, or one page down if already at bottom of page, extending selection to new caret position. +fun void StutteredPageDownExtend=2438(,) + + +# Move caret left one word, position cursor at end of word. +fun void WordLeftEnd=2439(,) + +# Move caret left one word, position cursor at end of word, extending selection to new caret position. +fun void WordLeftEndExtend=2440(,) + +# Move caret right one word, position cursor at end of word. +fun void WordRightEnd=2441(,) + +# Move caret right one word, position cursor at end of word, extending selection to new caret position. +fun void WordRightEndExtend=2442(,) + +# Set the set of characters making up whitespace for when moving or selecting by word. +# Should be called after SetWordChars. +set void SetWhitespaceChars=2443(, string characters) + +# Reset the set of characters for whitespace and word characters to the defaults. +fun void SetCharsDefault=2444(,) + +# Get currently selected item position in the auto-completion list +fun int AutoCGetCurrent=2445(,) + +# Get currently selected item text in the auto-completion list +# Returns the length of the item text +fun int AutoCGetCurrentText=2610(, stringresult s) + +# Enlarge the document to a particular size of text bytes. +fun void Allocate=2446(int bytes,) + +# Returns the target converted to UTF8. +# Return the length in bytes. +fun int TargetAsUTF8=2447(, stringresult s) + +# Set the length of the utf8 argument for calling EncodedFromUTF8. +# Set to -1 and the string will be measured to the first nul. +fun void SetLengthForEncode=2448(int bytes,) + +# Translates a UTF8 string into the document encoding. +# Return the length of the result in bytes. +# On error return 0. +fun int EncodedFromUTF8=2449(string utf8, stringresult encoded) + +# Find the position of a column on a line taking into account tabs and +# multi-byte characters. If beyond end of line, return line end position. +fun int FindColumn=2456(int line, int column) + +# Can the caret preferred x position only be changed by explicit movement commands? +get bool GetCaretSticky=2457(,) + +# Stop the caret preferred x position changing when the user types. +set void SetCaretSticky=2458(bool useCaretStickyBehaviour,) + +# Switch between sticky and non-sticky: meant to be bound to a key. +fun void ToggleCaretSticky=2459(,) + +# Enable/Disable convert-on-paste for line endings +set void SetPasteConvertEndings=2467(bool convert,) + +# Get convert-on-paste setting +get bool GetPasteConvertEndings=2468(,) + +# Duplicate the selection. If selection empty duplicate the line containing the caret. +fun void SelectionDuplicate=2469(,) + +val SC_ALPHA_TRANSPARENT=0 +val SC_ALPHA_OPAQUE=255 +val SC_ALPHA_NOALPHA=256 + +# Set background alpha of the caret line. +set void SetCaretLineBackAlpha=2470(int alpha,) + +# Get the background alpha of the caret line. +get int GetCaretLineBackAlpha=2471(,) + +enu CaretStyle=CARETSTYLE_ +val CARETSTYLE_INVISIBLE=0 +val CARETSTYLE_LINE=1 +val CARETSTYLE_BLOCK=2 + +# Set the style of the caret to be drawn. +set void SetCaretStyle=2512(int caretStyle,) + +# Returns the current style of the caret. +get int GetCaretStyle=2513(,) + +# Set the indicator used for IndicatorFillRange and IndicatorClearRange +set void SetIndicatorCurrent=2500(int indicator,) + +# Get the current indicator +get int GetIndicatorCurrent=2501(,) + +# Set the value used for IndicatorFillRange +set void SetIndicatorValue=2502(int value,) + +# Get the current indicator vaue +get int GetIndicatorValue=2503(,) + +# Turn a indicator on over a range. +fun void IndicatorFillRange=2504(int position, int fillLength) + +# Turn a indicator off over a range. +fun void IndicatorClearRange=2505(int position, int clearLength) + +# Are any indicators present at position? +fun int IndicatorAllOnFor=2506(int position,) + +# What value does a particular indicator have at at a position? +fun int IndicatorValueAt=2507(int indicator, int position) + +# Where does a particular indicator start? +fun int IndicatorStart=2508(int indicator, int position) + +# Where does a particular indicator end? +fun int IndicatorEnd=2509(int indicator, int position) + +# Set number of entries in position cache +set void SetPositionCache=2514(int size,) + +# How many entries are allocated to the position cache? +get int GetPositionCache=2515(,) + +# Copy the selection, if selection empty copy the line with the caret +fun void CopyAllowLine=2519(,) + +# Compact the document buffer and return a read-only pointer to the +# characters in the document. +get int GetCharacterPointer=2520(,) + +# Always interpret keyboard input as Unicode +set void SetKeysUnicode=2521(bool keysUnicode,) + +# Are keys always interpreted as Unicode? +get bool GetKeysUnicode=2522(,) + +# Set the alpha fill colour of the given indicator. +set void IndicSetAlpha=2523(int indicator, int alpha) + +# Get the alpha fill colour of the given indicator. +get int IndicGetAlpha=2524(int indicator,) + +# Set extra ascent for each line +set void SetExtraAscent=2525(int extraAscent,) + +# Get extra ascent for each line +get int GetExtraAscent=2526(,) + +# Set extra descent for each line +set void SetExtraDescent=2527(int extraDescent,) + +# Get extra descent for each line +get int GetExtraDescent=2528(,) + +# Which symbol was defined for markerNumber with MarkerDefine +fun int MarkerSymbolDefined=2529(int markerNumber,) + +# Set the text in the text margin for a line +set void MarginSetText=2530(int line, string text) + +# Get the text in the text margin for a line +get int MarginGetText=2531(int line, stringresult text) + +# Set the style number for the text margin for a line +set void MarginSetStyle=2532(int line, int style) + +# Get the style number for the text margin for a line +get int MarginGetStyle=2533(int line,) + +# Set the style in the text margin for a line +set void MarginSetStyles=2534(int line, string styles) + +# Get the styles in the text margin for a line +get int MarginGetStyles=2535(int line, stringresult styles) + +# Clear the margin text on all lines +fun void MarginTextClearAll=2536(,) + +# Get the start of the range of style numbers used for margin text +set void MarginSetStyleOffset=2537(int style,) + +# Get the start of the range of style numbers used for margin text +get int MarginGetStyleOffset=2538(,) + +# Set the annotation text for a line +set void AnnotationSetText=2540(int line, string text) + +# Get the annotation text for a line +get int AnnotationGetText=2541(int line, stringresult text) + +# Set the style number for the annotations for a line +set void AnnotationSetStyle=2542(int line, int style) + +# Get the style number for the annotations for a line +get int AnnotationGetStyle=2543(int line,) + +# Set the annotation styles for a line +set void AnnotationSetStyles=2544(int line, string styles) + +# Get the annotation styles for a line +get int AnnotationGetStyles=2545(int line, stringresult styles) + +# Get the number of annotation lines for a line +get int AnnotationGetLines=2546(int line,) + +# Clear the annotations from all lines +fun void AnnotationClearAll=2547(,) + +enu AnnotationVisible=ANNOTATION_ +val ANNOTATION_HIDDEN=0 +val ANNOTATION_STANDARD=1 +val ANNOTATION_BOXED=2 + +# Set the visibility for the annotations for a view +set void AnnotationSetVisible=2548(int visible,) + +# Get the visibility for the annotations for a view +get int AnnotationGetVisible=2549(,) + +# Get the start of the range of style numbers used for annotations +set void AnnotationSetStyleOffset=2550(int style,) + +# Get the start of the range of style numbers used for annotations +get int AnnotationGetStyleOffset=2551(,) + +val UNDO_MAY_COALESCE=1 + +# Add a container action to the undo stack +fun void AddUndoAction=2560(int token, int flags) + +# Find the position of a character from a point within the window. +fun position CharPositionFromPoint=2561(int x, int y) + +# Find the position of a character from a point within the window. +# Return INVALID_POSITION if not close to text. +fun position CharPositionFromPointClose=2562(int x, int y) + +# Set whether multiple selections can be made +set void SetMultipleSelection=2563(bool multipleSelection,) + +# Whether multiple selections can be made +get bool GetMultipleSelection=2564(,) + +# Set whether typing can be performed into multiple selections +set void SetAdditionalSelectionTyping=2565(bool additionalSelectionTyping,) + +# Whether typing can be performed into multiple selections +get bool GetAdditionalSelectionTyping=2566(,) + +# Set whether additional carets will blink +set void SetAdditionalCaretsBlink=2567(bool additionalCaretsBlink,) + +# Whether additional carets will blink +get bool GetAdditionalCaretsBlink=2568(,) + +# Set whether additional carets are visible +set void SetAdditionalCaretsVisible=2608(bool additionalCaretsBlink,) + +# Whether additional carets are visible +get bool GetAdditionalCaretsVisible=2609(,) + +# How many selections are there? +get int GetSelections=2570(,) + +# Clear selections to a single empty stream selection +fun void ClearSelections=2571(,) + +# Set a simple selection +fun int SetSelection=2572(int caret,int anchor) + +# Add a selection +fun int AddSelection=2573(int caret,int anchor) + +# Set the main selection +set void SetMainSelection=2574(int selection,) + +# Which selection is the main selection +get int GetMainSelection=2575(,) + +set void SetSelectionNCaret=2576(int selection, position pos) +get position GetSelectionNCaret=2577(int selection,) +set void SetSelectionNAnchor=2578(int selection, position posAnchor) +get position GetSelectionNAnchor=2579(int selection,) +set void SetSelectionNCaretVirtualSpace=2580(int selection, int space) +get int GetSelectionNCaretVirtualSpace=2581(int selection,) +set void SetSelectionNAnchorVirtualSpace=2582(int selection, int space) +get int GetSelectionNAnchorVirtualSpace=2583(int selection,) + +# Sets the position that starts the selection - this becomes the anchor. +set void SetSelectionNStart=2584(int selection, position pos) + +# Returns the position at the start of the selection. +get position GetSelectionNStart=2585(int selection,) + +# Sets the position that ends the selection - this becomes the currentPosition. +set void SetSelectionNEnd=2586(int selection, position pos,) + +# Returns the position at the end of the selection. +get position GetSelectionNEnd=2587(int selection,) + +set void SetRectangularSelectionCaret=2588(position pos,) +get position GetRectangularSelectionCaret=2589(,) +set void SetRectangularSelectionAnchor=2590(position posAnchor,) +get position GetRectangularSelectionAnchor=2591(,) +set void SetRectangularSelectionCaretVirtualSpace=2592(int space,) +get int GetRectangularSelectionCaretVirtualSpace=2593(,) +set void SetRectangularSelectionAnchorVirtualSpace=2594(int space,) +get int GetRectangularSelectionAnchorVirtualSpace=2595(,) + +enu VirtualSpace=SCVS_ +val SCVS_NONE=0 +val SCVS_RECTANGULARSELECTION=1 +val SCVS_USERACCESSIBLE=2 + +set void SetVirtualSpaceOptions=2596(int virtualSpaceOptions,) +get int GetVirtualSpaceOptions=2597(,) + +# On GTK+, allow selecting the modifier key to use for mouse-based +# rectangular selection. Often the window manager requires Alt+Mouse Drag +# for moving windows. +# Valid values are SCMOD_CTRL(default), SCMOD_ALT, or SCMOD_SUPER. + +set void SetRectangularSelectionModifier=2598(int modifier,) + +# Get the modifier key used for rectangular selection. +get int GetRectangularSelectionModifier=2599(,) + +# Set the foreground colour of additional selections. +# Must have previously called SetSelFore with non-zero first argument for this to have an effect. +set void SetAdditionalSelFore=2600(colour fore,) + +# Set the background colour of additional selections. +# Must have previously called SetSelBack with non-zero first argument for this to have an effect. +set void SetAdditionalSelBack=2601(colour back,) + +# Set the alpha of the selection. +set void SetAdditionalSelAlpha=2602(int alpha,) + +# Get the alpha of the selection. +get int GetAdditionalSelAlpha=2603(,) + +# Set the foreground colour of additional carets. +set void SetAdditionalCaretFore=2604(colour fore,) + +# Get the foreground colour of additional carets. +get colour GetAdditionalCaretFore=2605(,) + +# Set the main selection to the next selection. +fun void RotateSelection=2606(,) + +# Swap that caret and anchor of the main selection. +fun void SwapMainAnchorCaret=2607(,) + +# Start notifying the container of all key presses and commands. +fun void StartRecord=3001(,) + +# Stop notifying the container of all key presses and commands. +fun void StopRecord=3002(,) + +# Set the lexing language of the document. +set void SetLexer=4001(int lexer,) + +# Retrieve the lexing language of the document. +get int GetLexer=4002(,) + +# Colourise a segment of the document using the current lexing language. +fun void Colourise=4003(position start, position end) + +# Set up a value that may be used by a lexer for some optional feature. +set void SetProperty=4004(string key, string value) + +# Maximum value of keywordSet parameter of SetKeyWords. +val KEYWORDSET_MAX=8 + +# Set up the key words used by the lexer. +set void SetKeyWords=4005(int keywordSet, string keyWords) + +# Set the lexing language of the document based on string name. +set void SetLexerLanguage=4006(, string language) + +# Load a lexer library (dll / so). +fun void LoadLexerLibrary=4007(, string path) + +# Retrieve a "property" value previously set with SetProperty. +fun int GetProperty=4008(string key, stringresult buf) + +# Retrieve a "property" value previously set with SetProperty, +# with "$()" variable replacement on returned buffer. +fun int GetPropertyExpanded=4009(string key, stringresult buf) + +# Retrieve a "property" value previously set with SetProperty, +# interpreted as an int AFTER any "$()" variable replacement. +get int GetPropertyInt=4010(string key,) + +# Retrieve the number of bits the current lexer needs for styling. +get int GetStyleBitsNeeded=4011(,) + +# Retrieve the name of the lexer. +# Return the length of the text. +get int GetLexerLanguage=4012(, stringresult text) + +# Notifications +# Type of modification and the action which caused the modification. +# These are defined as a bit mask to make it easy to specify which notifications are wanted. +# One bit is set from each of SC_MOD_* and SC_PERFORMED_*. +enu ModificationFlags=SC_MOD_ SC_PERFORMED_ SC_LAST +val SC_MOD_INSERTTEXT=0x1 +val SC_MOD_DELETETEXT=0x2 +val SC_MOD_CHANGESTYLE=0x4 +val SC_MOD_CHANGEFOLD=0x8 +val SC_PERFORMED_USER=0x10 +val SC_PERFORMED_UNDO=0x20 +val SC_PERFORMED_REDO=0x40 +val SC_MULTISTEPUNDOREDO=0x80 +val SC_LASTSTEPINUNDOREDO=0x100 +val SC_MOD_CHANGEMARKER=0x200 +val SC_MOD_BEFOREINSERT=0x400 +val SC_MOD_BEFOREDELETE=0x800 +val SC_MULTILINEUNDOREDO=0x1000 +val SC_STARTACTION=0x2000 +val SC_MOD_CHANGEINDICATOR=0x4000 +val SC_MOD_CHANGELINESTATE=0x8000 +val SC_MOD_CHANGEMARGIN=0x10000 +val SC_MOD_CHANGEANNOTATION=0x20000 +val SC_MOD_CONTAINER=0x40000 +val SC_MODEVENTMASKALL=0x7FFFF + +# For compatibility, these go through the COMMAND notification rather than NOTIFY +# and should have had exactly the same values as the EN_* constants. +# Unfortunately the SETFOCUS and KILLFOCUS are flipped over from EN_* +# As clients depend on these constants, this will not be changed. +val SCEN_CHANGE=768 +val SCEN_SETFOCUS=512 +val SCEN_KILLFOCUS=256 + +# Symbolic key codes and modifier flags. +# ASCII and other printable characters below 256. +# Extended keys above 300. + +enu Keys=SCK_ +val SCK_DOWN=300 +val SCK_UP=301 +val SCK_LEFT=302 +val SCK_RIGHT=303 +val SCK_HOME=304 +val SCK_END=305 +val SCK_PRIOR=306 +val SCK_NEXT=307 +val SCK_DELETE=308 +val SCK_INSERT=309 +val SCK_ESCAPE=7 +val SCK_BACK=8 +val SCK_TAB=9 +val SCK_RETURN=13 +val SCK_ADD=310 +val SCK_SUBTRACT=311 +val SCK_DIVIDE=312 +val SCK_WIN=313 +val SCK_RWIN=314 +val SCK_MENU=315 + +enu KeyMod=SCMOD_ +val SCMOD_NORM=0 +val SCMOD_SHIFT=1 +val SCMOD_CTRL=2 +val SCMOD_ALT=4 +val SCMOD_SUPER=8 + +################################################ +# For SciLexer.h +enu Lexer=SCLEX_ +val SCLEX_CONTAINER=0 +val SCLEX_NULL=1 +val SCLEX_PYTHON=2 +val SCLEX_CPP=3 +val SCLEX_HTML=4 +val SCLEX_XML=5 +val SCLEX_PERL=6 +val SCLEX_SQL=7 +val SCLEX_VB=8 +val SCLEX_PROPERTIES=9 +val SCLEX_ERRORLIST=10 +val SCLEX_MAKEFILE=11 +val SCLEX_BATCH=12 +val SCLEX_XCODE=13 +val SCLEX_LATEX=14 +val SCLEX_LUA=15 +val SCLEX_DIFF=16 +val SCLEX_CONF=17 +val SCLEX_PASCAL=18 +val SCLEX_AVE=19 +val SCLEX_ADA=20 +val SCLEX_LISP=21 +val SCLEX_RUBY=22 +val SCLEX_EIFFEL=23 +val SCLEX_EIFFELKW=24 +val SCLEX_TCL=25 +val SCLEX_NNCRONTAB=26 +val SCLEX_BULLANT=27 +val SCLEX_VBSCRIPT=28 +val SCLEX_BAAN=31 +val SCLEX_MATLAB=32 +val SCLEX_SCRIPTOL=33 +val SCLEX_ASM=34 +val SCLEX_CPPNOCASE=35 +val SCLEX_FORTRAN=36 +val SCLEX_F77=37 +val SCLEX_CSS=38 +val SCLEX_POV=39 +val SCLEX_LOUT=40 +val SCLEX_ESCRIPT=41 +val SCLEX_PS=42 +val SCLEX_NSIS=43 +val SCLEX_MMIXAL=44 +val SCLEX_CLW=45 +val SCLEX_CLWNOCASE=46 +val SCLEX_LOT=47 +val SCLEX_YAML=48 +val SCLEX_TEX=49 +val SCLEX_METAPOST=50 +val SCLEX_POWERBASIC=51 +val SCLEX_FORTH=52 +val SCLEX_ERLANG=53 +val SCLEX_OCTAVE=54 +val SCLEX_MSSQL=55 +val SCLEX_VERILOG=56 +val SCLEX_KIX=57 +val SCLEX_GUI4CLI=58 +val SCLEX_SPECMAN=59 +val SCLEX_AU3=60 +val SCLEX_APDL=61 +val SCLEX_BASH=62 +val SCLEX_ASN1=63 +val SCLEX_VHDL=64 +val SCLEX_CAML=65 +val SCLEX_BLITZBASIC=66 +val SCLEX_PUREBASIC=67 +val SCLEX_HASKELL=68 +val SCLEX_PHPSCRIPT=69 +val SCLEX_TADS3=70 +val SCLEX_REBOL=71 +val SCLEX_SMALLTALK=72 +val SCLEX_FLAGSHIP=73 +val SCLEX_CSOUND=74 +val SCLEX_FREEBASIC=75 +val SCLEX_INNOSETUP=76 +val SCLEX_OPAL=77 +val SCLEX_SPICE=78 +val SCLEX_D=79 +val SCLEX_CMAKE=80 +val SCLEX_GAP=81 +val SCLEX_PLM=82 +val SCLEX_PROGRESS=83 +val SCLEX_ABAQUS=84 +val SCLEX_ASYMPTOTE=85 +val SCLEX_R=86 +val SCLEX_MAGIK=87 +val SCLEX_POWERSHELL=88 +val SCLEX_MYSQL=89 +val SCLEX_PO=90 +val SCLEX_TAL=91 +val SCLEX_COBOL=92 +val SCLEX_TACL=93 +val SCLEX_SORCUS=94 +val SCLEX_POWERPRO=95 +val SCLEX_NIMROD=96 +val SCLEX_SML=97 +val SCLEX_MARKDOWN=98 + +# When a lexer specifies its language as SCLEX_AUTOMATIC it receives a +# value assigned in sequence from SCLEX_AUTOMATIC+1. +val SCLEX_AUTOMATIC=1000 +# Lexical states for SCLEX_PYTHON +lex Python=SCLEX_PYTHON SCE_P_ +lex Nimrod=SCLEX_NIMROD SCE_P_ +val SCE_P_DEFAULT=0 +val SCE_P_COMMENTLINE=1 +val SCE_P_NUMBER=2 +val SCE_P_STRING=3 +val SCE_P_CHARACTER=4 +val SCE_P_WORD=5 +val SCE_P_TRIPLE=6 +val SCE_P_TRIPLEDOUBLE=7 +val SCE_P_CLASSNAME=8 +val SCE_P_DEFNAME=9 +val SCE_P_OPERATOR=10 +val SCE_P_IDENTIFIER=11 +val SCE_P_COMMENTBLOCK=12 +val SCE_P_STRINGEOL=13 +val SCE_P_WORD2=14 +val SCE_P_DECORATOR=15 +# Lexical states for SCLEX_CPP +lex Cpp=SCLEX_CPP SCE_C_ +lex BullAnt=SCLEX_BULLANT SCE_C_ +val SCE_C_DEFAULT=0 +val SCE_C_COMMENT=1 +val SCE_C_COMMENTLINE=2 +val SCE_C_COMMENTDOC=3 +val SCE_C_NUMBER=4 +val SCE_C_WORD=5 +val SCE_C_STRING=6 +val SCE_C_CHARACTER=7 +val SCE_C_UUID=8 +val SCE_C_PREPROCESSOR=9 +val SCE_C_OPERATOR=10 +val SCE_C_IDENTIFIER=11 +val SCE_C_STRINGEOL=12 +val SCE_C_VERBATIM=13 +val SCE_C_REGEX=14 +val SCE_C_COMMENTLINEDOC=15 +val SCE_C_WORD2=16 +val SCE_C_COMMENTDOCKEYWORD=17 +val SCE_C_COMMENTDOCKEYWORDERROR=18 +val SCE_C_GLOBALCLASS=19 +# Lexical states for SCLEX_D +lex D=SCLEX_D SCE_D_ +val SCE_D_DEFAULT=0 +val SCE_D_COMMENT=1 +val SCE_D_COMMENTLINE=2 +val SCE_D_COMMENTDOC=3 +val SCE_D_COMMENTNESTED=4 +val SCE_D_NUMBER=5 +val SCE_D_WORD=6 +val SCE_D_WORD2=7 +val SCE_D_WORD3=8 +val SCE_D_TYPEDEF=9 +val SCE_D_STRING=10 +val SCE_D_STRINGEOL=11 +val SCE_D_CHARACTER=12 +val SCE_D_OPERATOR=13 +val SCE_D_IDENTIFIER=14 +val SCE_D_COMMENTLINEDOC=15 +val SCE_D_COMMENTDOCKEYWORD=16 +val SCE_D_COMMENTDOCKEYWORDERROR=17 +val SCE_D_STRINGB=18 +val SCE_D_STRINGR=19 +val SCE_D_WORD5=20 +val SCE_D_WORD6=21 +val SCE_D_WORD7=22 +# Lexical states for SCLEX_TCL +lex TCL=SCLEX_TCL SCE_TCL_ +val SCE_TCL_DEFAULT=0 +val SCE_TCL_COMMENT=1 +val SCE_TCL_COMMENTLINE=2 +val SCE_TCL_NUMBER=3 +val SCE_TCL_WORD_IN_QUOTE=4 +val SCE_TCL_IN_QUOTE=5 +val SCE_TCL_OPERATOR=6 +val SCE_TCL_IDENTIFIER=7 +val SCE_TCL_SUBSTITUTION=8 +val SCE_TCL_SUB_BRACE=9 +val SCE_TCL_MODIFIER=10 +val SCE_TCL_EXPAND=11 +val SCE_TCL_WORD=12 +val SCE_TCL_WORD2=13 +val SCE_TCL_WORD3=14 +val SCE_TCL_WORD4=15 +val SCE_TCL_WORD5=16 +val SCE_TCL_WORD6=17 +val SCE_TCL_WORD7=18 +val SCE_TCL_WORD8=19 +val SCE_TCL_COMMENT_BOX=20 +val SCE_TCL_BLOCK_COMMENT=21 +# Lexical states for SCLEX_HTML, SCLEX_XML +lex HTML=SCLEX_HTML SCE_H +lex XML=SCLEX_XML SCE_H +lex ASP=SCLEX_ASP SCE_H +lex PHP=SCLEX_PHP SCE_H +val SCE_H_DEFAULT=0 +val SCE_H_TAG=1 +val SCE_H_TAGUNKNOWN=2 +val SCE_H_ATTRIBUTE=3 +val SCE_H_ATTRIBUTEUNKNOWN=4 +val SCE_H_NUMBER=5 +val SCE_H_DOUBLESTRING=6 +val SCE_H_SINGLESTRING=7 +val SCE_H_OTHER=8 +val SCE_H_COMMENT=9 +val SCE_H_ENTITY=10 +# XML and ASP +val SCE_H_TAGEND=11 +val SCE_H_XMLSTART=12 +val SCE_H_XMLEND=13 +val SCE_H_SCRIPT=14 +val SCE_H_ASP=15 +val SCE_H_ASPAT=16 +val SCE_H_CDATA=17 +val SCE_H_QUESTION=18 +# More HTML +val SCE_H_VALUE=19 +# X-Code +val SCE_H_XCCOMMENT=20 +# SGML +val SCE_H_SGML_DEFAULT=21 +val SCE_H_SGML_COMMAND=22 +val SCE_H_SGML_1ST_PARAM=23 +val SCE_H_SGML_DOUBLESTRING=24 +val SCE_H_SGML_SIMPLESTRING=25 +val SCE_H_SGML_ERROR=26 +val SCE_H_SGML_SPECIAL=27 +val SCE_H_SGML_ENTITY=28 +val SCE_H_SGML_COMMENT=29 +val SCE_H_SGML_1ST_PARAM_COMMENT=30 +val SCE_H_SGML_BLOCK_DEFAULT=31 +# Embedded Javascript +val SCE_HJ_START=40 +val SCE_HJ_DEFAULT=41 +val SCE_HJ_COMMENT=42 +val SCE_HJ_COMMENTLINE=43 +val SCE_HJ_COMMENTDOC=44 +val SCE_HJ_NUMBER=45 +val SCE_HJ_WORD=46 +val SCE_HJ_KEYWORD=47 +val SCE_HJ_DOUBLESTRING=48 +val SCE_HJ_SINGLESTRING=49 +val SCE_HJ_SYMBOLS=50 +val SCE_HJ_STRINGEOL=51 +val SCE_HJ_REGEX=52 +# ASP Javascript +val SCE_HJA_START=55 +val SCE_HJA_DEFAULT=56 +val SCE_HJA_COMMENT=57 +val SCE_HJA_COMMENTLINE=58 +val SCE_HJA_COMMENTDOC=59 +val SCE_HJA_NUMBER=60 +val SCE_HJA_WORD=61 +val SCE_HJA_KEYWORD=62 +val SCE_HJA_DOUBLESTRING=63 +val SCE_HJA_SINGLESTRING=64 +val SCE_HJA_SYMBOLS=65 +val SCE_HJA_STRINGEOL=66 +val SCE_HJA_REGEX=67 +# Embedded VBScript +val SCE_HB_START=70 +val SCE_HB_DEFAULT=71 +val SCE_HB_COMMENTLINE=72 +val SCE_HB_NUMBER=73 +val SCE_HB_WORD=74 +val SCE_HB_STRING=75 +val SCE_HB_IDENTIFIER=76 +val SCE_HB_STRINGEOL=77 +# ASP VBScript +val SCE_HBA_START=80 +val SCE_HBA_DEFAULT=81 +val SCE_HBA_COMMENTLINE=82 +val SCE_HBA_NUMBER=83 +val SCE_HBA_WORD=84 +val SCE_HBA_STRING=85 +val SCE_HBA_IDENTIFIER=86 +val SCE_HBA_STRINGEOL=87 +# Embedded Python +val SCE_HP_START=90 +val SCE_HP_DEFAULT=91 +val SCE_HP_COMMENTLINE=92 +val SCE_HP_NUMBER=93 +val SCE_HP_STRING=94 +val SCE_HP_CHARACTER=95 +val SCE_HP_WORD=96 +val SCE_HP_TRIPLE=97 +val SCE_HP_TRIPLEDOUBLE=98 +val SCE_HP_CLASSNAME=99 +val SCE_HP_DEFNAME=100 +val SCE_HP_OPERATOR=101 +val SCE_HP_IDENTIFIER=102 +# PHP +val SCE_HPHP_COMPLEX_VARIABLE=104 +# ASP Python +val SCE_HPA_START=105 +val SCE_HPA_DEFAULT=106 +val SCE_HPA_COMMENTLINE=107 +val SCE_HPA_NUMBER=108 +val SCE_HPA_STRING=109 +val SCE_HPA_CHARACTER=110 +val SCE_HPA_WORD=111 +val SCE_HPA_TRIPLE=112 +val SCE_HPA_TRIPLEDOUBLE=113 +val SCE_HPA_CLASSNAME=114 +val SCE_HPA_DEFNAME=115 +val SCE_HPA_OPERATOR=116 +val SCE_HPA_IDENTIFIER=117 +# PHP +val SCE_HPHP_DEFAULT=118 +val SCE_HPHP_HSTRING=119 +val SCE_HPHP_SIMPLESTRING=120 +val SCE_HPHP_WORD=121 +val SCE_HPHP_NUMBER=122 +val SCE_HPHP_VARIABLE=123 +val SCE_HPHP_COMMENT=124 +val SCE_HPHP_COMMENTLINE=125 +val SCE_HPHP_HSTRING_VARIABLE=126 +val SCE_HPHP_OPERATOR=127 +# Lexical states for SCLEX_PERL +lex Perl=SCLEX_PERL SCE_PL_ +val SCE_PL_DEFAULT=0 +val SCE_PL_ERROR=1 +val SCE_PL_COMMENTLINE=2 +val SCE_PL_POD=3 +val SCE_PL_NUMBER=4 +val SCE_PL_WORD=5 +val SCE_PL_STRING=6 +val SCE_PL_CHARACTER=7 +val SCE_PL_PUNCTUATION=8 +val SCE_PL_PREPROCESSOR=9 +val SCE_PL_OPERATOR=10 +val SCE_PL_IDENTIFIER=11 +val SCE_PL_SCALAR=12 +val SCE_PL_ARRAY=13 +val SCE_PL_HASH=14 +val SCE_PL_SYMBOLTABLE=15 +val SCE_PL_VARIABLE_INDEXER=16 +val SCE_PL_REGEX=17 +val SCE_PL_REGSUBST=18 +val SCE_PL_LONGQUOTE=19 +val SCE_PL_BACKTICKS=20 +val SCE_PL_DATASECTION=21 +val SCE_PL_HERE_DELIM=22 +val SCE_PL_HERE_Q=23 +val SCE_PL_HERE_QQ=24 +val SCE_PL_HERE_QX=25 +val SCE_PL_STRING_Q=26 +val SCE_PL_STRING_QQ=27 +val SCE_PL_STRING_QX=28 +val SCE_PL_STRING_QR=29 +val SCE_PL_STRING_QW=30 +val SCE_PL_POD_VERB=31 +val SCE_PL_SUB_PROTOTYPE=40 +val SCE_PL_FORMAT_IDENT=41 +val SCE_PL_FORMAT=42 +# Lexical states for SCLEX_RUBY +lex Ruby=SCLEX_RUBY SCE_RB_ +val SCE_RB_DEFAULT=0 +val SCE_RB_ERROR=1 +val SCE_RB_COMMENTLINE=2 +val SCE_RB_POD=3 +val SCE_RB_NUMBER=4 +val SCE_RB_WORD=5 +val SCE_RB_STRING=6 +val SCE_RB_CHARACTER=7 +val SCE_RB_CLASSNAME=8 +val SCE_RB_DEFNAME=9 +val SCE_RB_OPERATOR=10 +val SCE_RB_IDENTIFIER=11 +val SCE_RB_REGEX=12 +val SCE_RB_GLOBAL=13 +val SCE_RB_SYMBOL=14 +val SCE_RB_MODULE_NAME=15 +val SCE_RB_INSTANCE_VAR=16 +val SCE_RB_CLASS_VAR=17 +val SCE_RB_BACKTICKS=18 +val SCE_RB_DATASECTION=19 +val SCE_RB_HERE_DELIM=20 +val SCE_RB_HERE_Q=21 +val SCE_RB_HERE_QQ=22 +val SCE_RB_HERE_QX=23 +val SCE_RB_STRING_Q=24 +val SCE_RB_STRING_QQ=25 +val SCE_RB_STRING_QX=26 +val SCE_RB_STRING_QR=27 +val SCE_RB_STRING_QW=28 +val SCE_RB_WORD_DEMOTED=29 +val SCE_RB_STDIN=30 +val SCE_RB_STDOUT=31 +val SCE_RB_STDERR=40 +val SCE_RB_UPPER_BOUND=41 +# Lexical states for SCLEX_VB, SCLEX_VBSCRIPT, SCLEX_POWERBASIC +lex VB=SCLEX_VB SCE_B_ +lex VBScript=SCLEX_VBSCRIPT SCE_B_ +lex PowerBasic=SCLEX_POWERBASIC SCE_B_ +val SCE_B_DEFAULT=0 +val SCE_B_COMMENT=1 +val SCE_B_NUMBER=2 +val SCE_B_KEYWORD=3 +val SCE_B_STRING=4 +val SCE_B_PREPROCESSOR=5 +val SCE_B_OPERATOR=6 +val SCE_B_IDENTIFIER=7 +val SCE_B_DATE=8 +val SCE_B_STRINGEOL=9 +val SCE_B_KEYWORD2=10 +val SCE_B_KEYWORD3=11 +val SCE_B_KEYWORD4=12 +val SCE_B_CONSTANT=13 +val SCE_B_ASM=14 +val SCE_B_LABEL=15 +val SCE_B_ERROR=16 +val SCE_B_HEXNUMBER=17 +val SCE_B_BINNUMBER=18 +# Lexical states for SCLEX_PROPERTIES +lex Properties=SCLEX_PROPERTIES SCE_PROPS_ +val SCE_PROPS_DEFAULT=0 +val SCE_PROPS_COMMENT=1 +val SCE_PROPS_SECTION=2 +val SCE_PROPS_ASSIGNMENT=3 +val SCE_PROPS_DEFVAL=4 +val SCE_PROPS_KEY=5 +# Lexical states for SCLEX_LATEX +lex LaTeX=SCLEX_LATEX SCE_L_ +val SCE_L_DEFAULT=0 +val SCE_L_COMMAND=1 +val SCE_L_TAG=2 +val SCE_L_MATH=3 +val SCE_L_COMMENT=4 +# Lexical states for SCLEX_LUA +lex Lua=SCLEX_LUA SCE_LUA_ +val SCE_LUA_DEFAULT=0 +val SCE_LUA_COMMENT=1 +val SCE_LUA_COMMENTLINE=2 +val SCE_LUA_COMMENTDOC=3 +val SCE_LUA_NUMBER=4 +val SCE_LUA_WORD=5 +val SCE_LUA_STRING=6 +val SCE_LUA_CHARACTER=7 +val SCE_LUA_LITERALSTRING=8 +val SCE_LUA_PREPROCESSOR=9 +val SCE_LUA_OPERATOR=10 +val SCE_LUA_IDENTIFIER=11 +val SCE_LUA_STRINGEOL=12 +val SCE_LUA_WORD2=13 +val SCE_LUA_WORD3=14 +val SCE_LUA_WORD4=15 +val SCE_LUA_WORD5=16 +val SCE_LUA_WORD6=17 +val SCE_LUA_WORD7=18 +val SCE_LUA_WORD8=19 +# Lexical states for SCLEX_ERRORLIST +lex ErrorList=SCLEX_ERRORLIST SCE_ERR_ +val SCE_ERR_DEFAULT=0 +val SCE_ERR_PYTHON=1 +val SCE_ERR_GCC=2 +val SCE_ERR_MS=3 +val SCE_ERR_CMD=4 +val SCE_ERR_BORLAND=5 +val SCE_ERR_PERL=6 +val SCE_ERR_NET=7 +val SCE_ERR_LUA=8 +val SCE_ERR_CTAG=9 +val SCE_ERR_DIFF_CHANGED=10 +val SCE_ERR_DIFF_ADDITION=11 +val SCE_ERR_DIFF_DELETION=12 +val SCE_ERR_DIFF_MESSAGE=13 +val SCE_ERR_PHP=14 +val SCE_ERR_ELF=15 +val SCE_ERR_IFC=16 +val SCE_ERR_IFORT=17 +val SCE_ERR_ABSF=18 +val SCE_ERR_TIDY=19 +val SCE_ERR_JAVA_STACK=20 +val SCE_ERR_VALUE=21 +# Lexical states for SCLEX_BATCH +lex Batch=SCLEX_BATCH SCE_BAT_ +val SCE_BAT_DEFAULT=0 +val SCE_BAT_COMMENT=1 +val SCE_BAT_WORD=2 +val SCE_BAT_LABEL=3 +val SCE_BAT_HIDE=4 +val SCE_BAT_COMMAND=5 +val SCE_BAT_IDENTIFIER=6 +val SCE_BAT_OPERATOR=7 +# Lexical states for SCLEX_MAKEFILE +lex MakeFile=SCLEX_MAKEFILE SCE_MAKE_ +val SCE_MAKE_DEFAULT=0 +val SCE_MAKE_COMMENT=1 +val SCE_MAKE_PREPROCESSOR=2 +val SCE_MAKE_IDENTIFIER=3 +val SCE_MAKE_OPERATOR=4 +val SCE_MAKE_TARGET=5 +val SCE_MAKE_IDEOL=9 +# Lexical states for SCLEX_DIFF +lex Diff=SCLEX_DIFF SCE_DIFF_ +val SCE_DIFF_DEFAULT=0 +val SCE_DIFF_COMMENT=1 +val SCE_DIFF_COMMAND=2 +val SCE_DIFF_HEADER=3 +val SCE_DIFF_POSITION=4 +val SCE_DIFF_DELETED=5 +val SCE_DIFF_ADDED=6 +val SCE_DIFF_CHANGED=7 +# Lexical states for SCLEX_CONF (Apache Configuration Files Lexer) +lex Conf=SCLEX_CONF SCE_CONF_ +val SCE_CONF_DEFAULT=0 +val SCE_CONF_COMMENT=1 +val SCE_CONF_NUMBER=2 +val SCE_CONF_IDENTIFIER=3 +val SCE_CONF_EXTENSION=4 +val SCE_CONF_PARAMETER=5 +val SCE_CONF_STRING=6 +val SCE_CONF_OPERATOR=7 +val SCE_CONF_IP=8 +val SCE_CONF_DIRECTIVE=9 +# Lexical states for SCLEX_AVE, Avenue +lex Avenue=SCLEX_AVE SCE_AVE_ +val SCE_AVE_DEFAULT=0 +val SCE_AVE_COMMENT=1 +val SCE_AVE_NUMBER=2 +val SCE_AVE_WORD=3 +val SCE_AVE_STRING=6 +val SCE_AVE_ENUM=7 +val SCE_AVE_STRINGEOL=8 +val SCE_AVE_IDENTIFIER=9 +val SCE_AVE_OPERATOR=10 +val SCE_AVE_WORD1=11 +val SCE_AVE_WORD2=12 +val SCE_AVE_WORD3=13 +val SCE_AVE_WORD4=14 +val SCE_AVE_WORD5=15 +val SCE_AVE_WORD6=16 +# Lexical states for SCLEX_ADA +lex Ada=SCLEX_ADA SCE_ADA_ +val SCE_ADA_DEFAULT=0 +val SCE_ADA_WORD=1 +val SCE_ADA_IDENTIFIER=2 +val SCE_ADA_NUMBER=3 +val SCE_ADA_DELIMITER=4 +val SCE_ADA_CHARACTER=5 +val SCE_ADA_CHARACTEREOL=6 +val SCE_ADA_STRING=7 +val SCE_ADA_STRINGEOL=8 +val SCE_ADA_LABEL=9 +val SCE_ADA_COMMENTLINE=10 +val SCE_ADA_ILLEGAL=11 +# Lexical states for SCLEX_BAAN +lex Baan=SCLEX_BAAN SCE_BAAN_ +val SCE_BAAN_DEFAULT=0 +val SCE_BAAN_COMMENT=1 +val SCE_BAAN_COMMENTDOC=2 +val SCE_BAAN_NUMBER=3 +val SCE_BAAN_WORD=4 +val SCE_BAAN_STRING=5 +val SCE_BAAN_PREPROCESSOR=6 +val SCE_BAAN_OPERATOR=7 +val SCE_BAAN_IDENTIFIER=8 +val SCE_BAAN_STRINGEOL=9 +val SCE_BAAN_WORD2=10 +# Lexical states for SCLEX_LISP +lex Lisp=SCLEX_LISP SCE_LISP_ +val SCE_LISP_DEFAULT=0 +val SCE_LISP_COMMENT=1 +val SCE_LISP_NUMBER=2 +val SCE_LISP_KEYWORD=3 +val SCE_LISP_KEYWORD_KW=4 +val SCE_LISP_SYMBOL=5 +val SCE_LISP_STRING=6 +val SCE_LISP_STRINGEOL=8 +val SCE_LISP_IDENTIFIER=9 +val SCE_LISP_OPERATOR=10 +val SCE_LISP_SPECIAL=11 +val SCE_LISP_MULTI_COMMENT=12 +# Lexical states for SCLEX_EIFFEL and SCLEX_EIFFELKW +lex Eiffel=SCLEX_EIFFEL SCE_EIFFEL_ +lex EiffelKW=SCLEX_EIFFELKW SCE_EIFFEL_ +val SCE_EIFFEL_DEFAULT=0 +val SCE_EIFFEL_COMMENTLINE=1 +val SCE_EIFFEL_NUMBER=2 +val SCE_EIFFEL_WORD=3 +val SCE_EIFFEL_STRING=4 +val SCE_EIFFEL_CHARACTER=5 +val SCE_EIFFEL_OPERATOR=6 +val SCE_EIFFEL_IDENTIFIER=7 +val SCE_EIFFEL_STRINGEOL=8 +# Lexical states for SCLEX_NNCRONTAB (nnCron crontab Lexer) +lex NNCronTab=SCLEX_NNCRONTAB SCE_NNCRONTAB_ +val SCE_NNCRONTAB_DEFAULT=0 +val SCE_NNCRONTAB_COMMENT=1 +val SCE_NNCRONTAB_TASK=2 +val SCE_NNCRONTAB_SECTION=3 +val SCE_NNCRONTAB_KEYWORD=4 +val SCE_NNCRONTAB_MODIFIER=5 +val SCE_NNCRONTAB_ASTERISK=6 +val SCE_NNCRONTAB_NUMBER=7 +val SCE_NNCRONTAB_STRING=8 +val SCE_NNCRONTAB_ENVIRONMENT=9 +val SCE_NNCRONTAB_IDENTIFIER=10 +# Lexical states for SCLEX_FORTH (Forth Lexer) +lex Forth=SCLEX_FORTH SCE_FORTH_ +val SCE_FORTH_DEFAULT=0 +val SCE_FORTH_COMMENT=1 +val SCE_FORTH_COMMENT_ML=2 +val SCE_FORTH_IDENTIFIER=3 +val SCE_FORTH_CONTROL=4 +val SCE_FORTH_KEYWORD=5 +val SCE_FORTH_DEFWORD=6 +val SCE_FORTH_PREWORD1=7 +val SCE_FORTH_PREWORD2=8 +val SCE_FORTH_NUMBER=9 +val SCE_FORTH_STRING=10 +val SCE_FORTH_LOCALE=11 +# Lexical states for SCLEX_MATLAB +lex MatLab=SCLEX_MATLAB SCE_MATLAB_ +val SCE_MATLAB_DEFAULT=0 +val SCE_MATLAB_COMMENT=1 +val SCE_MATLAB_COMMAND=2 +val SCE_MATLAB_NUMBER=3 +val SCE_MATLAB_KEYWORD=4 +# single quoted string +val SCE_MATLAB_STRING=5 +val SCE_MATLAB_OPERATOR=6 +val SCE_MATLAB_IDENTIFIER=7 +val SCE_MATLAB_DOUBLEQUOTESTRING=8 +# Lexical states for SCLEX_SCRIPTOL +lex Sol=SCLEX_SCRIPTOL SCE_SCRIPTOL_ +val SCE_SCRIPTOL_DEFAULT=0 +val SCE_SCRIPTOL_WHITE=1 +val SCE_SCRIPTOL_COMMENTLINE=2 +val SCE_SCRIPTOL_PERSISTENT=3 +val SCE_SCRIPTOL_CSTYLE=4 +val SCE_SCRIPTOL_COMMENTBLOCK=5 +val SCE_SCRIPTOL_NUMBER=6 +val SCE_SCRIPTOL_STRING=7 +val SCE_SCRIPTOL_CHARACTER=8 +val SCE_SCRIPTOL_STRINGEOL=9 +val SCE_SCRIPTOL_KEYWORD=10 +val SCE_SCRIPTOL_OPERATOR=11 +val SCE_SCRIPTOL_IDENTIFIER=12 +val SCE_SCRIPTOL_TRIPLE=13 +val SCE_SCRIPTOL_CLASSNAME=14 +val SCE_SCRIPTOL_PREPROCESSOR=15 +# Lexical states for SCLEX_ASM +lex Asm=SCLEX_ASM SCE_ASM_ +val SCE_ASM_DEFAULT=0 +val SCE_ASM_COMMENT=1 +val SCE_ASM_NUMBER=2 +val SCE_ASM_STRING=3 +val SCE_ASM_OPERATOR=4 +val SCE_ASM_IDENTIFIER=5 +val SCE_ASM_CPUINSTRUCTION=6 +val SCE_ASM_MATHINSTRUCTION=7 +val SCE_ASM_REGISTER=8 +val SCE_ASM_DIRECTIVE=9 +val SCE_ASM_DIRECTIVEOPERAND=10 +val SCE_ASM_COMMENTBLOCK=11 +val SCE_ASM_CHARACTER=12 +val SCE_ASM_STRINGEOL=13 +val SCE_ASM_EXTINSTRUCTION=14 +# Lexical states for SCLEX_FORTRAN +lex Fortran=SCLEX_FORTRAN SCE_F_ +lex F77=SCLEX_F77 SCE_F_ +val SCE_F_DEFAULT=0 +val SCE_F_COMMENT=1 +val SCE_F_NUMBER=2 +val SCE_F_STRING1=3 +val SCE_F_STRING2=4 +val SCE_F_STRINGEOL=5 +val SCE_F_OPERATOR=6 +val SCE_F_IDENTIFIER=7 +val SCE_F_WORD=8 +val SCE_F_WORD2=9 +val SCE_F_WORD3=10 +val SCE_F_PREPROCESSOR=11 +val SCE_F_OPERATOR2=12 +val SCE_F_LABEL=13 +val SCE_F_CONTINUATION=14 +# Lexical states for SCLEX_CSS +lex CSS=SCLEX_CSS SCE_CSS_ +val SCE_CSS_DEFAULT=0 +val SCE_CSS_TAG=1 +val SCE_CSS_CLASS=2 +val SCE_CSS_PSEUDOCLASS=3 +val SCE_CSS_UNKNOWN_PSEUDOCLASS=4 +val SCE_CSS_OPERATOR=5 +val SCE_CSS_IDENTIFIER=6 +val SCE_CSS_UNKNOWN_IDENTIFIER=7 +val SCE_CSS_VALUE=8 +val SCE_CSS_COMMENT=9 +val SCE_CSS_ID=10 +val SCE_CSS_IMPORTANT=11 +val SCE_CSS_DIRECTIVE=12 +val SCE_CSS_DOUBLESTRING=13 +val SCE_CSS_SINGLESTRING=14 +val SCE_CSS_IDENTIFIER2=15 +val SCE_CSS_ATTRIBUTE=16 +val SCE_CSS_IDENTIFIER3=17 +val SCE_CSS_PSEUDOELEMENT=18 +val SCE_CSS_EXTENDED_IDENTIFIER=19 +val SCE_CSS_EXTENDED_PSEUDOCLASS=20 +val SCE_CSS_EXTENDED_PSEUDOELEMENT=21 +val SCE_CSS_MEDIA=22 +# Lexical states for SCLEX_POV +lex POV=SCLEX_POV SCE_POV_ +val SCE_POV_DEFAULT=0 +val SCE_POV_COMMENT=1 +val SCE_POV_COMMENTLINE=2 +val SCE_POV_NUMBER=3 +val SCE_POV_OPERATOR=4 +val SCE_POV_IDENTIFIER=5 +val SCE_POV_STRING=6 +val SCE_POV_STRINGEOL=7 +val SCE_POV_DIRECTIVE=8 +val SCE_POV_BADDIRECTIVE=9 +val SCE_POV_WORD2=10 +val SCE_POV_WORD3=11 +val SCE_POV_WORD4=12 +val SCE_POV_WORD5=13 +val SCE_POV_WORD6=14 +val SCE_POV_WORD7=15 +val SCE_POV_WORD8=16 +# Lexical states for SCLEX_LOUT +lex LOUT=SCLEX_LOUT SCE_LOUT_ +val SCE_LOUT_DEFAULT=0 +val SCE_LOUT_COMMENT=1 +val SCE_LOUT_NUMBER=2 +val SCE_LOUT_WORD=3 +val SCE_LOUT_WORD2=4 +val SCE_LOUT_WORD3=5 +val SCE_LOUT_WORD4=6 +val SCE_LOUT_STRING=7 +val SCE_LOUT_OPERATOR=8 +val SCE_LOUT_IDENTIFIER=9 +val SCE_LOUT_STRINGEOL=10 +# Lexical states for SCLEX_ESCRIPT +lex ESCRIPT=SCLEX_ESCRIPT SCE_ESCRIPT_ +val SCE_ESCRIPT_DEFAULT=0 +val SCE_ESCRIPT_COMMENT=1 +val SCE_ESCRIPT_COMMENTLINE=2 +val SCE_ESCRIPT_COMMENTDOC=3 +val SCE_ESCRIPT_NUMBER=4 +val SCE_ESCRIPT_WORD=5 +val SCE_ESCRIPT_STRING=6 +val SCE_ESCRIPT_OPERATOR=7 +val SCE_ESCRIPT_IDENTIFIER=8 +val SCE_ESCRIPT_BRACE=9 +val SCE_ESCRIPT_WORD2=10 +val SCE_ESCRIPT_WORD3=11 +# Lexical states for SCLEX_PS +lex PS=SCLEX_PS SCE_PS_ +val SCE_PS_DEFAULT=0 +val SCE_PS_COMMENT=1 +val SCE_PS_DSC_COMMENT=2 +val SCE_PS_DSC_VALUE=3 +val SCE_PS_NUMBER=4 +val SCE_PS_NAME=5 +val SCE_PS_KEYWORD=6 +val SCE_PS_LITERAL=7 +val SCE_PS_IMMEVAL=8 +val SCE_PS_PAREN_ARRAY=9 +val SCE_PS_PAREN_DICT=10 +val SCE_PS_PAREN_PROC=11 +val SCE_PS_TEXT=12 +val SCE_PS_HEXSTRING=13 +val SCE_PS_BASE85STRING=14 +val SCE_PS_BADSTRINGCHAR=15 +# Lexical states for SCLEX_NSIS +lex NSIS=SCLEX_NSIS SCE_NSIS_ +val SCE_NSIS_DEFAULT=0 +val SCE_NSIS_COMMENT=1 +val SCE_NSIS_STRINGDQ=2 +val SCE_NSIS_STRINGLQ=3 +val SCE_NSIS_STRINGRQ=4 +val SCE_NSIS_FUNCTION=5 +val SCE_NSIS_VARIABLE=6 +val SCE_NSIS_LABEL=7 +val SCE_NSIS_USERDEFINED=8 +val SCE_NSIS_SECTIONDEF=9 +val SCE_NSIS_SUBSECTIONDEF=10 +val SCE_NSIS_IFDEFINEDEF=11 +val SCE_NSIS_MACRODEF=12 +val SCE_NSIS_STRINGVAR=13 +val SCE_NSIS_NUMBER=14 +val SCE_NSIS_SECTIONGROUP=15 +val SCE_NSIS_PAGEEX=16 +val SCE_NSIS_FUNCTIONDEF=17 +val SCE_NSIS_COMMENTBOX=18 +# Lexical states for SCLEX_MMIXAL +lex MMIXAL=SCLEX_MMIXAL SCE_MMIXAL_ +val SCE_MMIXAL_LEADWS=0 +val SCE_MMIXAL_COMMENT=1 +val SCE_MMIXAL_LABEL=2 +val SCE_MMIXAL_OPCODE=3 +val SCE_MMIXAL_OPCODE_PRE=4 +val SCE_MMIXAL_OPCODE_VALID=5 +val SCE_MMIXAL_OPCODE_UNKNOWN=6 +val SCE_MMIXAL_OPCODE_POST=7 +val SCE_MMIXAL_OPERANDS=8 +val SCE_MMIXAL_NUMBER=9 +val SCE_MMIXAL_REF=10 +val SCE_MMIXAL_CHAR=11 +val SCE_MMIXAL_STRING=12 +val SCE_MMIXAL_REGISTER=13 +val SCE_MMIXAL_HEX=14 +val SCE_MMIXAL_OPERATOR=15 +val SCE_MMIXAL_SYMBOL=16 +val SCE_MMIXAL_INCLUDE=17 +# Lexical states for SCLEX_CLW +lex Clarion=SCLEX_CLW SCE_CLW_ +val SCE_CLW_DEFAULT=0 +val SCE_CLW_LABEL=1 +val SCE_CLW_COMMENT=2 +val SCE_CLW_STRING=3 +val SCE_CLW_USER_IDENTIFIER=4 +val SCE_CLW_INTEGER_CONSTANT=5 +val SCE_CLW_REAL_CONSTANT=6 +val SCE_CLW_PICTURE_STRING=7 +val SCE_CLW_KEYWORD=8 +val SCE_CLW_COMPILER_DIRECTIVE=9 +val SCE_CLW_RUNTIME_EXPRESSIONS=10 +val SCE_CLW_BUILTIN_PROCEDURES_FUNCTION=11 +val SCE_CLW_STRUCTURE_DATA_TYPE=12 +val SCE_CLW_ATTRIBUTE=13 +val SCE_CLW_STANDARD_EQUATE=14 +val SCE_CLW_ERROR=15 +val SCE_CLW_DEPRECATED=16 +# Lexical states for SCLEX_LOT +lex LOT=SCLEX_LOT SCE_LOT_ +val SCE_LOT_DEFAULT=0 +val SCE_LOT_HEADER=1 +val SCE_LOT_BREAK=2 +val SCE_LOT_SET=3 +val SCE_LOT_PASS=4 +val SCE_LOT_FAIL=5 +val SCE_LOT_ABORT=6 +# Lexical states for SCLEX_YAML +lex YAML=SCLEX_YAML SCE_YAML_ +val SCE_YAML_DEFAULT=0 +val SCE_YAML_COMMENT=1 +val SCE_YAML_IDENTIFIER=2 +val SCE_YAML_KEYWORD=3 +val SCE_YAML_NUMBER=4 +val SCE_YAML_REFERENCE=5 +val SCE_YAML_DOCUMENT=6 +val SCE_YAML_TEXT=7 +val SCE_YAML_ERROR=8 +val SCE_YAML_OPERATOR=9 +# Lexical states for SCLEX_TEX +lex TeX=SCLEX_TEX SCE_TEX_ +val SCE_TEX_DEFAULT=0 +val SCE_TEX_SPECIAL=1 +val SCE_TEX_GROUP=2 +val SCE_TEX_SYMBOL=3 +val SCE_TEX_COMMAND=4 +val SCE_TEX_TEXT=5 +lex Metapost=SCLEX_METAPOST SCE_METAPOST_ +val SCE_METAPOST_DEFAULT=0 +val SCE_METAPOST_SPECIAL=1 +val SCE_METAPOST_GROUP=2 +val SCE_METAPOST_SYMBOL=3 +val SCE_METAPOST_COMMAND=4 +val SCE_METAPOST_TEXT=5 +val SCE_METAPOST_EXTRA=6 +# Lexical states for SCLEX_ERLANG +lex Erlang=SCLEX_ERLANG SCE_ERLANG_ +val SCE_ERLANG_DEFAULT=0 +val SCE_ERLANG_COMMENT=1 +val SCE_ERLANG_VARIABLE=2 +val SCE_ERLANG_NUMBER=3 +val SCE_ERLANG_KEYWORD=4 +val SCE_ERLANG_STRING=5 +val SCE_ERLANG_OPERATOR=6 +val SCE_ERLANG_ATOM=7 +val SCE_ERLANG_FUNCTION_NAME=8 +val SCE_ERLANG_CHARACTER=9 +val SCE_ERLANG_MACRO=10 +val SCE_ERLANG_RECORD=11 +val SCE_ERLANG_PREPROC=12 +val SCE_ERLANG_NODE_NAME=13 +val SCE_ERLANG_COMMENT_FUNCTION=14 +val SCE_ERLANG_COMMENT_MODULE=15 +val SCE_ERLANG_COMMENT_DOC=16 +val SCE_ERLANG_COMMENT_DOC_MACRO=17 +val SCE_ERLANG_ATOM_QUOTED=18 +val SCE_ERLANG_MACRO_QUOTED=19 +val SCE_ERLANG_RECORD_QUOTED=20 +val SCE_ERLANG_NODE_NAME_QUOTED=21 +val SCE_ERLANG_BIFS=22 +val SCE_ERLANG_MODULES=23 +val SCE_ERLANG_MODULES_ATT=24 +val SCE_ERLANG_UNKNOWN=31 +# Lexical states for SCLEX_OCTAVE are identical to MatLab +lex Octave=SCLEX_OCTAVE SCE_MATLAB_ +# Lexical states for SCLEX_MSSQL +lex MSSQL=SCLEX_MSSQL SCE_MSSQL_ +val SCE_MSSQL_DEFAULT=0 +val SCE_MSSQL_COMMENT=1 +val SCE_MSSQL_LINE_COMMENT=2 +val SCE_MSSQL_NUMBER=3 +val SCE_MSSQL_STRING=4 +val SCE_MSSQL_OPERATOR=5 +val SCE_MSSQL_IDENTIFIER=6 +val SCE_MSSQL_VARIABLE=7 +val SCE_MSSQL_COLUMN_NAME=8 +val SCE_MSSQL_STATEMENT=9 +val SCE_MSSQL_DATATYPE=10 +val SCE_MSSQL_SYSTABLE=11 +val SCE_MSSQL_GLOBAL_VARIABLE=12 +val SCE_MSSQL_FUNCTION=13 +val SCE_MSSQL_STORED_PROCEDURE=14 +val SCE_MSSQL_DEFAULT_PREF_DATATYPE=15 +val SCE_MSSQL_COLUMN_NAME_2=16 +# Lexical states for SCLEX_VERILOG +lex Verilog=SCLEX_VERILOG SCE_V_ +val SCE_V_DEFAULT=0 +val SCE_V_COMMENT=1 +val SCE_V_COMMENTLINE=2 +val SCE_V_COMMENTLINEBANG=3 +val SCE_V_NUMBER=4 +val SCE_V_WORD=5 +val SCE_V_STRING=6 +val SCE_V_WORD2=7 +val SCE_V_WORD3=8 +val SCE_V_PREPROCESSOR=9 +val SCE_V_OPERATOR=10 +val SCE_V_IDENTIFIER=11 +val SCE_V_STRINGEOL=12 +val SCE_V_USER=19 +# Lexical states for SCLEX_KIX +lex Kix=SCLEX_KIX SCE_KIX_ +val SCE_KIX_DEFAULT=0 +val SCE_KIX_COMMENT=1 +val SCE_KIX_STRING1=2 +val SCE_KIX_STRING2=3 +val SCE_KIX_NUMBER=4 +val SCE_KIX_VAR=5 +val SCE_KIX_MACRO=6 +val SCE_KIX_KEYWORD=7 +val SCE_KIX_FUNCTIONS=8 +val SCE_KIX_OPERATOR=9 +val SCE_KIX_IDENTIFIER=31 +# Lexical states for SCLEX_GUI4CLI +val SCE_GC_DEFAULT=0 +val SCE_GC_COMMENTLINE=1 +val SCE_GC_COMMENTBLOCK=2 +val SCE_GC_GLOBAL=3 +val SCE_GC_EVENT=4 +val SCE_GC_ATTRIBUTE=5 +val SCE_GC_CONTROL=6 +val SCE_GC_COMMAND=7 +val SCE_GC_STRING=8 +val SCE_GC_OPERATOR=9 +# Lexical states for SCLEX_SPECMAN +lex Specman=SCLEX_SPECMAN SCE_SN_ +val SCE_SN_DEFAULT=0 +val SCE_SN_CODE=1 +val SCE_SN_COMMENTLINE=2 +val SCE_SN_COMMENTLINEBANG=3 +val SCE_SN_NUMBER=4 +val SCE_SN_WORD=5 +val SCE_SN_STRING=6 +val SCE_SN_WORD2=7 +val SCE_SN_WORD3=8 +val SCE_SN_PREPROCESSOR=9 +val SCE_SN_OPERATOR=10 +val SCE_SN_IDENTIFIER=11 +val SCE_SN_STRINGEOL=12 +val SCE_SN_REGEXTAG=13 +val SCE_SN_SIGNAL=14 +val SCE_SN_USER=19 +# Lexical states for SCLEX_AU3 +lex Au3=SCLEX_AU3 SCE_AU3_ +val SCE_AU3_DEFAULT=0 +val SCE_AU3_COMMENT=1 +val SCE_AU3_COMMENTBLOCK=2 +val SCE_AU3_NUMBER=3 +val SCE_AU3_FUNCTION=4 +val SCE_AU3_KEYWORD=5 +val SCE_AU3_MACRO=6 +val SCE_AU3_STRING=7 +val SCE_AU3_OPERATOR=8 +val SCE_AU3_VARIABLE=9 +val SCE_AU3_SENT=10 +val SCE_AU3_PREPROCESSOR=11 +val SCE_AU3_SPECIAL=12 +val SCE_AU3_EXPAND=13 +val SCE_AU3_COMOBJ=14 +val SCE_AU3_UDF=15 +# Lexical states for SCLEX_APDL +lex APDL=SCLEX_APDL SCE_APDL_ +val SCE_APDL_DEFAULT=0 +val SCE_APDL_COMMENT=1 +val SCE_APDL_COMMENTBLOCK=2 +val SCE_APDL_NUMBER=3 +val SCE_APDL_STRING=4 +val SCE_APDL_OPERATOR=5 +val SCE_APDL_WORD=6 +val SCE_APDL_PROCESSOR=7 +val SCE_APDL_COMMAND=8 +val SCE_APDL_SLASHCOMMAND=9 +val SCE_APDL_STARCOMMAND=10 +val SCE_APDL_ARGUMENT=11 +val SCE_APDL_FUNCTION=12 +# Lexical states for SCLEX_BASH +lex Bash=SCLEX_BASH SCE_SH_ +val SCE_SH_DEFAULT=0 +val SCE_SH_ERROR=1 +val SCE_SH_COMMENTLINE=2 +val SCE_SH_NUMBER=3 +val SCE_SH_WORD=4 +val SCE_SH_STRING=5 +val SCE_SH_CHARACTER=6 +val SCE_SH_OPERATOR=7 +val SCE_SH_IDENTIFIER=8 +val SCE_SH_SCALAR=9 +val SCE_SH_PARAM=10 +val SCE_SH_BACKTICKS=11 +val SCE_SH_HERE_DELIM=12 +val SCE_SH_HERE_Q=13 +# Lexical states for SCLEX_ASN1 +lex Asn1=SCLEX_ASN1 SCE_ASN1_ +val SCE_ASN1_DEFAULT=0 +val SCE_ASN1_COMMENT=1 +val SCE_ASN1_IDENTIFIER=2 +val SCE_ASN1_STRING=3 +val SCE_ASN1_OID=4 +val SCE_ASN1_SCALAR=5 +val SCE_ASN1_KEYWORD=6 +val SCE_ASN1_ATTRIBUTE=7 +val SCE_ASN1_DESCRIPTOR=8 +val SCE_ASN1_TYPE=9 +val SCE_ASN1_OPERATOR=10 +# Lexical states for SCLEX_VHDL +lex VHDL=SCLEX_VHDL SCE_VHDL_ +val SCE_VHDL_DEFAULT=0 +val SCE_VHDL_COMMENT=1 +val SCE_VHDL_COMMENTLINEBANG=2 +val SCE_VHDL_NUMBER=3 +val SCE_VHDL_STRING=4 +val SCE_VHDL_OPERATOR=5 +val SCE_VHDL_IDENTIFIER=6 +val SCE_VHDL_STRINGEOL=7 +val SCE_VHDL_KEYWORD=8 +val SCE_VHDL_STDOPERATOR=9 +val SCE_VHDL_ATTRIBUTE=10 +val SCE_VHDL_STDFUNCTION=11 +val SCE_VHDL_STDPACKAGE=12 +val SCE_VHDL_STDTYPE=13 +val SCE_VHDL_USERWORD=14 +# Lexical states for SCLEX_CAML +lex Caml=SCLEX_CAML SCE_CAML_ +val SCE_CAML_DEFAULT=0 +val SCE_CAML_IDENTIFIER=1 +val SCE_CAML_TAGNAME=2 +val SCE_CAML_KEYWORD=3 +val SCE_CAML_KEYWORD2=4 +val SCE_CAML_KEYWORD3=5 +val SCE_CAML_LINENUM=6 +val SCE_CAML_OPERATOR=7 +val SCE_CAML_NUMBER=8 +val SCE_CAML_CHAR=9 +val SCE_CAML_WHITE=10 +val SCE_CAML_STRING=11 +val SCE_CAML_COMMENT=12 +val SCE_CAML_COMMENT1=13 +val SCE_CAML_COMMENT2=14 +val SCE_CAML_COMMENT3=15 +# Lexical states for SCLEX_HASKELL +lex Haskell=SCLEX_HASKELL SCE_HA_ +val SCE_HA_DEFAULT=0 +val SCE_HA_IDENTIFIER=1 +val SCE_HA_KEYWORD=2 +val SCE_HA_NUMBER=3 +val SCE_HA_STRING=4 +val SCE_HA_CHARACTER=5 +val SCE_HA_CLASS=6 +val SCE_HA_MODULE=7 +val SCE_HA_CAPITAL=8 +val SCE_HA_DATA=9 +val SCE_HA_IMPORT=10 +val SCE_HA_OPERATOR=11 +val SCE_HA_INSTANCE=12 +val SCE_HA_COMMENTLINE=13 +val SCE_HA_COMMENTBLOCK=14 +val SCE_HA_COMMENTBLOCK2=15 +val SCE_HA_COMMENTBLOCK3=16 +# Lexical states of SCLEX_TADS3 +lex TADS3=SCLEX_TADS3 SCE_T3_ +val SCE_T3_DEFAULT=0 +val SCE_T3_X_DEFAULT=1 +val SCE_T3_PREPROCESSOR=2 +val SCE_T3_BLOCK_COMMENT=3 +val SCE_T3_LINE_COMMENT=4 +val SCE_T3_OPERATOR=5 +val SCE_T3_KEYWORD=6 +val SCE_T3_NUMBER=7 +val SCE_T3_IDENTIFIER=8 +val SCE_T3_S_STRING=9 +val SCE_T3_D_STRING=10 +val SCE_T3_X_STRING=11 +val SCE_T3_LIB_DIRECTIVE=12 +val SCE_T3_MSG_PARAM=13 +val SCE_T3_HTML_TAG=14 +val SCE_T3_HTML_DEFAULT=15 +val SCE_T3_HTML_STRING=16 +val SCE_T3_USER1=17 +val SCE_T3_USER2=18 +val SCE_T3_USER3=19 +val SCE_T3_BRACE=20 +# Lexical states for SCLEX_REBOL +lex Rebol=SCLEX_REBOL SCE_REBOL_ +val SCE_REBOL_DEFAULT=0 +val SCE_REBOL_COMMENTLINE=1 +val SCE_REBOL_COMMENTBLOCK=2 +val SCE_REBOL_PREFACE=3 +val SCE_REBOL_OPERATOR=4 +val SCE_REBOL_CHARACTER=5 +val SCE_REBOL_QUOTEDSTRING=6 +val SCE_REBOL_BRACEDSTRING=7 +val SCE_REBOL_NUMBER=8 +val SCE_REBOL_PAIR=9 +val SCE_REBOL_TUPLE=10 +val SCE_REBOL_BINARY=11 +val SCE_REBOL_MONEY=12 +val SCE_REBOL_ISSUE=13 +val SCE_REBOL_TAG=14 +val SCE_REBOL_FILE=15 +val SCE_REBOL_EMAIL=16 +val SCE_REBOL_URL=17 +val SCE_REBOL_DATE=18 +val SCE_REBOL_TIME=19 +val SCE_REBOL_IDENTIFIER=20 +val SCE_REBOL_WORD=21 +val SCE_REBOL_WORD2=22 +val SCE_REBOL_WORD3=23 +val SCE_REBOL_WORD4=24 +val SCE_REBOL_WORD5=25 +val SCE_REBOL_WORD6=26 +val SCE_REBOL_WORD7=27 +val SCE_REBOL_WORD8=28 +# Lexical states for SCLEX_SQL +lex SQL=SCLEX_SQL SCE_SQL_ +val SCE_SQL_DEFAULT=0 +val SCE_SQL_COMMENT=1 +val SCE_SQL_COMMENTLINE=2 +val SCE_SQL_COMMENTDOC=3 +val SCE_SQL_NUMBER=4 +val SCE_SQL_WORD=5 +val SCE_SQL_STRING=6 +val SCE_SQL_CHARACTER=7 +val SCE_SQL_SQLPLUS=8 +val SCE_SQL_SQLPLUS_PROMPT=9 +val SCE_SQL_OPERATOR=10 +val SCE_SQL_IDENTIFIER=11 +val SCE_SQL_SQLPLUS_COMMENT=13 +val SCE_SQL_COMMENTLINEDOC=15 +val SCE_SQL_WORD2=16 +val SCE_SQL_COMMENTDOCKEYWORD=17 +val SCE_SQL_COMMENTDOCKEYWORDERROR=18 +val SCE_SQL_USER1=19 +val SCE_SQL_USER2=20 +val SCE_SQL_USER3=21 +val SCE_SQL_USER4=22 +val SCE_SQL_QUOTEDIDENTIFIER=23 +# Lexical states for SCLEX_SMALLTALK +lex Smalltalk=SCLEX_SMALLTALK SCE_ST_ +val SCE_ST_DEFAULT=0 +val SCE_ST_STRING=1 +val SCE_ST_NUMBER=2 +val SCE_ST_COMMENT=3 +val SCE_ST_SYMBOL=4 +val SCE_ST_BINARY=5 +val SCE_ST_BOOL=6 +val SCE_ST_SELF=7 +val SCE_ST_SUPER=8 +val SCE_ST_NIL=9 +val SCE_ST_GLOBAL=10 +val SCE_ST_RETURN=11 +val SCE_ST_SPECIAL=12 +val SCE_ST_KWSEND=13 +val SCE_ST_ASSIGN=14 +val SCE_ST_CHARACTER=15 +val SCE_ST_SPEC_SEL=16 +# Lexical states for SCLEX_FLAGSHIP (clipper) +lex FlagShip=SCLEX_FLAGSHIP SCE_FS_ +val SCE_FS_DEFAULT=0 +val SCE_FS_COMMENT=1 +val SCE_FS_COMMENTLINE=2 +val SCE_FS_COMMENTDOC=3 +val SCE_FS_COMMENTLINEDOC=4 +val SCE_FS_COMMENTDOCKEYWORD=5 +val SCE_FS_COMMENTDOCKEYWORDERROR=6 +val SCE_FS_KEYWORD=7 +val SCE_FS_KEYWORD2=8 +val SCE_FS_KEYWORD3=9 +val SCE_FS_KEYWORD4=10 +val SCE_FS_NUMBER=11 +val SCE_FS_STRING=12 +val SCE_FS_PREPROCESSOR=13 +val SCE_FS_OPERATOR=14 +val SCE_FS_IDENTIFIER=15 +val SCE_FS_DATE=16 +val SCE_FS_STRINGEOL=17 +val SCE_FS_CONSTANT=18 +val SCE_FS_WORDOPERATOR=19 +val SCE_FS_DISABLEDCODE=20 +val SCE_FS_DEFAULT_C=21 +val SCE_FS_COMMENTDOC_C=22 +val SCE_FS_COMMENTLINEDOC_C=23 +val SCE_FS_KEYWORD_C=24 +val SCE_FS_KEYWORD2_C=25 +val SCE_FS_NUMBER_C=26 +val SCE_FS_STRING_C=27 +val SCE_FS_PREPROCESSOR_C=28 +val SCE_FS_OPERATOR_C=29 +val SCE_FS_IDENTIFIER_C=30 +val SCE_FS_STRINGEOL_C=31 +# Lexical states for SCLEX_CSOUND +lex Csound=SCLEX_CSOUND SCE_CSOUND_ +val SCE_CSOUND_DEFAULT=0 +val SCE_CSOUND_COMMENT=1 +val SCE_CSOUND_NUMBER=2 +val SCE_CSOUND_OPERATOR=3 +val SCE_CSOUND_INSTR=4 +val SCE_CSOUND_IDENTIFIER=5 +val SCE_CSOUND_OPCODE=6 +val SCE_CSOUND_HEADERSTMT=7 +val SCE_CSOUND_USERKEYWORD=8 +val SCE_CSOUND_COMMENTBLOCK=9 +val SCE_CSOUND_PARAM=10 +val SCE_CSOUND_ARATE_VAR=11 +val SCE_CSOUND_KRATE_VAR=12 +val SCE_CSOUND_IRATE_VAR=13 +val SCE_CSOUND_GLOBAL_VAR=14 +val SCE_CSOUND_STRINGEOL=15 +# Lexical states for SCLEX_INNOSETUP +lex Inno=SCLEX_INNOSETUP SCE_INNO_ +val SCE_INNO_DEFAULT=0 +val SCE_INNO_COMMENT=1 +val SCE_INNO_KEYWORD=2 +val SCE_INNO_PARAMETER=3 +val SCE_INNO_SECTION=4 +val SCE_INNO_PREPROC=5 +val SCE_INNO_INLINE_EXPANSION=6 +val SCE_INNO_COMMENT_PASCAL=7 +val SCE_INNO_KEYWORD_PASCAL=8 +val SCE_INNO_KEYWORD_USER=9 +val SCE_INNO_STRING_DOUBLE=10 +val SCE_INNO_STRING_SINGLE=11 +val SCE_INNO_IDENTIFIER=12 +# Lexical states for SCLEX_OPAL +lex Opal=SCLEX_OPAL SCE_OPAL_ +val SCE_OPAL_SPACE=0 +val SCE_OPAL_COMMENT_BLOCK=1 +val SCE_OPAL_COMMENT_LINE=2 +val SCE_OPAL_INTEGER=3 +val SCE_OPAL_KEYWORD=4 +val SCE_OPAL_SORT=5 +val SCE_OPAL_STRING=6 +val SCE_OPAL_PAR=7 +val SCE_OPAL_BOOL_CONST=8 +val SCE_OPAL_DEFAULT=32 +# Lexical states for SCLEX_SPICE +lex Spice=SCLEX_SPICE SCE_SPICE_ +val SCE_SPICE_DEFAULT=0 +val SCE_SPICE_IDENTIFIER=1 +val SCE_SPICE_KEYWORD=2 +val SCE_SPICE_KEYWORD2=3 +val SCE_SPICE_KEYWORD3=4 +val SCE_SPICE_NUMBER=5 +val SCE_SPICE_DELIMITER=6 +val SCE_SPICE_VALUE=7 +val SCE_SPICE_COMMENTLINE=8 +# Lexical states for SCLEX_CMAKE +lex CMAKE=SCLEX_CMAKE SCE_CMAKE_ +val SCE_CMAKE_DEFAULT=0 +val SCE_CMAKE_COMMENT=1 +val SCE_CMAKE_STRINGDQ=2 +val SCE_CMAKE_STRINGLQ=3 +val SCE_CMAKE_STRINGRQ=4 +val SCE_CMAKE_COMMANDS=5 +val SCE_CMAKE_PARAMETERS=6 +val SCE_CMAKE_VARIABLE=7 +val SCE_CMAKE_USERDEFINED=8 +val SCE_CMAKE_WHILEDEF=9 +val SCE_CMAKE_FOREACHDEF=10 +val SCE_CMAKE_IFDEFINEDEF=11 +val SCE_CMAKE_MACRODEF=12 +val SCE_CMAKE_STRINGVAR=13 +val SCE_CMAKE_NUMBER=14 +# Lexical states for SCLEX_GAP +lex Gap=SCLEX_GAP SCE_GAP_ +val SCE_GAP_DEFAULT=0 +val SCE_GAP_IDENTIFIER=1 +val SCE_GAP_KEYWORD=2 +val SCE_GAP_KEYWORD2=3 +val SCE_GAP_KEYWORD3=4 +val SCE_GAP_KEYWORD4=5 +val SCE_GAP_STRING=6 +val SCE_GAP_CHAR=7 +val SCE_GAP_OPERATOR=8 +val SCE_GAP_COMMENT=9 +val SCE_GAP_NUMBER=10 +val SCE_GAP_STRINGEOL=11 +# Lexical state for SCLEX_PLM +lex PLM=SCLEX_PLM SCE_PLM_ +val SCE_PLM_DEFAULT=0 +val SCE_PLM_COMMENT=1 +val SCE_PLM_STRING=2 +val SCE_PLM_NUMBER=3 +val SCE_PLM_IDENTIFIER=4 +val SCE_PLM_OPERATOR=5 +val SCE_PLM_CONTROL=6 +val SCE_PLM_KEYWORD=7 +# Lexical state for SCLEX_PROGRESS +lex Progress=SCLEX_PROGRESS SCE_4GL_ +val SCE_4GL_DEFAULT=0 +val SCE_4GL_NUMBER=1 +val SCE_4GL_WORD=2 +val SCE_4GL_STRING=3 +val SCE_4GL_CHARACTER=4 +val SCE_4GL_PREPROCESSOR=5 +val SCE_4GL_OPERATOR=6 +val SCE_4GL_IDENTIFIER=7 +val SCE_4GL_BLOCK=8 +val SCE_4GL_END=9 +val SCE_4GL_COMMENT1=10 +val SCE_4GL_COMMENT2=11 +val SCE_4GL_COMMENT3=12 +val SCE_4GL_COMMENT4=13 +val SCE_4GL_COMMENT5=14 +val SCE_4GL_COMMENT6=15 +val SCE_4GL_DEFAULT_=16 +val SCE_4GL_NUMBER_=17 +val SCE_4GL_WORD_=18 +val SCE_4GL_STRING_=19 +val SCE_4GL_CHARACTER_=20 +val SCE_4GL_PREPROCESSOR_=21 +val SCE_4GL_OPERATOR_=22 +val SCE_4GL_IDENTIFIER_=23 +val SCE_4GL_BLOCK_=24 +val SCE_4GL_END_=25 +val SCE_4GL_COMMENT1_=26 +val SCE_4GL_COMMENT2_=27 +val SCE_4GL_COMMENT3_=28 +val SCE_4GL_COMMENT4_=29 +val SCE_4GL_COMMENT5_=30 +val SCE_4GL_COMMENT6_=31 +# Lexical states for SCLEX_ABAQUS +lex ABAQUS=SCLEX_ABAQUS SCE_ABAQUS_ +val SCE_ABAQUS_DEFAULT=0 +val SCE_ABAQUS_COMMENT=1 +val SCE_ABAQUS_COMMENTBLOCK=2 +val SCE_ABAQUS_NUMBER=3 +val SCE_ABAQUS_STRING=4 +val SCE_ABAQUS_OPERATOR=5 +val SCE_ABAQUS_WORD=6 +val SCE_ABAQUS_PROCESSOR=7 +val SCE_ABAQUS_COMMAND=8 +val SCE_ABAQUS_SLASHCOMMAND=9 +val SCE_ABAQUS_STARCOMMAND=10 +val SCE_ABAQUS_ARGUMENT=11 +val SCE_ABAQUS_FUNCTION=12 +# Lexical states for SCLEX_ASYMPTOTE +lex Asymptote=SCLEX_ASYMPTOTE SCE_ASY_ +val SCE_ASY_DEFAULT=0 +val SCE_ASY_COMMENT=1 +val SCE_ASY_COMMENTLINE=2 +val SCE_ASY_NUMBER=3 +val SCE_ASY_WORD=4 +val SCE_ASY_STRING=5 +val SCE_ASY_CHARACTER=6 +val SCE_ASY_OPERATOR=7 +val SCE_ASY_IDENTIFIER=8 +val SCE_ASY_STRINGEOL=9 +val SCE_ASY_COMMENTLINEDOC=10 +val SCE_ASY_WORD2=11 +# Lexical states for SCLEX_R +lex R=SCLEX_R SCE_R_ +val SCE_R_DEFAULT=0 +val SCE_R_COMMENT=1 +val SCE_R_KWORD=2 +val SCE_R_BASEKWORD=3 +val SCE_R_OTHERKWORD=4 +val SCE_R_NUMBER=5 +val SCE_R_STRING=6 +val SCE_R_STRING2=7 +val SCE_R_OPERATOR=8 +val SCE_R_IDENTIFIER=9 +val SCE_R_INFIX=10 +val SCE_R_INFIXEOL=11 +# Lexical state for SCLEX_MAGIKSF +lex MagikSF=SCLEX_MAGIKSF SCE_MAGIK_ +val SCE_MAGIK_DEFAULT=0 +val SCE_MAGIK_COMMENT=1 +val SCE_MAGIK_HYPER_COMMENT=16 +val SCE_MAGIK_STRING=2 +val SCE_MAGIK_CHARACTER=3 +val SCE_MAGIK_NUMBER=4 +val SCE_MAGIK_IDENTIFIER=5 +val SCE_MAGIK_OPERATOR=6 +val SCE_MAGIK_FLOW=7 +val SCE_MAGIK_CONTAINER=8 +val SCE_MAGIK_BRACKET_BLOCK=9 +val SCE_MAGIK_BRACE_BLOCK=10 +val SCE_MAGIK_SQBRACKET_BLOCK=11 +val SCE_MAGIK_UNKNOWN_KEYWORD=12 +val SCE_MAGIK_KEYWORD=13 +val SCE_MAGIK_PRAGMA=14 +val SCE_MAGIK_SYMBOL=15 +# Lexical state for SCLEX_POWERSHELL +lex PowerShell=SCLEX_POWERSHELL SCE_POWERSHELL_ +val SCE_POWERSHELL_DEFAULT=0 +val SCE_POWERSHELL_COMMENT=1 +val SCE_POWERSHELL_STRING=2 +val SCE_POWERSHELL_CHARACTER=3 +val SCE_POWERSHELL_NUMBER=4 +val SCE_POWERSHELL_VARIABLE=5 +val SCE_POWERSHELL_OPERATOR=6 +val SCE_POWERSHELL_IDENTIFIER=7 +val SCE_POWERSHELL_KEYWORD=8 +val SCE_POWERSHELL_CMDLET=9 +val SCE_POWERSHELL_ALIAS=10 +# Lexical state for SCLEX_MYSQL +lex MySQL=SCLEX_MYSQL SCE_MYSQL_ +val SCE_MYSQL_DEFAULT=0 +val SCE_MYSQL_COMMENT=1 +val SCE_MYSQL_COMMENTLINE=2 +val SCE_MYSQL_VARIABLE=3 +val SCE_MYSQL_SYSTEMVARIABLE=4 +val SCE_MYSQL_KNOWNSYSTEMVARIABLE=5 +val SCE_MYSQL_NUMBER=6 +val SCE_MYSQL_MAJORKEYWORD=7 +val SCE_MYSQL_KEYWORD=8 +val SCE_MYSQL_DATABASEOBJECT=9 +val SCE_MYSQL_PROCEDUREKEYWORD=10 +val SCE_MYSQL_STRING=11 +val SCE_MYSQL_SQSTRING=12 +val SCE_MYSQL_DQSTRING=13 +val SCE_MYSQL_OPERATOR=14 +val SCE_MYSQL_FUNCTION=15 +val SCE_MYSQL_IDENTIFIER=16 +val SCE_MYSQL_QUOTEDIDENTIFIER=17 +val SCE_MYSQL_USER1=18 +val SCE_MYSQL_USER2=19 +val SCE_MYSQL_USER3=20 +val SCE_MYSQL_HIDDENCOMMAND=21 +# Lexical state for SCLEX_PO +lex Po=SCLEX_PO SCE_PO_ +val SCE_PO_DEFAULT=0 +val SCE_PO_COMMENT=1 +val SCE_PO_MSGID=2 +val SCE_PO_MSGID_TEXT=3 +val SCE_PO_MSGSTR=4 +val SCE_PO_MSGSTR_TEXT=5 +val SCE_PO_MSGCTXT=6 +val SCE_PO_MSGCTXT_TEXT=7 +val SCE_PO_FUZZY=8 +# Lexical states for SCLEX_PASCAL +lex Pascal=SCLEX_PASCAL SCE_PAS_ +val SCE_PAS_DEFAULT=0 +val SCE_PAS_IDENTIFIER=1 +val SCE_PAS_COMMENT=2 +val SCE_PAS_COMMENT2=3 +val SCE_PAS_COMMENTLINE=4 +val SCE_PAS_PREPROCESSOR=5 +val SCE_PAS_PREPROCESSOR2=6 +val SCE_PAS_NUMBER=7 +val SCE_PAS_HEXNUMBER=8 +val SCE_PAS_WORD=9 +val SCE_PAS_STRING=10 +val SCE_PAS_STRINGEOL=11 +val SCE_PAS_CHARACTER=12 +val SCE_PAS_OPERATOR=13 +val SCE_PAS_ASM=14 +# Lexical state for SCLEX_SORCUS +lex SORCUS=SCLEX_SORCUS SCE_SORCUS_ +val SCE_SORCUS_DEFAULT=0 +val SCE_SORCUS_COMMAND=1 +val SCE_SORCUS_PARAMETER=2 +val SCE_SORCUS_COMMENTLINE=3 +val SCE_SORCUS_STRING=4 +val SCE_SORCUS_STRINGEOL=5 +val SCE_SORCUS_IDENTIFIER=6 +val SCE_SORCUS_OPERATOR=7 +val SCE_SORCUS_NUMBER=8 +val SCE_SORCUS_CONSTANT=9 +# Lexical state for SCLEX_POWERPRO +lex PowerPro=SCLEX_POWERPRO SCE_POWERPRO_ +val SCE_POWERPRO_DEFAULT=0 +val SCE_POWERPRO_COMMENTBLOCK=1 +val SCE_POWERPRO_COMMENTLINE=2 +val SCE_POWERPRO_NUMBER=3 +val SCE_POWERPRO_WORD=4 +val SCE_POWERPRO_WORD2=5 +val SCE_POWERPRO_WORD3=6 +val SCE_POWERPRO_WORD4=7 +val SCE_POWERPRO_DOUBLEQUOTEDSTRING=8 +val SCE_POWERPRO_SINGLEQUOTEDSTRING=9 +val SCE_POWERPRO_LINECONTINUE=10 +val SCE_POWERPRO_OPERATOR=11 +val SCE_POWERPRO_IDENTIFIER=12 +val SCE_POWERPRO_STRINGEOL=13 +val SCE_POWERPRO_VERBATIM=14 +val SCE_POWERPRO_ALTQUOTE=15 +val SCE_POWERPRO_FUNCTION=16 +# Lexical states for SCLEX_SML +lex SML=SCLEX_SML SCE_SML_ +val SCE_SML_DEFAULT=0 +val SCE_SML_IDENTIFIER=1 +val SCE_SML_TAGNAME=2 +val SCE_SML_KEYWORD=3 +val SCE_SML_KEYWORD2=4 +val SCE_SML_KEYWORD3=5 +val SCE_SML_LINENUM=6 +val SCE_SML_OPERATOR=7 +val SCE_SML_NUMBER=8 +val SCE_SML_CHAR=9 +val SCE_SML_STRING=11 +val SCE_SML_COMMENT=12 +val SCE_SML_COMMENT1=13 +val SCE_SML_COMMENT2=14 +val SCE_SML_COMMENT3=15 +# Lexical state for SCLEX_MARKDOWN +lex Markdown=SCLEX_MARKDOWN SCE_MARKDOWN_ +val SCE_MARKDOWN_DEFAULT=0 +val SCE_MARKDOWN_LINE_BEGIN=1 +val SCE_MARKDOWN_STRONG1=2 +val SCE_MARKDOWN_STRONG2=3 +val SCE_MARKDOWN_EM1=4 +val SCE_MARKDOWN_EM2=5 +val SCE_MARKDOWN_HEADER1=6 +val SCE_MARKDOWN_HEADER2=7 +val SCE_MARKDOWN_HEADER3=8 +val SCE_MARKDOWN_HEADER4=9 +val SCE_MARKDOWN_HEADER5=10 +val SCE_MARKDOWN_HEADER6=11 +val SCE_MARKDOWN_PRECHAR=12 +val SCE_MARKDOWN_ULIST_ITEM=13 +val SCE_MARKDOWN_OLIST_ITEM=14 +val SCE_MARKDOWN_BLOCKQUOTE=15 +val SCE_MARKDOWN_STRIKEOUT=16 +val SCE_MARKDOWN_HRULE=17 +val SCE_MARKDOWN_LINK=18 +val SCE_MARKDOWN_CODE=19 +val SCE_MARKDOWN_CODE2=20 +val SCE_MARKDOWN_CODEBK=21 + +# Events + +evt void StyleNeeded=2000(int position) +evt void CharAdded=2001(int ch) +evt void SavePointReached=2002(void) +evt void SavePointLeft=2003(void) +evt void ModifyAttemptRO=2004(void) +# GTK+ Specific to work around focus and accelerator problems: +evt void Key=2005(int ch, int modifiers) +evt void DoubleClick=2006(void) +evt void UpdateUI=2007(void) +evt void Modified=2008(int position, int modificationType, string text, int length, int linesAdded, int line, int foldLevelNow, int foldLevelPrev) +evt void MacroRecord=2009(int message, int wParam, int lParam) +evt void MarginClick=2010(int modifiers, int position, int margin) +evt void NeedShown=2011(int position, int length) +evt void Painted=2013(void) +evt void UserListSelection=2014(int listType, string text) +evt void URIDropped=2015(string text) +evt void DwellStart=2016(int position) +evt void DwellEnd=2017(int position) +evt void Zoom=2018(void) +evt void HotSpotClick=2019(int modifiers, int position) +evt void HotSpotDoubleClick=2020(int modifiers, int position) +evt void CallTipClick=2021(int position) +evt void AutoCSelection=2022(string text) +evt void IndicatorClick=2023(int modifiers, int position) +evt void IndicatorRelease=2024(int modifiers, int position) +evt void AutoCCancelled=2025(void) +evt void AutoCCharDeleted=2026(void) diff --git a/sdk/wxscintilla/src/scintilla/include/ScintillaWidget.h b/sdk/wxscintilla/src/scintilla/include/ScintillaWidget.h new file mode 100644 index 0000000..e3c4c79 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/include/ScintillaWidget.h @@ -0,0 +1,55 @@ +/* Scintilla source code edit control */ +/** @file ScintillaWidget.h + ** Definition of Scintilla widget for GTK+. + ** Only needed by GTK+ code but is harmless on other platforms. + **/ +/* Copyright 1998-2001 by Neil Hodgson + * The License.txt file describes the conditions under which this software may be distributed. */ + +#ifndef SCINTILLAWIDGET_H +#define SCINTILLAWIDGET_H + +#if defined(GTK) && !defined(__APPLE__) + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __APPLE__ +#include +#endif + +#define SCINTILLA(obj) GTK_CHECK_CAST (obj, scintilla_get_type (), ScintillaObject) +#define SCINTILLA_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, scintilla_get_type (), ScintillaClass) +#define IS_SCINTILLA(obj) GTK_CHECK_TYPE (obj, scintilla_get_type ()) + +typedef struct _ScintillaObject ScintillaObject; +typedef struct _ScintillaClass ScintillaClass; + +struct _ScintillaObject { + GtkContainer cont; + void *pscin; +}; + +struct _ScintillaClass { + GtkContainerClass parent_class; + + void (* command) (ScintillaObject *ttt); + void (* notify) (ScintillaObject *ttt); +}; + +GType scintilla_get_type (void); +GtkWidget* scintilla_new (void); +void scintilla_set_id (ScintillaObject *sci, uptr_t id); +sptr_t scintilla_send_message (ScintillaObject *sci,unsigned int iMessage, uptr_t wParam, sptr_t lParam); +void scintilla_release_resources(void); + +#define SCINTILLA_NOTIFY "sci-notify" + +#ifdef __cplusplus +} +#endif + +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/include/WindowAccessor.h b/sdk/wxscintilla/src/scintilla/include/WindowAccessor.h new file mode 100644 index 0000000..4a86407 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/include/WindowAccessor.h @@ -0,0 +1,67 @@ +// Scintilla source code edit control +/** @file WindowAccessor.h + ** Implementation of BufferAccess and StylingAccess on a Scintilla + ** rapid easy access to contents of a Scintilla. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +/** + */ + +class WindowAccessor : public Accessor { + // Private so WindowAccessor objects can not be copied + WindowAccessor(const WindowAccessor &source) : Accessor(), props(source.props) {} + WindowAccessor &operator=(const WindowAccessor &) { return *this; } +protected: + WindowID id; + PropertyGet &props; + int lenDoc; + + char styleBuf[bufferSize]; + int validLen; + char chFlags; + char chWhile; + unsigned int startSeg; + + bool InternalIsLeadByte(char ch); + void Fill(int position); +public: + WindowAccessor(WindowID id_, PropertyGet &props_) : + Accessor(), id(id_), props(props_), + lenDoc(-1), validLen(0), chFlags(0), chWhile(0) { + } + ~WindowAccessor(); + bool Match(int pos, const char *s); + char StyleAt(int position); + int GetLine(int position); + int LineStart(int line); + int LevelAt(int line); + int Length(); + void Flush(); + int GetLineState(int line); + int SetLineState(int line, int state); + int GetPropertyInt(const char *key, int defaultValue=0) { + return props.GetInt(key, defaultValue); + } + char *GetProperties() { + return props.ToString(); + } + + void StartAt(unsigned int start, char chMask=31); + void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; } + unsigned int GetStartSegment() { return startSeg; } + void StartSegment(unsigned int pos); + void ColourTo(unsigned int pos, int chAttr); + void SetLevel(int line, int level); + int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0); + void IndicatorFill(int start, int end, int indicator, int value); +}; + +#ifdef SCI_NAMESPACE +} +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/AutoComplete.cxx b/sdk/wxscintilla/src/scintilla/src/AutoComplete.cxx new file mode 100644 index 0000000..8fba820 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/AutoComplete.cxx @@ -0,0 +1,178 @@ +// Scintilla source code edit control +/** @file AutoComplete.cxx + ** Defines the auto completion list box. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include + +#include "Platform.h" + +#include "CharClassify.h" +#include "AutoComplete.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +AutoComplete::AutoComplete() : + active(false), + separator(' '), + typesep('?'), + ignoreCase(false), + chooseSingle(false), + lb(0), + posStart(0), + startLen(0), + cancelAtStartPos(true), + autoHide(true), + dropRestOfWord(false) { + lb = ListBox::Allocate(); + stopChars[0] = '\0'; + fillUpChars[0] = '\0'; +} + +AutoComplete::~AutoComplete() { + if (lb) { + lb->Destroy(); + delete lb; + lb = 0; + } +} + +bool AutoComplete::Active() const { + return active; +} + +void AutoComplete::Start(Window &parent, int ctrlID, + int position, Point location, int startLen_, + int lineHeight, bool unicodeMode) { + if (active) { + Cancel(); + } + lb->Create(parent, ctrlID, location, lineHeight, unicodeMode); + lb->Clear(); + active = true; + startLen = startLen_; + posStart = position; +} + +void AutoComplete::SetStopChars(const char *stopChars_) { + strncpy(stopChars, stopChars_, sizeof(stopChars)); + stopChars[sizeof(stopChars) - 1] = '\0'; +} + +bool AutoComplete::IsStopChar(char ch) { + return ch && strchr(stopChars, ch); +} + +void AutoComplete::SetFillUpChars(const char *fillUpChars_) { + strncpy(fillUpChars, fillUpChars_, sizeof(fillUpChars)); + fillUpChars[sizeof(fillUpChars) - 1] = '\0'; +} + +bool AutoComplete::IsFillUpChar(char ch) { + return ch && strchr(fillUpChars, ch); +} + +void AutoComplete::SetSeparator(char separator_) { + separator = separator_; +} + +char AutoComplete::GetSeparator() const { + return separator; +} + +void AutoComplete::SetTypesep(char separator_) { + typesep = separator_; +} + +char AutoComplete::GetTypesep() const { + return typesep; +} + +void AutoComplete::SetList(const char *list) { + lb->SetList(list, separator, typesep); +} + +void AutoComplete::Show(bool show) { + lb->Show(show); + if (show) + lb->Select(0); +} + +void AutoComplete::Cancel() { + if (lb->Created()) { + lb->Clear(); + lb->Destroy(); + active = false; + } +} + + +void AutoComplete::Move(int delta) { + int count = lb->Length(); + int current = lb->GetSelection(); + current += delta; + if (current >= count) + current = count - 1; + if (current < 0) + current = 0; + lb->Select(current); +} + +void AutoComplete::Select(const char *word) { + size_t lenWord = strlen(word); + int location = -1; + const int maxItemLen=1000; + char item[maxItemLen]; + int start = 0; // lower bound of the api array block to search + int end = lb->Length() - 1; // upper bound of the api array block to search + while ((start <= end) && (location == -1)) { // Binary searching loop + int pivot = (start + end) / 2; + lb->GetValue(pivot, item, maxItemLen); + int cond; + if (ignoreCase) + cond = CompareNCaseInsensitive(word, item, lenWord); + else + cond = strncmp(word, item, lenWord); + if (!cond) { + // Find first match + while (pivot > start) { + lb->GetValue(pivot-1, item, maxItemLen); + if (ignoreCase) + cond = CompareNCaseInsensitive(word, item, lenWord); + else + cond = strncmp(word, item, lenWord); + if (0 != cond) + break; + --pivot; + } + location = pivot; + if (ignoreCase) { + // Check for exact-case match + for (; pivot <= end; pivot++) { + lb->GetValue(pivot, item, maxItemLen); + if (!strncmp(word, item, lenWord)) { + location = pivot; + break; + } + if (CompareNCaseInsensitive(word, item, lenWord)) + break; + } + } + } else if (cond < 0) { + end = pivot - 1; + } else if (cond > 0) { + start = pivot + 1; + } + } + if (location == -1 && autoHide) + Cancel(); + else + lb->Select(location); +} + diff --git a/sdk/wxscintilla/src/scintilla/src/AutoComplete.h b/sdk/wxscintilla/src/scintilla/src/AutoComplete.h new file mode 100644 index 0000000..f48cb05 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/AutoComplete.h @@ -0,0 +1,78 @@ +// Scintilla source code edit control +/** @file AutoComplete.h + ** Defines the auto completion list box. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef AUTOCOMPLETE_H +#define AUTOCOMPLETE_H + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +/** + */ +class AutoComplete { + bool active; + char stopChars[256]; + char fillUpChars[256]; + char separator; + char typesep; // Type seperator + +public: + bool ignoreCase; + bool chooseSingle; + ListBox *lb; + int posStart; + int startLen; + /// Should autocompletion be canceled if editor's currentPos <= startPos? + bool cancelAtStartPos; + bool autoHide; + bool dropRestOfWord; + + AutoComplete(); + ~AutoComplete(); + + /// Is the auto completion list displayed? + bool Active() const; + + /// Display the auto completion list positioned to be near a character position + void Start(Window &parent, int ctrlID, int position, Point location, + int startLen_, int lineHeight, bool unicodeMode); + + /// The stop chars are characters which, when typed, cause the auto completion list to disappear + void SetStopChars(const char *stopChars_); + bool IsStopChar(char ch); + + /// The fillup chars are characters which, when typed, fill up the selected word + void SetFillUpChars(const char *fillUpChars_); + bool IsFillUpChar(char ch); + + /// The separator character is used when interpreting the list in SetList + void SetSeparator(char separator_); + char GetSeparator() const; + + /// The typesep character is used for seperating the word from the type + void SetTypesep(char separator_); + char GetTypesep() const; + + /// The list string contains a sequence of words separated by the separator character + void SetList(const char *list); + + void Show(bool show); + void Cancel(); + + /// Move the current list element by delta, scrolling appropriately + void Move(int delta); + + /// Select a list element that starts with word as the current element + void Select(const char *word); +}; + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/CallTip.cxx b/sdk/wxscintilla/src/scintilla/src/CallTip.cxx new file mode 100644 index 0000000..fe1d589 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/CallTip.cxx @@ -0,0 +1,387 @@ +// Scintilla source code edit control +/** @file CallTip.cxx + ** Code for displaying call tips. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include + +#include "Platform.h" + +#include "Scintilla.h" +#include "CallTip.h" +#include + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static const int insetX = 5; // text inset in x from calltip border +static const int widthArrow = 14; + +CallTip::CallTip() { + wCallTip = 0; + inCallTipMode = false; + posStartCallTip = 0; + val = 0; + rectUp = PRectangle(0,0,0,0); + rectDown = PRectangle(0,0,0,0); + lineHeight = 1; + startHighlight = 0; + endHighlight = 0; + tabSize = 0; + useStyleCallTip = false; // for backwards compatibility + +#ifdef __APPLE__ + // proper apple colours for the default + colourBG.desired = ColourDesired(0xff, 0xff, 0xc6); + colourUnSel.desired = ColourDesired(0, 0, 0); +#else + colourBG.desired = ColourDesired(0xff, 0xff, 0xff); + colourUnSel.desired = ColourDesired(0x80, 0x80, 0x80); +#endif + colourSel.desired = ColourDesired(0, 0, 0x80); + colourShade.desired = ColourDesired(0, 0, 0); + colourLight.desired = ColourDesired(0xc0, 0xc0, 0xc0); + + // ERAN IFRAH + ColourDesired c(0, 0, 255); + ColourAllocated ca(c.AsLong()); + + colourDoxyHighlight = ca; + colourDivider = ColourAllocated(0); + // ERAN IFRAH - END +} + +CallTip::~CallTip() { + font.Release(); + wCallTip.Destroy(); + delete []val; + val = 0; +} + +void CallTip::RefreshColourPalette(Palette &pal, bool want) { + pal.WantFind(colourBG, want); + pal.WantFind(colourUnSel, want); + pal.WantFind(colourSel, want); + pal.WantFind(colourShade, want); + pal.WantFind(colourLight, want); +} + +// Although this test includes 0, we should never see a \0 character. +static bool IsArrowCharacter(char ch) { + return (ch == 0) || (ch == '\001') || (ch == '\002'); +} + +// ERAN IFRAH +static bool IsDoxyKeyWord(const char* s, int &len) { + len = 0; + if(s[0] == '@' || s[0] == '\\') { + len = 1; + for(size_t i=0; i 0; +} +// ERAN IFRAH - END + +// We ignore tabs unless a tab width has been set. +bool CallTip::IsTabCharacter(char ch) const { + return (tabSize > 0) && (ch == '\t'); +} + +int CallTip::NextTabPos(int x) { + if (tabSize > 0) { // paranoia... not called unless this is true + x -= insetX; // position relative to text + x = (x + tabSize) / tabSize; // tab "number" + return tabSize*x + insetX; // position of next tab + } else { + return x + 1; // arbitrary + } +} + +// Draw a section of the call tip that does not include \n in one colour. +// The text may include up to numEnds tabs or arrow characters. +void CallTip::DrawChunk(Surface *surface, int &x, const char *s, + int posStart, int posEnd, int ytext, PRectangle rcClient, + bool highlight, bool draw) { + s += posStart; + int len = posEnd - posStart; + + // Divide the text into sections that are all text, or that are + // single arrows or single tab characters (if tabSize > 0). + int maxEnd = 0; + const int numEnds = 10; + int ends[numEnds + 2]; + + // ERAN IFRAH + int doxyWordLen = 0; + for (int i=0;i 0) + ends[maxEnd++] = i; + ends[maxEnd++] = i+1; + } else if((maxEnd < numEnds) && IsDoxyKeyWord(s+i, doxyWordLen)) { + // we found a doxygen word + if(i > 0) + ends[maxEnd++] = i; + ends[maxEnd++] = i + doxyWordLen; + i += len; + } + } + + // If we find this magic string, we translate it into + // a horizontal line in the tip + bool isLine (false); + if(strncmp(s, "@@LINE@@", 8) == 0) { + isLine = true; + } + // ERAN IFRAH - END + + ends[maxEnd++] = len; + int startSeg = 0; + int xEnd; + for (int seg = 0; seg startSeg) { + // ERAN IFRAH + if(isLine) { + int ww = rcClient.Width(); + rcClient.left = x; + rcClient.right = rcClient.left + ww; + surface->PenColour(colourDivider); + surface->MoveTo(0, rcClient.top); + surface->LineTo(rcClient.right, rcClient.top); + xEnd = rcClient.right; + // END + } else if (IsArrowCharacter(s[startSeg])) { + bool upArrow = s[startSeg] == '\001'; + rcClient.left = x; + rcClient.right = rcClient.left + widthArrow; + if (draw) { + const int halfWidth = widthArrow / 2 - 3; + const int centreX = rcClient.left + widthArrow / 2 - 1; + const int centreY = (rcClient.top + rcClient.bottom) / 2; + surface->FillRectangle(rcClient, colourBG.allocated); + PRectangle rcClientInner(rcClient.left + 1, rcClient.top + 1, + rcClient.right - 2, rcClient.bottom - 1); + surface->FillRectangle(rcClientInner, colourUnSel.allocated); + + if (upArrow) { // Up arrow + Point pts[] = { + Point(centreX - halfWidth, centreY + halfWidth / 2), + Point(centreX + halfWidth, centreY + halfWidth / 2), + Point(centreX, centreY - halfWidth + halfWidth / 2), + }; + surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]), + colourBG.allocated, colourBG.allocated); + } else { // Down arrow + Point pts[] = { + Point(centreX - halfWidth, centreY - halfWidth / 2), + Point(centreX + halfWidth, centreY - halfWidth / 2), + Point(centreX, centreY + halfWidth - halfWidth / 2), + }; + surface->Polygon(pts, sizeof(pts) / sizeof(pts[0]), + colourBG.allocated, colourBG.allocated); + } + } + xEnd = rcClient.right; + offsetMain = xEnd; + if (upArrow) { + rectUp = rcClient; + } else { + rectDown = rcClient; + } + } else if (IsTabCharacter(s[startSeg])) { + xEnd = NextTabPos(x); + } else { + // ERAN IFRAH + bool doxyHighlight = (s[startSeg] == '@' || s[startSeg] == '\\'); + xEnd = x + surface->WidthText(font, s + startSeg, endSeg - startSeg); + if (draw) + { + rcClient.left = x; + rcClient.right = xEnd; + if(doxyHighlight) { + surface->DrawTextTransparent(rcClient, font, ytext, + s+startSeg, endSeg - startSeg, + colourDoxyHighlight); + } else { + surface->DrawTextTransparent(rcClient, font, ytext, + s+startSeg, endSeg - startSeg, + highlight ? colourSel.allocated : colourUnSel.allocated); + } + } + // ERAN IFRAH - END + } + x = xEnd; + startSeg = endSeg; + } + } +} + +int CallTip::PaintContents(Surface *surfaceWindow, bool draw) { + PRectangle rcClientPos = wCallTip.GetClientPosition(); + PRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left, + rcClientPos.bottom - rcClientPos.top); + PRectangle rcClient(1, 1, rcClientSize.right - 1, rcClientSize.bottom - 1); + + // To make a nice small call tip window, it is only sized to fit most normal characters without accents + int ascent = surfaceWindow->Ascent(font) - surfaceWindow->InternalLeading(font); + + // For each line... + // Draw the definition in three parts: before highlight, highlighted, after highlight + int ytext = rcClient.top + ascent + 1; + rcClient.bottom = ytext + surfaceWindow->Descent(font) + 1; + char *chunkVal = val; + bool moreChunks = true; + int maxWidth = 0; + + while (moreChunks) { + char *chunkEnd = strchr(chunkVal, '\n'); + if (chunkEnd == NULL) { + chunkEnd = chunkVal + strlen(chunkVal); + moreChunks = false; + } + int chunkOffset = chunkVal - val; + int chunkLength = chunkEnd - chunkVal; + int chunkEndOffset = chunkOffset + chunkLength; + int thisStartHighlight = Platform::Maximum(startHighlight, chunkOffset); + thisStartHighlight = Platform::Minimum(thisStartHighlight, chunkEndOffset); + thisStartHighlight -= chunkOffset; + int thisEndHighlight = Platform::Maximum(endHighlight, chunkOffset); + thisEndHighlight = Platform::Minimum(thisEndHighlight, chunkEndOffset); + thisEndHighlight -= chunkOffset; + rcClient.top = ytext - ascent - 1; + + int x = insetX; // start each line at this inset + + DrawChunk(surfaceWindow, x, chunkVal, 0, thisStartHighlight, + ytext, rcClient, false, draw); + DrawChunk(surfaceWindow, x, chunkVal, thisStartHighlight, thisEndHighlight, + ytext, rcClient, true, draw); + DrawChunk(surfaceWindow, x, chunkVal, thisEndHighlight, chunkLength, + ytext, rcClient, false, draw); + + chunkVal = chunkEnd + 1; + ytext += lineHeight; + rcClient.bottom += lineHeight; + maxWidth = Platform::Maximum(maxWidth, x); + } + return maxWidth; +} + +void CallTip::PaintCT(Surface *surfaceWindow) { + if (!val) + return; + PRectangle rcClientPos = wCallTip.GetClientPosition(); + PRectangle rcClientSize(0, 0, rcClientPos.right - rcClientPos.left, + rcClientPos.bottom - rcClientPos.top); + PRectangle rcClient(1, 1, rcClientSize.right - 1, rcClientSize.bottom - 1); + + surfaceWindow->FillRectangle(rcClient, colourBG.allocated); + + offsetMain = insetX; // initial alignment assuming no arrows + PaintContents(surfaceWindow, true); + + // OSX doesn't put borders on "help tags" + // Draw a raised border around the edges of the window + surfaceWindow->MoveTo(0, rcClientSize.bottom - 1); + surfaceWindow->PenColour(colourShade.allocated); + surfaceWindow->LineTo(rcClientSize.right - 1, rcClientSize.bottom - 1); + surfaceWindow->LineTo(rcClientSize.right - 1, 0); + surfaceWindow->PenColour(colourShade.allocated); + surfaceWindow->LineTo(0, 0); + surfaceWindow->LineTo(0, rcClientSize.bottom - 1); +} + +void CallTip::MouseClick(Point pt) { + clickPlace = 0; + if (rectUp.Contains(pt)) + clickPlace = 1; + if (rectDown.Contains(pt)) + clickPlace = 2; +} + +PRectangle CallTip::CallTipStart(int pos, Point pt, const char *defn, + const char *faceName, int size, + int codePage_, int characterSet, Window &wParent) { + clickPlace = 0; + delete []val; + val = 0; + val = new char[strlen(defn) + 1]; + strcpy(val, defn); + codePage = codePage_; + Surface *surfaceMeasure = Surface::Allocate(); + if (!surfaceMeasure) + return PRectangle(); + surfaceMeasure->Init(wParent.GetID()); + surfaceMeasure->SetUnicodeMode(SC_CP_UTF8 == codePage); + surfaceMeasure->SetDBCSMode(codePage); + startHighlight = 0; + endHighlight = 0; + inCallTipMode = true; + posStartCallTip = pos; + int deviceHeight = surfaceMeasure->DeviceHeightFont(size); + font.Create(faceName, characterSet, deviceHeight, false, false); + // Look for multiple lines in the text + // Only support \n here - simply means container must avoid \r! + int numLines = 1; + const char *newline; + const char *look = val; + rectUp = PRectangle(0,0,0,0); + rectDown = PRectangle(0,0,0,0); + offsetMain = insetX; // changed to right edge of any arrows + int width = PaintContents(surfaceMeasure, false) + insetX; + while ((newline = strchr(look, '\n')) != NULL) { + look = newline + 1; + numLines++; + } + lineHeight = surfaceMeasure->Height(font); + + // Extra line for border and an empty line at top and bottom. The returned + // rectangle is aligned to the right edge of the last arrow encountered in + // the tip text, else to the tip text left edge. + int height = lineHeight * numLines - surfaceMeasure->InternalLeading(font) + 2 + 2; + delete surfaceMeasure; + return PRectangle(pt.x - offsetMain, pt.y + 1, pt.x + width - offsetMain, pt.y + 1 + height); +} + +void CallTip::CallTipCancel() { + inCallTipMode = false; + if (wCallTip.Created()) { + wCallTip.Destroy(); + } +} + +void CallTip::SetHighlight(int start, int end) { + // Avoid flashing by checking something has really changed + if ((start != startHighlight) || (end != endHighlight)) { + startHighlight = start; + endHighlight = end; + if (wCallTip.Created()) { + wCallTip.InvalidateAll(); + } + } +} + +// Set the tab size (sizes > 0 enable the use of tabs). This also enables the +// use of the STYLE_CALLTIP. +void CallTip::SetTabSize(int tabSz) { + tabSize = tabSz; + useStyleCallTip = true; +} + +// It might be better to have two access functions for this and to use +// them for all settings of colours. +void CallTip::SetForeBack(const ColourPair &fore, const ColourPair &back) { + colourBG = back; + colourUnSel = fore; +} diff --git a/sdk/wxscintilla/src/scintilla/src/CallTip.h b/sdk/wxscintilla/src/scintilla/src/CallTip.h new file mode 100644 index 0000000..b01f0a6 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/CallTip.h @@ -0,0 +1,91 @@ +// Scintilla source code edit control +/** @file CallTip.h + ** Interface to the call tip control. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef CALLTIP_H +#define CALLTIP_H + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +/** + */ +class CallTip { + int startHighlight; // character offset to start and... + int endHighlight; // ...end of highlighted text + char *val; + Font font; + PRectangle rectUp; // rectangle of last up angle in the tip + PRectangle rectDown; // rectangle of last down arrow in the tip + int lineHeight; // vertical line spacing + int offsetMain; // The alignment point of the call tip + int tabSize; // Tab size in pixels, <=0 no TAB expand + bool useStyleCallTip; // if true, STYLE_CALLTIP should be used + + // Private so CallTip objects can not be copied + CallTip(const CallTip &); + CallTip &operator=(const CallTip &); + void DrawChunk(Surface *surface, int &x, const char *s, + int posStart, int posEnd, int ytext, PRectangle rcClient, + bool highlight, bool draw); + int PaintContents(Surface *surfaceWindow, bool draw); + bool IsTabCharacter(char c) const; + int NextTabPos(int x); + +public: + Window wCallTip; + Window wDraw; + bool inCallTipMode; + int posStartCallTip; + ColourPair colourBG; + ColourPair colourUnSel; + ColourPair colourSel; + ColourPair colourShade; + ColourPair colourLight; + // ERAN IFRAH + ColourAllocated colourDivider; + ColourAllocated colourDoxyHighlight; + // ERAN IFRAH - END + int codePage; + int clickPlace; + + CallTip(); + ~CallTip(); + + /// Claim or accept palette entries for the colours required to paint a calltip. + void RefreshColourPalette(Palette &pal, bool want); + + void PaintCT(Surface *surfaceWindow); + + void MouseClick(Point pt); + + /// Setup the calltip and return a rectangle of the area required. + PRectangle CallTipStart(int pos, Point pt, const char *defn, + const char *faceName, int size, int codePage_, + int characterSet, Window &wParent); + + void CallTipCancel(); + + /// Set a range of characters to be displayed in a highlight style. + /// Commonly used to highlight the current parameter. + void SetHighlight(int start, int end); + + /// Set the tab size in pixels for the call tip. 0 or -ve means no tab expand. + void SetTabSize(int tabSz); + + /// Used to determine which STYLE_xxxx to use for call tip information + bool UseStyleCallTip() const { return useStyleCallTip;} + + // Modify foreground and background colours + void SetForeBack(const ColourPair &fore, const ColourPair &back); +}; + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/CellBuffer.cxx b/sdk/wxscintilla/src/scintilla/src/CellBuffer.cxx new file mode 100644 index 0000000..6c116ba --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/CellBuffer.cxx @@ -0,0 +1,656 @@ +// Scintilla source code edit control +/** @file CellBuffer.cxx + ** Manages a buffer of cells. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include "Platform.h" + +#include "Scintilla.h" +#include "SplitVector.h" +#include "Partitioning.h" +#include "CellBuffer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +LineVector::LineVector() : starts(256), perLine(0) { + Init(); +} + +LineVector::~LineVector() { + starts.DeleteAll(); +} + +void LineVector::Init() { + starts.DeleteAll(); + if (perLine) { + perLine->Init(); + } +} + +void LineVector::SetPerLine(PerLine *pl) { + perLine = pl; +} + +void LineVector::InsertText(int line, int delta) { + starts.InsertText(line, delta); +} + +void LineVector::InsertLine(int line, int position, bool lineStart) { + starts.InsertPartition(line, position); + if (perLine) { + if ((line > 0) && lineStart) + line--; + perLine->InsertLine(line); + } +} + +void LineVector::SetLineStart(int line, int position) { + starts.SetPartitionStartPosition(line, position); +} + +void LineVector::RemoveLine(int line) { + starts.RemovePartition(line); + if (perLine) { + perLine->RemoveLine(line); + } +} + +int LineVector::LineFromPosition(int pos) const { + return starts.PartitionFromPosition(pos); +} + +Action::Action() { + at = startAction; + position = 0; + data = 0; + lenData = 0; + mayCoalesce = false; +} + +Action::~Action() { + Destroy(); +} + +void Action::Create(actionType at_, int position_, char *data_, int lenData_, bool mayCoalesce_) { + delete []data; + position = position_; + at = at_; + data = data_; + lenData = lenData_; + mayCoalesce = mayCoalesce_; +} + +void Action::Destroy() { + delete []data; + data = 0; +} + +void Action::Grab(Action *source) { + delete []data; + + position = source->position; + at = source->at; + data = source->data; + lenData = source->lenData; + mayCoalesce = source->mayCoalesce; + + // Ownership of source data transferred to this + source->position = 0; + source->at = startAction; + source->data = 0; + source->lenData = 0; + source->mayCoalesce = true; +} + +// The undo history stores a sequence of user operations that represent the user's view of the +// commands executed on the text. +// Each user operation contains a sequence of text insertion and text deletion actions. +// All the user operations are stored in a list of individual actions with 'start' actions used +// as delimiters between user operations. +// Initially there is one start action in the history. +// As each action is performed, it is recorded in the history. The action may either become +// part of the current user operation or may start a new user operation. If it is to be part of the +// current operation, then it overwrites the current last action. If it is to be part of a new +// operation, it is appended after the current last action. +// After writing the new action, a new start action is appended at the end of the history. +// The decision of whether to start a new user operation is based upon two factors. If a +// compound operation has been explicitly started by calling BeginUndoAction and no matching +// EndUndoAction (these calls nest) has been called, then the action is coalesced into the current +// operation. If there is no outstanding BeginUndoAction call then a new operation is started +// unless it looks as if the new action is caused by the user typing or deleting a stream of text. +// Sequences that look like typing or deletion are coalesced into a single user operation. + +UndoHistory::UndoHistory() { + + lenActions = 100; + actions = new Action[lenActions]; + maxAction = 0; + currentAction = 0; + undoSequenceDepth = 0; + savePoint = 0; + + actions[currentAction].Create(startAction); +} + +UndoHistory::~UndoHistory() { + delete []actions; + actions = 0; +} + +void UndoHistory::EnsureUndoRoom() { + // Have to test that there is room for 2 more actions in the array + // as two actions may be created by the calling function + if (currentAction >= (lenActions - 2)) { + // Run out of undo nodes so extend the array + int lenActionsNew = lenActions * 2; + Action *actionsNew = new Action[lenActionsNew]; + for (int act = 0; act <= currentAction; act++) + actionsNew[act].Grab(&actions[act]); + delete []actions; + lenActions = lenActionsNew; + actions = actionsNew; + } +} + +void UndoHistory::AppendAction(actionType at, int position, char *data, int lengthData, + bool &startSequence, bool mayCoalesce) { + EnsureUndoRoom(); + //Platform::DebugPrintf("%% %d action %d %d %d\n", at, position, lengthData, currentAction); + //Platform::DebugPrintf("^ %d action %d %d\n", actions[currentAction - 1].at, + // actions[currentAction - 1].position, actions[currentAction - 1].lenData); + if (currentAction < savePoint) { + savePoint = -1; + } + int oldCurrentAction = currentAction; + if (currentAction >= 1) { + if (0 == undoSequenceDepth) { + // Top level actions may not always be coalesced + int targetAct = -1; + const Action *actPrevious = &(actions[currentAction + targetAct]); + // Container actions may forward the coalesce state of Scintilla Actions. + while ((actPrevious->at == containerAction) && actPrevious->mayCoalesce) { + targetAct--; + actPrevious = &(actions[currentAction + targetAct]); + } + // See if current action can be coalesced into previous action + // Will work if both are inserts or deletes and position is same + if (currentAction == savePoint) { + currentAction++; + } else if (!actions[currentAction].mayCoalesce) { + // Not allowed to coalesce if this set + currentAction++; + } else if (!mayCoalesce || !actPrevious->mayCoalesce) { + currentAction++; + } else if (at == containerAction || actions[currentAction].at == containerAction) { + ; // A coalescible containerAction + } else if ((at != actPrevious->at) && (actPrevious->at != startAction)) { + currentAction++; + } else if ((at == insertAction) && + (position != (actPrevious->position + actPrevious->lenData))) { + // Insertions must be immediately after to coalesce + currentAction++; + } else if (at == removeAction) { + if ((lengthData == 1) || (lengthData == 2)){ + if ((position + lengthData) == actPrevious->position) { + ; // Backspace -> OK + } else if (position == actPrevious->position) { + ; // Delete -> OK + } else { + // Removals must be at same position to coalesce + currentAction++; + } + } else { + // Removals must be of one character to coalesce + currentAction++; + } + } else { + // Action coalesced. + } + + } else { + // Actions not at top level are always coalesced unless this is after return to top level + if (!actions[currentAction].mayCoalesce) + currentAction++; + } + } else { + currentAction++; + } + startSequence = oldCurrentAction != currentAction; + actions[currentAction].Create(at, position, data, lengthData, mayCoalesce); + currentAction++; + actions[currentAction].Create(startAction); + maxAction = currentAction; +} + +void UndoHistory::BeginUndoAction() { + EnsureUndoRoom(); + if (undoSequenceDepth == 0) { + if (actions[currentAction].at != startAction) { + currentAction++; + actions[currentAction].Create(startAction); + maxAction = currentAction; + } + actions[currentAction].mayCoalesce = false; + } + undoSequenceDepth++; +} + +void UndoHistory::EndUndoAction() { + PLATFORM_ASSERT(undoSequenceDepth > 0); + EnsureUndoRoom(); + undoSequenceDepth--; + if (0 == undoSequenceDepth) { + if (actions[currentAction].at != startAction) { + currentAction++; + actions[currentAction].Create(startAction); + maxAction = currentAction; + } + actions[currentAction].mayCoalesce = false; + } +} + +void UndoHistory::DropUndoSequence() { + undoSequenceDepth = 0; +} + +void UndoHistory::DeleteUndoHistory() { + for (int i = 1; i < maxAction; i++) + actions[i].Destroy(); + maxAction = 0; + currentAction = 0; + actions[currentAction].Create(startAction); + savePoint = 0; +} + +void UndoHistory::SetSavePoint() { + savePoint = currentAction; +} + +bool UndoHistory::IsSavePoint() const { + return savePoint == currentAction; +} + +bool UndoHistory::CanUndo() const { + return (currentAction > 0) && (maxAction > 0); +} + +int UndoHistory::StartUndo() { + // Drop any trailing startAction + if (actions[currentAction].at == startAction && currentAction > 0) + currentAction--; + + // Count the steps in this action + int act = currentAction; + while (actions[act].at != startAction && act > 0) { + act--; + } + return currentAction - act; +} + +const Action &UndoHistory::GetUndoStep() const { + return actions[currentAction]; +} + +void UndoHistory::CompletedUndoStep() { + currentAction--; +} + +bool UndoHistory::CanRedo() const { + return maxAction > currentAction; +} + +int UndoHistory::StartRedo() { + // Drop any leading startAction + if (actions[currentAction].at == startAction && currentAction < maxAction) + currentAction++; + + // Count the steps in this action + int act = currentAction; + while (actions[act].at != startAction && act < maxAction) { + act++; + } + return act - currentAction; +} + +const Action &UndoHistory::GetRedoStep() const { + return actions[currentAction]; +} + +void UndoHistory::CompletedRedoStep() { + currentAction++; +} + +CellBuffer::CellBuffer() { + readOnly = false; + collectingUndo = true; +} + +CellBuffer::~CellBuffer() { +} + +char CellBuffer::CharAt(int position) const { + return substance.ValueAt(position); +} + +void CellBuffer::GetCharRange(char *buffer, int position, int lengthRetrieve) const { + if (lengthRetrieve < 0) + return; + if (position < 0) + return; + if ((position + lengthRetrieve) > substance.Length()) { + Platform::DebugPrintf("Bad GetCharRange %d for %d of %d\n", position, + lengthRetrieve, substance.Length()); + return; + } + + for (int i=0; i((curVal & ~mask) | styleValue)); + return true; + } else { + return false; + } +} + +bool CellBuffer::SetStyleFor(int position, int lengthStyle, char styleValue, char mask) { + bool changed = false; + PLATFORM_ASSERT(lengthStyle == 0 || + (lengthStyle > 0 && lengthStyle + position <= style.Length())); + while (lengthStyle--) { + char curVal = style.ValueAt(position); + if ((curVal & mask) != styleValue) { + style.SetValueAt(position, static_cast((curVal & ~mask) | styleValue)); + changed = true; + } + position++; + } + return changed; +} + +// The char* returned is to an allocation owned by the undo history +const char *CellBuffer::DeleteChars(int position, int deleteLength, bool &startSequence) { + // InsertString and DeleteChars are the bottleneck though which all changes occur + PLATFORM_ASSERT(deleteLength > 0); + char *data = 0; + if (!readOnly) { + if (collectingUndo) { + // Save into the undo/redo stack, but only the characters - not the formatting + data = new char[deleteLength]; + for (int i = 0; i < deleteLength; i++) { + data[i] = substance.ValueAt(position + i); + } + uh.AppendAction(removeAction, position, data, deleteLength, startSequence); + } + + BasicDeleteChars(position, deleteLength); + } + return data; +} + +int CellBuffer::Length() const { + return substance.Length(); +} + +void CellBuffer::Allocate(int newSize) { + substance.ReAllocate(newSize); + style.ReAllocate(newSize); +} + +void CellBuffer::SetPerLine(PerLine *pl) { + lv.SetPerLine(pl); +} + +int CellBuffer::Lines() const { + return lv.Lines(); +} + +int CellBuffer::LineStart(int line) const { + if (line < 0) + return 0; + else if (line >= Lines()) + return Length(); + else + return lv.LineStart(line); +} + +bool CellBuffer::IsReadOnly() const { + return readOnly; +} + +void CellBuffer::SetReadOnly(bool set) { + readOnly = set; +} + +void CellBuffer::SetSavePoint() { + uh.SetSavePoint(); +} + +bool CellBuffer::IsSavePoint() { + return uh.IsSavePoint(); +} + +// Without undo + +void CellBuffer::InsertLine(int line, int position, bool lineStart) { + lv.InsertLine(line, position, lineStart); +} + +void CellBuffer::RemoveLine(int line) { + lv.RemoveLine(line); +} + +void CellBuffer::BasicInsertString(int position, const char *s, int insertLength) { + if (insertLength == 0) + return; + PLATFORM_ASSERT(insertLength > 0); + + substance.InsertFromArray(position, s, 0, insertLength); + style.InsertValue(position, insertLength, 0); + + int lineInsert = lv.LineFromPosition(position) + 1; + bool atLineStart = lv.LineStart(lineInsert-1) == position; + // Point all the lines after the insertion point further along in the buffer + lv.InsertText(lineInsert-1, insertLength); + char chPrev = substance.ValueAt(position - 1); + char chAfter = substance.ValueAt(position + insertLength); + if (chPrev == '\r' && chAfter == '\n') { + // Splitting up a crlf pair at position + InsertLine(lineInsert, position, false); + lineInsert++; + } + char ch = ' '; + for (int i = 0; i < insertLength; i++) { + ch = s[i]; + if (ch == '\r') { + InsertLine(lineInsert, (position + i) + 1, atLineStart); + lineInsert++; + } else if (ch == '\n') { + if (chPrev == '\r') { + // Patch up what was end of line + lv.SetLineStart(lineInsert - 1, (position + i) + 1); + } else { + InsertLine(lineInsert, (position + i) + 1, atLineStart); + lineInsert++; + } + } + chPrev = ch; + } + // Joining two lines where last insertion is cr and following substance starts with lf + if (chAfter == '\n') { + if (ch == '\r') { + // End of line already in buffer so drop the newly created one + RemoveLine(lineInsert - 1); + } + } +} + +void CellBuffer::BasicDeleteChars(int position, int deleteLength) { + if (deleteLength == 0) + return; + + if ((position == 0) && (deleteLength == substance.Length())) { + // If whole buffer is being deleted, faster to reinitialise lines data + // than to delete each line. + lv.Init(); + } else { + // Have to fix up line positions before doing deletion as looking at text in buffer + // to work out which lines have been removed + + int lineRemove = lv.LineFromPosition(position) + 1; + lv.InsertText(lineRemove-1, - (deleteLength)); + char chPrev = substance.ValueAt(position - 1); + char chBefore = chPrev; + char chNext = substance.ValueAt(position); + bool ignoreNL = false; + if (chPrev == '\r' && chNext == '\n') { + // Move back one + lv.SetLineStart(lineRemove, position); + lineRemove++; + ignoreNL = true; // First \n is not real deletion + } + + char ch = chNext; + for (int i = 0; i < deleteLength; i++) { + chNext = substance.ValueAt(position + i + 1); + if (ch == '\r') { + if (chNext != '\n') { + RemoveLine(lineRemove); + } + } else if (ch == '\n') { + if (ignoreNL) { + ignoreNL = false; // Further \n are real deletions + } else { + RemoveLine(lineRemove); + } + } + + ch = chNext; + } + // May have to fix up end if last deletion causes cr to be next to lf + // or removes one of a crlf pair + char chAfter = substance.ValueAt(position + deleteLength); + if (chBefore == '\r' && chAfter == '\n') { + // Using lineRemove-1 as cr ended line before start of deletion + RemoveLine(lineRemove - 1); + lv.SetLineStart(lineRemove - 1, position + 1); + } + } + substance.DeleteRange(position, deleteLength); + style.DeleteRange(position, deleteLength); +} + +bool CellBuffer::SetUndoCollection(bool collectUndo) { + collectingUndo = collectUndo; + uh.DropUndoSequence(); + return collectingUndo; +} + +bool CellBuffer::IsCollectingUndo() const { + return collectingUndo; +} + +void CellBuffer::BeginUndoAction() { + uh.BeginUndoAction(); +} + +void CellBuffer::EndUndoAction() { + uh.EndUndoAction(); +} + +void CellBuffer::AddUndoAction(int token, bool mayCoalesce) { + bool startSequence; + uh.AppendAction(containerAction, token, 0, 0, startSequence, mayCoalesce); +} + +void CellBuffer::DeleteUndoHistory() { + uh.DeleteUndoHistory(); +} + +bool CellBuffer::CanUndo() { + return uh.CanUndo(); +} + +int CellBuffer::StartUndo() { + return uh.StartUndo(); +} + +const Action &CellBuffer::GetUndoStep() const { + return uh.GetUndoStep(); +} + +void CellBuffer::PerformUndoStep() { + const Action &actionStep = uh.GetUndoStep(); + if (actionStep.at == insertAction) { + BasicDeleteChars(actionStep.position, actionStep.lenData); + } else if (actionStep.at == removeAction) { + BasicInsertString(actionStep.position, actionStep.data, actionStep.lenData); + } + uh.CompletedUndoStep(); +} + +bool CellBuffer::CanRedo() { + return uh.CanRedo(); +} + +int CellBuffer::StartRedo() { + return uh.StartRedo(); +} + +const Action &CellBuffer::GetRedoStep() const { + return uh.GetRedoStep(); +} + +void CellBuffer::PerformRedoStep() { + const Action &actionStep = uh.GetRedoStep(); + if (actionStep.at == insertAction) { + BasicInsertString(actionStep.position, actionStep.data, actionStep.lenData); + } else if (actionStep.at == removeAction) { + BasicDeleteChars(actionStep.position, actionStep.lenData); + } + uh.CompletedRedoStep(); +} + diff --git a/sdk/wxscintilla/src/scintilla/src/CellBuffer.h b/sdk/wxscintilla/src/scintilla/src/CellBuffer.h new file mode 100644 index 0000000..78f586e --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/CellBuffer.h @@ -0,0 +1,208 @@ +// Scintilla source code edit control +/** @file CellBuffer.h + ** Manages the text of the document. + **/ +// Copyright 1998-2004 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef CELLBUFFER_H +#define CELLBUFFER_H + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +// Interface to per-line data that wants to see each line insertion and deletion +class PerLine { +public: + virtual ~PerLine() {} + virtual void Init()=0; + virtual void InsertLine(int)=0; + virtual void RemoveLine(int)=0; +}; + +/** + * The line vector contains information about each of the lines in a cell buffer. + */ +class LineVector { + + Partitioning starts; + PerLine *perLine; + +public: + + LineVector(); + ~LineVector(); + void Init(); + void SetPerLine(PerLine *pl); + + void InsertText(int line, int delta); + void InsertLine(int line, int position, bool lineStart); + void SetLineStart(int line, int position); + void RemoveLine(int line); + int Lines() const { + return starts.Partitions(); + } + int LineFromPosition(int pos) const; + int LineStart(int line) const { + return starts.PositionFromPartition(line); + } + + int MarkValue(int line); + int AddMark(int line, int marker); + void MergeMarkers(int pos); + void DeleteMark(int line, int markerNum, bool all); + void DeleteMarkFromHandle(int markerHandle); + int LineFromHandle(int markerHandle); + + void ClearLevels(); + int SetLevel(int line, int level); + int GetLevel(int line); + + int SetLineState(int line, int state); + int GetLineState(int line); + int GetMaxLineState(); + +}; + +enum actionType { insertAction, removeAction, startAction, containerAction }; + +/** + * Actions are used to store all the information required to perform one undo/redo step. + */ +class Action { +public: + actionType at; + int position; + char *data; + int lenData; + bool mayCoalesce; + + Action(); + ~Action(); + void Create(actionType at_, int position_=0, char *data_=0, int lenData_=0, bool mayCoalesce_=true); + void Destroy(); + void Grab(Action *source); +}; + +/** + * + */ +class UndoHistory { + Action *actions; + int lenActions; + int maxAction; + int currentAction; + int undoSequenceDepth; + int savePoint; + + void EnsureUndoRoom(); + +public: + UndoHistory(); + ~UndoHistory(); + + void AppendAction(actionType at, int position, char *data, int length, bool &startSequence, bool mayCoalesce=true); + + void BeginUndoAction(); + void EndUndoAction(); + void DropUndoSequence(); + void DeleteUndoHistory(); + + /// The save point is a marker in the undo stack where the container has stated that + /// the buffer was saved. Undo and redo can move over the save point. + void SetSavePoint(); + bool IsSavePoint() const; + + /// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is + /// called that many times. Similarly for redo. + bool CanUndo() const; + int StartUndo(); + const Action &GetUndoStep() const; + void CompletedUndoStep(); + bool CanRedo() const; + int StartRedo(); + const Action &GetRedoStep() const; + void CompletedRedoStep(); +}; + +/** + * Holder for an expandable array of characters that supports undo and line markers. + * Based on article "Data Structures in a Bit-Mapped Text Editor" + * by Wilfred J. Hansen, Byte January 1987, page 183. + */ +class CellBuffer { +private: + SplitVector substance; + SplitVector style; + bool readOnly; + + bool collectingUndo; + UndoHistory uh; + + LineVector lv; + +public: + + CellBuffer(); + ~CellBuffer(); + + /// Retrieving positions outside the range of the buffer works and returns 0 + char CharAt(int position) const; + void GetCharRange(char *buffer, int position, int lengthRetrieve) const; + char StyleAt(int position) const; + const char *BufferPointer(); + + int Length() const; + void Allocate(int newSize); + void SetPerLine(PerLine *pl); + int Lines() const; + int LineStart(int line) const; + int LineFromPosition(int pos) const { return lv.LineFromPosition(pos); } + void InsertLine(int line, int position, bool lineStart); + void RemoveLine(int line); + const char *InsertString(int position, const char *s, int insertLength, bool &startSequence); + + /// Setting styles for positions outside the range of the buffer is safe and has no effect. + /// @return true if the style of a character is changed. + bool SetStyleAt(int position, char styleValue, char mask='\377'); + bool SetStyleFor(int position, int length, char styleValue, char mask); + + const char *DeleteChars(int position, int deleteLength, bool &startSequence); + + bool IsReadOnly() const; + void SetReadOnly(bool set); + + /// The save point is a marker in the undo stack where the container has stated that + /// the buffer was saved. Undo and redo can move over the save point. + void SetSavePoint(); + bool IsSavePoint(); + + /// Actions without undo + void BasicInsertString(int position, const char *s, int insertLength); + void BasicDeleteChars(int position, int deleteLength); + + bool SetUndoCollection(bool collectUndo); + bool IsCollectingUndo() const; + void BeginUndoAction(); + void EndUndoAction(); + void AddUndoAction(int token, bool mayCoalesce); + void DeleteUndoHistory(); + + /// To perform an undo, StartUndo is called to retrieve the number of steps, then UndoStep is + /// called that many times. Similarly for redo. + bool CanUndo(); + int StartUndo(); + const Action &GetUndoStep() const; + void PerformUndoStep(); + bool CanRedo(); + int StartRedo(); + const Action &GetRedoStep() const; + void PerformRedoStep(); +}; + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/CharClassify.cxx b/sdk/wxscintilla/src/scintilla/src/CharClassify.cxx new file mode 100644 index 0000000..bbd25a0 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/CharClassify.cxx @@ -0,0 +1,78 @@ +// Scintilla source code edit control +/** @file CharClassify.cxx + ** Character classifications used by Document and RESearch. + **/ +// Copyright 2006 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include + +#include "CharClassify.h" + +// Shut up annoying Visual C++ warnings: +#ifdef _MSC_VER +#pragma warning(disable: 4514) +#endif + +CharClassify::CharClassify() { + SetDefaultCharClasses(true); +} + +void CharClassify::SetDefaultCharClasses(bool includeWordClass) { + // Initialize all char classes to default values + for (int ch = 0; ch < 256; ch++) { + if (ch == '\r' || ch == '\n') + charClass[ch] = ccNewLine; + else if (ch < 0x20 || ch == ' ') + charClass[ch] = ccSpace; + else if (includeWordClass && (ch >= 0x80 || isalnum(ch) || ch == '_')) + charClass[ch] = ccWord; + else + charClass[ch] = ccPunctuation; + } +} + +void CharClassify::SetCharClasses(const unsigned char *chars, cc newCharClass) { + // Apply the newCharClass to the specifed chars + if (chars) { + while (*chars) { + charClass[*chars] = static_cast(newCharClass); + chars++; + } + } +} + +int CompareCaseInsensitive(const char *a, const char *b) { + while (*a && *b) { + if (*a != *b) { + char upperA = MakeUpperCase(*a); + char upperB = MakeUpperCase(*b); + if (upperA != upperB) + return upperA - upperB; + } + a++; + b++; + } + // Either *a or *b is nul + return *a - *b; +} + +int CompareNCaseInsensitive(const char *a, const char *b, size_t len) { + while (*a && *b && len) { + if (*a != *b) { + char upperA = MakeUpperCase(*a); + char upperB = MakeUpperCase(*b); + if (upperA != upperB) + return upperA - upperB; + } + a++; + b++; + len--; + } + if (len == 0) + return 0; + else + // Either *a or *b is nul + return *a - *b; +} diff --git a/sdk/wxscintilla/src/scintilla/src/CharClassify.h b/sdk/wxscintilla/src/scintilla/src/CharClassify.h new file mode 100644 index 0000000..d746fe0 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/CharClassify.h @@ -0,0 +1,37 @@ +// Scintilla source code edit control +/** @file CharClassify.h + ** Character classifications used by Document and RESearch. + **/ +// Copyright 2006-2009 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef CHARCLASSIFY_H +#define CHARCLASSIFY_H + +class CharClassify { +public: + CharClassify(); + + enum cc { ccSpace, ccNewLine, ccWord, ccPunctuation }; + void SetDefaultCharClasses(bool includeWordClass); + void SetCharClasses(const unsigned char *chars, cc newCharClass); + cc GetClass(unsigned char ch) const { return static_cast(charClass[ch]);} + bool IsWord(unsigned char ch) const { return static_cast(charClass[ch]) == ccWord;} + +private: + enum { maxChar=256 }; + unsigned char charClass[maxChar]; // not type cc to save space +}; + +// These functions are implemented because each platform calls them something different. +int CompareCaseInsensitive(const char *a, const char *b); +int CompareNCaseInsensitive(const char *a, const char *b, size_t len); + +inline char MakeUpperCase(char ch) { + if (ch < 'a' || ch > 'z') + return ch; + else + return static_cast(ch - 'a' + 'A'); +} + +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/CharacterSet.h b/sdk/wxscintilla/src/scintilla/src/CharacterSet.h new file mode 100644 index 0000000..9b88696 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/CharacterSet.h @@ -0,0 +1,59 @@ +// Scintilla source code edit control +/** @file CharacterSet.h + ** Encapsulates a set of characters. Used to test if a character is within a set. + **/ +// Copyright 2007 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +class CharacterSet { + int size; + bool valueAfter; + bool *bset; +public: + enum setBase { + setNone=0, + setLower=1, + setUpper=2, + setDigits=4, + setAlpha=setLower|setUpper, + setAlphaNum=setAlpha|setDigits + }; + CharacterSet(setBase base=setNone, const char *initialSet="", int size_=0x80, bool valueAfter_=false) { + size = size_; + valueAfter = valueAfter_; + bset = new bool[size]; + for (int i=0; i < size; i++) { + bset[i] = false; + } + AddString(initialSet); + if (base & setLower) + AddString("abcdefghijklmnopqrstuvwxyz"); + if (base & setUpper) + AddString("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + if (base & setDigits) + AddString("0123456789"); + } + ~CharacterSet() { + delete []bset; + bset = 0; + size = 0; + } + void Add(int val) { + PLATFORM_ASSERT(val >= 0); + PLATFORM_ASSERT(val < size); + bset[val] = true; + } + void AddString(const char *CharacterSet) { + for (const char *cp=CharacterSet; *cp; cp++) { + int val = static_cast(*cp); + PLATFORM_ASSERT(val >= 0); + PLATFORM_ASSERT(val < size); + bset[val] = true; + } + } + bool Contains(int val) const { + PLATFORM_ASSERT(val >= 0); + if (val < 0) return false; + return (val < size) ? bset[val] : valueAfter; + } +}; diff --git a/sdk/wxscintilla/src/scintilla/src/ContractionState.cxx b/sdk/wxscintilla/src/scintilla/src/ContractionState.cxx new file mode 100644 index 0000000..08de5cf --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/ContractionState.cxx @@ -0,0 +1,251 @@ +// Scintilla source code edit control +/** @file ContractionState.cxx + ** Manages visibility of lines for folding and wrapping. + **/ +// Copyright 1998-2007 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include + +#include "Platform.h" + +#include "SplitVector.h" +#include "Partitioning.h" +#include "RunStyles.h" +#include "ContractionState.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +ContractionState::ContractionState() : visible(0), expanded(0), heights(0), displayLines(0), linesInDocument(1) { + //InsertLine(0); +} + +ContractionState::~ContractionState() { + Clear(); +} + +void ContractionState::EnsureData() { + if (OneToOne()) { + visible = new RunStyles(); + expanded = new RunStyles(); + heights = new RunStyles(); + displayLines = new Partitioning(4); + InsertLines(0, linesInDocument); + } +} + +void ContractionState::Clear() { + delete visible; + visible = 0; + delete expanded; + expanded = 0; + delete heights; + heights = 0; + delete displayLines; + displayLines = 0; + linesInDocument = 1; +} + +int ContractionState::LinesInDoc() const { + if (OneToOne()) { + return linesInDocument; + } else { + return displayLines->Partitions() - 1; + } +} + +int ContractionState::LinesDisplayed() const { + if (OneToOne()) { + return linesInDocument; + } else { + return displayLines->PositionFromPartition(LinesInDoc()); + } +} + +int ContractionState::DisplayFromDoc(int lineDoc) const { + if (OneToOne()) { + return lineDoc; + } else { + if (lineDoc > displayLines->Partitions()) + lineDoc = displayLines->Partitions(); + return displayLines->PositionFromPartition(lineDoc); + } +} + +int ContractionState::DocFromDisplay(int lineDisplay) const { + if (OneToOne()) { + return lineDisplay; + } else { + if (lineDisplay <= 0) { + return 0; + } + if (lineDisplay > LinesDisplayed()) { + return displayLines->PartitionFromPosition(LinesDisplayed()); + } + int lineDoc = displayLines->PartitionFromPosition(lineDisplay); + PLATFORM_ASSERT(GetVisible(lineDoc)); + return lineDoc; + } +} + +void ContractionState::InsertLine(int lineDoc) { + if (OneToOne()) { + linesInDocument++; + } else { + visible->InsertSpace(lineDoc, 1); + visible->SetValueAt(lineDoc, 1); + expanded->InsertSpace(lineDoc, 1); + expanded->SetValueAt(lineDoc, 1); + heights->InsertSpace(lineDoc, 1); + heights->SetValueAt(lineDoc, 1); + int lineDisplay = DisplayFromDoc(lineDoc); + displayLines->InsertPartition(lineDoc, lineDisplay); + displayLines->InsertText(lineDoc, 1); + } +} + +void ContractionState::InsertLines(int lineDoc, int lineCount) { + for (int l = 0; l < lineCount; l++) { + InsertLine(lineDoc + l); + } + Check(); +} + +void ContractionState::DeleteLine(int lineDoc) { + if (OneToOne()) { + linesInDocument--; + } else { + if (GetVisible(lineDoc)) { + displayLines->InsertText(lineDoc, -heights->ValueAt(lineDoc)); + } + displayLines->RemovePartition(lineDoc); + visible->DeleteRange(lineDoc, 1); + expanded->DeleteRange(lineDoc, 1); + heights->DeleteRange(lineDoc, 1); + } +} + +void ContractionState::DeleteLines(int lineDoc, int lineCount) { + for (int l = 0; l < lineCount; l++) { + DeleteLine(lineDoc); + } + Check(); +} + +bool ContractionState::GetVisible(int lineDoc) const { + if (OneToOne()) { + return true; + } else { + if (lineDoc >= visible->Length()) + return true; + return visible->ValueAt(lineDoc) == 1; + } +} + +bool ContractionState::SetVisible(int lineDocStart, int lineDocEnd, bool visible_) { + if (OneToOne() && visible_) { + return false; + } else { + EnsureData(); + int delta = 0; + Check(); + if ((lineDocStart <= lineDocEnd) && (lineDocStart >= 0) && (lineDocEnd < LinesInDoc())) { + for (int line = lineDocStart; line <= lineDocEnd; line++) { + if (GetVisible(line) != visible_) { + int difference = visible_ ? heights->ValueAt(line) : -heights->ValueAt(line); + visible->SetValueAt(line, visible_ ? 1 : 0); + displayLines->InsertText(line, difference); + delta += difference; + } + } + } else { + return false; + } + Check(); + return delta != 0; + } +} + +bool ContractionState::GetExpanded(int lineDoc) const { + if (OneToOne()) { + return true; + } else { + Check(); + return expanded->ValueAt(lineDoc) == 1; + } +} + +bool ContractionState::SetExpanded(int lineDoc, bool expanded_) { + if (OneToOne() && expanded_) { + return false; + } else { + EnsureData(); + if (expanded_ != (expanded->ValueAt(lineDoc) == 1)) { + expanded->SetValueAt(lineDoc, expanded_ ? 1 : 0); + Check(); + return true; + } else { + Check(); + return false; + } + } +} + +int ContractionState::GetHeight(int lineDoc) const { + if (OneToOne()) { + return 1; + } else { + return heights->ValueAt(lineDoc); + } +} + +// Set the number of display lines needed for this line. +// Return true if this is a change. +bool ContractionState::SetHeight(int lineDoc, int height) { + if (OneToOne() && (height == 1)) { + return false; + } else { + EnsureData(); + if (GetHeight(lineDoc) != height) { + if (GetVisible(lineDoc)) { + displayLines->InsertText(lineDoc, height - GetHeight(lineDoc)); + } + heights->SetValueAt(lineDoc, height); + Check(); + return true; + } else { + Check(); + return false; + } + } +} + +void ContractionState::ShowAll() { + int lines = LinesInDoc(); + Clear(); + linesInDocument = lines; +} + +// Debugging checks + +void ContractionState::Check() const { +#ifdef CHECK_CORRECTNESS + for (int vline = 0;vline < LinesDisplayed(); vline++) { + const int lineDoc = DocFromDisplay(vline); + PLATFORM_ASSERT(GetVisible(lineDoc)); + } + for (int lineDoc = 0;lineDoc < LinesInDoc(); lineDoc++) { + const int displayThis = DisplayFromDoc(lineDoc); + const int displayNext = DisplayFromDoc(lineDoc + 1); + const int height = displayNext - displayThis; + PLATFORM_ASSERT(height >= 0); + if (GetVisible(lineDoc)) { + PLATFORM_ASSERT(GetHeight(lineDoc) == height); + } else { + PLATFORM_ASSERT(0 == height); + } + } +#endif +} diff --git a/sdk/wxscintilla/src/scintilla/src/ContractionState.h b/sdk/wxscintilla/src/scintilla/src/ContractionState.h new file mode 100644 index 0000000..ba62975 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/ContractionState.h @@ -0,0 +1,66 @@ +// Scintilla source code edit control +/** @file ContractionState.h + ** Manages visibility of lines for folding and wrapping. + **/ +// Copyright 1998-2007 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef CONTRACTIONSTATE_H +#define CONTRACTIONSTATE_H + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +/** + */ +class ContractionState { + // These contain 1 element for every document line. + RunStyles *visible; + RunStyles *expanded; + RunStyles *heights; + Partitioning *displayLines; + int linesInDocument; + + void EnsureData(); + + bool OneToOne() const { + // True when each document line is exactly one display line so need for + // complex data structures. + return visible == 0; + } + +public: + ContractionState(); + virtual ~ContractionState(); + + void Clear(); + + int LinesInDoc() const; + int LinesDisplayed() const; + int DisplayFromDoc(int lineDoc) const; + int DocFromDisplay(int lineDisplay) const; + + void InsertLine(int lineDoc); + void InsertLines(int lineDoc, int lineCount); + void DeleteLine(int lineDoc); + void DeleteLines(int lineDoc, int lineCount); + + bool GetVisible(int lineDoc) const; + bool SetVisible(int lineDocStart, int lineDocEnd, bool visible); + + bool GetExpanded(int lineDoc) const; + bool SetExpanded(int lineDoc, bool expanded); + + int GetHeight(int lineDoc) const; + bool SetHeight(int lineDoc, int height); + + void ShowAll(); + void Check() const; +}; + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/Decoration.cxx b/sdk/wxscintilla/src/scintilla/src/Decoration.cxx new file mode 100644 index 0000000..e4ac0e0 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/Decoration.cxx @@ -0,0 +1,188 @@ +/** @file Decoration.cxx + ** Visual elements added over text. + **/ +// Copyright 1998-2007 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include "Platform.h" + +#include "Scintilla.h" +#include "SplitVector.h" +#include "Partitioning.h" +#include "RunStyles.h" +#include "Decoration.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +Decoration::Decoration(int indicator_) : next(0), indicator(indicator_) { +} + +Decoration::~Decoration() { +} + +bool Decoration::Empty() { + return rs.starts->Partitions() == 1; +} + +DecorationList::DecorationList() : currentIndicator(0), currentValue(1), current(0), + lengthDocument(0), root(0), clickNotified(false) { +} + +DecorationList::~DecorationList() { + Decoration *deco = root; + while (deco) { + Decoration *decoNext = deco->next; + delete deco; + deco = decoNext; + } + root = 0; + current = 0; +} + +Decoration *DecorationList::DecorationFromIndicator(int indicator) { + for (Decoration *deco=root; deco; deco = deco->next) { + if (deco->indicator == indicator) { + return deco; + } + } + return 0; +} + +Decoration *DecorationList::Create(int indicator, int length) { + currentIndicator = indicator; + Decoration *decoNew = new Decoration(indicator); + decoNew->rs.InsertSpace(0, length); + + Decoration *decoPrev = 0; + Decoration *deco = root; + + while (deco && (deco->indicator < indicator)) { + decoPrev = deco; + deco = deco->next; + } + if (decoPrev == 0) { + decoNew->next = root; + root = decoNew; + } else { + decoNew->next = deco; + decoPrev->next = decoNew; + } + return decoNew; +} + +void DecorationList::Delete(int indicator) { + Decoration *decoToDelete = 0; + if (root) { + if (root->indicator == indicator) { + decoToDelete = root; + root = root->next; + } else { + Decoration *deco=root; + while (deco->next && !decoToDelete) { + if (deco->next && deco->next->indicator == indicator) { + decoToDelete = deco->next; + deco->next = decoToDelete->next; + } else { + deco = deco->next; + } + } + } + } + if (decoToDelete) { + delete decoToDelete; + current = 0; + } +} + +void DecorationList::SetCurrentIndicator(int indicator) { + currentIndicator = indicator; + current = DecorationFromIndicator(indicator); + currentValue = 1; +} + +void DecorationList::SetCurrentValue(int value) { + currentValue = value ? value : 1; +} + +bool DecorationList::FillRange(int &position, int value, int &fillLength) { + if (!current) { + current = DecorationFromIndicator(currentIndicator); + if (!current) { + current = Create(currentIndicator, lengthDocument); + } + } + bool changed = current->rs.FillRange(position, value, fillLength); + if (current->Empty()) { + Delete(currentIndicator); + } + return changed; +} + +void DecorationList::InsertSpace(int position, int insertLength) { + lengthDocument += insertLength; + for (Decoration *deco=root; deco; deco = deco->next) { + deco->rs.InsertSpace(position, insertLength); + } +} + +void DecorationList::DeleteRange(int position, int deleteLength) { + lengthDocument -= deleteLength; + Decoration *deco; + for (deco=root; deco; deco = deco->next) { + deco->rs.DeleteRange(position, deleteLength); + } + DeleteAnyEmpty(); +} + +void DecorationList::DeleteAnyEmpty() { + Decoration *deco = root; + while (deco) { + if (deco->Empty()) { + Delete(deco->indicator); + deco = root; + } else { + deco = deco->next; + } + } +} + +int DecorationList::AllOnFor(int position) { + int mask = 0; + for (Decoration *deco=root; deco; deco = deco->next) { + if (deco->rs.ValueAt(position)) { + mask |= 1 << deco->indicator; + } + } + return mask; +} + +int DecorationList::ValueAt(int indicator, int position) { + Decoration *deco = DecorationFromIndicator(indicator); + if (deco) { + return deco->rs.ValueAt(position); + } + return 0; +} + +int DecorationList::Start(int indicator, int position) { + Decoration *deco = DecorationFromIndicator(indicator); + if (deco) { + return deco->rs.StartRun(position); + } + return 0; +} + +int DecorationList::End(int indicator, int position) { + Decoration *deco = DecorationFromIndicator(indicator); + if (deco) { + return deco->rs.EndRun(position); + } + return 0; +} diff --git a/sdk/wxscintilla/src/scintilla/src/Decoration.h b/sdk/wxscintilla/src/scintilla/src/Decoration.h new file mode 100644 index 0000000..fedff97 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/Decoration.h @@ -0,0 +1,64 @@ +/** @file Decoration.h + ** Visual elements added over text. + **/ +// Copyright 1998-2007 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef DECORATION_H +#define DECORATION_H + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +class Decoration { +public: + Decoration *next; + RunStyles rs; + int indicator; + + Decoration(int indicator_); + ~Decoration(); + + bool Empty(); +}; + +class DecorationList { + int currentIndicator; + int currentValue; + Decoration *current; + int lengthDocument; + Decoration *DecorationFromIndicator(int indicator); + Decoration *Create(int indicator, int length); + void Delete(int indicator); + void DeleteAnyEmpty(); +public: + Decoration *root; + bool clickNotified; + + DecorationList(); + ~DecorationList(); + + void SetCurrentIndicator(int indicator); + int GetCurrentIndicator() const { return currentIndicator; } + + void SetCurrentValue(int value); + int GetCurrentValue() const { return currentValue; } + + // Returns true if some values may have changed + bool FillRange(int &position, int value, int &fillLength); + + void InsertSpace(int position, int insertLength); + void DeleteRange(int position, int deleteLength); + + int AllOnFor(int position); + int ValueAt(int indicator, int position); + int Start(int indicator, int position); + int End(int indicator, int position); +}; + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/Document.cxx b/sdk/wxscintilla/src/scintilla/src/Document.cxx new file mode 100644 index 0000000..fbaaaf2 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/Document.cxx @@ -0,0 +1,1920 @@ +// Scintilla source code edit control +/** @file Document.cxx + ** Text document that handles notifications, DBCS, styling, words and end of line. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include +#include + +// With Borland C++ 5.5, including includes Windows.h leading to defining +// FindText to FindTextA which makes calls here to Document::FindText fail. +#ifdef __BORLANDC__ +#ifdef FindText +#undef FindText +#endif +#endif + +#include "Platform.h" + +#include "Scintilla.h" +#include "SplitVector.h" +#include "Partitioning.h" +#include "RunStyles.h" +#include "CellBuffer.h" +#include "PerLine.h" +#include "CharClassify.h" +#include "Decoration.h" +#include "Document.h" +#include "RESearch.h" +#include "UniConversion.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +// This is ASCII specific but is safe with chars >= 0x80 +static inline bool isspacechar(unsigned char ch) { + return (ch == ' ') || ((ch >= 0x09) && (ch <= 0x0d)); +} + +static inline bool IsPunctuation(char ch) { + return isascii(ch) && ispunct(ch); +} + +static inline bool IsADigit(char ch) { + return isascii(ch) && isdigit(ch); +} + +static inline bool IsLowerCase(char ch) { + return isascii(ch) && islower(ch); +} + +static inline bool IsUpperCase(char ch) { + return isascii(ch) && isupper(ch); +} + +Document::Document() { + refCount = 0; +#ifdef unix + eolMode = SC_EOL_LF; +#else + eolMode = SC_EOL_CRLF; +#endif + dbcsCodePage = 0; + stylingBits = 5; + stylingBitsMask = 0x1F; + stylingMask = 0; + endStyled = 0; + styleClock = 0; + enteredModification = 0; + enteredStyling = 0; + enteredReadOnlyCount = 0; + tabInChars = 8; + indentInChars = 0; + actualIndentInChars = 8; + useTabs = true; + tabIndents = true; + backspaceUnindents = false; + watchers = 0; + lenWatchers = 0; + + matchesValid = false; + regex = 0; + + perLineData[ldMarkers] = new LineMarkers(); + perLineData[ldLevels] = new LineLevels(); + perLineData[ldState] = new LineState(); + perLineData[ldMargin] = new LineAnnotation(); + perLineData[ldAnnotation] = new LineAnnotation(); + + cb.SetPerLine(this); +} + +Document::~Document() { + for (int i = 0; i < lenWatchers; i++) { + watchers[i].watcher->NotifyDeleted(this, watchers[i].userData); + } + delete []watchers; + for (int j=0; jInit(); + } +} + +void Document::InsertLine(int line) { + for (int j=0; jInsertLine(line); + } +} + +void Document::RemoveLine(int line) { + for (int j=0; jRemoveLine(line); + } +} + +// Increase reference count and return its previous value. +int Document::AddRef() { + return refCount++; +} + +// Decrease reference count and return its previous value. +// Delete the document if reference count reaches zero. +int Document::Release() { + int curRefCount = --refCount; + if (curRefCount == 0) + delete this; + return curRefCount; +} + +void Document::SetSavePoint() { + cb.SetSavePoint(); + NotifySavePoint(true); +} + +int Document::GetMark(int line) { + return static_cast(perLineData[ldMarkers])->MarkValue(line); +} + +int Document::AddMark(int line, int markerNum) { + if (line <= LinesTotal()) { + int prev = static_cast(perLineData[ldMarkers])-> + AddMark(line, markerNum, LinesTotal()); + DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); + NotifyModified(mh); + return prev; + } else { + return 0; + } +} + +void Document::AddMarkSet(int line, int valueSet) { + unsigned int m = valueSet; + for (int i = 0; m; i++, m >>= 1) + if (m & 1) + static_cast(perLineData[ldMarkers])-> + AddMark(line, i, LinesTotal()); + DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); + NotifyModified(mh); +} + +void Document::DeleteMark(int line, int markerNum) { + static_cast(perLineData[ldMarkers])->DeleteMark(line, markerNum, false); + DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); + NotifyModified(mh); +} + +void Document::DeleteMarkFromHandle(int markerHandle) { + static_cast(perLineData[ldMarkers])->DeleteMarkFromHandle(markerHandle); + DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); + mh.line = -1; + NotifyModified(mh); +} + +void Document::DeleteAllMarks(int markerNum) { + for (int line = 0; line < LinesTotal(); line++) { + static_cast(perLineData[ldMarkers])->DeleteMark(line, markerNum, true); + } + DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); + mh.line = -1; + NotifyModified(mh); +} + +int Document::LineFromHandle(int markerHandle) { + return static_cast(perLineData[ldMarkers])->LineFromHandle(markerHandle); +} + +int Document::LineStart(int line) const { + return cb.LineStart(line); +} + +int Document::LineEnd(int line) const { + if (line == LinesTotal() - 1) { + return LineStart(line + 1); + } else { + int position = LineStart(line + 1) - 1; + // When line terminator is CR+LF, may need to go back one more + if ((position > LineStart(line)) && (cb.CharAt(position - 1) == '\r')) { + position--; + } + return position; + } +} + +int Document::LineFromPosition(int pos) const { + return cb.LineFromPosition(pos); +} + +int Document::LineEndPosition(int position) const { + return LineEnd(LineFromPosition(position)); +} + +bool Document::IsLineEndPosition(int position) const { + return LineEnd(LineFromPosition(position)) == position; +} + +int Document::VCHomePosition(int position) const { + int line = LineFromPosition(position); + int startPosition = LineStart(line); + int endLine = LineEnd(line); + int startText = startPosition; + while (startText < endLine && (cb.CharAt(startText) == ' ' || cb.CharAt(startText) == '\t' ) ) + startText++; + if (position == startText) + return startPosition; + else + return startText; +} + +int Document::SetLevel(int line, int level) { + int prev = static_cast(perLineData[ldLevels])->SetLevel(line, level, LinesTotal()); + if (prev != level) { + DocModification mh(SC_MOD_CHANGEFOLD | SC_MOD_CHANGEMARKER, + LineStart(line), 0, 0, 0, line); + mh.foldLevelNow = level; + mh.foldLevelPrev = prev; + NotifyModified(mh); + } + return prev; +} + +int Document::GetLevel(int line) const { + return static_cast(perLineData[ldLevels])->GetLevel(line); +} + +void Document::ClearLevels() { + static_cast(perLineData[ldLevels])->ClearLevels(); +} + +static bool IsSubordinate(int levelStart, int levelTry) { + if (levelTry & SC_FOLDLEVELWHITEFLAG) + return true; + else + return (levelStart & SC_FOLDLEVELNUMBERMASK) < (levelTry & SC_FOLDLEVELNUMBERMASK); +} + +int Document::GetLastChild(int lineParent, int level) { + if (level == -1) + level = GetLevel(lineParent) & SC_FOLDLEVELNUMBERMASK; + int maxLine = LinesTotal(); + int lineMaxSubord = lineParent; + while (lineMaxSubord < maxLine - 1) { + EnsureStyledTo(LineStart(lineMaxSubord + 2)); + if (!IsSubordinate(level, GetLevel(lineMaxSubord + 1))) + break; + lineMaxSubord++; + } + if (lineMaxSubord > lineParent) { + if (level > (GetLevel(lineMaxSubord + 1) & SC_FOLDLEVELNUMBERMASK)) { + // Have chewed up some whitespace that belongs to a parent so seek back + if (GetLevel(lineMaxSubord) & SC_FOLDLEVELWHITEFLAG) { + lineMaxSubord--; + } + } + } + return lineMaxSubord; +} + +int Document::GetFoldParent(int line) { + int level = GetLevel(line) & SC_FOLDLEVELNUMBERMASK; + int lineLook = line - 1; + while ((lineLook > 0) && ( + (!(GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG)) || + ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) >= level)) + ) { + lineLook--; + } + if ((GetLevel(lineLook) & SC_FOLDLEVELHEADERFLAG) && + ((GetLevel(lineLook) & SC_FOLDLEVELNUMBERMASK) < level)) { + return lineLook; + } else { + return -1; + } +} + +int Document::ClampPositionIntoDocument(int pos) { + return Platform::Clamp(pos, 0, Length()); +} + +bool Document::IsCrLf(int pos) { + if (pos < 0) + return false; + if (pos >= (Length() - 1)) + return false; + return (cb.CharAt(pos) == '\r') && (cb.CharAt(pos + 1) == '\n'); +} + +static const int maxBytesInDBCSCharacter=5; + +int Document::LenChar(int pos) { + if (pos < 0) { + return 1; + } else if (IsCrLf(pos)) { + return 2; + } else if (SC_CP_UTF8 == dbcsCodePage) { + unsigned char ch = static_cast(cb.CharAt(pos)); + if (ch < 0x80) + return 1; + int len = 2; + if (ch >= (0x80 + 0x40 + 0x20 + 0x10)) + len = 4; + else if (ch >= (0x80 + 0x40 + 0x20)) + len = 3; + int lengthDoc = Length(); + if ((pos + len) > lengthDoc) + return lengthDoc -pos; + else + return len; + } else if (dbcsCodePage) { + char mbstr[maxBytesInDBCSCharacter+1]; + int i; + for (i=0; i= 0x80) && (ch < (0x80 + 0x40)); +} + +static int BytesFromLead(int leadByte) { + if (leadByte > 0xF4) { + // Characters longer than 4 bytes not possible in current UTF-8 + return 0; + } else if (leadByte >= 0xF0) { + return 4; + } else if (leadByte >= 0xE0) { + return 3; + } else if (leadByte >= 0xC2) { + return 2; + } + return 0; +} + +bool Document::InGoodUTF8(int pos, int &start, int &end) { + int lead = pos; + while ((lead>0) && (pos-lead < 4) && IsTrailByte(static_cast(cb.CharAt(lead-1)))) + lead--; + start = 0; + if (lead > 0) { + start = lead-1; + } + int leadByte = static_cast(cb.CharAt(start)); + int bytes = BytesFromLead(leadByte); + if (bytes == 0) { + return false; + } else { + int trailBytes = bytes - 1; + int len = pos - lead + 1; + if (len > trailBytes) + // pos too far from lead + return false; + // Check that there are enough trails for this lead + int trail = pos + 1; + while ((trail-lead(cb.CharAt(trail)))) { + return false; + } + trail++; + } + end = start + bytes; + return true; + } +} + +// Normalise a position so that it is not halfway through a two byte character. +// This can occur in two situations - +// When lines are terminated with \r\n pairs which should be treated as one character. +// When displaying DBCS text such as Japanese. +// If moving, move the position in the indicated direction. +int Document::MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd) { + //Platform::DebugPrintf("NoCRLF %d %d\n", pos, moveDir); + // If out of range, just return minimum/maximum value. + if (pos <= 0) + return 0; + if (pos >= Length()) + return Length(); + + // PLATFORM_ASSERT(pos > 0 && pos < Length()); + if (checkLineEnd && IsCrLf(pos - 1)) { + if (moveDir > 0) + return pos + 1; + else + return pos - 1; + } + + // Not between CR and LF + + if (dbcsCodePage) { + if (SC_CP_UTF8 == dbcsCodePage) { + unsigned char ch = static_cast(cb.CharAt(pos)); + int startUTF = pos; + int endUTF = pos; + if (IsTrailByte(ch) && InGoodUTF8(pos, startUTF, endUTF)) { + // ch is a trail byte within a UTF-8 character + if (moveDir > 0) + pos = endUTF; + else + pos = startUTF; + } + } else { + // Anchor DBCS calculations at start of line because start of line can + // not be a DBCS trail byte. + int posCheck = LineStart(LineFromPosition(pos)); + while (posCheck < pos) { + char mbstr[maxBytesInDBCSCharacter+1]; + int i; + for(i=0;i pos) { + if (moveDir > 0) { + return posCheck + mbsize; + } else { + return posCheck; + } + } + posCheck += mbsize; + } + } + } + + return pos; +} + +void Document::ModifiedAt(int pos) { + if (endStyled > pos) + endStyled = pos; +} + +void Document::CheckReadOnly() { + if (cb.IsReadOnly() && enteredReadOnlyCount == 0) { + enteredReadOnlyCount++; + NotifyModifyAttempt(); + enteredReadOnlyCount--; + } +} + +// Document only modified by gateways DeleteChars, InsertString, Undo, Redo, and SetStyleAt. +// SetStyleAt does not change the persistent state of a document + +bool Document::DeleteChars(int pos, int len) { + if (len == 0) + return false; + if ((pos + len) > Length()) + return false; + CheckReadOnly(); + if (enteredModification != 0) { + return false; + } else { + enteredModification++; + if (!cb.IsReadOnly()) { + NotifyModified( + DocModification( + SC_MOD_BEFOREDELETE | SC_PERFORMED_USER, + pos, len, + 0, 0)); + int prevLinesTotal = LinesTotal(); + bool startSavePoint = cb.IsSavePoint(); + bool startSequence = false; + const char *text = cb.DeleteChars(pos, len, startSequence); + if (startSavePoint && cb.IsCollectingUndo()) + NotifySavePoint(!startSavePoint); + if ((pos < Length()) || (pos == 0)) + ModifiedAt(pos); + else + ModifiedAt(pos-1); + NotifyModified( + DocModification( + SC_MOD_DELETETEXT | SC_PERFORMED_USER | (startSequence?SC_STARTACTION:0), + pos, len, + LinesTotal() - prevLinesTotal, text)); + } + enteredModification--; + } + return !cb.IsReadOnly(); +} + +/** + * Insert a string with a length. + */ +bool Document::InsertString(int position, const char *s, int insertLength) { + if (insertLength <= 0) { + return false; + } + CheckReadOnly(); + if (enteredModification != 0) { + return false; + } else { + enteredModification++; + if (!cb.IsReadOnly()) { + NotifyModified( + DocModification( + SC_MOD_BEFOREINSERT | SC_PERFORMED_USER, + position, insertLength, + 0, s)); + int prevLinesTotal = LinesTotal(); + bool startSavePoint = cb.IsSavePoint(); + bool startSequence = false; + const char *text = cb.InsertString(position, s, insertLength, startSequence); + if (startSavePoint && cb.IsCollectingUndo()) + NotifySavePoint(!startSavePoint); + ModifiedAt(position); + NotifyModified( + DocModification( + SC_MOD_INSERTTEXT | SC_PERFORMED_USER | (startSequence?SC_STARTACTION:0), + position, insertLength, + LinesTotal() - prevLinesTotal, text)); + } + enteredModification--; + } + return !cb.IsReadOnly(); +} + +int Document::Undo() { + int newPos = -1; + CheckReadOnly(); + if (enteredModification == 0) { + enteredModification++; + if (!cb.IsReadOnly()) { + bool startSavePoint = cb.IsSavePoint(); + bool multiLine = false; + int steps = cb.StartUndo(); + //Platform::DebugPrintf("Steps=%d\n", steps); + for (int step = 0; step < steps; step++) { + const int prevLinesTotal = LinesTotal(); + const Action &action = cb.GetUndoStep(); + if (action.at == removeAction) { + NotifyModified(DocModification( + SC_MOD_BEFOREINSERT | SC_PERFORMED_UNDO, action)); + } else if (action.at == containerAction) { + DocModification dm(SC_MOD_CONTAINER | SC_PERFORMED_UNDO); + dm.token = action.position; + NotifyModified(dm); + } else { + NotifyModified(DocModification( + SC_MOD_BEFOREDELETE | SC_PERFORMED_UNDO, action)); + } + cb.PerformUndoStep(); + int cellPosition = action.position; + if (action.at != containerAction) { + ModifiedAt(cellPosition); + newPos = cellPosition; + } + + int modFlags = SC_PERFORMED_UNDO; + // With undo, an insertion action becomes a deletion notification + if (action.at == removeAction) { + newPos += action.lenData; + modFlags |= SC_MOD_INSERTTEXT; + } else if (action.at == insertAction) { + modFlags |= SC_MOD_DELETETEXT; + } + if (steps > 1) + modFlags |= SC_MULTISTEPUNDOREDO; + const int linesAdded = LinesTotal() - prevLinesTotal; + if (linesAdded != 0) + multiLine = true; + if (step == steps - 1) { + modFlags |= SC_LASTSTEPINUNDOREDO; + if (multiLine) + modFlags |= SC_MULTILINEUNDOREDO; + } + NotifyModified(DocModification(modFlags, cellPosition, action.lenData, + linesAdded, action.data)); + } + + bool endSavePoint = cb.IsSavePoint(); + if (startSavePoint != endSavePoint) + NotifySavePoint(endSavePoint); + } + enteredModification--; + } + return newPos; +} + +int Document::Redo() { + int newPos = -1; + CheckReadOnly(); + if (enteredModification == 0) { + enteredModification++; + if (!cb.IsReadOnly()) { + bool startSavePoint = cb.IsSavePoint(); + bool multiLine = false; + int steps = cb.StartRedo(); + for (int step = 0; step < steps; step++) { + const int prevLinesTotal = LinesTotal(); + const Action &action = cb.GetRedoStep(); + if (action.at == insertAction) { + NotifyModified(DocModification( + SC_MOD_BEFOREINSERT | SC_PERFORMED_REDO, action)); + } else if (action.at == containerAction) { + DocModification dm(SC_MOD_CONTAINER | SC_PERFORMED_REDO); + dm.token = action.position; + NotifyModified(dm); + } else { + NotifyModified(DocModification( + SC_MOD_BEFOREDELETE | SC_PERFORMED_REDO, action)); + } + cb.PerformRedoStep(); + if (action.at != containerAction) { + ModifiedAt(action.position); + newPos = action.position; + } + + int modFlags = SC_PERFORMED_REDO; + if (action.at == insertAction) { + newPos += action.lenData; + modFlags |= SC_MOD_INSERTTEXT; + } else if (action.at == removeAction) { + modFlags |= SC_MOD_DELETETEXT; + } + if (steps > 1) + modFlags |= SC_MULTISTEPUNDOREDO; + const int linesAdded = LinesTotal() - prevLinesTotal; + if (linesAdded != 0) + multiLine = true; + if (step == steps - 1) { + modFlags |= SC_LASTSTEPINUNDOREDO; + if (multiLine) + modFlags |= SC_MULTILINEUNDOREDO; + } + NotifyModified( + DocModification(modFlags, action.position, action.lenData, + linesAdded, action.data)); + } + + bool endSavePoint = cb.IsSavePoint(); + if (startSavePoint != endSavePoint) + NotifySavePoint(endSavePoint); + } + enteredModification--; + } + return newPos; +} + +/** + * Insert a single character. + */ +bool Document::InsertChar(int pos, char ch) { + char chs[1]; + chs[0] = ch; + return InsertString(pos, chs, 1); +} + +/** + * Insert a null terminated string. + */ +bool Document::InsertCString(int position, const char *s) { + return InsertString(position, s, strlen(s)); +} + +void Document::ChangeChar(int pos, char ch) { + DeleteChars(pos, 1); + InsertChar(pos, ch); +} + +void Document::DelChar(int pos) { + DeleteChars(pos, LenChar(pos)); +} + +void Document::DelCharBack(int pos) { + if (pos <= 0) { + return; + } else if (IsCrLf(pos - 2)) { + DeleteChars(pos - 2, 2); + } else if (dbcsCodePage) { + int startChar = MovePositionOutsideChar(pos - 1, -1, false); + DeleteChars(startChar, pos - startChar); + } else { + DeleteChars(pos - 1, 1); + } +} + +static bool isindentchar(char ch) { + return (ch == ' ') || (ch == '\t'); +} + +static int NextTab(int pos, int tabSize) { + return ((pos / tabSize) + 1) * tabSize; +} + +static void CreateIndentation(char *linebuf, int length, int indent, int tabSize, bool insertSpaces) { + length--; // ensure space for \0 + if (!insertSpaces) { + while ((indent >= tabSize) && (length > 0)) { + *linebuf++ = '\t'; + indent -= tabSize; + length--; + } + } + while ((indent > 0) && (length > 0)) { + *linebuf++ = ' '; + indent--; + length--; + } + *linebuf = '\0'; +} + +int Document::GetLineIndentation(int line) { + int indent = 0; + if ((line >= 0) && (line < LinesTotal())) { + int lineStart = LineStart(line); + int length = Length(); + for (int i = lineStart;i < length;i++) { + char ch = cb.CharAt(i); + if (ch == ' ') + indent++; + else if (ch == '\t') + indent = NextTab(indent, tabInChars); + else + return indent; + } + } + return indent; +} + +void Document::SetLineIndentation(int line, int indent) { + int indentOfLine = GetLineIndentation(line); + if (indent < 0) + indent = 0; + if (indent != indentOfLine) { + char linebuf[1000]; + CreateIndentation(linebuf, sizeof(linebuf), indent, tabInChars, !useTabs); + int thisLineStart = LineStart(line); + int indentPos = GetLineIndentPosition(line); + UndoGroup ug(this); + DeleteChars(thisLineStart, indentPos - thisLineStart); + InsertCString(thisLineStart, linebuf); + } +} + +int Document::GetLineIndentPosition(int line) const { + if (line < 0) + return 0; + int pos = LineStart(line); + int length = Length(); + while ((pos < length) && isindentchar(cb.CharAt(pos))) { + pos++; + } + return pos; +} + +int Document::GetColumn(int pos) { + int column = 0; + int line = LineFromPosition(pos); + if ((line >= 0) && (line < LinesTotal())) { + for (int i = LineStart(line);i < pos;) { + char ch = cb.CharAt(i); + if (ch == '\t') { + column = NextTab(column, tabInChars); + i++; + } else if (ch == '\r') { + return column; + } else if (ch == '\n') { + return column; + } else if (i >= Length()) { + return column; + } else { + column++; + i = MovePositionOutsideChar(i + 1, 1, false); + } + } + } + return column; +} + +int Document::FindColumn(int line, int column) { + int position = LineStart(line); + if ((line >= 0) && (line < LinesTotal())) { + int columnCurrent = 0; + while ((columnCurrent < column) && (position < Length())) { + char ch = cb.CharAt(position); + if (ch == '\t') { + columnCurrent = NextTab(columnCurrent, tabInChars); + position++; + } else if (ch == '\r') { + return position; + } else if (ch == '\n') { + return position; + } else { + columnCurrent++; + position = MovePositionOutsideChar(position + 1, 1, false); + } + } + } + return position; +} + +void Document::Indent(bool forwards, int lineBottom, int lineTop) { + // Dedent - suck white space off the front of the line to dedent by equivalent of a tab + for (int line = lineBottom; line >= lineTop; line--) { + int indentOfLine = GetLineIndentation(line); + if (forwards) { + if (LineStart(line) < LineEnd(line)) { + SetLineIndentation(line, indentOfLine + IndentSize()); + } + } else { + SetLineIndentation(line, indentOfLine - IndentSize()); + } + } +} + +// Convert line endings for a piece of text to a particular mode. +// Stop at len or when a NUL is found. +// Caller must delete the returned pointer. +char *Document::TransformLineEnds(int *pLenOut, const char *s, size_t len, int eolMode) { + char *dest = new char[2 * len + 1]; + const char *sptr = s; + char *dptr = dest; + for (size_t i = 0; (i < len) && (*sptr != '\0'); i++) { + if (*sptr == '\n' || *sptr == '\r') { + if (eolMode == SC_EOL_CR) { + *dptr++ = '\r'; + } else if (eolMode == SC_EOL_LF) { + *dptr++ = '\n'; + } else { // eolMode == SC_EOL_CRLF + *dptr++ = '\r'; + *dptr++ = '\n'; + } + if ((*sptr == '\r') && (i+1 < len) && (*(sptr+1) == '\n')) { + i++; + sptr++; + } + sptr++; + } else { + *dptr++ = *sptr++; + } + } + *dptr++ = '\0'; + *pLenOut = (dptr - dest) - 1; + return dest; +} + +void Document::ConvertLineEnds(int eolModeSet) { + UndoGroup ug(this); + + for (int pos = 0; pos < Length(); pos++) { + if (cb.CharAt(pos) == '\r') { + if (cb.CharAt(pos + 1) == '\n') { + // CRLF + if (eolModeSet == SC_EOL_CR) { + DeleteChars(pos + 1, 1); // Delete the LF + } else if (eolModeSet == SC_EOL_LF) { + DeleteChars(pos, 1); // Delete the CR + } else { + pos++; + } + } else { + // CR + if (eolModeSet == SC_EOL_CRLF) { + InsertString(pos + 1, "\n", 1); // Insert LF + pos++; + } else if (eolModeSet == SC_EOL_LF) { + InsertString(pos, "\n", 1); // Insert LF + DeleteChars(pos + 1, 1); // Delete CR + } + } + } else if (cb.CharAt(pos) == '\n') { + // LF + if (eolModeSet == SC_EOL_CRLF) { + InsertString(pos, "\r", 1); // Insert CR + pos++; + } else if (eolModeSet == SC_EOL_CR) { + InsertString(pos, "\r", 1); // Insert CR + DeleteChars(pos + 1, 1); // Delete LF + } + } + } + +} + +bool Document::IsWhiteLine(int line) const { + int currentChar = LineStart(line); + int endLine = LineEnd(line); + while (currentChar < endLine) { + if (cb.CharAt(currentChar) != ' ' && cb.CharAt(currentChar) != '\t') { + return false; + } + ++currentChar; + } + return true; +} + +int Document::ParaUp(int pos) { + int line = LineFromPosition(pos); + line--; + while (line >= 0 && IsWhiteLine(line)) { // skip empty lines + line--; + } + while (line >= 0 && !IsWhiteLine(line)) { // skip non-empty lines + line--; + } + line++; + return LineStart(line); +} + +int Document::ParaDown(int pos) { + int line = LineFromPosition(pos); + while (line < LinesTotal() && !IsWhiteLine(line)) { // skip non-empty lines + line++; + } + while (line < LinesTotal() && IsWhiteLine(line)) { // skip empty lines + line++; + } + if (line < LinesTotal()) + return LineStart(line); + else // end of a document + return LineEnd(line-1); +} + +CharClassify::cc Document::WordCharClass(unsigned char ch) { + if ((SC_CP_UTF8 == dbcsCodePage) && (ch >= 0x80)) + return CharClassify::ccWord; + return charClass.GetClass(ch); +} + +/** + * Used by commmands that want to select whole words. + * Finds the start of word at pos when delta < 0 or the end of the word when delta >= 0. + */ +int Document::ExtendWordSelect(int pos, int delta, bool onlyWordCharacters) { + CharClassify::cc ccStart = CharClassify::ccWord; + if (delta < 0) { + if (!onlyWordCharacters) + ccStart = WordCharClass(cb.CharAt(pos-1)); + while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart)) + pos--; + } else { + if (!onlyWordCharacters && pos < Length()) + ccStart = WordCharClass(cb.CharAt(pos)); + while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart)) + pos++; + } + return MovePositionOutsideChar(pos, delta, true); +} + +/** + * Find the start of the next word in either a forward (delta >= 0) or backwards direction + * (delta < 0). + * This is looking for a transition between character classes although there is also some + * additional movement to transit white space. + * Used by cursor movement by word commands. + */ +int Document::NextWordStart(int pos, int delta) { + if (delta < 0) { + while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace)) + pos--; + if (pos > 0) { + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1)); + while (pos > 0 && (WordCharClass(cb.CharAt(pos - 1)) == ccStart)) { + pos--; + } + } + } else { + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos)); + while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == ccStart)) + pos++; + while (pos < (Length()) && (WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace)) + pos++; + } + return pos; +} + +/** + * Find the end of the next word in either a forward (delta >= 0) or backwards direction + * (delta < 0). + * This is looking for a transition between character classes although there is also some + * additional movement to transit white space. + * Used by cursor movement by word commands. + */ +int Document::NextWordEnd(int pos, int delta) { + if (delta < 0) { + if (pos > 0) { + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos-1)); + if (ccStart != CharClassify::ccSpace) { + while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == ccStart) { + pos--; + } + } + while (pos > 0 && WordCharClass(cb.CharAt(pos - 1)) == CharClassify::ccSpace) { + pos--; + } + } + } else { + while (pos < Length() && WordCharClass(cb.CharAt(pos)) == CharClassify::ccSpace) { + pos++; + } + if (pos < Length()) { + CharClassify::cc ccStart = WordCharClass(cb.CharAt(pos)); + while (pos < Length() && WordCharClass(cb.CharAt(pos)) == ccStart) { + pos++; + } + } + } + return pos; +} + +/** + * Check that the character at the given position is a word or punctuation character and that + * the previous character is of a different character class. + */ +bool Document::IsWordStartAt(int pos) { + if (pos > 0) { + CharClassify::cc ccPos = WordCharClass(CharAt(pos)); + return (ccPos == CharClassify::ccWord || ccPos == CharClassify::ccPunctuation) && + (ccPos != WordCharClass(CharAt(pos - 1))); + } + return true; +} + +/** + * Check that the character at the given position is a word or punctuation character and that + * the next character is of a different character class. + */ +bool Document::IsWordEndAt(int pos) { + if (pos < Length()) { + CharClassify::cc ccPrev = WordCharClass(CharAt(pos-1)); + return (ccPrev == CharClassify::ccWord || ccPrev == CharClassify::ccPunctuation) && + (ccPrev != WordCharClass(CharAt(pos))); + } + return true; +} + +/** + * Check that the given range is has transitions between character classes at both + * ends and where the characters on the inside are word or punctuation characters. + */ +bool Document::IsWordAt(int start, int end) { + return IsWordStartAt(start) && IsWordEndAt(end); +} + +static inline char MakeLowerCase(char ch) { + if (ch < 'A' || ch > 'Z') + return ch; + else + return static_cast(ch - 'A' + 'a'); +} + +static bool GoodTrailByte(int v) { + return (v >= 0x80) && (v < 0xc0); +} + +size_t Document::ExtractChar(int pos, char *bytes) { + unsigned char ch = static_cast(cb.CharAt(pos)); + size_t widthChar = UTF8CharLength(ch); + bytes[0] = ch; + for (size_t i=1; i(bytes[i]))) { // Bad byte + widthChar = 1; + } + } + return widthChar; +} + +CaseFolderTable::CaseFolderTable() { + for (size_t iChar=0; iChar(iChar); + } +} + +CaseFolderTable::~CaseFolderTable() { +} + +size_t CaseFolderTable::Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) { + if (lenMixed > sizeFolded) { + return 0; + } else { + for (size_t i=0; i(mixed[i])]; + } + return lenMixed; + } +} + +void CaseFolderTable::SetTranslation(char ch, char chTranslation) { + mapping[static_cast(ch)] = chTranslation; +} + +void CaseFolderTable::StandardASCII() { + for (size_t iChar=0; iChar= 'A' && iChar <= 'Z') { + mapping[iChar] = static_cast(iChar - 'A' + 'a'); + } else { + mapping[iChar] = static_cast(iChar); + } + } +} + +bool Document::MatchesWordOptions(bool word, bool wordStart, int pos, int length) { + return (!word && !wordStart) || + (word && IsWordAt(pos, pos + length)) || + (wordStart && IsWordStartAt(pos)); +} + +/** + * Find text in document, supporting both forward and backward + * searches (just pass minPos > maxPos to do a backward search) + * Has not been tested with backwards DBCS searches yet. + */ +long Document::FindText(int minPos, int maxPos, const char *search, + bool caseSensitive, bool word, bool wordStart, bool regExp, int flags, + int *length, CaseFolder *pcf) { + if (regExp) { + if (!regex) + regex = CreateRegexSearch(&charClass); + return regex->FindText(this, minPos, maxPos, search, caseSensitive, word, wordStart, flags, length); + } else { + + const bool forward = minPos <= maxPos; + const int increment = forward ? 1 : -1; + + // Range endpoints should not be inside DBCS characters, but just in case, move them. + const int startPos = MovePositionOutsideChar(minPos, increment, false); + const int endPos = MovePositionOutsideChar(maxPos, increment, false); + + // Compute actual search ranges needed + const int lengthFind = (*length == -1) ? static_cast(strlen(search)) : *length; + const int endSearch = (startPos <= endPos) ? endPos - lengthFind + 1 : endPos; + + //Platform::DebugPrintf("Find %d %d %s %d\n", startPos, endPos, ft->lpstrText, lengthFind); + const int limitPos = Platform::Maximum(startPos, endPos); + int pos = forward ? startPos : (startPos - 1); + if (caseSensitive) { + while (forward ? (pos < endSearch) : (pos >= endSearch)) { + bool found = (pos + lengthFind) <= limitPos; + for (int indexSearch = 0; (indexSearch < lengthFind) && found; indexSearch++) { + found = CharAt(pos + indexSearch) == search[indexSearch]; + } + if (found && MatchesWordOptions(word, wordStart, pos, lengthFind)) { + return pos; + } + pos += increment; + if (dbcsCodePage && (pos >= 0)) { + // Have to use >= 0 as otherwise next statement would change + // -1 to 0 and make loop infinite. + // Ensure trying to match from start of character + pos = MovePositionOutsideChar(pos, increment, false); + } + } + } else if (SC_CP_UTF8 == dbcsCodePage) { + const size_t maxBytesCharacter = 4; + const size_t maxFoldingExpansion = 4; + std::vector searchThing(lengthFind * maxBytesCharacter * maxFoldingExpansion + 1); + const int lenSearch = pcf->Fold(&searchThing[0], searchThing.size(), search, lengthFind); + while (forward ? (pos < endSearch) : (pos >= endSearch)) { + int widthFirstCharacter = 0; + int indexDocument = 0; + int indexSearch = 0; + bool characterMatches = true; + while (characterMatches && + ((pos + indexDocument) < limitPos) && + (indexSearch < lenSearch)) { + char bytes[maxBytesCharacter + 1]; + bytes[maxBytesCharacter] = 0; + const int widthChar = ExtractChar(pos + indexDocument, bytes); + if (!widthFirstCharacter) + widthFirstCharacter = widthChar; + char folded[maxBytesCharacter * maxFoldingExpansion + 1]; + const int lenFlat = pcf->Fold(folded, sizeof(folded), bytes, widthChar); + folded[lenFlat] = 0; + // Does folded match the buffer + characterMatches = 0 == memcmp(folded, &searchThing[0] + indexSearch, lenFlat); + indexDocument += widthChar; + indexSearch += lenFlat; + } + if (characterMatches && (indexSearch == static_cast(lenSearch))) { + if (MatchesWordOptions(word, wordStart, pos, indexDocument)) { + *length = indexDocument; + return pos; + } + } + if (forward) { + pos += widthFirstCharacter; + } else { + pos--; + if (pos > 0) { + // Ensure trying to match from start of character + pos = MovePositionOutsideChar(pos, increment, false); + } + } + } + } else { + CaseFolderTable caseFolder; + std::vector searchThing(lengthFind + 1); + pcf->Fold(&searchThing[0], searchThing.size(), search, lengthFind); + while (forward ? (pos < endSearch) : (pos >= endSearch)) { + bool found = (pos + lengthFind) <= limitPos; + for (int indexSearch = 0; (indexSearch < lengthFind) && found; indexSearch++) { + char ch = CharAt(pos + indexSearch); + char folded[2]; + pcf->Fold(folded, sizeof(folded), &ch, 1); + found = folded[0] == searchThing[indexSearch]; + } + if (found && MatchesWordOptions(word, wordStart, pos, lengthFind)) { + return pos; + } + pos += increment; + if (dbcsCodePage && (pos >= 0)) { + // Ensure trying to match from start of character + pos = MovePositionOutsideChar(pos, increment, false); + } + } + } + } + //Platform::DebugPrintf("Not found\n"); + return -1; +} + +const char *Document::SubstituteByPosition(const char *text, int *length) { + return regex->SubstituteByPosition(this, text, length); +} + +int Document::LinesTotal() const { + return cb.Lines(); +} + +void Document::ChangeCase(Range r, bool makeUpperCase) { + for (int pos = r.start; pos < r.end;) { + int len = LenChar(pos); + if (len == 1) { + char ch = CharAt(pos); + if (makeUpperCase) { + if (IsLowerCase(ch)) { + ChangeChar(pos, static_cast(MakeUpperCase(ch))); + } + } else { + if (IsUpperCase(ch)) { + ChangeChar(pos, static_cast(MakeLowerCase(ch))); + } + } + } + pos += len; + } +} + +void Document::SetDefaultCharClasses(bool includeWordClass) { + charClass.SetDefaultCharClasses(includeWordClass); +} + +void Document::SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass) { + charClass.SetCharClasses(chars, newCharClass); +} + +void Document::SetStylingBits(int bits) { + stylingBits = bits; + stylingBitsMask = (1 << stylingBits) - 1; +} + +void Document::StartStyling(int position, char mask) { + stylingMask = mask; + endStyled = position; +} + +bool Document::SetStyleFor(int length, char style) { + if (enteredStyling != 0) { + return false; + } else { + enteredStyling++; + style &= stylingMask; + int prevEndStyled = endStyled; + if (cb.SetStyleFor(endStyled, length, style, stylingMask)) { + DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER, + prevEndStyled, length); + NotifyModified(mh); + } + endStyled += length; + enteredStyling--; + return true; + } +} + +bool Document::SetStyles(int length, const char *styles) { + if (enteredStyling != 0) { + return false; + } else { + enteredStyling++; + bool didChange = false; + int startMod = 0; + int endMod = 0; + for (int iPos = 0; iPos < length; iPos++, endStyled++) { + PLATFORM_ASSERT(endStyled < Length()); + if (cb.SetStyleAt(endStyled, styles[iPos], stylingMask)) { + if (!didChange) { + startMod = endStyled; + } + didChange = true; + endMod = endStyled; + } + } + if (didChange) { + DocModification mh(SC_MOD_CHANGESTYLE | SC_PERFORMED_USER, + startMod, endMod - startMod + 1); + NotifyModified(mh); + } + enteredStyling--; + return true; + } +} + +void Document::EnsureStyledTo(int pos) { + if ((enteredStyling == 0) && (pos > GetEndStyled())) { + IncrementStyleClock(); + // Ask the watchers to style, and stop as soon as one responds. + for (int i = 0; pos > GetEndStyled() && i < lenWatchers; i++) { + watchers[i].watcher->NotifyStyleNeeded(this, watchers[i].userData, pos); + } + } +} + +int Document::SetLineState(int line, int state) { + int statePrevious = static_cast(perLineData[ldState])->SetLineState(line, state); + if (state != statePrevious) { + DocModification mh(SC_MOD_CHANGELINESTATE, 0, 0, 0, 0, line); + NotifyModified(mh); + } + return statePrevious; +} + +int Document::GetLineState(int line) const { + return static_cast(perLineData[ldState])->GetLineState(line); +} + +int Document::GetMaxLineState() { + return static_cast(perLineData[ldState])->GetMaxLineState(); +} + +StyledText Document::MarginStyledText(int line) { + LineAnnotation *pla = static_cast(perLineData[ldMargin]); + return StyledText(pla->Length(line), pla->Text(line), + pla->MultipleStyles(line), pla->Style(line), pla->Styles(line)); +} + +void Document::MarginSetText(int line, const char *text) { + static_cast(perLineData[ldMargin])->SetText(line, text); + DocModification mh(SC_MOD_CHANGEMARGIN, LineStart(line), 0, 0, 0, line); + NotifyModified(mh); +} + +void Document::MarginSetStyle(int line, int style) { + static_cast(perLineData[ldMargin])->SetStyle(line, style); +} + +void Document::MarginSetStyles(int line, const unsigned char *styles) { + static_cast(perLineData[ldMargin])->SetStyles(line, styles); +} + +int Document::MarginLength(int line) const { + return static_cast(perLineData[ldMargin])->Length(line); +} + +void Document::MarginClearAll() { + int maxEditorLine = LinesTotal(); + for (int l=0;l(perLineData[ldMargin])->ClearAll(); +} + +bool Document::AnnotationAny() const { + return static_cast(perLineData[ldAnnotation])->AnySet(); +} + +StyledText Document::AnnotationStyledText(int line) { + LineAnnotation *pla = static_cast(perLineData[ldAnnotation]); + return StyledText(pla->Length(line), pla->Text(line), + pla->MultipleStyles(line), pla->Style(line), pla->Styles(line)); +} + +void Document::AnnotationSetText(int line, const char *text) { + const int linesBefore = AnnotationLines(line); + static_cast(perLineData[ldAnnotation])->SetText(line, text); + const int linesAfter = AnnotationLines(line); + DocModification mh(SC_MOD_CHANGEANNOTATION, LineStart(line), 0, 0, 0, line); + mh.annotationLinesAdded = linesAfter - linesBefore; + NotifyModified(mh); +} + +void Document::AnnotationSetStyle(int line, int style) { + static_cast(perLineData[ldAnnotation])->SetStyle(line, style); +} + +void Document::AnnotationSetStyles(int line, const unsigned char *styles) { + static_cast(perLineData[ldAnnotation])->SetStyles(line, styles); +} + +int Document::AnnotationLength(int line) const { + return static_cast(perLineData[ldAnnotation])->Length(line); +} + +int Document::AnnotationLines(int line) const { + return static_cast(perLineData[ldAnnotation])->Lines(line); +} + +void Document::AnnotationClearAll() { + int maxEditorLine = LinesTotal(); + for (int l=0;l(perLineData[ldAnnotation])->ClearAll(); +} + +void Document::IncrementStyleClock() { + styleClock = (styleClock + 1) % 0x100000; +} + +void Document::DecorationFillRange(int position, int value, int fillLength) { + if (decorations.FillRange(position, value, fillLength)) { + DocModification mh(SC_MOD_CHANGEINDICATOR | SC_PERFORMED_USER, + position, fillLength); + NotifyModified(mh); + } +} + +bool Document::AddWatcher(DocWatcher *watcher, void *userData) { + for (int i = 0; i < lenWatchers; i++) { + if ((watchers[i].watcher == watcher) && + (watchers[i].userData == userData)) + return false; + } + WatcherWithUserData *pwNew = new WatcherWithUserData[lenWatchers + 1]; + for (int j = 0; j < lenWatchers; j++) + pwNew[j] = watchers[j]; + pwNew[lenWatchers].watcher = watcher; + pwNew[lenWatchers].userData = userData; + delete []watchers; + watchers = pwNew; + lenWatchers++; + return true; +} + +bool Document::RemoveWatcher(DocWatcher *watcher, void *userData) { + for (int i = 0; i < lenWatchers; i++) { + if ((watchers[i].watcher == watcher) && + (watchers[i].userData == userData)) { + if (lenWatchers == 1) { + delete []watchers; + watchers = 0; + lenWatchers = 0; + } else { + WatcherWithUserData *pwNew = new WatcherWithUserData[lenWatchers]; + for (int j = 0; j < lenWatchers - 1; j++) { + pwNew[j] = (j < i) ? watchers[j] : watchers[j + 1]; + } + delete []watchers; + watchers = pwNew; + lenWatchers--; + } + return true; + } + } + return false; +} + +void Document::NotifyModifyAttempt() { + for (int i = 0; i < lenWatchers; i++) { + watchers[i].watcher->NotifyModifyAttempt(this, watchers[i].userData); + } +} + +void Document::NotifySavePoint(bool atSavePoint) { + for (int i = 0; i < lenWatchers; i++) { + watchers[i].watcher->NotifySavePoint(this, watchers[i].userData, atSavePoint); + } +} + +void Document::NotifyModified(DocModification mh) { + if (mh.modificationType & SC_MOD_INSERTTEXT) { + decorations.InsertSpace(mh.position, mh.length); + } else if (mh.modificationType & SC_MOD_DELETETEXT) { + decorations.DeleteRange(mh.position, mh.length); + } + for (int i = 0; i < lenWatchers; i++) { + watchers[i].watcher->NotifyModified(this, mh, watchers[i].userData); + } +} + +bool Document::IsWordPartSeparator(char ch) { + return (WordCharClass(ch) == CharClassify::ccWord) && IsPunctuation(ch); +} + +int Document::WordPartLeft(int pos) { + if (pos > 0) { + --pos; + char startChar = cb.CharAt(pos); + if (IsWordPartSeparator(startChar)) { + while (pos > 0 && IsWordPartSeparator(cb.CharAt(pos))) { + --pos; + } + } + if (pos > 0) { + startChar = cb.CharAt(pos); + --pos; + if (IsLowerCase(startChar)) { + while (pos > 0 && IsLowerCase(cb.CharAt(pos))) + --pos; + if (!IsUpperCase(cb.CharAt(pos)) && !IsLowerCase(cb.CharAt(pos))) + ++pos; + } else if (IsUpperCase(startChar)) { + while (pos > 0 && IsUpperCase(cb.CharAt(pos))) + --pos; + if (!IsUpperCase(cb.CharAt(pos))) + ++pos; + } else if (IsADigit(startChar)) { + while (pos > 0 && IsADigit(cb.CharAt(pos))) + --pos; + if (!IsADigit(cb.CharAt(pos))) + ++pos; + } else if (IsPunctuation(startChar)) { + while (pos > 0 && IsPunctuation(cb.CharAt(pos))) + --pos; + if (!IsPunctuation(cb.CharAt(pos))) + ++pos; + } else if (isspacechar(startChar)) { + while (pos > 0 && isspacechar(cb.CharAt(pos))) + --pos; + if (!isspacechar(cb.CharAt(pos))) + ++pos; + } else if (!isascii(startChar)) { + while (pos > 0 && !isascii(cb.CharAt(pos))) + --pos; + if (isascii(cb.CharAt(pos))) + ++pos; + } else { + ++pos; + } + } + } + return pos; +} + +int Document::WordPartRight(int pos) { + char startChar = cb.CharAt(pos); + int length = Length(); + if (IsWordPartSeparator(startChar)) { + while (pos < length && IsWordPartSeparator(cb.CharAt(pos))) + ++pos; + startChar = cb.CharAt(pos); + } + if (!isascii(startChar)) { + while (pos < length && !isascii(cb.CharAt(pos))) + ++pos; + } else if (IsLowerCase(startChar)) { + while (pos < length && IsLowerCase(cb.CharAt(pos))) + ++pos; + } else if (IsUpperCase(startChar)) { + if (IsLowerCase(cb.CharAt(pos + 1))) { + ++pos; + while (pos < length && IsLowerCase(cb.CharAt(pos))) + ++pos; + } else { + while (pos < length && IsUpperCase(cb.CharAt(pos))) + ++pos; + } + if (IsLowerCase(cb.CharAt(pos)) && IsUpperCase(cb.CharAt(pos - 1))) + --pos; + } else if (IsADigit(startChar)) { + while (pos < length && IsADigit(cb.CharAt(pos))) + ++pos; + } else if (IsPunctuation(startChar)) { + while (pos < length && IsPunctuation(cb.CharAt(pos))) + ++pos; + } else if (isspacechar(startChar)) { + while (pos < length && isspacechar(cb.CharAt(pos))) + ++pos; + } else { + ++pos; + } + return pos; +} + +bool IsLineEndChar(char c) { + return (c == '\n' || c == '\r'); +} + +int Document::ExtendStyleRange(int pos, int delta, bool singleLine) { + int sStart = cb.StyleAt(pos); + if (delta < 0) { + while (pos > 0 && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) ) + pos--; + pos++; + } else { + while (pos < (Length()) && (cb.StyleAt(pos) == sStart) && (!singleLine || !IsLineEndChar(cb.CharAt(pos))) ) + pos++; + } + return pos; +} + +static char BraceOpposite(char ch) { + switch (ch) { + case '(': + return ')'; + case ')': + return '('; + case '[': + return ']'; + case ']': + return '['; + case '{': + return '}'; + case '}': + return '{'; + case '<': + return '>'; + case '>': + return '<'; + default: + return '\0'; + } +} + +// TODO: should be able to extend styled region to find matching brace +int Document::BraceMatch(int position, int /*maxReStyle*/) { + char chBrace = CharAt(position); + char chSeek = BraceOpposite(chBrace); + if (chSeek == '\0') + return - 1; + char styBrace = static_cast(StyleAt(position) & stylingBitsMask); + int direction = -1; + if (chBrace == '(' || chBrace == '[' || chBrace == '{' || chBrace == '<') + direction = 1; + int depth = 1; + position = position + direction; + while ((position >= 0) && (position < Length())) { + position = MovePositionOutsideChar(position, direction, true); + char chAtPos = CharAt(position); + char styAtPos = static_cast(StyleAt(position) & stylingBitsMask); + if ((position > GetEndStyled()) || (styAtPos == styBrace)) { + if (chAtPos == chBrace) + depth++; + if (chAtPos == chSeek) + depth--; + if (depth == 0) + return position; + } + position = position + direction; + } + return - 1; +} + +/** + * Implementation of RegexSearchBase for the default built-in regular expression engine + */ +class BuiltinRegex : public RegexSearchBase { +public: + BuiltinRegex(CharClassify *charClassTable) : search(charClassTable), substituted(NULL) {} + + virtual ~BuiltinRegex() { + delete substituted; + } + + virtual long FindText(Document *doc, int minPos, int maxPos, const char *s, + bool caseSensitive, bool word, bool wordStart, int flags, + int *length); + + virtual const char *SubstituteByPosition(Document* doc, const char *text, int *length); + +private: + RESearch search; + char *substituted; +}; + +// Define a way for the Regular Expression code to access the document +class DocumentIndexer : public CharacterIndexer { + Document *pdoc; + int end; +public: + DocumentIndexer(Document *pdoc_, int end_) : + pdoc(pdoc_), end(end_) { + } + + virtual ~DocumentIndexer() { + } + + virtual char CharAt(int index) { + if (index < 0 || index >= end) + return 0; + else + return pdoc->CharAt(index); + } +}; + +long BuiltinRegex::FindText(Document *doc, int minPos, int maxPos, const char *s, + bool caseSensitive, bool, bool, int flags, + int *length) { + bool posix = (flags & SCFIND_POSIX) != 0; + int increment = (minPos <= maxPos) ? 1 : -1; + + int startPos = minPos; + int endPos = maxPos; + + // Range endpoints should not be inside DBCS characters, but just in case, move them. + startPos = doc->MovePositionOutsideChar(startPos, 1, false); + endPos = doc->MovePositionOutsideChar(endPos, 1, false); + + const char *errmsg = search.Compile(s, *length, caseSensitive, posix); + if (errmsg) { + return -1; + } + // Find a variable in a property file: \$(\([A-Za-z0-9_.]+\)) + // Replace first '.' with '-' in each property file variable reference: + // Search: \$(\([A-Za-z0-9_-]+\)\.\([A-Za-z0-9_.]+\)) + // Replace: $(\1-\2) + int lineRangeStart = doc->LineFromPosition(startPos); + int lineRangeEnd = doc->LineFromPosition(endPos); + if ((increment == 1) && + (startPos >= doc->LineEnd(lineRangeStart)) && + (lineRangeStart < lineRangeEnd)) { + // the start position is at end of line or between line end characters. + lineRangeStart++; + startPos = doc->LineStart(lineRangeStart); + } + int pos = -1; + int lenRet = 0; + char searchEnd = s[*length - 1]; + int lineRangeBreak = lineRangeEnd + increment; + for (int line = lineRangeStart; line != lineRangeBreak; line += increment) { + int startOfLine = doc->LineStart(line); + int endOfLine = doc->LineEnd(line); + if (increment == 1) { + if (line == lineRangeStart) { + if ((startPos != startOfLine) && (s[0] == '^')) + continue; // Can't match start of line if start position after start of line + startOfLine = startPos; + } + if (line == lineRangeEnd) { + if ((endPos != endOfLine) && (searchEnd == '$')) + continue; // Can't match end of line if end position before end of line + endOfLine = endPos; + } + } else { + if (line == lineRangeEnd) { + if ((endPos != startOfLine) && (s[0] == '^')) + continue; // Can't match start of line if end position after start of line + startOfLine = endPos; + } + if (line == lineRangeStart) { + if ((startPos != endOfLine) && (searchEnd == '$')) + continue; // Can't match end of line if start position before end of line + endOfLine = startPos; + } + } + + DocumentIndexer di(doc, endOfLine); + int success = search.Execute(di, startOfLine, endOfLine); + if (success) { + pos = search.bopat[0]; + lenRet = search.eopat[0] - search.bopat[0]; + if (increment == -1) { + // Check for the last match on this line. + int repetitions = 1000; // Break out of infinite loop + while (success && (search.eopat[0] <= endOfLine) && (repetitions--)) { + success = search.Execute(di, pos+1, endOfLine); + if (success) { + if (search.eopat[0] <= minPos) { + pos = search.bopat[0]; + lenRet = search.eopat[0] - search.bopat[0]; + } else { + success = 0; + } + } + } + } + break; + } + } + *length = lenRet; + return pos; +} + +const char *BuiltinRegex::SubstituteByPosition(Document* doc, const char *text, int *length) { + delete []substituted; + substituted = 0; + DocumentIndexer di(doc, doc->Length()); + if (!search.GrabMatches(di)) + return 0; + unsigned int lenResult = 0; + for (int i = 0; i < *length; i++) { + if (text[i] == '\\') { + if (text[i + 1] >= '1' && text[i + 1] <= '9') { + unsigned int patNum = text[i + 1] - '0'; + lenResult += search.eopat[patNum] - search.bopat[patNum]; + i++; + } else { + switch (text[i + 1]) { + case 'a': + case 'b': + case 'f': + case 'n': + case 'r': + case 't': + case 'v': + case '\\': + i++; + } + lenResult++; + } + } else { + lenResult++; + } + } + substituted = new char[lenResult + 1]; + char *o = substituted; + for (int j = 0; j < *length; j++) { + if (text[j] == '\\') { + if (text[j + 1] >= '1' && text[j + 1] <= '9') { + unsigned int patNum = text[j + 1] - '0'; + unsigned int len = search.eopat[patNum] - search.bopat[patNum]; + if (search.pat[patNum]) // Will be null if try for a match that did not occur + memcpy(o, search.pat[patNum], len); + o += len; + j++; + } else { + j++; + switch (text[j]) { + case 'a': + *o++ = '\a'; + break; + case 'b': + *o++ = '\b'; + break; + case 'f': + *o++ = '\f'; + break; + case 'n': + *o++ = '\n'; + break; + case 'r': + *o++ = '\r'; + break; + case 't': + *o++ = '\t'; + break; + case 'v': + *o++ = '\v'; + break; + case '\\': + *o++ = '\\'; + break; + default: + *o++ = '\\'; + j--; + } + } + } else { + *o++ = text[j]; + } + } + *o = '\0'; + *length = lenResult; + return substituted; +} + +#ifndef SCI_OWNREGEX + +#ifdef SCI_NAMESPACE + +RegexSearchBase *Scintilla::CreateRegexSearch(CharClassify *charClassTable) { + return new BuiltinRegex(charClassTable); +} + +#else + +RegexSearchBase *CreateRegexSearch(CharClassify *charClassTable) { + return new BuiltinRegex(charClassTable); +} + +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/Document.h b/sdk/wxscintilla/src/scintilla/src/Document.h new file mode 100644 index 0000000..d4964f0 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/Document.h @@ -0,0 +1,426 @@ +// Scintilla source code edit control +/** @file Document.h + ** Text document that handles notifications, DBCS, styling, words and end of line. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef DOCUMENT_H +#define DOCUMENT_H + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +/** + * A Position is a position within a document between two characters or at the beginning or end. + * Sometimes used as a character index where it identifies the character after the position. + */ +typedef int Position; +const Position invalidPosition = -1; + +/** + * The range class represents a range of text in a document. + * The two values are not sorted as one end may be more significant than the other + * as is the case for the selection where the end position is the position of the caret. + * If either position is invalidPosition then the range is invalid and most operations will fail. + */ +class Range { +public: + Position start; + Position end; + + Range(Position pos=0) : + start(pos), end(pos) { + } + Range(Position start_, Position end_) : + start(start_), end(end_) { + } + + bool Valid() const { + return (start != invalidPosition) && (end != invalidPosition); + } + + // Is the position within the range? + bool Contains(Position pos) const { + if (start < end) { + return (pos >= start && pos <= end); + } else { + return (pos <= start && pos >= end); + } + } + + // Is the character after pos within the range? + bool ContainsCharacter(Position pos) const { + if (start < end) { + return (pos >= start && pos < end); + } else { + return (pos < start && pos >= end); + } + } + + bool Contains(Range other) const { + return Contains(other.start) && Contains(other.end); + } + + bool Overlaps(Range other) const { + return + Contains(other.start) || + Contains(other.end) || + other.Contains(start) || + other.Contains(end); + } +}; + +class DocWatcher; +class DocModification; +class Document; + +/** + * Interface class for regular expression searching + */ +class RegexSearchBase { +public: + virtual ~RegexSearchBase(){} + + virtual long FindText(Document* doc, int minPos, int maxPos, const char *s, + bool caseSensitive, bool word, bool wordStart, int flags, int *length) = 0; + + ///@return String with the substitutions, must remain valid until the next call or destruction + virtual const char *SubstituteByPosition(Document* doc, const char *text, int *length) = 0; +}; + +/// Factory function for RegexSearchBase +extern RegexSearchBase* CreateRegexSearch(CharClassify *charClassTable); + +struct StyledText { + size_t length; + const char *text; + bool multipleStyles; + size_t style; + const unsigned char *styles; + StyledText( size_t length_, const char *text_, bool multipleStyles_, int style_, const unsigned char *styles_) : + length(length_), text(text_), multipleStyles(multipleStyles_), style(style_), styles(styles_) { + } + // Return number of bytes from start to before '\n' or end of text. + // Return 1 when start is outside text + size_t LineLength(size_t start) const { + size_t cur = start; + while ((cur < length) && (text[cur] != '\n')) + cur++; + return cur-start; + } + size_t StyleAt(size_t i) const { + return multipleStyles ? styles[i] : style; + } +}; + +class CaseFolder { +public: + virtual ~CaseFolder() { + } + virtual size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) = 0; +}; + +class CaseFolderTable : public CaseFolder { +protected: + char mapping[256]; +public: + CaseFolderTable(); + virtual ~CaseFolderTable(); + virtual size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed); + void SetTranslation(char ch, char chTranslation); + void StandardASCII(); +}; + +/** + */ +class Document : PerLine { + +public: + /** Used to pair watcher pointer with user data. */ + class WatcherWithUserData { + public: + DocWatcher *watcher; + void *userData; + WatcherWithUserData() { + watcher = 0; + userData = 0; + } + }; + + enum charClassification { ccSpace, ccNewLine, ccWord, ccPunctuation }; +private: + int refCount; + CellBuffer cb; + CharClassify charClass; + char stylingMask; + int endStyled; + int styleClock; + int enteredModification; + int enteredStyling; + int enteredReadOnlyCount; + + WatcherWithUserData *watchers; + int lenWatchers; + + // ldSize is not real data - it is for dimensions and loops + enum lineData { ldMarkers, ldLevels, ldState, ldMargin, ldAnnotation, ldSize }; + PerLine *perLineData[ldSize]; + + bool matchesValid; + RegexSearchBase* regex; + +public: + int stylingBits; + int stylingBitsMask; + + int eolMode; + /// Can also be SC_CP_UTF8 to enable UTF-8 mode + int dbcsCodePage; + int tabInChars; + int indentInChars; + int actualIndentInChars; + bool useTabs; + bool tabIndents; + bool backspaceUnindents; + + DecorationList decorations; + + Document(); + virtual ~Document(); + + int AddRef(); + int Release(); + + virtual void Init(); + virtual void InsertLine(int line); + virtual void RemoveLine(int line); + + int LineFromPosition(int pos) const; + int ClampPositionIntoDocument(int pos); + bool IsCrLf(int pos); + int LenChar(int pos); + bool InGoodUTF8(int pos, int &start, int &end); + int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true); + + // Gateways to modifying document + void ModifiedAt(int pos); + void CheckReadOnly(); + bool DeleteChars(int pos, int len); + bool InsertString(int position, const char *s, int insertLength); + int Undo(); + int Redo(); + bool CanUndo() { return cb.CanUndo(); } + bool CanRedo() { return cb.CanRedo(); } + void DeleteUndoHistory() { cb.DeleteUndoHistory(); } + bool SetUndoCollection(bool collectUndo) { + return cb.SetUndoCollection(collectUndo); + } + bool IsCollectingUndo() { return cb.IsCollectingUndo(); } + void BeginUndoAction() { cb.BeginUndoAction(); } + void EndUndoAction() { cb.EndUndoAction(); } + void AddUndoAction(int token, bool mayCoalesce) { cb.AddUndoAction(token, mayCoalesce); } + void SetSavePoint(); + bool IsSavePoint() { return cb.IsSavePoint(); } + const char *BufferPointer() { return cb.BufferPointer(); } + + int GetLineIndentation(int line); + void SetLineIndentation(int line, int indent); + int GetLineIndentPosition(int line) const; + int GetColumn(int position); + int FindColumn(int line, int column); + void Indent(bool forwards, int lineBottom, int lineTop); + static char *TransformLineEnds(int *pLenOut, const char *s, size_t len, int eolMode); + void ConvertLineEnds(int eolModeSet); + void SetReadOnly(bool set) { cb.SetReadOnly(set); } + bool IsReadOnly() { return cb.IsReadOnly(); } + + bool InsertChar(int pos, char ch); + bool InsertCString(int position, const char *s); + void ChangeChar(int pos, char ch); + void DelChar(int pos); + void DelCharBack(int pos); + + char CharAt(int position) { return cb.CharAt(position); } + void GetCharRange(char *buffer, int position, int lengthRetrieve) const { + cb.GetCharRange(buffer, position, lengthRetrieve); + } + char StyleAt(int position) const { return cb.StyleAt(position); } + int GetMark(int line); + int AddMark(int line, int markerNum); + void AddMarkSet(int line, int valueSet); + void DeleteMark(int line, int markerNum); + void DeleteMarkFromHandle(int markerHandle); + void DeleteAllMarks(int markerNum); + int LineFromHandle(int markerHandle); + int LineStart(int line) const; + int LineEnd(int line) const; + int LineEndPosition(int position) const; + bool IsLineEndPosition(int position) const; + int VCHomePosition(int position) const; + + int SetLevel(int line, int level); + int GetLevel(int line) const; + void ClearLevels(); + int GetLastChild(int lineParent, int level=-1); + int GetFoldParent(int line); + + void Indent(bool forwards); + int ExtendWordSelect(int pos, int delta, bool onlyWordCharacters=false); + int NextWordStart(int pos, int delta); + int NextWordEnd(int pos, int delta); + int Length() const { return cb.Length(); } + void Allocate(int newSize) { cb.Allocate(newSize); } + size_t ExtractChar(int pos, char *bytes); + bool MatchesWordOptions(bool word, bool wordStart, int pos, int length); + long FindText(int minPos, int maxPos, const char *search, bool caseSensitive, bool word, + bool wordStart, bool regExp, int flags, int *length, CaseFolder *pcf); + const char *SubstituteByPosition(const char *text, int *length); + int LinesTotal() const; + + void ChangeCase(Range r, bool makeUpperCase); + + void SetDefaultCharClasses(bool includeWordClass); + void SetCharClasses(const unsigned char *chars, CharClassify::cc newCharClass); + void SetStylingBits(int bits); + void StartStyling(int position, char mask); + bool SetStyleFor(int length, char style); + bool SetStyles(int length, const char *styles); + int GetEndStyled() { return endStyled; } + void EnsureStyledTo(int pos); + int GetStyleClock() { return styleClock; } + void IncrementStyleClock(); + void DecorationFillRange(int position, int value, int fillLength); + + int SetLineState(int line, int state); + int GetLineState(int line) const; + int GetMaxLineState(); + + StyledText MarginStyledText(int line); + void MarginSetStyle(int line, int style); + void MarginSetStyles(int line, const unsigned char *styles); + void MarginSetText(int line, const char *text); + int MarginLength(int line) const; + void MarginClearAll(); + + bool AnnotationAny() const; + StyledText AnnotationStyledText(int line); + void AnnotationSetText(int line, const char *text); + void AnnotationSetStyle(int line, int style); + void AnnotationSetStyles(int line, const unsigned char *styles); + int AnnotationLength(int line) const; + int AnnotationLines(int line) const; + void AnnotationClearAll(); + + bool AddWatcher(DocWatcher *watcher, void *userData); + bool RemoveWatcher(DocWatcher *watcher, void *userData); + const WatcherWithUserData *GetWatchers() const { return watchers; } + int GetLenWatchers() const { return lenWatchers; } + + bool IsWordPartSeparator(char ch); + int WordPartLeft(int pos); + int WordPartRight(int pos); + int ExtendStyleRange(int pos, int delta, bool singleLine = false); + bool IsWhiteLine(int line) const; + int ParaUp(int pos); + int ParaDown(int pos); + int IndentSize() { return actualIndentInChars; } + int BraceMatch(int position, int maxReStyle); + +private: + CharClassify::cc WordCharClass(unsigned char ch); + bool IsWordStartAt(int pos); + bool IsWordEndAt(int pos); + bool IsWordAt(int start, int end); + + void NotifyModifyAttempt(); + void NotifySavePoint(bool atSavePoint); + void NotifyModified(DocModification mh); +}; + +class UndoGroup { + Document *pdoc; + bool groupNeeded; +public: + UndoGroup(Document *pdoc_, bool groupNeeded_=true) : + pdoc(pdoc_), groupNeeded(groupNeeded_) { + if (groupNeeded) { + pdoc->BeginUndoAction(); + } + } + ~UndoGroup() { + if (groupNeeded) { + pdoc->EndUndoAction(); + } + } + bool Needed() const { + return groupNeeded; + } +}; + + +/** + * To optimise processing of document modifications by DocWatchers, a hint is passed indicating the + * scope of the change. + * If the DocWatcher is a document view then this can be used to optimise screen updating. + */ +class DocModification { +public: + int modificationType; + int position; + int length; + int linesAdded; /**< Negative if lines deleted. */ + const char *text; /**< Only valid for changes to text, not for changes to style. */ + int line; + int foldLevelNow; + int foldLevelPrev; + int annotationLinesAdded; + int token; + + DocModification(int modificationType_, int position_=0, int length_=0, + int linesAdded_=0, const char *text_=0, int line_=0) : + modificationType(modificationType_), + position(position_), + length(length_), + linesAdded(linesAdded_), + text(text_), + line(line_), + foldLevelNow(0), + foldLevelPrev(0), + annotationLinesAdded(0), + token(0) {} + + DocModification(int modificationType_, const Action &act, int linesAdded_=0) : + modificationType(modificationType_), + position(act.position), + length(act.lenData), + linesAdded(linesAdded_), + text(act.data), + line(0), + foldLevelNow(0), + foldLevelPrev(0), + annotationLinesAdded(0), + token(0) {} +}; + +/** + * A class that wants to receive notifications from a Document must be derived from DocWatcher + * and implement the notification methods. It can then be added to the watcher list with AddWatcher. + */ +class DocWatcher { +public: + virtual ~DocWatcher() {} + + virtual void NotifyModifyAttempt(Document *doc, void *userData) = 0; + virtual void NotifySavePoint(Document *doc, void *userData, bool atSavePoint) = 0; + virtual void NotifyModified(Document *doc, DocModification mh, void *userData) = 0; + virtual void NotifyDeleted(Document *doc, void *userData) = 0; + virtual void NotifyStyleNeeded(Document *doc, void *userData, int endPos) = 0; +}; + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/DocumentAccessor.cxx b/sdk/wxscintilla/src/scintilla/src/DocumentAccessor.cxx new file mode 100644 index 0000000..a25979d --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/DocumentAccessor.cxx @@ -0,0 +1,199 @@ +// Scintilla source code edit control +/** @file DocumentAccessor.cxx + ** Rapid easy access to contents of a Scintilla. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "DocumentAccessor.h" +#include "SplitVector.h" +#include "Partitioning.h" +#include "RunStyles.h" +#include "CellBuffer.h" +#include "Scintilla.h" +#include "CharClassify.h" +#include "Decoration.h" +#include "Document.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +DocumentAccessor::~DocumentAccessor() { +} + +bool DocumentAccessor::InternalIsLeadByte(char ch) { + if (SC_CP_UTF8 == codePage) + // For lexing, all characters >= 0x80 are treated the + // same so none is considered a lead byte. + return false; + else + return Platform::IsDBCSLeadByte(codePage, ch); +} + +void DocumentAccessor::Fill(int position) { + if (lenDoc == -1) + lenDoc = pdoc->Length(); + startPos = position - slopSize; + if (startPos + bufferSize > lenDoc) + startPos = lenDoc - bufferSize; + if (startPos < 0) + startPos = 0; + endPos = startPos + bufferSize; + if (endPos > lenDoc) + endPos = lenDoc; + + pdoc->GetCharRange(buf, startPos, endPos-startPos); + buf[endPos-startPos] = '\0'; +} + +bool DocumentAccessor::Match(int pos, const char *s) { + for (int i=0; *s; i++) { + if (*s != SafeGetCharAt(pos+i)) + return false; + s++; + } + return true; +} + +char DocumentAccessor::StyleAt(int position) { + // Mask off all bits which aren't in the 'mask'. + return static_cast(pdoc->StyleAt(position) & mask); +} + +int DocumentAccessor::GetLine(int position) { + return pdoc->LineFromPosition(position); +} + +int DocumentAccessor::LineStart(int line) { + return pdoc->LineStart(line); +} + +int DocumentAccessor::LevelAt(int line) { + return pdoc->GetLevel(line); +} + +int DocumentAccessor::Length() { + if (lenDoc == -1) + lenDoc = pdoc->Length(); + return lenDoc; +} + +int DocumentAccessor::GetLineState(int line) { + return pdoc->GetLineState(line); +} + +int DocumentAccessor::SetLineState(int line, int state) { + return pdoc->SetLineState(line, state); +} + +void DocumentAccessor::StartAt(unsigned int start, char chMask) { + // Store the mask specified for use with StyleAt. + mask = chMask; + pdoc->StartStyling(start, chMask); + startPosStyling = start; +} + +void DocumentAccessor::StartSegment(unsigned int pos) { + startSeg = pos; +} + +void DocumentAccessor::ColourTo(unsigned int pos, int chAttr) { + // Only perform styling if non empty range + if (pos != startSeg - 1) { + PLATFORM_ASSERT(pos >= startSeg); + if (pos < startSeg) { + return; + } + + if (validLen + (pos - startSeg + 1) >= bufferSize) + Flush(); + if (validLen + (pos - startSeg + 1) >= bufferSize) { + // Too big for buffer so send directly + pdoc->SetStyleFor(pos - startSeg + 1, static_cast(chAttr)); + } else { + if (chAttr != chWhile) + chFlags = 0; + chAttr |= chFlags; + for (unsigned int i = startSeg; i <= pos; i++) { + PLATFORM_ASSERT((startPosStyling + validLen) < Length()); + styleBuf[validLen++] = static_cast(chAttr); + } + } + } + startSeg = pos+1; +} + +void DocumentAccessor::SetLevel(int line, int level) { + pdoc->SetLevel(line, level); +} + +void DocumentAccessor::Flush() { + startPos = extremePosition; + lenDoc = -1; + if (validLen > 0) { + pdoc->SetStyles(validLen, styleBuf); + startPosStyling += validLen; + validLen = 0; + } +} + +int DocumentAccessor::IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader) { + int end = Length(); + int spaceFlags = 0; + + // Determines the indentation level of the current line and also checks for consistent + // indentation compared to the previous line. + // Indentation is judged consistent when the indentation whitespace of each line lines + // the same or the indentation of one line is a prefix of the other. + + int pos = LineStart(line); + char ch = (*this)[pos]; + int indent = 0; + bool inPrevPrefix = line > 0; + int posPrev = inPrevPrefix ? LineStart(line-1) : 0; + while ((ch == ' ' || ch == '\t') && (pos < end)) { + if (inPrevPrefix) { + char chPrev = (*this)[posPrev++]; + if (chPrev == ' ' || chPrev == '\t') { + if (chPrev != ch) + spaceFlags |= wsInconsistent; + } else { + inPrevPrefix = false; + } + } + if (ch == ' ') { + spaceFlags |= wsSpace; + indent++; + } else { // Tab + spaceFlags |= wsTab; + if (spaceFlags & wsSpace) + spaceFlags |= wsSpaceTab; + indent = (indent / 8 + 1) * 8; + } + ch = (*this)[++pos]; + } + + *flags = spaceFlags; + indent += SC_FOLDLEVELBASE; + // if completely empty line or the start of a comment... + if ((ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') || + (pfnIsCommentLeader && (*pfnIsCommentLeader)(*this, pos, end-pos)) ) + return indent | SC_FOLDLEVELWHITEFLAG; + else + return indent; +} + +void DocumentAccessor::IndicatorFill(int start, int end, int indicator, int value) { + pdoc->decorations.SetCurrentIndicator(indicator); + pdoc->DecorationFillRange(start, value, end - start); +} diff --git a/sdk/wxscintilla/src/scintilla/src/DocumentAccessor.h b/sdk/wxscintilla/src/scintilla/src/DocumentAccessor.h new file mode 100644 index 0000000..c7af142 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/DocumentAccessor.h @@ -0,0 +1,77 @@ +// Scintilla source code edit control +/** @file DocumentAccessor.h + ** Implementation of BufferAccess and StylingAccess on a Scintilla + ** rapid easy access to contents of a Scintilla. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +class Document; + +/** + */ + +class DocumentAccessor : public Accessor { + // Private so DocumentAccessor objects can not be copied + DocumentAccessor(const DocumentAccessor &source); + DocumentAccessor &operator=(const DocumentAccessor &); + +protected: + Document *pdoc; + PropertyGet &props; + WindowID id; + int lenDoc; + + char styleBuf[bufferSize]; + int validLen; + char chFlags; + char chWhile; + unsigned int startSeg; + int startPosStyling; + int mask; + + bool InternalIsLeadByte(char ch); + void Fill(int position); + +public: + DocumentAccessor(Document *pdoc_, PropertyGet &props_, WindowID id_=0) : + Accessor(), pdoc(pdoc_), props(props_), id(id_), + lenDoc(-1), validLen(0), chFlags(0), chWhile(0), + startSeg(0), startPosStyling(0), + mask(127) { // Initialize the mask to be big enough for any lexer. + } + ~DocumentAccessor(); + bool Match(int pos, const char *s); + char StyleAt(int position); + int GetLine(int position); + int LineStart(int line); + int LevelAt(int line); + int Length(); + void Flush(); + int GetLineState(int line); + int SetLineState(int line, int state); + int GetPropertyInt(const char *key, int defaultValue=0) { + return props.GetInt(key, defaultValue); + } + char *GetProperties() { + return props.ToString(); + } + WindowID GetWindow() { return id; } + + void StartAt(unsigned int start, char chMask=31); + void SetFlags(char chFlags_, char chWhile_) {chFlags = chFlags_; chWhile = chWhile_; } + unsigned int GetStartSegment() { return startSeg; } + void StartSegment(unsigned int pos); + void ColourTo(unsigned int pos, int chAttr); + void SetLevel(int line, int level); + int IndentAmount(int line, int *flags, PFNIsCommentLeader pfnIsCommentLeader = 0); + void IndicatorFill(int start, int end, int indicator, int value); +}; + +#ifdef SCI_NAMESPACE +} +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/Editor.cxx b/sdk/wxscintilla/src/scintilla/src/Editor.cxx new file mode 100644 index 0000000..8bf418e --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/Editor.cxx @@ -0,0 +1,8708 @@ +// Scintilla source code edit control +/** @file Editor.cxx + ** Main code for the edit control. + **/ +// Copyright 1998-2004 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include +#include +#include +#include + +// With Borland C++ 5.5, including includes Windows.h leading to defining +// FindText to FindTextA which makes calls here to Document::FindText fail. +#ifdef __BORLANDC__ +#ifdef FindText +#undef FindText +#endif +#endif + +#include "Platform.h" + +#include "Scintilla.h" + +#include "SplitVector.h" +#include "Partitioning.h" +#include "RunStyles.h" +#include "ContractionState.h" +#include "CellBuffer.h" +#include "KeyMap.h" +#include "Indicator.h" +#include "XPM.h" +#include "LineMarker.h" +#include "Style.h" +#include "ViewStyle.h" +#include "CharClassify.h" +#include "Decoration.h" +#include "Document.h" +#include "Selection.h" +#include "PositionCache.h" +#include "Editor.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +/* + return whether this modification represents an operation that + may reasonably be deferred (not done now OR [possibly] at all) +*/ +static bool CanDeferToLastStep(const DocModification& mh) { + if (mh.modificationType & (SC_MOD_BEFOREINSERT | SC_MOD_BEFOREDELETE)) + return true; // CAN skip + if (!(mh.modificationType & (SC_PERFORMED_UNDO | SC_PERFORMED_REDO))) + return false; // MUST do + if (mh.modificationType & SC_MULTISTEPUNDOREDO) + return true; // CAN skip + return false; // PRESUMABLY must do +} + +static bool CanEliminate(const DocModification& mh) { + return + (mh.modificationType & (SC_MOD_BEFOREINSERT | SC_MOD_BEFOREDELETE)) != 0; +} + +/* + return whether this modification represents the FINAL step + in a [possibly lengthy] multi-step Undo/Redo sequence +*/ +static bool IsLastStep(const DocModification& mh) { + return + (mh.modificationType & (SC_PERFORMED_UNDO | SC_PERFORMED_REDO)) != 0 + && (mh.modificationType & SC_MULTISTEPUNDOREDO) != 0 + && (mh.modificationType & SC_LASTSTEPINUNDOREDO) != 0 + && (mh.modificationType & SC_MULTILINEUNDOREDO) != 0; +} + +Caret::Caret() : + active(false), on(false), period(500) {} + +Timer::Timer() : + ticking(false), ticksToWait(0), tickerID(0) {} + +Idler::Idler() : + state(false), idlerID(0) {} + +static inline bool IsControlCharacter(int ch) { + // iscntrl returns true for lots of chars > 127 which are displayable + return ch >= 0 && ch < ' '; +} + +Editor::Editor() { + ctrlID = 0; + + stylesValid = false; + + printMagnification = 0; + printColourMode = SC_PRINT_NORMAL; + printWrapState = eWrapWord; + cursorMode = SC_CURSORNORMAL; + controlCharSymbol = 0; /* Draw the control characters */ + + hasFocus = false; + hideSelection = false; + inOverstrike = false; + errorStatus = 0; + mouseDownCaptures = true; + + bufferedDraw = true; + twoPhaseDraw = true; + + lastClickTime = 0; + dwellDelay = SC_TIME_FOREVER; + ticksToDwell = SC_TIME_FOREVER; + dwelling = false; + ptMouseLast.x = 0; + ptMouseLast.y = 0; + inDragDrop = ddNone; + dropWentOutside = false; + posDrag = SelectionPosition(invalidPosition); + posDrop = SelectionPosition(invalidPosition); + selectionType = selChar; + + lastXChosen = 0; + lineAnchor = 0; + originalAnchorPos = 0; + + primarySelection = true; + + caretXPolicy = CARET_SLOP | CARET_EVEN; + caretXSlop = 50; + + caretYPolicy = CARET_EVEN; + caretYSlop = 0; + + searchAnchor = 0; + + xOffset = 0; + xCaretMargin = 50; + horizontalScrollBarVisible = true; + scrollWidth = 2000; + trackLineWidth = false; + lineWidthMaxSeen = 0; + verticalScrollBarVisible = true; + endAtLastLine = true; + caretSticky = false; + multipleSelection = false; + additionalSelectionTyping = false; + multiPasteMode = SC_MULTIPASTE_ONCE; + additionalCaretsBlink = true; + additionalCaretsVisible = true; + virtualSpaceOptions = SCVS_NONE; + + pixmapLine = Surface::Allocate(); + pixmapSelMargin = Surface::Allocate(); + pixmapSelPattern = Surface::Allocate(); + pixmapIndentGuide = Surface::Allocate(); + pixmapIndentGuideHighlight = Surface::Allocate(); + + targetStart = 0; + targetEnd = 0; + searchFlags = 0; + + topLine = 0; + posTopLine = 0; + + lengthForEncode = -1; + + needUpdateUI = true; + braces[0] = invalidPosition; + braces[1] = invalidPosition; + bracesMatchStyle = STYLE_BRACEBAD; + highlightGuideColumn = 0; + + theEdge = 0; + + paintState = notPainting; + + modEventMask = SC_MODEVENTMASKALL; + + pdoc = new Document(); + pdoc->AddRef(); + pdoc->AddWatcher(this, 0); + + recordingMacro = false; + foldFlags = 0; + + wrapState = eWrapNone; + wrapWidth = LineLayout::wrapWidthInfinite; + wrapStart = wrapLineLarge; + wrapEnd = wrapLineLarge; + wrapVisualFlags = 0; + wrapVisualFlagsLocation = 0; + wrapVisualStartIndent = 0; + wrapIndentMode = SC_WRAPINDENT_FIXED; + wrapAddIndent = 0; + + convertPastes = true; + + hsStart = -1; + hsEnd = -1; + + llc.SetLevel(LineLayoutCache::llcCaret); + posCache.SetSize(0x400); +} + +Editor::~Editor() { + pdoc->RemoveWatcher(this, 0); + pdoc->Release(); + pdoc = 0; + DropGraphics(); + delete pixmapLine; + delete pixmapSelMargin; + delete pixmapSelPattern; + delete pixmapIndentGuide; + delete pixmapIndentGuideHighlight; +} + +void Editor::Finalise() { + SetIdle(false); + CancelModes(); +} + +void Editor::DropGraphics() { + pixmapLine->Release(); + pixmapSelMargin->Release(); + pixmapSelPattern->Release(); + pixmapIndentGuide->Release(); + pixmapIndentGuideHighlight->Release(); +} + +void Editor::InvalidateStyleData() { + stylesValid = false; + DropGraphics(); + palette.Release(); + llc.Invalidate(LineLayout::llInvalid); + posCache.Clear(); +} + +void Editor::InvalidateStyleRedraw() { + NeedWrapping(); + InvalidateStyleData(); + Redraw(); +} + +void Editor::RefreshColourPalette(Palette &pal, bool want) { + vs.RefreshColourPalette(pal, want); +} + +void Editor::RefreshStyleData() { + if (!stylesValid) { + stylesValid = true; + AutoSurface surface(this); + if (surface) { + vs.Refresh(*surface); + RefreshColourPalette(palette, true); + palette.Allocate(wMain); + RefreshColourPalette(palette, false); + } + if (wrapIndentMode == SC_WRAPINDENT_INDENT) { + wrapAddIndent = pdoc->IndentSize() * vs.spaceWidth; + } else if (wrapIndentMode == SC_WRAPINDENT_SAME) { + wrapAddIndent = 0; + } else { //SC_WRAPINDENT_FIXED + wrapAddIndent = wrapVisualStartIndent * vs.aveCharWidth; + if ((wrapVisualFlags & SC_WRAPVISUALFLAG_START) && (wrapAddIndent <= 0)) + wrapAddIndent = vs.aveCharWidth; // must indent to show start visual + } + SetScrollBars(); + SetRectangularRange(); + } +} + +PRectangle Editor::GetClientRectangle() { + return wMain.GetClientPosition(); +} + +PRectangle Editor::GetTextRectangle() { + PRectangle rc = GetClientRectangle(); + rc.left += vs.fixedColumnWidth; + rc.right -= vs.rightMarginWidth; + return rc; +} + +int Editor::LinesOnScreen() { + PRectangle rcClient = GetClientRectangle(); + int htClient = rcClient.bottom - rcClient.top; + //Platform::DebugPrintf("lines on screen = %d\n", htClient / lineHeight + 1); + return htClient / vs.lineHeight; +} + +int Editor::LinesToScroll() { + int retVal = LinesOnScreen() - 1; + if (retVal < 1) + return 1; + else + return retVal; +} + +int Editor::MaxScrollPos() { + //Platform::DebugPrintf("Lines %d screen = %d maxScroll = %d\n", + //LinesTotal(), LinesOnScreen(), LinesTotal() - LinesOnScreen() + 1); + int retVal = cs.LinesDisplayed(); + if (endAtLastLine) { + retVal -= LinesOnScreen(); + } else { + retVal--; + } + if (retVal < 0) { + return 0; + } else { + return retVal; + } +} + +const char *ControlCharacterString(unsigned char ch) { + const char *reps[] = { + "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL", + "BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI", + "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB", + "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US" + }; + if (ch < (sizeof(reps) / sizeof(reps[0]))) { + return reps[ch]; + } else { + return "BAD"; + } +} + +/** + * Convenience class to ensure LineLayout objects are always disposed. + */ +class AutoLineLayout { + LineLayoutCache &llc; + LineLayout *ll; + AutoLineLayout &operator=(const AutoLineLayout &); +public: + AutoLineLayout(LineLayoutCache &llc_, LineLayout *ll_) : llc(llc_), ll(ll_) {} + ~AutoLineLayout() { + llc.Dispose(ll); + ll = 0; + } + LineLayout *operator->() const { + return ll; + } + operator LineLayout *() const { + return ll; + } + void Set(LineLayout *ll_) { + llc.Dispose(ll); + ll = ll_; + } +}; + +SelectionPosition Editor::ClampPositionIntoDocument(SelectionPosition sp) const { + if (sp.Position() < 0) { + return SelectionPosition(0); + } else if (sp.Position() > pdoc->Length()) { + return SelectionPosition(pdoc->Length()); + } else { + // If not at end of line then set offset to 0 + if (!pdoc->IsLineEndPosition(sp.Position())) + sp.SetVirtualSpace(0); + return sp; + } +} + +Point Editor::LocationFromPosition(SelectionPosition pos) { + Point pt; + RefreshStyleData(); + if (pos.Position() == INVALID_POSITION) + return pt; + int line = pdoc->LineFromPosition(pos.Position()); + int lineVisible = cs.DisplayFromDoc(line); + //Platform::DebugPrintf("line=%d\n", line); + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(line)); + if (surface && ll) { + // -1 because of adding in for visible lines in following loop. + pt.y = (lineVisible - topLine - 1) * vs.lineHeight; + pt.x = 0; + unsigned int posLineStart = pdoc->LineStart(line); + LayoutLine(line, surface, vs, ll, wrapWidth); + int posInLine = pos.Position() - posLineStart; + // In case of very long line put x at arbitrary large position + if (posInLine > ll->maxLineLength) { + pt.x = ll->positions[ll->maxLineLength] - ll->positions[ll->LineStart(ll->lines)]; + } + + for (int subLine = 0; subLine < ll->lines; subLine++) { + if ((posInLine >= ll->LineStart(subLine)) && (posInLine <= ll->LineStart(subLine + 1))) { + pt.x = ll->positions[posInLine] - ll->positions[ll->LineStart(subLine)]; + if (ll->wrapIndent != 0) { + int lineStart = ll->LineStart(subLine); + if (lineStart != 0) // Wrapped + pt.x += ll->wrapIndent; + } + } + if (posInLine >= ll->LineStart(subLine)) { + pt.y += vs.lineHeight; + } + } + pt.x += vs.fixedColumnWidth - xOffset; + } + pt.x += pos.VirtualSpace() * static_cast(vs.styles[ll->EndLineStyle()].spaceWidth); + return pt; +} + +Point Editor::LocationFromPosition(int pos) { + return LocationFromPosition(SelectionPosition(pos)); +} + +int Editor::XFromPosition(int pos) { + Point pt = LocationFromPosition(pos); + return pt.x - vs.fixedColumnWidth + xOffset; +} + +int Editor::XFromPosition(SelectionPosition sp) { + Point pt = LocationFromPosition(sp); + return pt.x - vs.fixedColumnWidth + xOffset; +} + +int Editor::LineFromLocation(Point pt) { + return cs.DocFromDisplay(pt.y / vs.lineHeight + topLine); +} + +void Editor::SetTopLine(int topLineNew) { + topLine = topLineNew; + posTopLine = pdoc->LineStart(cs.DocFromDisplay(topLine)); +} + +SelectionPosition Editor::SPositionFromLocation(Point pt, bool canReturnInvalid, bool charPosition, bool virtualSpace) { + RefreshStyleData(); + if (canReturnInvalid) { + PRectangle rcClient = GetTextRectangle(); + if (!rcClient.Contains(pt)) + return SelectionPosition(INVALID_POSITION); + if (pt.x < vs.fixedColumnWidth) + return SelectionPosition(INVALID_POSITION); + if (pt.y < 0) + return SelectionPosition(INVALID_POSITION); + } + pt.x = pt.x - vs.fixedColumnWidth + xOffset; + int visibleLine = pt.y / vs.lineHeight + topLine; + if (pt.y < 0) { // Division rounds towards 0 + visibleLine = (pt.y - (vs.lineHeight - 1)) / vs.lineHeight + topLine; + } + if (!canReturnInvalid && (visibleLine < 0)) + visibleLine = 0; + int lineDoc = cs.DocFromDisplay(visibleLine); + if (canReturnInvalid && (lineDoc < 0)) + return SelectionPosition(INVALID_POSITION); + if (lineDoc >= pdoc->LinesTotal()) + return SelectionPosition(canReturnInvalid ? INVALID_POSITION : pdoc->Length()); + unsigned int posLineStart = pdoc->LineStart(lineDoc); + SelectionPosition retVal(canReturnInvalid ? INVALID_POSITION : static_cast(posLineStart)); + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc)); + if (surface && ll) { + LayoutLine(lineDoc, surface, vs, ll, wrapWidth); + int lineStartSet = cs.DisplayFromDoc(lineDoc); + int subLine = visibleLine - lineStartSet; + if (subLine < ll->lines) { + int lineStart = ll->LineStart(subLine); + int lineEnd = ll->LineLastVisible(subLine); + int subLineStart = ll->positions[lineStart]; + + if (ll->wrapIndent != 0) { + if (lineStart != 0) // Wrapped + pt.x -= ll->wrapIndent; + } + int i = ll->FindBefore(pt.x + subLineStart, lineStart, lineEnd); + while (i < lineEnd) { + if (charPosition) { + if ((pt.x + subLineStart) < (ll->positions[i + 1])) { + return SelectionPosition(pdoc->MovePositionOutsideChar(i + posLineStart, 1)); + } + } else { + if ((pt.x + subLineStart) < ((ll->positions[i] + ll->positions[i + 1]) / 2)) { + return SelectionPosition(pdoc->MovePositionOutsideChar(i + posLineStart, 1)); + } + } + i++; + } + if (virtualSpace) { + const int spaceWidth = static_cast(vs.styles[ll->EndLineStyle()].spaceWidth); + int spaceOffset = (pt.x + subLineStart - ll->positions[lineEnd] + spaceWidth / 2) / + spaceWidth; + return SelectionPosition(lineEnd + posLineStart, spaceOffset); + } else if (canReturnInvalid) { + if (pt.x < (ll->positions[lineEnd] - subLineStart)) { + return SelectionPosition(pdoc->MovePositionOutsideChar(lineEnd + posLineStart, 1)); + } + } else { + return SelectionPosition(lineEnd + posLineStart); + } + } + if (!canReturnInvalid) + return SelectionPosition(ll->numCharsInLine + posLineStart); + } + return retVal; +} + +int Editor::PositionFromLocation(Point pt, bool canReturnInvalid, bool charPosition) { + return SPositionFromLocation(pt, canReturnInvalid, charPosition, false).Position(); +} + +/** + * Find the document position corresponding to an x coordinate on a particular document line. + * Ensure is between whole characters when document is in multi-byte or UTF-8 mode. + */ +int Editor::PositionFromLineX(int lineDoc, int x) { + RefreshStyleData(); + if (lineDoc >= pdoc->LinesTotal()) + return pdoc->Length(); + //Platform::DebugPrintf("Position of (%d,%d) line = %d top=%d\n", pt.x, pt.y, line, topLine); + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc)); + int retVal = 0; + if (surface && ll) { + unsigned int posLineStart = pdoc->LineStart(lineDoc); + LayoutLine(lineDoc, surface, vs, ll, wrapWidth); + retVal = ll->numCharsBeforeEOL + posLineStart; + int subLine = 0; + int lineStart = ll->LineStart(subLine); + int lineEnd = ll->LineLastVisible(subLine); + int subLineStart = ll->positions[lineStart]; + + if (ll->wrapIndent != 0) { + if (lineStart != 0) // Wrapped + x -= ll->wrapIndent; + } + int i = ll->FindBefore(x + subLineStart, lineStart, lineEnd); + while (i < lineEnd) { + if ((x + subLineStart) < ((ll->positions[i] + ll->positions[i + 1]) / 2)) { + retVal = pdoc->MovePositionOutsideChar(i + posLineStart, 1); + break; + } + i++; + } + } + return retVal; +} + +/** + * Find the document position corresponding to an x coordinate on a particular document line. + * Ensure is between whole characters when document is in multi-byte or UTF-8 mode. + */ +SelectionPosition Editor::SPositionFromLineX(int lineDoc, int x) { + RefreshStyleData(); + if (lineDoc >= pdoc->LinesTotal()) + return SelectionPosition(pdoc->Length()); + //Platform::DebugPrintf("Position of (%d,%d) line = %d top=%d\n", pt.x, pt.y, line, topLine); + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc)); + int retVal = 0; + if (surface && ll) { + unsigned int posLineStart = pdoc->LineStart(lineDoc); + LayoutLine(lineDoc, surface, vs, ll, wrapWidth); + int subLine = 0; + int lineStart = ll->LineStart(subLine); + int lineEnd = ll->LineLastVisible(subLine); + int subLineStart = ll->positions[lineStart]; + + if (ll->wrapIndent != 0) { + if (lineStart != 0) // Wrapped + x -= ll->wrapIndent; + } + int i = ll->FindBefore(x + subLineStart, lineStart, lineEnd); + while (i < lineEnd) { + if ((x + subLineStart) < ((ll->positions[i] + ll->positions[i + 1]) / 2)) { + retVal = pdoc->MovePositionOutsideChar(i + posLineStart, 1); + return SelectionPosition(retVal); + } + i++; + } + const int spaceWidth = static_cast(vs.styles[ll->EndLineStyle()].spaceWidth); + int spaceOffset = (x + subLineStart - ll->positions[lineEnd] + spaceWidth / 2) / spaceWidth; + return SelectionPosition(lineEnd + posLineStart, spaceOffset); + } + return SelectionPosition(retVal); +} + +/** + * If painting then abandon the painting because a wider redraw is needed. + * @return true if calling code should stop drawing. + */ +bool Editor::AbandonPaint() { + if ((paintState == painting) && !paintingAllText) { + paintState = paintAbandoned; + } + return paintState == paintAbandoned; +} + +void Editor::RedrawRect(PRectangle rc) { + //Platform::DebugPrintf("Redraw %0d,%0d - %0d,%0d\n", rc.left, rc.top, rc.right, rc.bottom); + + // Clip the redraw rectangle into the client area + PRectangle rcClient = GetClientRectangle(); + if (rc.top < rcClient.top) + rc.top = rcClient.top; + if (rc.bottom > rcClient.bottom) + rc.bottom = rcClient.bottom; + if (rc.left < rcClient.left) + rc.left = rcClient.left; + if (rc.right > rcClient.right) + rc.right = rcClient.right; + + if ((rc.bottom > rc.top) && (rc.right > rc.left)) { + wMain.InvalidateRectangle(rc); + } +} + +void Editor::Redraw() { + //Platform::DebugPrintf("Redraw all\n"); + PRectangle rcClient = GetClientRectangle(); + wMain.InvalidateRectangle(rcClient); + //wMain.InvalidateAll(); +} + +void Editor::RedrawSelMargin(int line, bool allAfter) { + if (!AbandonPaint()) { + if (vs.maskInLine) { + Redraw(); + } else { + PRectangle rcSelMargin = GetClientRectangle(); + rcSelMargin.right = vs.fixedColumnWidth; + if (line != -1) { + int position = pdoc->LineStart(line); + PRectangle rcLine = RectangleFromRange(position, position); + rcSelMargin.top = rcLine.top; + if (!allAfter) + rcSelMargin.bottom = rcLine.bottom; + } + wMain.InvalidateRectangle(rcSelMargin); + } + } +} + +PRectangle Editor::RectangleFromRange(int start, int end) { + int minPos = start; + if (minPos > end) + minPos = end; + int maxPos = start; + if (maxPos < end) + maxPos = end; + int minLine = cs.DisplayFromDoc(pdoc->LineFromPosition(minPos)); + int lineDocMax = pdoc->LineFromPosition(maxPos); + int maxLine = cs.DisplayFromDoc(lineDocMax) + cs.GetHeight(lineDocMax) - 1; + PRectangle rcClient = GetTextRectangle(); + PRectangle rc; + rc.left = vs.fixedColumnWidth; + rc.top = (minLine - topLine) * vs.lineHeight; + if (rc.top < 0) + rc.top = 0; + rc.right = rcClient.right; + rc.bottom = (maxLine - topLine + 1) * vs.lineHeight; + // Ensure PRectangle is within 16 bit space + rc.top = Platform::Clamp(rc.top, -32000, 32000); + rc.bottom = Platform::Clamp(rc.bottom, -32000, 32000); + + return rc; +} + +void Editor::InvalidateRange(int start, int end) { + RedrawRect(RectangleFromRange(start, end)); +} + +int Editor::CurrentPosition() { + return sel.MainCaret(); +} + +bool Editor::SelectionEmpty() { + return sel.Empty(); +} + +SelectionPosition Editor::SelectionStart() { + return sel.RangeMain().Start(); +} + +SelectionPosition Editor::SelectionEnd() { + return sel.RangeMain().End(); +} + +void Editor::SetRectangularRange() { + if (sel.IsRectangular()) { + int xAnchor = XFromPosition(sel.Rectangular().anchor); + int xCaret = XFromPosition(sel.Rectangular().caret); + if (sel.selType == Selection::selThin) { + xCaret = xAnchor; + } + int lineAnchor = pdoc->LineFromPosition(sel.Rectangular().anchor.Position()); + int lineCaret = pdoc->LineFromPosition(sel.Rectangular().caret.Position()); + int increment = (lineCaret > lineAnchor) ? 1 : -1; + for (int line=lineAnchor; line != lineCaret+increment; line += increment) { + SelectionRange range(SPositionFromLineX(line, xCaret), SPositionFromLineX(line, xAnchor)); + if ((virtualSpaceOptions & SCVS_RECTANGULARSELECTION) == 0) + range.ClearVirtualSpace(); + if (line == lineAnchor) + sel.SetSelection(range); + else + sel.AddSelection(range); + } + } +} + +void Editor::ThinRectangularRange() { + if (sel.IsRectangular()) { + sel.selType = Selection::selThin; + if (sel.Rectangular().caret < sel.Rectangular().anchor) { + sel.Rectangular() = SelectionRange(sel.Range(sel.Count()-1).caret, sel.Range(0).anchor); + } else { + sel.Rectangular() = SelectionRange(sel.Range(sel.Count()-1).anchor, sel.Range(0).caret); + } + SetRectangularRange(); + } +} + +void Editor::InvalidateSelection(SelectionRange newMain, bool invalidateWholeSelection) { + if (sel.Count() > 1 || !(sel.RangeMain().anchor == newMain.anchor) || sel.IsRectangular()) { + invalidateWholeSelection = true; + } + int firstAffected = Platform::Minimum(sel.RangeMain().Start().Position(), newMain.Start().Position()); + // +1 for lastAffected ensures caret repainted + int lastAffected = Platform::Maximum(newMain.caret.Position()+1, newMain.anchor.Position()); + lastAffected = Platform::Maximum(lastAffected, sel.RangeMain().End().Position()); + if (invalidateWholeSelection) { + for (size_t r=0; r 1 || !(sel.RangeMain() == rangeNew)) { + InvalidateSelection(rangeNew); + } + sel.RangeMain() = rangeNew; + SetRectangularRange(); + ClaimSelection(); +} + +void Editor::SetSelection(int currentPos_, int anchor_) { + SetSelection(SelectionPosition(currentPos_), SelectionPosition(anchor_)); +} + +// Just move the caret on the main selection +void Editor::SetSelection(SelectionPosition currentPos_) { + currentPos_ = ClampPositionIntoDocument(currentPos_); + if (sel.Count() > 1 || !(sel.RangeMain().caret == currentPos_)) { + InvalidateSelection(SelectionRange(currentPos_)); + } + if (sel.IsRectangular()) { + sel.Rectangular() = + SelectionRange(SelectionPosition(currentPos_), sel.Rectangular().anchor); + SetRectangularRange(); + } else { + sel.RangeMain() = + SelectionRange(SelectionPosition(currentPos_), sel.RangeMain().anchor); + } + ClaimSelection(); +} + +void Editor::SetSelection(int currentPos_) { + SetSelection(SelectionPosition(currentPos_)); +} + +void Editor::SetEmptySelection(SelectionPosition currentPos_) { + SelectionRange rangeNew(ClampPositionIntoDocument(currentPos_)); + if (sel.Count() > 1 || !(sel.RangeMain() == rangeNew)) { + InvalidateSelection(rangeNew); + } + sel.Clear(); + sel.RangeMain() = rangeNew; + SetRectangularRange(); + ClaimSelection(); + +} + +void Editor::SetEmptySelection(int currentPos_) { + SetEmptySelection(SelectionPosition(currentPos_)); +} + +bool Editor::RangeContainsProtected(int start, int end) const { + if (vs.ProtectionActive()) { + if (start > end) { + int t = start; + start = end; + end = t; + } + int mask = pdoc->stylingBitsMask; + for (int pos = start; pos < end; pos++) { + if (vs.styles[pdoc->StyleAt(pos) & mask].IsProtected()) + return true; + } + } + return false; +} + +bool Editor::SelectionContainsProtected() { + for (size_t r=0; rMovePositionOutsideChar(pos.Position(), moveDir, checkLineEnd); + if (posMoved != pos.Position()) + pos.SetPosition(posMoved); + if (vs.ProtectionActive()) { + int mask = pdoc->stylingBitsMask; + if (moveDir > 0) { + if ((pos.Position() > 0) && vs.styles[pdoc->StyleAt(pos.Position() - 1) & mask].IsProtected()) { + while ((pos.Position() < pdoc->Length()) && + (vs.styles[pdoc->StyleAt(pos.Position()) & mask].IsProtected())) + pos.Add(1); + } + } else if (moveDir < 0) { + if (vs.styles[pdoc->StyleAt(pos.Position()) & mask].IsProtected()) { + while ((pos.Position() > 0) && + (vs.styles[pdoc->StyleAt(pos.Position() - 1) & mask].IsProtected())) + pos.Add(-1); + } + } + } + return pos; +} + +int Editor::MovePositionTo(SelectionPosition newPos, Selection::selTypes selt, bool ensureVisible) { + bool simpleCaret = (sel.Count() == 1) && sel.Empty(); + SelectionPosition spCaret = sel.Last(); + + int delta = newPos.Position() - sel.MainCaret(); + newPos = ClampPositionIntoDocument(newPos); + newPos = MovePositionOutsideChar(newPos, delta); + if (!multipleSelection && sel.IsRectangular() && (selt == Selection::selStream)) { + // Can't turn into multiple selection so clear additional selections + InvalidateSelection(SelectionRange(newPos), true); + SelectionRange rangeMain = sel.RangeMain(); + sel.SetSelection(rangeMain); + } + if (!sel.IsRectangular() && (selt == Selection::selRectangle)) { + // Switching to rectangular + SelectionRange rangeMain = sel.RangeMain(); + sel.Clear(); + sel.Rectangular() = rangeMain; + } + if (selt != Selection::noSel) { + sel.selType = selt; + } + if (selt != Selection::noSel || sel.MoveExtends()) { + SetSelection(newPos); + } else { + SetEmptySelection(newPos); + } + ShowCaretAtCurrentPosition(); + if (ensureVisible) { + XYScrollPosition newXY = XYScrollToMakeVisible(true, true, true); + if (simpleCaret && (newXY.xOffset == xOffset)) { + // simple vertical scroll then invalidate + ScrollTo(newXY.topLine); + InvalidateSelection(SelectionRange(spCaret), true); + } else { + SetXYScroll(newXY); + } + } + return 0; +} + +int Editor::MovePositionTo(int newPos, Selection::selTypes selt, bool ensureVisible) { + return MovePositionTo(SelectionPosition(newPos), selt, ensureVisible); +} + +SelectionPosition Editor::MovePositionSoVisible(SelectionPosition pos, int moveDir) { + pos = ClampPositionIntoDocument(pos); + pos = MovePositionOutsideChar(pos, moveDir); + int lineDoc = pdoc->LineFromPosition(pos.Position()); + if (cs.GetVisible(lineDoc)) { + return pos; + } else { + int lineDisplay = cs.DisplayFromDoc(lineDoc); + if (moveDir > 0) { + // lineDisplay is already line before fold as lines in fold use display line of line after fold + lineDisplay = Platform::Clamp(lineDisplay, 0, cs.LinesDisplayed()); + return SelectionPosition(pdoc->LineStart(cs.DocFromDisplay(lineDisplay))); + } else { + lineDisplay = Platform::Clamp(lineDisplay - 1, 0, cs.LinesDisplayed()); + return SelectionPosition(pdoc->LineEnd(cs.DocFromDisplay(lineDisplay))); + } + } +} + +SelectionPosition Editor::MovePositionSoVisible(int pos, int moveDir) { + return MovePositionSoVisible(SelectionPosition(pos), moveDir); +} + +Point Editor::PointMainCaret() { + return LocationFromPosition(sel.Range(sel.Main()).caret); +} + +/** + * Choose the x position that the caret will try to stick to + * as it moves up and down. + */ +void Editor::SetLastXChosen() { + Point pt = PointMainCaret(); + lastXChosen = pt.x + xOffset; +} + +void Editor::ScrollTo(int line, bool moveThumb) { + int topLineNew = Platform::Clamp(line, 0, MaxScrollPos()); + if (topLineNew != topLine) { + // Try to optimise small scrolls + int linesToMove = topLine - topLineNew; + SetTopLine(topLineNew); + // Optimize by styling the view as this will invalidate any needed area + // which could abort the initial paint if discovered later. + StyleToPositionInView(PositionAfterArea(GetClientRectangle())); +#ifndef UNDER_CE + // Perform redraw rather than scroll if many lines would be redrawn anyway. + if ((abs(linesToMove) <= 10) && (paintState == notPainting)) { + ScrollText(linesToMove); + } else { + Redraw(); + } +#else + Redraw(); +#endif + if (moveThumb) { + SetVerticalScrollPos(); + } + } +} + +void Editor::ScrollText(int /* linesToMove */) { + //Platform::DebugPrintf("Editor::ScrollText %d\n", linesToMove); + Redraw(); +} + +void Editor::HorizontalScrollTo(int xPos) { + //Platform::DebugPrintf("HorizontalScroll %d\n", xPos); + if (xPos < 0) + xPos = 0; + if ((wrapState == eWrapNone) && (xOffset != xPos)) { + xOffset = xPos; + SetHorizontalScrollPos(); + RedrawRect(GetClientRectangle()); + } +} + +void Editor::MoveCaretInsideView(bool ensureVisible) { + PRectangle rcClient = GetTextRectangle(); + Point pt = PointMainCaret(); + if (pt.y < rcClient.top) { + MovePositionTo(SPositionFromLocation( + Point(lastXChosen - xOffset, rcClient.top)), + Selection::noSel, ensureVisible); + } else if ((pt.y + vs.lineHeight - 1) > rcClient.bottom) { + int yOfLastLineFullyDisplayed = rcClient.top + (LinesOnScreen() - 1) * vs.lineHeight; + MovePositionTo(SPositionFromLocation( + Point(lastXChosen - xOffset, rcClient.top + yOfLastLineFullyDisplayed)), + Selection::noSel, ensureVisible); + } +} + +int Editor::DisplayFromPosition(int pos) { + int lineDoc = pdoc->LineFromPosition(pos); + int lineDisplay = cs.DisplayFromDoc(lineDoc); + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc)); + if (surface && ll) { + LayoutLine(lineDoc, surface, vs, ll, wrapWidth); + unsigned int posLineStart = pdoc->LineStart(lineDoc); + int posInLine = pos - posLineStart; + lineDisplay--; // To make up for first increment ahead. + for (int subLine = 0; subLine < ll->lines; subLine++) { + if (posInLine >= ll->LineStart(subLine)) { + lineDisplay++; + } + } + } + return lineDisplay; +} + +/** + * Ensure the caret is reasonably visible in context. + * +Caret policy in SciTE + +If slop is set, we can define a slop value. +This value defines an unwanted zone (UZ) where the caret is... unwanted. +This zone is defined as a number of pixels near the vertical margins, +and as a number of lines near the horizontal margins. +By keeping the caret away from the edges, it is seen within its context, +so it is likely that the identifier that the caret is on can be completely seen, +and that the current line is seen with some of the lines following it which are +often dependent on that line. + +If strict is set, the policy is enforced... strictly. +The caret is centred on the display if slop is not set, +and cannot go in the UZ if slop is set. + +If jumps is set, the display is moved more energetically +so the caret can move in the same direction longer before the policy is applied again. +'3UZ' notation is used to indicate three time the size of the UZ as a distance to the margin. + +If even is not set, instead of having symmetrical UZs, +the left and bottom UZs are extended up to right and top UZs respectively. +This way, we favour the displaying of useful information: the begining of lines, +where most code reside, and the lines after the caret, eg. the body of a function. + + | | | | | +slop | strict | jumps | even | Caret can go to the margin | When reaching limit (caret going out of + | | | | | visibility or going into the UZ) display is... +-----+--------+-------+------+--------------------------------------------+-------------------------------------------------------------- + 0 | 0 | 0 | 0 | Yes | moved to put caret on top/on right + 0 | 0 | 0 | 1 | Yes | moved by one position + 0 | 0 | 1 | 0 | Yes | moved to put caret on top/on right + 0 | 0 | 1 | 1 | Yes | centred on the caret + 0 | 1 | - | 0 | Caret is always on top/on right of display | - + 0 | 1 | - | 1 | No, caret is always centred | - + 1 | 0 | 0 | 0 | Yes | moved to put caret out of the asymmetrical UZ + 1 | 0 | 0 | 1 | Yes | moved to put caret out of the UZ + 1 | 0 | 1 | 0 | Yes | moved to put caret at 3UZ of the top or right margin + 1 | 0 | 1 | 1 | Yes | moved to put caret at 3UZ of the margin + 1 | 1 | - | 0 | Caret is always at UZ of top/right margin | - + 1 | 1 | 0 | 1 | No, kept out of UZ | moved by one position + 1 | 1 | 1 | 1 | No, kept out of UZ | moved to put caret at 3UZ of the margin +*/ + +Editor::XYScrollPosition Editor::XYScrollToMakeVisible(const bool useMargin, const bool vert, const bool horiz) { + PRectangle rcClient = GetTextRectangle(); + const SelectionPosition posCaret = posDrag.IsValid() ? posDrag : sel.RangeMain().caret; + const Point pt = LocationFromPosition(posCaret); + const Point ptBottomCaret(pt.x, pt.y + vs.lineHeight - 1); + const int lineCaret = DisplayFromPosition(posCaret.Position()); + + XYScrollPosition newXY(xOffset, topLine); + + // Vertical positioning + if (vert && (pt.y < rcClient.top || ptBottomCaret.y > rcClient.bottom || (caretYPolicy & CARET_STRICT) != 0)) { + const int linesOnScreen = LinesOnScreen(); + const int halfScreen = Platform::Maximum(linesOnScreen - 1, 2) / 2; + const bool bSlop = (caretYPolicy & CARET_SLOP) != 0; + const bool bStrict = (caretYPolicy & CARET_STRICT) != 0; + const bool bJump = (caretYPolicy & CARET_JUMPS) != 0; + const bool bEven = (caretYPolicy & CARET_EVEN) != 0; + + // It should be possible to scroll the window to show the caret, + // but this fails to remove the caret on GTK+ + if (bSlop) { // A margin is defined + int yMoveT, yMoveB; + if (bStrict) { + int yMarginT, yMarginB; + if (!useMargin) { + // In drag mode, avoid moves + // otherwise, a double click will select several lines. + yMarginT = yMarginB = 0; + } else { + // yMarginT must equal to caretYSlop, with a minimum of 1 and + // a maximum of slightly less than half the heigth of the text area. + yMarginT = Platform::Clamp(caretYSlop, 1, halfScreen); + if (bEven) { + yMarginB = yMarginT; + } else { + yMarginB = linesOnScreen - yMarginT - 1; + } + } + yMoveT = yMarginT; + if (bEven) { + if (bJump) { + yMoveT = Platform::Clamp(caretYSlop * 3, 1, halfScreen); + } + yMoveB = yMoveT; + } else { + yMoveB = linesOnScreen - yMoveT - 1; + } + if (lineCaret < topLine + yMarginT) { + // Caret goes too high + newXY.topLine = lineCaret - yMoveT; + } else if (lineCaret > topLine + linesOnScreen - 1 - yMarginB) { + // Caret goes too low + newXY.topLine = lineCaret - linesOnScreen + 1 + yMoveB; + } + } else { // Not strict + yMoveT = bJump ? caretYSlop * 3 : caretYSlop; + yMoveT = Platform::Clamp(yMoveT, 1, halfScreen); + if (bEven) { + yMoveB = yMoveT; + } else { + yMoveB = linesOnScreen - yMoveT - 1; + } + if (lineCaret < topLine) { + // Caret goes too high + newXY.topLine = lineCaret - yMoveT; + } else if (lineCaret > topLine + linesOnScreen - 1) { + // Caret goes too low + newXY.topLine = lineCaret - linesOnScreen + 1 + yMoveB; + } + } + } else { // No slop + if (!bStrict && !bJump) { + // Minimal move + if (lineCaret < topLine) { + // Caret goes too high + newXY.topLine = lineCaret; + } else if (lineCaret > topLine + linesOnScreen - 1) { + // Caret goes too low + if (bEven) { + newXY.topLine = lineCaret - linesOnScreen + 1; + } else { + newXY.topLine = lineCaret; + } + } + } else { // Strict or going out of display + if (bEven) { + // Always center caret + newXY.topLine = lineCaret - halfScreen; + } else { + // Always put caret on top of display + newXY.topLine = lineCaret; + } + } + } + newXY.topLine = Platform::Clamp(newXY.topLine, 0, MaxScrollPos()); + } + + // Horizontal positioning + if (horiz && (wrapState == eWrapNone)) { + const int halfScreen = Platform::Maximum(rcClient.Width() - 4, 4) / 2; + const bool bSlop = (caretXPolicy & CARET_SLOP) != 0; + const bool bStrict = (caretXPolicy & CARET_STRICT) != 0; + const bool bJump = (caretXPolicy & CARET_JUMPS) != 0; + const bool bEven = (caretXPolicy & CARET_EVEN) != 0; + + if (bSlop) { // A margin is defined + int xMoveL, xMoveR; + if (bStrict) { + int xMarginL, xMarginR; + if (!useMargin) { + // In drag mode, avoid moves unless very near of the margin + // otherwise, a simple click will select text. + xMarginL = xMarginR = 2; + } else { + // xMargin must equal to caretXSlop, with a minimum of 2 and + // a maximum of slightly less than half the width of the text area. + xMarginR = Platform::Clamp(caretXSlop, 2, halfScreen); + if (bEven) { + xMarginL = xMarginR; + } else { + xMarginL = rcClient.Width() - xMarginR - 4; + } + } + if (bJump && bEven) { + // Jump is used only in even mode + xMoveL = xMoveR = Platform::Clamp(caretXSlop * 3, 1, halfScreen); + } else { + xMoveL = xMoveR = 0; // Not used, avoid a warning + } + if (pt.x < rcClient.left + xMarginL) { + // Caret is on the left of the display + if (bJump && bEven) { + newXY.xOffset -= xMoveL; + } else { + // Move just enough to allow to display the caret + newXY.xOffset -= (rcClient.left + xMarginL) - pt.x; + } + } else if (pt.x >= rcClient.right - xMarginR) { + // Caret is on the right of the display + if (bJump && bEven) { + newXY.xOffset += xMoveR; + } else { + // Move just enough to allow to display the caret + newXY.xOffset += pt.x - (rcClient.right - xMarginR) + 1; + } + } + } else { // Not strict + xMoveR = bJump ? caretXSlop * 3 : caretXSlop; + xMoveR = Platform::Clamp(xMoveR, 1, halfScreen); + if (bEven) { + xMoveL = xMoveR; + } else { + xMoveL = rcClient.Width() - xMoveR - 4; + } + if (pt.x < rcClient.left) { + // Caret is on the left of the display + newXY.xOffset -= xMoveL; + } else if (pt.x >= rcClient.right) { + // Caret is on the right of the display + newXY.xOffset += xMoveR; + } + } + } else { // No slop + if (bStrict || + (bJump && (pt.x < rcClient.left || pt.x >= rcClient.right))) { + // Strict or going out of display + if (bEven) { + // Center caret + newXY.xOffset += pt.x - rcClient.left - halfScreen; + } else { + // Put caret on right + newXY.xOffset += pt.x - rcClient.right + 1; + } + } else { + // Move just enough to allow to display the caret + if (pt.x < rcClient.left) { + // Caret is on the left of the display + if (bEven) { + newXY.xOffset -= rcClient.left - pt.x; + } else { + newXY.xOffset += pt.x - rcClient.right + 1; + } + } else if (pt.x >= rcClient.right) { + // Caret is on the right of the display + newXY.xOffset += pt.x - rcClient.right + 1; + } + } + } + // In case of a jump (find result) largely out of display, adjust the offset to display the caret + if (pt.x + xOffset < rcClient.left + newXY.xOffset) { + newXY.xOffset = pt.x + xOffset - rcClient.left; + } else if (pt.x + xOffset >= rcClient.right + newXY.xOffset) { + newXY.xOffset = pt.x + xOffset - rcClient.right + 1; + if (vs.caretStyle == CARETSTYLE_BLOCK) { + // Ensure we can see a good portion of the block caret + newXY.xOffset += vs.aveCharWidth; + } + } + if (newXY.xOffset < 0) { + newXY.xOffset = 0; + } + } + + return newXY; +} + +void Editor::SetXYScroll(XYScrollPosition newXY) { + if ((newXY.topLine != topLine) || (newXY.xOffset != xOffset)) { + if (newXY.topLine != topLine) { + SetTopLine(newXY.topLine); + SetVerticalScrollPos(); + } + if (newXY.xOffset != xOffset) { + xOffset = newXY.xOffset; + if (newXY.xOffset > 0) { + PRectangle rcText = GetTextRectangle(); + if (horizontalScrollBarVisible && + rcText.Width() + xOffset > scrollWidth) { + scrollWidth = xOffset + rcText.Width(); + SetScrollBars(); + } + } + SetHorizontalScrollPos(); + } + Redraw(); + UpdateSystemCaret(); + } + } + +void Editor::EnsureCaretVisible(bool useMargin, bool vert, bool horiz) { + SetXYScroll(XYScrollToMakeVisible(useMargin, vert, horiz)); +} + +void Editor::ShowCaretAtCurrentPosition() { + if (hasFocus) { + caret.active = true; + caret.on = true; + SetTicking(true); + } else { + caret.active = false; + caret.on = false; + } + InvalidateCaret(); +} + +void Editor::DropCaret() { + caret.active = false; + InvalidateCaret(); +} + +void Editor::InvalidateCaret() { + if (posDrag.IsValid()) { + InvalidateRange(posDrag.Position(), posDrag.Position() + 1); + } else { + for (size_t r=0; rLinesTotal()); + if (wrapStart > docLineStart) { + wrapStart = docLineStart; + llc.Invalidate(LineLayout::llPositions); + } + if (wrapEnd < docLineEnd) { + wrapEnd = docLineEnd; + } + wrapEnd = Platform::Clamp(wrapEnd, 0, pdoc->LinesTotal()); + // Wrap lines during idle. + if ((wrapState != eWrapNone) && (wrapEnd != wrapStart)) { + SetIdle(true); + } +} + +bool Editor::WrapOneLine(Surface *surface, int lineToWrap) { + AutoLineLayout ll(llc, RetrieveLineLayout(lineToWrap)); + int linesWrapped = 1; + if (ll) { + LayoutLine(lineToWrap, surface, vs, ll, wrapWidth); + linesWrapped = ll->lines; + } + return cs.SetHeight(lineToWrap, linesWrapped + + (vs.annotationVisible ? pdoc->AnnotationLines(lineToWrap) : 0)); +} + +// Check if wrapping needed and perform any needed wrapping. +// fullwrap: if true, all lines which need wrapping will be done, +// in this single call. +// priorityWrapLineStart: If greater than or equal to zero, all lines starting from +// here to 1 page + 100 lines past will be wrapped (even if there are +// more lines under wrapping process in idle). +// If it is neither fullwrap, nor priorityWrap, then 1 page + 100 lines will be +// wrapped, if there are any wrapping going on in idle. (Generally this +// condition is called only from idler). +// Return true if wrapping occurred. +bool Editor::WrapLines(bool fullWrap, int priorityWrapLineStart) { + // If there are any pending wraps, do them during idle if possible. + int linesInOneCall = LinesOnScreen() + 100; + if (wrapState != eWrapNone) { + if (wrapStart < wrapEnd) { + if (!SetIdle(true)) { + // Idle processing not supported so full wrap required. + fullWrap = true; + } + } + if (!fullWrap && priorityWrapLineStart >= 0 && + // .. and if the paint window is outside pending wraps + (((priorityWrapLineStart + linesInOneCall) < wrapStart) || + (priorityWrapLineStart > wrapEnd))) { + // No priority wrap pending + return false; + } + } + int goodTopLine = topLine; + bool wrapOccurred = false; + if (wrapStart <= pdoc->LinesTotal()) { + if (wrapState == eWrapNone) { + if (wrapWidth != LineLayout::wrapWidthInfinite) { + wrapWidth = LineLayout::wrapWidthInfinite; + for (int lineDoc = 0; lineDoc < pdoc->LinesTotal(); lineDoc++) { + cs.SetHeight(lineDoc, 1 + + (vs.annotationVisible ? pdoc->AnnotationLines(lineDoc) : 0)); + } + wrapOccurred = true; + } + wrapStart = wrapLineLarge; + wrapEnd = wrapLineLarge; + } else { + if (wrapEnd >= pdoc->LinesTotal()) + wrapEnd = pdoc->LinesTotal(); + //ElapsedTime et; + int lineDocTop = cs.DocFromDisplay(topLine); + int subLineTop = topLine - cs.DisplayFromDoc(lineDocTop); + PRectangle rcTextArea = GetClientRectangle(); + rcTextArea.left = vs.fixedColumnWidth; + rcTextArea.right -= vs.rightMarginWidth; + wrapWidth = rcTextArea.Width(); + // Ensure all of the document is styled. + pdoc->EnsureStyledTo(pdoc->Length()); + RefreshStyleData(); + AutoSurface surface(this); + if (surface) { + bool priorityWrap = false; + int lastLineToWrap = wrapEnd; + int lineToWrap = wrapStart; + if (!fullWrap) { + if (priorityWrapLineStart >= 0) { + // This is a priority wrap. + lineToWrap = priorityWrapLineStart; + lastLineToWrap = priorityWrapLineStart + linesInOneCall; + priorityWrap = true; + } else { + // This is idle wrap. + lastLineToWrap = wrapStart + linesInOneCall; + } + if (lastLineToWrap >= wrapEnd) + lastLineToWrap = wrapEnd; + } // else do a fullWrap. + + // Platform::DebugPrintf("Wraplines: full = %d, priorityStart = %d (wrapping: %d to %d)\n", fullWrap, priorityWrapLineStart, lineToWrap, lastLineToWrap); + // Platform::DebugPrintf("Pending wraps: %d to %d\n", wrapStart, wrapEnd); + while (lineToWrap < lastLineToWrap) { + if (WrapOneLine(surface, lineToWrap)) { + wrapOccurred = true; + } + lineToWrap++; + } + if (!priorityWrap) + wrapStart = lineToWrap; + // If wrapping is done, bring it to resting position + if (wrapStart >= wrapEnd) { + wrapStart = wrapLineLarge; + wrapEnd = wrapLineLarge; + } + } + goodTopLine = cs.DisplayFromDoc(lineDocTop); + if (subLineTop < cs.GetHeight(lineDocTop)) + goodTopLine += subLineTop; + else + goodTopLine += cs.GetHeight(lineDocTop); + //double durWrap = et.Duration(true); + //Platform::DebugPrintf("Wrap:%9.6g \n", durWrap); + } + } + if (wrapOccurred) { + SetScrollBars(); + SetTopLine(Platform::Clamp(goodTopLine, 0, MaxScrollPos())); + SetVerticalScrollPos(); + } + return wrapOccurred; +} + +void Editor::LinesJoin() { + if (!RangeContainsProtected(targetStart, targetEnd)) { + UndoGroup ug(pdoc); + bool prevNonWS = true; + for (int pos = targetStart; pos < targetEnd; pos++) { + if (IsEOLChar(pdoc->CharAt(pos))) { + targetEnd -= pdoc->LenChar(pos); + pdoc->DelChar(pos); + if (prevNonWS) { + // Ensure at least one space separating previous lines + pdoc->InsertChar(pos, ' '); + targetEnd++; + } + } else { + prevNonWS = pdoc->CharAt(pos) != ' '; + } + } + } +} + +const char *Editor::StringFromEOLMode(int eolMode) { + if (eolMode == SC_EOL_CRLF) { + return "\r\n"; + } else if (eolMode == SC_EOL_CR) { + return "\r"; + } else { + return "\n"; + } +} + +void Editor::LinesSplit(int pixelWidth) { + if (!RangeContainsProtected(targetStart, targetEnd)) { + if (pixelWidth == 0) { + PRectangle rcText = GetTextRectangle(); + pixelWidth = rcText.Width(); + } + int lineStart = pdoc->LineFromPosition(targetStart); + int lineEnd = pdoc->LineFromPosition(targetEnd); + const char *eol = StringFromEOLMode(pdoc->eolMode); + UndoGroup ug(pdoc); + for (int line = lineStart; line <= lineEnd; line++) { + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(line)); + if (surface && ll) { + unsigned int posLineStart = pdoc->LineStart(line); + LayoutLine(line, surface, vs, ll, pixelWidth); + for (int subLine = 1; subLine < ll->lines; subLine++) { + pdoc->InsertCString(posLineStart + (subLine - 1) * strlen(eol) + + ll->LineStart(subLine), eol); + targetEnd += static_cast(strlen(eol)); + } + } + lineEnd = pdoc->LineFromPosition(targetEnd); + } + } +} + +int Editor::SubstituteMarkerIfEmpty(int markerCheck, int markerDefault) { + if (vs.markers[markerCheck].markType == SC_MARK_EMPTY) + return markerDefault; + return markerCheck; +} + +// Avoid 64 bit compiler warnings. +// Scintilla does not support text buffers larger than 2**31 +static int istrlen(const char *s) { + return static_cast(strlen(s)); +} + +bool ValidStyledText(ViewStyle &vs, size_t styleOffset, const StyledText &st) { + if (st.multipleStyles) { + for (size_t iStyle=0;iStyle(styles[endSegment+1]) == style)) + endSegment++; + width += surface->WidthText(vs.styles[style+styleOffset].font, text + start, endSegment - start + 1); + start = endSegment + 1; + } + return width; +} + +static int WidestLineWidth(Surface *surface, ViewStyle &vs, int styleOffset, const StyledText &st) { + int widthMax = 0; + size_t start = 0; + while (start < st.length) { + size_t lenLine = st.LineLength(start); + int widthSubLine; + if (st.multipleStyles) { + widthSubLine = WidthStyledText(surface, vs, styleOffset, st.text + start, st.styles + start, lenLine); + } else { + widthSubLine = surface->WidthText(vs.styles[styleOffset + st.style].font, st.text + start, lenLine); + } + if (widthSubLine > widthMax) + widthMax = widthSubLine; + start += lenLine + 1; + } + return widthMax; +} + +void DrawStyledText(Surface *surface, ViewStyle &vs, int styleOffset, PRectangle rcText, int ascent, + const StyledText &st, size_t start, size_t length) { + + if (st.multipleStyles) { + int x = rcText.left; + size_t i = 0; + while (i < length) { + size_t end = i; + int style = st.styles[i + start]; + while (end < length-1 && st.styles[start+end+1] == style) + end++; + style += styleOffset; + int width = surface->WidthText(vs.styles[style].font, st.text + start + i, end - i + 1); + PRectangle rcSegment = rcText; + rcSegment.left = x; + rcSegment.right = x + width + 1; + surface->DrawTextNoClip(rcSegment, vs.styles[style].font, + ascent, st.text + start + i, end - i + 1, + vs.styles[style].fore.allocated, + vs.styles[style].back.allocated); + x += width; + i = end + 1; + } + } else { + int style = st.style + styleOffset; + surface->DrawTextNoClip(rcText, vs.styles[style].font, + rcText.top + vs.maxAscent, st.text + start, length, + vs.styles[style].fore.allocated, + vs.styles[style].back.allocated); + } +} + +void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) { + if (vs.fixedColumnWidth == 0) + return; + + PRectangle rcMargin = GetClientRectangle(); + rcMargin.right = vs.fixedColumnWidth; + + if (!rc.Intersects(rcMargin)) + return; + + Surface *surface; + if (bufferedDraw) { + surface = pixmapSelMargin; + } else { + surface = surfWindow; + } + + PRectangle rcSelMargin = rcMargin; + rcSelMargin.right = rcMargin.left; + + for (int margin = 0; margin < vs.margins; margin++) { + if (vs.ms[margin].width > 0) { + + rcSelMargin.left = rcSelMargin.right; + rcSelMargin.right = rcSelMargin.left + vs.ms[margin].width; + + if (vs.ms[margin].style != SC_MARGIN_NUMBER) { + /* alternate scheme: + if (vs.ms[margin].mask & SC_MASK_FOLDERS) + surface->FillRectangle(rcSelMargin, vs.styles[STYLE_DEFAULT].back.allocated); + else + // Required because of special way brush is created for selection margin + surface->FillRectangle(rcSelMargin, pixmapSelPattern); + */ + if (vs.ms[margin].mask & SC_MASK_FOLDERS) + // Required because of special way brush is created for selection margin + surface->FillRectangle(rcSelMargin, *pixmapSelPattern); + else { + ColourAllocated colour; + switch (vs.ms[margin].style) { + case SC_MARGIN_BACK: + colour = vs.styles[STYLE_DEFAULT].back.allocated; + break; + case SC_MARGIN_FORE: + colour = vs.styles[STYLE_DEFAULT].fore.allocated; + break; + default: + colour = vs.styles[STYLE_LINENUMBER].back.allocated; + break; + } + surface->FillRectangle(rcSelMargin, colour); + } + } else { + surface->FillRectangle(rcSelMargin, vs.styles[STYLE_LINENUMBER].back.allocated); + } + + int visibleLine = topLine; + int yposScreen = 0; + + // Work out whether the top line is whitespace located after a + // lessening of fold level which implies a 'fold tail' but which should not + // be displayed until the last of a sequence of whitespace. + bool needWhiteClosure = false; + int level = pdoc->GetLevel(cs.DocFromDisplay(topLine)); + if (level & SC_FOLDLEVELWHITEFLAG) { + int lineBack = cs.DocFromDisplay(topLine); + int levelPrev = level; + while ((lineBack > 0) && (levelPrev & SC_FOLDLEVELWHITEFLAG)) { + lineBack--; + levelPrev = pdoc->GetLevel(lineBack); + } + if (!(levelPrev & SC_FOLDLEVELHEADERFLAG)) { + if ((level & SC_FOLDLEVELNUMBERMASK) < (levelPrev & SC_FOLDLEVELNUMBERMASK)) + needWhiteClosure = true; + } + } + + // Old code does not know about new markers needed to distinguish all cases + int folderOpenMid = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEROPENMID, + SC_MARKNUM_FOLDEROPEN); + int folderEnd = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEREND, + SC_MARKNUM_FOLDER); + + while ((visibleLine < cs.LinesDisplayed()) && yposScreen < rcMargin.bottom) { + + PLATFORM_ASSERT(visibleLine < cs.LinesDisplayed()); + + int lineDoc = cs.DocFromDisplay(visibleLine); + PLATFORM_ASSERT(cs.GetVisible(lineDoc)); + bool firstSubLine = visibleLine == cs.DisplayFromDoc(lineDoc); + + // Decide which fold indicator should be displayed + level = pdoc->GetLevel(lineDoc); + int levelNext = pdoc->GetLevel(lineDoc + 1); + int marks = pdoc->GetMark(lineDoc); + if (!firstSubLine) + marks = 0; + int levelNum = level & SC_FOLDLEVELNUMBERMASK; + int levelNextNum = levelNext & SC_FOLDLEVELNUMBERMASK; + if (level & SC_FOLDLEVELHEADERFLAG) { + if (firstSubLine) { + if (cs.GetExpanded(lineDoc)) { + if (levelNum == SC_FOLDLEVELBASE) + marks |= 1 << SC_MARKNUM_FOLDEROPEN; + else + marks |= 1 << folderOpenMid; + } else { + if (levelNum == SC_FOLDLEVELBASE) + marks |= 1 << SC_MARKNUM_FOLDER; + else + marks |= 1 << folderEnd; + } + } else { + marks |= 1 << SC_MARKNUM_FOLDERSUB; + } + needWhiteClosure = false; + } else if (level & SC_FOLDLEVELWHITEFLAG) { + if (needWhiteClosure) { + if (levelNext & SC_FOLDLEVELWHITEFLAG) { + marks |= 1 << SC_MARKNUM_FOLDERSUB; + } else if (levelNum > SC_FOLDLEVELBASE) { + marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL; + needWhiteClosure = false; + } else { + marks |= 1 << SC_MARKNUM_FOLDERTAIL; + needWhiteClosure = false; + } + } else if (levelNum > SC_FOLDLEVELBASE) { + if (levelNextNum < levelNum) { + if (levelNextNum > SC_FOLDLEVELBASE) { + marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL; + } else { + marks |= 1 << SC_MARKNUM_FOLDERTAIL; + } + } else { + marks |= 1 << SC_MARKNUM_FOLDERSUB; + } + } + } else if (levelNum > SC_FOLDLEVELBASE) { + if (levelNextNum < levelNum) { + needWhiteClosure = false; + if (levelNext & SC_FOLDLEVELWHITEFLAG) { + marks |= 1 << SC_MARKNUM_FOLDERSUB; + needWhiteClosure = true; + } else if (levelNextNum > SC_FOLDLEVELBASE) { + marks |= 1 << SC_MARKNUM_FOLDERMIDTAIL; + } else { + marks |= 1 << SC_MARKNUM_FOLDERTAIL; + } + } else { + marks |= 1 << SC_MARKNUM_FOLDERSUB; + } + } + + marks &= vs.ms[margin].mask; + PRectangle rcMarker = rcSelMargin; + rcMarker.top = yposScreen; + rcMarker.bottom = yposScreen + vs.lineHeight; + if (vs.ms[margin].style == SC_MARGIN_NUMBER) { + char number[100]; + number[0] = '\0'; + if (firstSubLine) + sprintf(number, "%d", lineDoc + 1); + if (foldFlags & SC_FOLDFLAG_LEVELNUMBERS) { + int lev = pdoc->GetLevel(lineDoc); + sprintf(number, "%c%c %03X %03X", + (lev & SC_FOLDLEVELHEADERFLAG) ? 'H' : '_', + (lev & SC_FOLDLEVELWHITEFLAG) ? 'W' : '_', + lev & SC_FOLDLEVELNUMBERMASK, + lev >> 16 + ); + } + PRectangle rcNumber = rcMarker; + // Right justify + int width = surface->WidthText(vs.styles[STYLE_LINENUMBER].font, number, istrlen(number)); + int xpos = rcNumber.right - width - 3; + rcNumber.left = xpos; + surface->DrawTextNoClip(rcNumber, vs.styles[STYLE_LINENUMBER].font, + rcNumber.top + vs.maxAscent, number, istrlen(number), + vs.styles[STYLE_LINENUMBER].fore.allocated, + vs.styles[STYLE_LINENUMBER].back.allocated); + } else if (vs.ms[margin].style == SC_MARGIN_TEXT || vs.ms[margin].style == SC_MARGIN_RTEXT) { + if (firstSubLine) { + const StyledText stMargin = pdoc->MarginStyledText(lineDoc); + if (stMargin.text && ValidStyledText(vs, vs.marginStyleOffset, stMargin)) { + surface->FillRectangle(rcMarker, + vs.styles[stMargin.StyleAt(0)+vs.marginStyleOffset].back.allocated); + if (vs.ms[margin].style == SC_MARGIN_RTEXT) { + int width = WidestLineWidth(surface, vs, vs.marginStyleOffset, stMargin); + rcMarker.left = rcMarker.right - width - 3; + } + DrawStyledText(surface, vs, vs.marginStyleOffset, rcMarker, rcMarker.top + vs.maxAscent, + stMargin, 0, stMargin.length); + } + } + } + + if (marks) { + for (int markBit = 0; (markBit < 32) && marks; markBit++) { + if (marks & 1) { + // ERAN IFRAH + int lev = (pdoc->GetLevel(lineDoc) & SC_FOLDLEVELNUMBERMASK) - SC_FOLDLEVELBASE; + vs.markers[markBit].Draw(surface, rcMarker, vs.styles[STYLE_LINENUMBER].font, lev); + } + marks >>= 1; + } + } + + visibleLine++; + yposScreen += vs.lineHeight; + } + } + } + + PRectangle rcBlankMargin = rcMargin; + rcBlankMargin.left = rcSelMargin.right; + surface->FillRectangle(rcBlankMargin, vs.styles[STYLE_DEFAULT].back.allocated); + + if (bufferedDraw) { + surfWindow->Copy(rcMargin, Point(), *pixmapSelMargin); + } +} + +void DrawTabArrow(Surface *surface, PRectangle rcTab, int ymid) { + int ydiff = (rcTab.bottom - rcTab.top) / 2; + int xhead = rcTab.right - 1 - ydiff; + if (xhead <= rcTab.left) { + ydiff -= rcTab.left - xhead - 1; + xhead = rcTab.left - 1; + } + if ((rcTab.left + 2) < (rcTab.right - 1)) + surface->MoveTo(rcTab.left + 2, ymid); + else + surface->MoveTo(rcTab.right - 1, ymid); + surface->LineTo(rcTab.right - 1, ymid); + surface->LineTo(xhead, ymid - ydiff); + surface->MoveTo(rcTab.right - 1, ymid); + surface->LineTo(xhead, ymid + ydiff); +} + +LineLayout *Editor::RetrieveLineLayout(int lineNumber) { + int posLineStart = pdoc->LineStart(lineNumber); + int posLineEnd = pdoc->LineStart(lineNumber + 1); + PLATFORM_ASSERT(posLineEnd >= posLineStart); + int lineCaret = pdoc->LineFromPosition(sel.MainCaret()); + return llc.Retrieve(lineNumber, lineCaret, + posLineEnd - posLineStart, pdoc->GetStyleClock(), + LinesOnScreen() + 1, pdoc->LinesTotal()); +} + +static bool GoodTrailByte(int v) { + return (v >= 0x80) && (v < 0xc0); +} + +bool BadUTF(const char *s, int len, int &trailBytes) { + // For the rules: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 + if (trailBytes) { + trailBytes--; + return false; + } + const unsigned char *us = reinterpret_cast(s); + if (*us < 0x80) { + // Single bytes easy + return false; + } else if (*us > 0xF4) { + // Characters longer than 4 bytes not possible in current UTF-8 + return true; + } else if (*us >= 0xF0) { + // 4 bytes + if (len < 4) + return true; + if (GoodTrailByte(us[1]) && GoodTrailByte(us[2]) && GoodTrailByte(us[3])) { + if (*us == 0xf4) { + // Check if encoding a value beyond the last Unicode character 10FFFF + if (us[1] > 0x8f) { + return true; + } else if (us[1] == 0x8f) { + if (us[2] > 0xbf) { + return true; + } else if (us[2] == 0xbf) { + if (us[3] > 0xbf) { + return true; + } + } + } + } else if ((*us == 0xf0) && ((us[1] & 0xf0) == 0x80)) { + // Overlong + return true; + } + trailBytes = 3; + return false; + } else { + return true; + } + } else if (*us >= 0xE0) { + // 3 bytes + if (len < 3) + return true; + if (GoodTrailByte(us[1]) && GoodTrailByte(us[2])) { + if ((*us == 0xe0) && ((us[1] & 0xe0) == 0x80)) { + // Overlong + return true; + } + if ((*us == 0xed) && ((us[1] & 0xe0) == 0xa0)) { + // Surrogate + return true; + } + if ((*us == 0xef) && (us[1] == 0xbf) && (us[2] == 0xbe)) { + // U+FFFE + return true; + } + if ((*us == 0xef) && (us[1] == 0xbf) && (us[2] == 0xbf)) { + // U+FFFF + return true; + } + trailBytes = 2; + return false; + } else { + return true; + } + } else if (*us >= 0xC2) { + // 2 bytes + if (len < 2) + return true; + if (GoodTrailByte(us[1])) { + trailBytes = 1; + return false; + } else { + return true; + } + } else if (*us >= 0xC0) { + // Overlong encoding + return true; + } else { + // Trail byte + return true; + } +} + +/** + * Fill in the LineLayout data for the given line. + * Copy the given @a line and its styles from the document into local arrays. + * Also determine the x position at which each character starts. + */ +void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll, int width) { + if (!ll) + return; + + PLATFORM_ASSERT(line < pdoc->LinesTotal()); + PLATFORM_ASSERT(ll->chars != NULL); + int posLineStart = pdoc->LineStart(line); + int posLineEnd = pdoc->LineStart(line + 1); + // If the line is very long, limit the treatment to a length that should fit in the viewport + if (posLineEnd > (posLineStart + ll->maxLineLength)) { + posLineEnd = posLineStart + ll->maxLineLength; + } + if (ll->validity == LineLayout::llCheckTextAndStyle) { + int lineLength = posLineEnd - posLineStart; + if (!vstyle.viewEOL) { + int cid = posLineEnd - 1; + while ((cid > posLineStart) && IsEOLChar(pdoc->CharAt(cid))) { + cid--; + lineLength--; + } + } + if (lineLength == ll->numCharsInLine) { + // See if chars, styles, indicators, are all the same + bool allSame = true; + const int styleMask = pdoc->stylingBitsMask; + // Check base line layout + char styleByte = 0; + int numCharsInLine = 0; + while (numCharsInLine < lineLength) { + int charInDoc = numCharsInLine + posLineStart; + char chDoc = pdoc->CharAt(charInDoc); + styleByte = pdoc->StyleAt(charInDoc); + allSame = allSame && + (ll->styles[numCharsInLine] == static_cast(styleByte & styleMask)); + allSame = allSame && + (ll->indicators[numCharsInLine] == static_cast(styleByte & ~styleMask)); + if (vstyle.styles[ll->styles[numCharsInLine]].caseForce == Style::caseMixed) + allSame = allSame && + (ll->chars[numCharsInLine] == chDoc); + else if (vstyle.styles[ll->styles[numCharsInLine]].caseForce == Style::caseLower) + allSame = allSame && + (ll->chars[numCharsInLine] == static_cast(tolower(chDoc))); + else // Style::caseUpper + allSame = allSame && + (ll->chars[numCharsInLine] == static_cast(toupper(chDoc))); + numCharsInLine++; + } + allSame = allSame && (ll->styles[numCharsInLine] == styleByte); // For eolFilled + if (allSame) { + ll->validity = LineLayout::llPositions; + } else { + ll->validity = LineLayout::llInvalid; + } + } else { + ll->validity = LineLayout::llInvalid; + } + } + if (ll->validity == LineLayout::llInvalid) { + ll->widthLine = LineLayout::wrapWidthInfinite; + ll->lines = 1; + int numCharsInLine = 0; + int numCharsBeforeEOL = 0; + if (vstyle.edgeState == EDGE_BACKGROUND) { + ll->edgeColumn = pdoc->FindColumn(line, theEdge); + if (ll->edgeColumn >= posLineStart) { + ll->edgeColumn -= posLineStart; + } + } else { + ll->edgeColumn = -1; + } + + char styleByte = 0; + int styleMask = pdoc->stylingBitsMask; + ll->styleBitsSet = 0; + // Fill base line layout + for (int charInDoc = posLineStart; charInDoc < posLineEnd; charInDoc++) { + char chDoc = pdoc->CharAt(charInDoc); + styleByte = pdoc->StyleAt(charInDoc); + ll->styleBitsSet |= styleByte; + if (vstyle.viewEOL || (!IsEOLChar(chDoc))) { + ll->chars[numCharsInLine] = chDoc; + ll->styles[numCharsInLine] = static_cast(styleByte & styleMask); + ll->indicators[numCharsInLine] = static_cast(styleByte & ~styleMask); + if (vstyle.styles[ll->styles[numCharsInLine]].caseForce == Style::caseUpper) + ll->chars[numCharsInLine] = static_cast(toupper(chDoc)); + else if (vstyle.styles[ll->styles[numCharsInLine]].caseForce == Style::caseLower) + ll->chars[numCharsInLine] = static_cast(tolower(chDoc)); + numCharsInLine++; + if (!IsEOLChar(chDoc)) + numCharsBeforeEOL++; + } + } + ll->xHighlightGuide = 0; + // Extra element at the end of the line to hold end x position and act as + ll->chars[numCharsInLine] = 0; // Also triggers processing in the loops as this is a control character + ll->styles[numCharsInLine] = styleByte; // For eolFilled + ll->indicators[numCharsInLine] = 0; + + // Layout the line, determining the position of each character, + // with an extra element at the end for the end of the line. + int startseg = 0; // Start of the current segment, in char. number + int startsegx = 0; // Start of the current segment, in pixels + ll->positions[0] = 0; + unsigned int tabWidth = vstyle.spaceWidth * pdoc->tabInChars; + bool lastSegItalics = false; + Font &ctrlCharsFont = vstyle.styles[STYLE_CONTROLCHAR].font; + + int ctrlCharWidth[32] = {0}; + bool isControlNext = IsControlCharacter(ll->chars[0]); + int trailBytes = 0; + bool isBadUTFNext = IsUnicodeMode() && BadUTF(ll->chars, numCharsInLine, trailBytes); + for (int charInLine = 0; charInLine < numCharsInLine; charInLine++) { + bool isControl = isControlNext; + isControlNext = IsControlCharacter(ll->chars[charInLine + 1]); + bool isBadUTF = isBadUTFNext; + isBadUTFNext = IsUnicodeMode() && BadUTF(ll->chars + charInLine + 1, numCharsInLine - charInLine - 1, trailBytes); + if ((ll->styles[charInLine] != ll->styles[charInLine + 1]) || + isControl || isControlNext || isBadUTF || isBadUTFNext) { + ll->positions[startseg] = 0; + if (vstyle.styles[ll->styles[charInLine]].visible) { + if (isControl) { + if (ll->chars[charInLine] == '\t') { + ll->positions[charInLine + 1] = ((((startsegx + 2) / + tabWidth) + 1) * tabWidth) - startsegx; + } else if (controlCharSymbol < 32) { + if (ctrlCharWidth[ll->chars[charInLine]] == 0) { + const char *ctrlChar = ControlCharacterString(ll->chars[charInLine]); + // +3 For a blank on front and rounded edge each side: + ctrlCharWidth[ll->chars[charInLine]] = + surface->WidthText(ctrlCharsFont, ctrlChar, istrlen(ctrlChar)) + 3; + } + ll->positions[charInLine + 1] = ctrlCharWidth[ll->chars[charInLine]]; + } else { + char cc[2] = { static_cast(controlCharSymbol), '\0' }; + surface->MeasureWidths(ctrlCharsFont, cc, 1, + ll->positions + startseg + 1); + } + lastSegItalics = false; + } else if (isBadUTF) { + char hexits[4]; + sprintf(hexits, "x%2X", ll->chars[charInLine] & 0xff); + ll->positions[charInLine + 1] = + surface->WidthText(ctrlCharsFont, hexits, istrlen(hexits)) + 3; + } else { // Regular character + int lenSeg = charInLine - startseg + 1; + if ((lenSeg == 1) && (' ' == ll->chars[startseg])) { + lastSegItalics = false; + // Over half the segments are single characters and of these about half are space characters. + ll->positions[charInLine + 1] = vstyle.styles[ll->styles[charInLine]].spaceWidth; + } else { + lastSegItalics = vstyle.styles[ll->styles[charInLine]].italic; + posCache.MeasureWidths(surface, vstyle, ll->styles[charInLine], ll->chars + startseg, + lenSeg, ll->positions + startseg + 1); + } + } + } else { // invisible + for (int posToZero = startseg; posToZero <= (charInLine + 1); posToZero++) { + ll->positions[posToZero] = 0; + } + } + for (int posToIncrease = startseg; posToIncrease <= (charInLine + 1); posToIncrease++) { + ll->positions[posToIncrease] += startsegx; + } + startsegx = ll->positions[charInLine + 1]; + startseg = charInLine + 1; + } + } + // Small hack to make lines that end with italics not cut off the edge of the last character + if ((startseg > 0) && lastSegItalics) { + ll->positions[startseg] += 2; + } + ll->numCharsInLine = numCharsInLine; + ll->numCharsBeforeEOL = numCharsBeforeEOL; + ll->validity = LineLayout::llPositions; + } + // Hard to cope when too narrow, so just assume there is space + if (width < 20) { + width = 20; + } + if ((ll->validity == LineLayout::llPositions) || (ll->widthLine != width)) { + ll->widthLine = width; + if (width == LineLayout::wrapWidthInfinite) { + ll->lines = 1; + } else if (width > ll->positions[ll->numCharsInLine]) { + // Simple common case where line does not need wrapping. + ll->lines = 1; + } else { + if (wrapVisualFlags & SC_WRAPVISUALFLAG_END) { + width -= vstyle.aveCharWidth; // take into account the space for end wrap mark + } + ll->wrapIndent = wrapAddIndent; + if (wrapIndentMode != SC_WRAPINDENT_FIXED) + for (int i = 0; i < ll->numCharsInLine; i++) { + if (!IsSpaceOrTab(ll->chars[i])) { + ll->wrapIndent += ll->positions[i]; // Add line indent + break; + } + } + // Check for text width minimum + if (ll->wrapIndent > width - static_cast(vstyle.aveCharWidth) * 15) + ll->wrapIndent = wrapAddIndent; + // Check for wrapIndent minimum + if ((wrapVisualFlags & SC_WRAPVISUALFLAG_START) && (ll->wrapIndent < static_cast(vstyle.aveCharWidth))) + ll->wrapIndent = vstyle.aveCharWidth; // Indent to show start visual + ll->lines = 0; + // Calculate line start positions based upon width. + int lastGoodBreak = 0; + int lastLineStart = 0; + int startOffset = 0; + int p = 0; + while (p < ll->numCharsInLine) { + if ((ll->positions[p + 1] - startOffset) >= width) { + if (lastGoodBreak == lastLineStart) { + // Try moving to start of last character + if (p > 0) { + lastGoodBreak = pdoc->MovePositionOutsideChar(p + posLineStart, -1) + - posLineStart; + } + if (lastGoodBreak == lastLineStart) { + // Ensure at least one character on line. + lastGoodBreak = pdoc->MovePositionOutsideChar(lastGoodBreak + posLineStart + 1, 1) + - posLineStart; + } + } + lastLineStart = lastGoodBreak; + ll->lines++; + ll->SetLineStart(ll->lines, lastGoodBreak); + startOffset = ll->positions[lastGoodBreak]; + // take into account the space for start wrap mark and indent + startOffset -= ll->wrapIndent; + p = lastGoodBreak + 1; + continue; + } + if (p > 0) { + if (wrapState == eWrapChar) { + lastGoodBreak = pdoc->MovePositionOutsideChar(p + posLineStart, -1) + - posLineStart; + p = pdoc->MovePositionOutsideChar(p + 1 + posLineStart, 1) - posLineStart; + continue; + } else if (ll->styles[p] != ll->styles[p - 1]) { + lastGoodBreak = p; + } else if (IsSpaceOrTab(ll->chars[p - 1]) && !IsSpaceOrTab(ll->chars[p])) { + lastGoodBreak = p; + } + } + p++; + } + ll->lines++; + } + ll->validity = LineLayout::llLines; + } +} + +ColourAllocated Editor::SelectionBackground(ViewStyle &vsDraw, bool main) { + return main ? + (primarySelection ? vsDraw.selbackground.allocated : vsDraw.selbackground2.allocated) : + vsDraw.selAdditionalBackground.allocated; +} + +ColourAllocated Editor::TextBackground(ViewStyle &vsDraw, bool overrideBackground, + ColourAllocated background, int inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll) { + if (inSelection == 1) { + if (vsDraw.selbackset && (vsDraw.selAlpha == SC_ALPHA_NOALPHA)) { + return SelectionBackground(vsDraw, true); + } + } else if (inSelection == 2) { + if (vsDraw.selbackset && (vsDraw.selAdditionalAlpha == SC_ALPHA_NOALPHA)) { + return SelectionBackground(vsDraw, false); + } + } else { + if ((vsDraw.edgeState == EDGE_BACKGROUND) && + (i >= ll->edgeColumn) && + !IsEOLChar(ll->chars[i])) + return vsDraw.edgecolour.allocated; + if (inHotspot && vsDraw.hotspotBackgroundSet) + return vsDraw.hotspotBackground.allocated; + if (overrideBackground && (styleMain != STYLE_BRACELIGHT) && (styleMain != STYLE_BRACEBAD)) + return background; + } + return vsDraw.styles[styleMain].back.allocated; +} + +void Editor::DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight) { + Point from(0, ((lineVisible & 1) && (lineHeight & 1)) ? 1 : 0); + PRectangle rcCopyArea(start + 1, rcSegment.top, start + 2, rcSegment.bottom); + surface->Copy(rcCopyArea, from, + highlight ? *pixmapIndentGuideHighlight : *pixmapIndentGuide); +} + +void Editor::DrawWrapMarker(Surface *surface, PRectangle rcPlace, + bool isEndMarker, ColourAllocated wrapColour) { + surface->PenColour(wrapColour); + + enum { xa = 1 }; // gap before start + int w = rcPlace.right - rcPlace.left - xa - 1; + + bool xStraight = isEndMarker; // x-mirrored symbol for start marker + bool yStraight = true; + //bool yStraight= isEndMarker; // comment in for start marker y-mirrowed + + int x0 = xStraight ? rcPlace.left : rcPlace.right - 1; + int y0 = yStraight ? rcPlace.top : rcPlace.bottom - 1; + + int dy = (rcPlace.bottom - rcPlace.top) / 5; + int y = (rcPlace.bottom - rcPlace.top) / 2 + dy; + + struct Relative { + Surface *surface; + int xBase; + int xDir; + int yBase; + int yDir; + void MoveTo(int xRelative, int yRelative) { + surface->MoveTo(xBase + xDir * xRelative, yBase + yDir * yRelative); + } + void LineTo(int xRelative, int yRelative) { + surface->LineTo(xBase + xDir * xRelative, yBase + yDir * yRelative); + } + }; + Relative rel = {surface, x0, xStraight ? 1 : -1, y0, yStraight ? 1 : -1}; + + // arrow head + rel.MoveTo(xa, y); + rel.LineTo(xa + 2*w / 3, y - dy); + rel.MoveTo(xa, y); + rel.LineTo(xa + 2*w / 3, y + dy); + + // arrow body + rel.MoveTo(xa, y); + rel.LineTo(xa + w, y); + rel.LineTo(xa + w, y - 2 * dy); + rel.LineTo(xa - 1, // on windows lineto is exclusive endpoint, perhaps GTK not... + y - 2 * dy); +} + +static void SimpleAlphaRectangle(Surface *surface, PRectangle rc, ColourAllocated fill, int alpha) { + if (alpha != SC_ALPHA_NOALPHA) { + surface->AlphaRectangle(rc, 0, fill, alpha, fill, alpha, 0); + } +} + +void DrawTextBlob(Surface *surface, ViewStyle &vsDraw, PRectangle rcSegment, + const char *s, ColourAllocated textBack, ColourAllocated textFore, bool twoPhaseDraw) { + if (!twoPhaseDraw) { + surface->FillRectangle(rcSegment, textBack); + } + Font &ctrlCharsFont = vsDraw.styles[STYLE_CONTROLCHAR].font; + int normalCharHeight = surface->Ascent(ctrlCharsFont) - + surface->InternalLeading(ctrlCharsFont); + PRectangle rcCChar = rcSegment; + rcCChar.left = rcCChar.left + 1; + rcCChar.top = rcSegment.top + vsDraw.maxAscent - normalCharHeight; + rcCChar.bottom = rcSegment.top + vsDraw.maxAscent + 1; + PRectangle rcCentral = rcCChar; + rcCentral.top++; + rcCentral.bottom--; + surface->FillRectangle(rcCentral, textFore); + PRectangle rcChar = rcCChar; + rcChar.left++; + rcChar.right--; + surface->DrawTextClipped(rcChar, ctrlCharsFont, + rcSegment.top + vsDraw.maxAscent, s, istrlen(s), + textBack, textFore); +} + +void Editor::DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll, + int line, int lineEnd, int xStart, int subLine, int subLineStart, + bool overrideBackground, ColourAllocated background, + bool drawWrapMarkEnd, ColourAllocated wrapColour) { + + const int posLineStart = pdoc->LineStart(line); + const int styleMask = pdoc->stylingBitsMask; + PRectangle rcSegment = rcLine; + + const bool lastSubLine = subLine == (ll->lines - 1); + int virtualSpace = 0; + if (lastSubLine) { + const int spaceWidth = static_cast(vsDraw.styles[ll->EndLineStyle()].spaceWidth); + virtualSpace = sel.VirtualSpaceFor(pdoc->LineEnd(line)) * spaceWidth; + } + + // Fill in a PRectangle representing the end of line characters + + int xEol = ll->positions[lineEnd] - subLineStart; + + // Fill the virtual space and show selections within it + if (virtualSpace) { + rcSegment.left = xEol + xStart; + rcSegment.right = xEol + xStart + virtualSpace; + surface->FillRectangle(rcSegment, overrideBackground ? background : vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back.allocated); + if (!hideSelection && ((vsDraw.selAlpha == SC_ALPHA_NOALPHA) || (vsDraw.selAdditionalAlpha == SC_ALPHA_NOALPHA))) { + SelectionSegment virtualSpaceRange(SelectionPosition(pdoc->LineEnd(line)), SelectionPosition(pdoc->LineEnd(line), sel.VirtualSpaceFor(pdoc->LineEnd(line)))); + for (size_t r=0; r(vsDraw.styles[ll->EndLineStyle()].spaceWidth); + rcSegment.left = xStart + ll->positions[portion.start.Position() - posLineStart] - subLineStart + portion.start.VirtualSpace() * spaceWidth; + rcSegment.right = xStart + ll->positions[portion.end.Position() - posLineStart] - subLineStart + portion.end.VirtualSpace() * spaceWidth; + rcSegment.left = Platform::Maximum(rcSegment.left, rcLine.left); + rcSegment.right = Platform::Minimum(rcSegment.right, rcLine.right); + surface->FillRectangle(rcSegment, SelectionBackground(vsDraw, r == sel.Main())); + } + } + } + } + } + + int posAfterLineEnd = pdoc->LineStart(line + 1); + int eolInSelection = (subLine == (ll->lines - 1)) ? sel.InSelectionForEOL(posAfterLineEnd) : 0; + int alpha = (eolInSelection == 1) ? vsDraw.selAlpha : vsDraw.selAdditionalAlpha; + + // Draw the [CR], [LF], or [CR][LF] blobs if visible line ends are on + int blobsWidth = 0; + if (lastSubLine) { + for (int eolPos=ll->numCharsBeforeEOL; eolPosnumCharsInLine; eolPos++) { + rcSegment.left = xStart + ll->positions[eolPos] - subLineStart + virtualSpace; + rcSegment.right = xStart + ll->positions[eolPos+1] - subLineStart + virtualSpace; + blobsWidth += rcSegment.Width(); + const char *ctrlChar = ControlCharacterString(ll->chars[eolPos]); + int inSelection = 0; + bool inHotspot = false; + int styleMain = ll->styles[eolPos]; + ColourAllocated textBack = TextBackground(vsDraw, overrideBackground, background, inSelection, inHotspot, styleMain, eolPos, ll); + ColourAllocated textFore = vsDraw.styles[styleMain].fore.allocated; + if (!hideSelection && eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1)) { + if (alpha == SC_ALPHA_NOALPHA) { + surface->FillRectangle(rcSegment, SelectionBackground(vsDraw, eolInSelection == 1)); + } else { + surface->FillRectangle(rcSegment, textBack); + SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw, eolInSelection == 1), alpha); + } + } else { + surface->FillRectangle(rcSegment, textBack); + } + DrawTextBlob(surface, vsDraw, rcSegment, ctrlChar, textBack, textFore, twoPhaseDraw); + } + } + + // Draw the eol-is-selected rectangle + rcSegment.left = xEol + xStart + virtualSpace + blobsWidth; + rcSegment.right = xEol + xStart + virtualSpace + blobsWidth + vsDraw.aveCharWidth; + + if (!hideSelection && eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (alpha == SC_ALPHA_NOALPHA)) { + surface->FillRectangle(rcSegment, SelectionBackground(vsDraw, eolInSelection == 1)); + } else { + if (overrideBackground) { + surface->FillRectangle(rcSegment, background); + } else if (line < pdoc->LinesTotal() - 1) { + surface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back.allocated); + } else if (vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].eolFilled) { + surface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back.allocated); + } else { + surface->FillRectangle(rcSegment, vsDraw.styles[STYLE_DEFAULT].back.allocated); + } + if (!hideSelection && eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (alpha != SC_ALPHA_NOALPHA)) { + SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw, eolInSelection == 1), alpha); + } + } + + // Fill the remainder of the line + rcSegment.left = xEol + xStart + virtualSpace + blobsWidth + vsDraw.aveCharWidth; + rcSegment.right = rcLine.right; + + if (!hideSelection && vsDraw.selEOLFilled && eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (alpha == SC_ALPHA_NOALPHA)) { + surface->FillRectangle(rcSegment, SelectionBackground(vsDraw, eolInSelection == 1)); + } else { + if (overrideBackground) { + surface->FillRectangle(rcSegment, background); + } else if (vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].eolFilled) { + surface->FillRectangle(rcSegment, vsDraw.styles[ll->styles[ll->numCharsInLine] & styleMask].back.allocated); + } else { + surface->FillRectangle(rcSegment, vsDraw.styles[STYLE_DEFAULT].back.allocated); + } + if (!hideSelection && vsDraw.selEOLFilled && eolInSelection && vsDraw.selbackset && (line < pdoc->LinesTotal() - 1) && (alpha != SC_ALPHA_NOALPHA)) { + SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw, eolInSelection == 1), alpha); + } + } + + if (drawWrapMarkEnd) { + PRectangle rcPlace = rcSegment; + + if (wrapVisualFlagsLocation & SC_WRAPVISUALFLAGLOC_END_BY_TEXT) { + rcPlace.left = xEol + xStart + virtualSpace; + rcPlace.right = rcPlace.left + vsDraw.aveCharWidth; + } else { + // draw left of the right text margin, to avoid clipping by the current clip rect + rcPlace.right = rcLine.right - vs.rightMarginWidth; + rcPlace.left = rcPlace.right - vsDraw.aveCharWidth; + } + DrawWrapMarker(surface, rcPlace, true, wrapColour); + } +} + +void Editor::DrawIndicators(Surface *surface, ViewStyle &vsDraw, int line, int xStart, + PRectangle rcLine, LineLayout *ll, int subLine, int lineEnd, bool under) { + // Draw decorators + const int posLineStart = pdoc->LineStart(line); + const int lineStart = ll->LineStart(subLine); + const int subLineStart = ll->positions[lineStart]; + const int posLineEnd = posLineStart + lineEnd; + + if (!under) { + // Draw indicators + // foreach indicator... + for (int indicnum = 0, mask = 1 << pdoc->stylingBits; mask < 0x100; indicnum++) { + if (!(mask & ll->styleBitsSet)) { + mask <<= 1; + continue; + } + int startPos = -1; + // foreach style pos in line... + for (int indicPos = lineStart; indicPos <= lineEnd; indicPos++) { + // look for starts... + if (startPos < 0) { + // NOT in indicator run, looking for START + if (indicPos < lineEnd && (ll->indicators[indicPos] & mask)) + startPos = indicPos; + } + // ... or ends + if (startPos >= 0) { + // IN indicator run, looking for END + if (indicPos >= lineEnd || !(ll->indicators[indicPos] & mask)) { + // AT end of indicator run, DRAW it! + PRectangle rcIndic( + ll->positions[startPos] + xStart - subLineStart, + rcLine.top + vsDraw.maxAscent, + ll->positions[indicPos] + xStart - subLineStart, + rcLine.top + vsDraw.maxAscent + 3); + vsDraw.indicators[indicnum].Draw(surface, rcIndic, rcLine); + // RESET control var + startPos = -1; + } + } + } + mask <<= 1; + } + } + + for (Decoration *deco = pdoc->decorations.root; deco; deco = deco->next) { + if (under == vsDraw.indicators[deco->indicator].under) { + int startPos = posLineStart + lineStart; + if (!deco->rs.ValueAt(startPos)) { + startPos = deco->rs.EndRun(startPos); + } + while ((startPos < posLineEnd) && (deco->rs.ValueAt(startPos))) { + int endPos = deco->rs.EndRun(startPos); + if (endPos > posLineEnd) + endPos = posLineEnd; + PRectangle rcIndic( + ll->positions[startPos - posLineStart] + xStart - subLineStart, + rcLine.top + vsDraw.maxAscent, + ll->positions[endPos - posLineStart] + xStart - subLineStart, + rcLine.top + vsDraw.maxAscent + 3); + vsDraw.indicators[deco->indicator].Draw(surface, rcIndic, rcLine); + startPos = deco->rs.EndRun(endPos); + } + } + } +} + +void Editor::DrawAnnotation(Surface *surface, ViewStyle &vsDraw, int line, int xStart, + PRectangle rcLine, LineLayout *ll, int subLine) { + int indent = pdoc->GetLineIndentation(line) * vsDraw.spaceWidth; + PRectangle rcSegment = rcLine; + int annotationLine = subLine - ll->lines; + const StyledText stAnnotation = pdoc->AnnotationStyledText(line); + if (stAnnotation.text && ValidStyledText(vsDraw, vsDraw.annotationStyleOffset, stAnnotation)) { + surface->FillRectangle(rcSegment, vsDraw.styles[0].back.allocated); + if (vs.annotationVisible == ANNOTATION_BOXED) { + // Only care about calculating width if need to draw box + int widthAnnotation = WidestLineWidth(surface, vsDraw, vsDraw.annotationStyleOffset, stAnnotation); + widthAnnotation += vsDraw.spaceWidth * 2; // Margins + rcSegment.left = xStart + indent; + rcSegment.right = rcSegment.left + widthAnnotation; + surface->PenColour(vsDraw.styles[vsDraw.annotationStyleOffset].fore.allocated); + } else { + rcSegment.left = xStart; + } + const int annotationLines = pdoc->AnnotationLines(line); + size_t start = 0; + size_t lengthAnnotation = stAnnotation.LineLength(start); + int lineInAnnotation = 0; + while ((lineInAnnotation < annotationLine) && (start < stAnnotation.length)) { + start += lengthAnnotation + 1; + lengthAnnotation = stAnnotation.LineLength(start); + lineInAnnotation++; + } + PRectangle rcText = rcSegment; + if (vs.annotationVisible == ANNOTATION_BOXED) { + surface->FillRectangle(rcText, + vsDraw.styles[stAnnotation.StyleAt(start) + vsDraw.annotationStyleOffset].back.allocated); + rcText.left += vsDraw.spaceWidth; + } + DrawStyledText(surface, vsDraw, vsDraw.annotationStyleOffset, rcText, rcText.top + vsDraw.maxAscent, + stAnnotation, start, lengthAnnotation); + if (vs.annotationVisible == ANNOTATION_BOXED) { + + // Set grey border colour + ColourDesired greyCol (128, 128, 128); + ColourDesired lightGreyCol(192, 192, 192); + + surface->PenColour(greyCol.AsLong()); + + surface->MoveTo(rcSegment.left, rcSegment.top); + surface->LineTo(rcSegment.left, rcSegment.bottom); + + surface->PenColour(lightGreyCol.AsLong()); + surface->MoveTo(rcSegment.right, rcSegment.top); + surface->LineTo(rcSegment.right, rcSegment.bottom); + + if (subLine == ll->lines){ + surface->PenColour(lightGreyCol.AsLong()); + surface->MoveTo(rcSegment.left, rcSegment.top); + surface->LineTo(rcSegment.right, rcSegment.top); + } + if (subLine == ll->lines+annotationLines-1) { + surface->PenColour(greyCol.AsLong()); + surface->MoveTo(rcSegment.left, rcSegment.bottom - 1); + surface->LineTo(rcSegment.right, rcSegment.bottom - 1); + } + } + } +} + +void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart, + PRectangle rcLine, LineLayout *ll, int subLine) { + + PRectangle rcSegment = rcLine; + + // Using one font for all control characters so it can be controlled independently to ensure + // the box goes around the characters tightly. Seems to be no way to work out what height + // is taken by an individual character - internal leading gives varying results. + Font &ctrlCharsFont = vsDraw.styles[STYLE_CONTROLCHAR].font; + + // See if something overrides the line background color: Either if caret is on the line + // and background color is set for that, or if a marker is defined that forces its background + // color onto the line, or if a marker is defined but has no selection margin in which to + // display itself (as long as it's not an SC_MARK_EMPTY marker). These are checked in order + // with the earlier taking precedence. When multiple markers cause background override, + // the color for the highest numbered one is used. + bool overrideBackground = false; + ColourAllocated background; + if (caret.active && vsDraw.showCaretLineBackground && (vsDraw.caretLineAlpha == SC_ALPHA_NOALPHA) && ll->containsCaret) { + overrideBackground = true; + background = vsDraw.caretLineBackground.allocated; + } + if (!overrideBackground) { + int marks = pdoc->GetMark(line); + for (int markBit = 0; (markBit < 32) && marks; markBit++) { + if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) && + (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) { + background = vsDraw.markers[markBit].back.allocated; + overrideBackground = true; + } + marks >>= 1; + } + } + if (!overrideBackground) { + if (vsDraw.maskInLine) { + int marksMasked = pdoc->GetMark(line) & vsDraw.maskInLine; + if (marksMasked) { + for (int markBit = 0; (markBit < 32) && marksMasked; markBit++) { + if ((marksMasked & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY) && + (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) { + overrideBackground = true; + background = vsDraw.markers[markBit].back.allocated; + } + marksMasked >>= 1; + } + } + } + } + + bool drawWhitespaceBackground = (vsDraw.viewWhitespace != wsInvisible) && + (!overrideBackground) && (vsDraw.whitespaceBackgroundSet); + + bool inIndentation = subLine == 0; // Do not handle indentation except on first subline. + int indentWidth = pdoc->IndentSize() * vsDraw.spaceWidth; + + int posLineStart = pdoc->LineStart(line); + + int startseg = ll->LineStart(subLine); + int subLineStart = ll->positions[startseg]; + if (subLine >= ll->lines) { + DrawAnnotation(surface, vsDraw, line, xStart, rcLine, ll, subLine); + return; // No further drawing + } + int lineStart = 0; + int lineEnd = 0; + if (subLine < ll->lines) { + lineStart = ll->LineStart(subLine); + lineEnd = ll->LineStart(subLine + 1); + if (subLine == ll->lines - 1) { + lineEnd = ll->numCharsBeforeEOL; + } + } + + ColourAllocated wrapColour = vsDraw.styles[STYLE_DEFAULT].fore.allocated; + if (vsDraw.whitespaceForegroundSet) + wrapColour = vsDraw.whitespaceForeground.allocated; + + bool drawWrapMarkEnd = false; + + if (wrapVisualFlags & SC_WRAPVISUALFLAG_END) { + if (subLine + 1 < ll->lines) { + drawWrapMarkEnd = ll->LineStart(subLine + 1) != 0; + } + } + + if (ll->wrapIndent != 0) { + + bool continuedWrapLine = false; + if (subLine < ll->lines) { + continuedWrapLine = ll->LineStart(subLine) != 0; + } + + if (continuedWrapLine) { + // draw continuation rect + PRectangle rcPlace = rcSegment; + + rcPlace.left = ll->positions[startseg] + xStart - subLineStart; + rcPlace.right = rcPlace.left + ll->wrapIndent; + + // default bgnd here.. + surface->FillRectangle(rcSegment, overrideBackground ? background : + vsDraw.styles[STYLE_DEFAULT].back.allocated); + + // main line style would be below but this would be inconsistent with end markers + // also would possibly not be the style at wrap point + //int styleMain = ll->styles[lineStart]; + //surface->FillRectangle(rcPlace, vsDraw.styles[styleMain].back.allocated); + + if (wrapVisualFlags & SC_WRAPVISUALFLAG_START) { + + if (wrapVisualFlagsLocation & SC_WRAPVISUALFLAGLOC_START_BY_TEXT) + rcPlace.left = rcPlace.right - vsDraw.aveCharWidth; + else + rcPlace.right = rcPlace.left + vsDraw.aveCharWidth; + + DrawWrapMarker(surface, rcPlace, false, wrapColour); + } + + xStart += ll->wrapIndent; + } + } + + bool selBackDrawn = vsDraw.selbackset && + ((vsDraw.selAlpha == SC_ALPHA_NOALPHA) || (vsDraw.selAdditionalAlpha == SC_ALPHA_NOALPHA)); + + // Does not take margin into account but not significant + int xStartVisible = subLineStart - xStart; + + ll->psel = &sel; + + BreakFinder bfBack(ll, lineStart, lineEnd, posLineStart, IsUnicodeMode(), xStartVisible, selBackDrawn); + int next = bfBack.First(); + + // Background drawing loop + while (twoPhaseDraw && (next < lineEnd)) { + + startseg = next; + next = bfBack.Next(); + int i = next - 1; + int iDoc = i + posLineStart; + + rcSegment.left = ll->positions[startseg] + xStart - subLineStart; + rcSegment.right = ll->positions[i + 1] + xStart - subLineStart; + // Only try to draw if really visible - enhances performance by not calling environment to + // draw strings that are completely past the right side of the window. + if ((rcSegment.left <= rcLine.right) && (rcSegment.right >= rcLine.left)) { + // Clip to line rectangle, since may have a huge position which will not work with some platforms + rcSegment.left = Platform::Maximum(rcSegment.left, rcLine.left); + rcSegment.right = Platform::Minimum(rcSegment.right, rcLine.right); + + int styleMain = ll->styles[i]; + const int inSelection = hideSelection ? 0 : sel.CharacterInSelection(iDoc); + bool inHotspot = (ll->hsStart != -1) && (iDoc >= ll->hsStart) && (iDoc < ll->hsEnd); + ColourAllocated textBack = TextBackground(vsDraw, overrideBackground, background, inSelection, inHotspot, styleMain, i, ll); + if (ll->chars[i] == '\t') { + // Tab display + if (drawWhitespaceBackground && + (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways)) + textBack = vsDraw.whitespaceBackground.allocated; + surface->FillRectangle(rcSegment, textBack); + } else if (IsControlCharacter(ll->chars[i])) { + // Control character display + inIndentation = false; + surface->FillRectangle(rcSegment, textBack); + } else { + // Normal text display + surface->FillRectangle(rcSegment, textBack); + if (vsDraw.viewWhitespace != wsInvisible || + (inIndentation && vsDraw.viewIndentationGuides == ivReal)) { + for (int cpos = 0; cpos <= i - startseg; cpos++) { + if (ll->chars[cpos + startseg] == ' ') { + if (drawWhitespaceBackground && + (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways)) { + PRectangle rcSpace(ll->positions[cpos + startseg] + xStart - subLineStart, + rcSegment.top, + ll->positions[cpos + startseg + 1] + xStart - subLineStart, + rcSegment.bottom); + surface->FillRectangle(rcSpace, vsDraw.whitespaceBackground.allocated); + } + } else { + inIndentation = false; + } + } + } + } + } else if (rcSegment.left > rcLine.right) { + break; + } + } + + if (twoPhaseDraw) { + DrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd, + xStart, subLine, subLineStart, overrideBackground, background, + drawWrapMarkEnd, wrapColour); + } + + DrawIndicators(surface, vsDraw, line, xStart, rcLine, ll, subLine, lineEnd, true); + + if (vsDraw.edgeState == EDGE_LINE) { + int edgeX = theEdge * vsDraw.spaceWidth; + rcSegment.left = edgeX + xStart; + rcSegment.right = rcSegment.left + 1; + surface->FillRectangle(rcSegment, vsDraw.edgecolour.allocated); + } + + // Draw underline mark as part of background if not transparent + int marks = pdoc->GetMark(line); + int markBit; + for (markBit = 0; (markBit < 32) && marks; markBit++) { + if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_UNDERLINE) && + (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) { + PRectangle rcUnderline = rcLine; + rcUnderline.top = rcUnderline.bottom - 2; + surface->FillRectangle(rcUnderline, vsDraw.markers[markBit].back.allocated); + } + marks >>= 1; + } + + inIndentation = subLine == 0; // Do not handle indentation except on first subline. + // Foreground drawing loop + BreakFinder bfFore(ll, lineStart, lineEnd, posLineStart, IsUnicodeMode(), xStartVisible, + ((!twoPhaseDraw && selBackDrawn) || vsDraw.selforeset)); + next = bfFore.First(); + + while (next < lineEnd) { + + startseg = next; + next = bfFore.Next(); + int i = next - 1; + + int iDoc = i + posLineStart; + + rcSegment.left = ll->positions[startseg] + xStart - subLineStart; + rcSegment.right = ll->positions[i + 1] + xStart - subLineStart; + // Only try to draw if really visible - enhances performance by not calling environment to + // draw strings that are completely past the right side of the window. + if ((rcSegment.left <= rcLine.right) && (rcSegment.right >= rcLine.left)) { + int styleMain = ll->styles[i]; + ColourAllocated textFore = vsDraw.styles[styleMain].fore.allocated; + Font &textFont = vsDraw.styles[styleMain].font; + //hotspot foreground + if (ll->hsStart != -1 && iDoc >= ll->hsStart && iDoc < hsEnd) { + if (vsDraw.hotspotForegroundSet) + textFore = vsDraw.hotspotForeground.allocated; + } + const int inSelection = hideSelection ? 0 : sel.CharacterInSelection(iDoc); + if (inSelection && (vsDraw.selforeset)) { + textFore = (inSelection == 1) ? vsDraw.selforeground.allocated : vsDraw.selAdditionalForeground.allocated; + } + bool inHotspot = (ll->hsStart != -1) && (iDoc >= ll->hsStart) && (iDoc < ll->hsEnd); + ColourAllocated textBack = TextBackground(vsDraw, overrideBackground, background, inSelection, inHotspot, styleMain, i, ll); + if (ll->chars[i] == '\t') { + // Tab display + if (!twoPhaseDraw) { + if (drawWhitespaceBackground && + (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways)) + textBack = vsDraw.whitespaceBackground.allocated; + surface->FillRectangle(rcSegment, textBack); + } + if ((vsDraw.viewWhitespace != wsInvisible) || + (inIndentation && vsDraw.viewIndentationGuides != ivNone)) { + if (vsDraw.whitespaceForegroundSet) + textFore = vsDraw.whitespaceForeground.allocated; + surface->PenColour(textFore); + } + if (inIndentation && vsDraw.viewIndentationGuides == ivReal) { + for (int xIG = ll->positions[i] / indentWidth * indentWidth; xIG < ll->positions[i + 1]; xIG += indentWidth) { + if (xIG >= ll->positions[i] && xIG > 0) { + DrawIndentGuide(surface, lineVisible, vsDraw.lineHeight, xIG + xStart, rcSegment, + (ll->xHighlightGuide == xIG)); + } + } + } + if (vsDraw.viewWhitespace != wsInvisible) { + if (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways) { + PRectangle rcTab(rcSegment.left + 1, rcSegment.top + 4, + rcSegment.right - 1, rcSegment.bottom - vsDraw.maxDescent); + DrawTabArrow(surface, rcTab, rcSegment.top + vsDraw.lineHeight / 2); + } + } + } else if (IsControlCharacter(ll->chars[i])) { + // Control character display + inIndentation = false; + if (controlCharSymbol < 32) { + // Draw the character + const char *ctrlChar = ControlCharacterString(ll->chars[i]); + DrawTextBlob(surface, vsDraw, rcSegment, ctrlChar, textBack, textFore, twoPhaseDraw); + } else { + char cc[2] = { static_cast(controlCharSymbol), '\0' }; + surface->DrawTextNoClip(rcSegment, ctrlCharsFont, + rcSegment.top + vsDraw.maxAscent, + cc, 1, textBack, textFore); + } + } else if ((i == startseg) && (static_cast(ll->chars[i]) >= 0x80) && IsUnicodeMode()) { + // A single byte >= 0x80 in UTF-8 is a bad byte and is displayed as its hex value + char hexits[4]; + sprintf(hexits, "x%2X", ll->chars[i] & 0xff); + DrawTextBlob(surface, vsDraw, rcSegment, hexits, textBack, textFore, twoPhaseDraw); + } else { + // Normal text display + if (vsDraw.styles[styleMain].visible) { + if (twoPhaseDraw) { + surface->DrawTextTransparent(rcSegment, textFont, + rcSegment.top + vsDraw.maxAscent, ll->chars + startseg, + i - startseg + 1, textFore); + } else { + surface->DrawTextNoClip(rcSegment, textFont, + rcSegment.top + vsDraw.maxAscent, ll->chars + startseg, + i - startseg + 1, textFore, textBack); + } + } + if (vsDraw.viewWhitespace != wsInvisible || + (inIndentation && vsDraw.viewIndentationGuides != ivNone)) { + for (int cpos = 0; cpos <= i - startseg; cpos++) { + if (ll->chars[cpos + startseg] == ' ') { + if (vsDraw.viewWhitespace != wsInvisible) { + if (vsDraw.whitespaceForegroundSet) + textFore = vsDraw.whitespaceForeground.allocated; + if (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways) { + int xmid = (ll->positions[cpos + startseg] + ll->positions[cpos + startseg + 1]) / 2; + if (!twoPhaseDraw && drawWhitespaceBackground && + (!inIndentation || vsDraw.viewWhitespace == wsVisibleAlways)) { + textBack = vsDraw.whitespaceBackground.allocated; + PRectangle rcSpace(ll->positions[cpos + startseg] + xStart - subLineStart, + rcSegment.top, + ll->positions[cpos + startseg + 1] + xStart - subLineStart, + rcSegment.bottom); + surface->FillRectangle(rcSpace, textBack); + } + PRectangle rcDot(xmid + xStart - subLineStart, rcSegment.top + vsDraw.lineHeight / 2, 0, 0); + rcDot.right = rcDot.left + vs.whitespaceSize; + rcDot.bottom = rcDot.top + vs.whitespaceSize; + surface->FillRectangle(rcDot, textFore); + } + } + if (inIndentation && vsDraw.viewIndentationGuides == ivReal) { + int startSpace = ll->positions[cpos + startseg]; + if (startSpace > 0 && (startSpace % indentWidth == 0)) { + DrawIndentGuide(surface, lineVisible, vsDraw.lineHeight, startSpace + xStart, rcSegment, + (ll->xHighlightGuide == ll->positions[cpos + startseg])); + } + } + } else { + inIndentation = false; + } + } + } + } + if (ll->hsStart != -1 && vsDraw.hotspotUnderline && iDoc >= ll->hsStart && iDoc < ll->hsEnd ) { + PRectangle rcUL = rcSegment; + rcUL.top = rcUL.top + vsDraw.maxAscent + 1; + rcUL.bottom = rcUL.top + 1; + if (vsDraw.hotspotForegroundSet) + surface->FillRectangle(rcUL, vsDraw.hotspotForeground.allocated); + else + surface->FillRectangle(rcUL, textFore); + } else if (vsDraw.styles[styleMain].underline) { + PRectangle rcUL = rcSegment; + rcUL.top = rcUL.top + vsDraw.maxAscent + 1; + rcUL.bottom = rcUL.top + 1; + surface->FillRectangle(rcUL, textFore); + } + } else if (rcSegment.left > rcLine.right) { + break; + } + } + if ((vsDraw.viewIndentationGuides == ivLookForward || vsDraw.viewIndentationGuides == ivLookBoth) + && (subLine == 0)) { + int indentSpace = pdoc->GetLineIndentation(line); + int xStartText = ll->positions[pdoc->GetLineIndentPosition(line) - posLineStart]; + + // Find the most recent line with some text + + int lineLastWithText = line; + while (lineLastWithText > Platform::Maximum(line-20, 0) && pdoc->IsWhiteLine(lineLastWithText)) { + lineLastWithText--; + } + if (lineLastWithText < line) { + xStartText = 100000; // Don't limit to visible indentation on empty line + // This line is empty, so use indentation of last line with text + int indentLastWithText = pdoc->GetLineIndentation(lineLastWithText); + int isFoldHeader = pdoc->GetLevel(lineLastWithText) & SC_FOLDLEVELHEADERFLAG; + if (isFoldHeader) { + // Level is one more level than parent + indentLastWithText += pdoc->IndentSize(); + } + if (vsDraw.viewIndentationGuides == ivLookForward) { + // In viLookForward mode, previous line only used if it is a fold header + if (isFoldHeader) { + indentSpace = Platform::Maximum(indentSpace, indentLastWithText); + } + } else { // viLookBoth + indentSpace = Platform::Maximum(indentSpace, indentLastWithText); + } + } + + int lineNextWithText = line; + while (lineNextWithText < Platform::Minimum(line+20, pdoc->LinesTotal()) && pdoc->IsWhiteLine(lineNextWithText)) { + lineNextWithText++; + } + if (lineNextWithText > line) { + // This line is empty, so use indentation of last line with text + indentSpace = Platform::Maximum(indentSpace, + pdoc->GetLineIndentation(lineNextWithText)); + } + + for (int indentPos = pdoc->IndentSize(); indentPos < indentSpace; indentPos += pdoc->IndentSize()) { + int xIndent = indentPos * vsDraw.spaceWidth; + if (xIndent < xStartText) { + DrawIndentGuide(surface, lineVisible, vsDraw.lineHeight, xIndent + xStart, rcSegment, + (ll->xHighlightGuide == xIndent)); + } + } + } + + DrawIndicators(surface, vsDraw, line, xStart, rcLine, ll, subLine, lineEnd, false); + + // End of the drawing of the current line + if (!twoPhaseDraw) { + DrawEOL(surface, vsDraw, rcLine, ll, line, lineEnd, + xStart, subLine, subLineStart, overrideBackground, background, + drawWrapMarkEnd, wrapColour); + } + if (!hideSelection && ((vsDraw.selAlpha != SC_ALPHA_NOALPHA) || (vsDraw.selAdditionalAlpha != SC_ALPHA_NOALPHA))) { + // For each selection draw + int virtualSpaces = 0; + if (subLine == (ll->lines - 1)) { + virtualSpaces = sel.VirtualSpaceFor(pdoc->LineEnd(line)); + } + SelectionPosition posStart(posLineStart); + SelectionPosition posEnd(posLineStart + lineEnd, virtualSpaces); + SelectionSegment virtualSpaceRange(posStart, posEnd); + for (size_t r=0; r(vsDraw.styles[ll->EndLineStyle()].spaceWidth); + rcSegment.left = xStart + ll->positions[portion.start.Position() - posLineStart] - subLineStart + portion.start.VirtualSpace() * spaceWidth; + rcSegment.right = xStart + ll->positions[portion.end.Position() - posLineStart] - subLineStart + portion.end.VirtualSpace() * spaceWidth; + rcSegment.left = Platform::Maximum(rcSegment.left, rcLine.left); + rcSegment.right = Platform::Minimum(rcSegment.right, rcLine.right); + SimpleAlphaRectangle(surface, rcSegment, SelectionBackground(vsDraw, r == sel.Main()), alpha); + } + } + } + } + + // Draw any translucent whole line states + rcSegment.left = xStart; + rcSegment.right = rcLine.right - 1; + if (caret.active && vsDraw.showCaretLineBackground && ll->containsCaret) { + SimpleAlphaRectangle(surface, rcSegment, vsDraw.caretLineBackground.allocated, vsDraw.caretLineAlpha); + } + marks = pdoc->GetMark(line); + for (markBit = 0; (markBit < 32) && marks; markBit++) { + if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND)) { + SimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back.allocated, vsDraw.markers[markBit].alpha); + } else if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_UNDERLINE)) { + PRectangle rcUnderline = rcSegment; + rcUnderline.top = rcUnderline.bottom - 2; + SimpleAlphaRectangle(surface, rcUnderline, vsDraw.markers[markBit].back.allocated, vsDraw.markers[markBit].alpha); + } + marks >>= 1; + } + if (vsDraw.maskInLine) { + int marksMasked = pdoc->GetMark(line) & vsDraw.maskInLine; + if (marksMasked) { + for (markBit = 0; (markBit < 32) && marksMasked; markBit++) { + if ((marksMasked & 1) && (vsDraw.markers[markBit].markType != SC_MARK_EMPTY)) { + SimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back.allocated, vsDraw.markers[markBit].alpha); + } + marksMasked >>= 1; + } + } + } +} + +void Editor::DrawBlockCaret(Surface *surface, ViewStyle &vsDraw, LineLayout *ll, int subLine, + int xStart, int offset, int posCaret, PRectangle rcCaret, ColourAllocated caretColour) { + + int lineStart = ll->LineStart(subLine); + int posBefore = posCaret; + int posAfter = MovePositionOutsideChar(posCaret + 1, 1); + int numCharsToDraw = posAfter - posCaret; + + // Work out where the starting and ending offsets are. We need to + // see if the previous character shares horizontal space, such as a + // glyph / combining character. If so we'll need to draw that too. + int offsetFirstChar = offset; + int offsetLastChar = offset + (posAfter - posCaret); + while ((offsetLastChar - numCharsToDraw) >= lineStart) { + if ((ll->positions[offsetLastChar] - ll->positions[offsetLastChar - numCharsToDraw]) > 0) { + // The char does not share horizontal space + break; + } + // Char shares horizontal space, update the numChars to draw + // Update posBefore to point to the prev char + posBefore = MovePositionOutsideChar(posBefore - 1, -1); + numCharsToDraw = posAfter - posBefore; + offsetFirstChar = offset - (posCaret - posBefore); + } + + // See if the next character shares horizontal space, if so we'll + // need to draw that too. + numCharsToDraw = offsetLastChar - offsetFirstChar; + while ((offsetLastChar < ll->LineStart(subLine + 1)) && (offsetLastChar <= ll->numCharsInLine)) { + // Update posAfter to point to the 2nd next char, this is where + // the next character ends, and 2nd next begins. We'll need + // to compare these two + posBefore = posAfter; + posAfter = MovePositionOutsideChar(posAfter + 1, 1); + offsetLastChar = offset + (posAfter - posCaret); + if ((ll->positions[offsetLastChar] - ll->positions[offsetLastChar - (posAfter - posBefore)]) > 0) { + // The char does not share horizontal space + break; + } + // Char shares horizontal space, update the numChars to draw + numCharsToDraw = offsetLastChar - offsetFirstChar; + } + + // We now know what to draw, update the caret drawing rectangle + rcCaret.left = ll->positions[offsetFirstChar] - ll->positions[lineStart] + xStart; + rcCaret.right = ll->positions[offsetFirstChar+numCharsToDraw] - ll->positions[lineStart] + xStart; + + // Adjust caret position to take into account any word wrapping symbols. + if ((ll->wrapIndent != 0) && (lineStart != 0)) { + int wordWrapCharWidth = ll->wrapIndent; + rcCaret.left += wordWrapCharWidth; + rcCaret.right += wordWrapCharWidth; + } + + // This character is where the caret block is, we override the colours + // (inversed) for drawing the caret here. + int styleMain = ll->styles[offsetFirstChar]; + surface->DrawTextClipped(rcCaret, vsDraw.styles[styleMain].font, + rcCaret.top + vsDraw.maxAscent, ll->chars + offsetFirstChar, + numCharsToDraw, vsDraw.styles[styleMain].back.allocated, + caretColour); +} + +void Editor::RefreshPixMaps(Surface *surfaceWindow) { + if (!pixmapSelPattern->Initialised()) { + const int patternSize = 8; + pixmapSelPattern->InitPixMap(patternSize, patternSize, surfaceWindow, wMain.GetID()); + // This complex procedure is to reproduce the checkerboard dithered pattern used by windows + // for scroll bars and Visual Studio for its selection margin. The colour of this pattern is half + // way between the chrome colour and the chrome highlight colour making a nice transition + // between the window chrome and the content area. And it works in low colour depths. + PRectangle rcPattern(0, 0, patternSize, patternSize); + + // Initialize default colours based on the chrome colour scheme. Typically the highlight is white. + ColourAllocated colourFMFill = vs.selbar.allocated; + ColourAllocated colourFMStripes = vs.selbarlight.allocated; + + if (!(vs.selbarlight.desired == ColourDesired(0xff, 0xff, 0xff))) { + // User has chosen an unusual chrome colour scheme so just use the highlight edge colour. + // (Typically, the highlight colour is white.) + colourFMFill = vs.selbarlight.allocated; + } + + if (vs.foldmarginColourSet) { + // override default fold margin colour + colourFMFill = vs.foldmarginColour.allocated; + } + if (vs.foldmarginHighlightColourSet) { + // override default fold margin highlight colour + colourFMStripes = vs.foldmarginHighlightColour.allocated; + } + + pixmapSelPattern->FillRectangle(rcPattern, colourFMFill); + pixmapSelPattern->PenColour(colourFMStripes); + for (int stripe = 0; stripe < patternSize; stripe++) { + // Alternating 1 pixel stripes is same as checkerboard. + pixmapSelPattern->MoveTo(0, stripe * 2); + pixmapSelPattern->LineTo(patternSize, stripe * 2 - patternSize); + } + } + + if (!pixmapIndentGuide->Initialised()) { + // 1 extra pixel in height so can handle odd/even positions and so produce a continuous line + pixmapIndentGuide->InitPixMap(1, vs.lineHeight + 1, surfaceWindow, wMain.GetID()); + pixmapIndentGuideHighlight->InitPixMap(1, vs.lineHeight + 1, surfaceWindow, wMain.GetID()); + PRectangle rcIG(0, 0, 1, vs.lineHeight); + pixmapIndentGuide->FillRectangle(rcIG, vs.styles[STYLE_INDENTGUIDE].back.allocated); + pixmapIndentGuide->PenColour(vs.styles[STYLE_INDENTGUIDE].fore.allocated); + pixmapIndentGuideHighlight->FillRectangle(rcIG, vs.styles[STYLE_BRACELIGHT].back.allocated); + pixmapIndentGuideHighlight->PenColour(vs.styles[STYLE_BRACELIGHT].fore.allocated); + for (int stripe = 1; stripe < vs.lineHeight + 1; stripe += 2) { + pixmapIndentGuide->MoveTo(0, stripe); + pixmapIndentGuide->LineTo(2, stripe); + pixmapIndentGuideHighlight->MoveTo(0, stripe); + pixmapIndentGuideHighlight->LineTo(2, stripe); + } + } + + if (bufferedDraw) { + if (!pixmapLine->Initialised()) { + PRectangle rcClient = GetClientRectangle(); + pixmapLine->InitPixMap(rcClient.Width(), vs.lineHeight, + surfaceWindow, wMain.GetID()); + pixmapSelMargin->InitPixMap(vs.fixedColumnWidth, + rcClient.Height(), surfaceWindow, wMain.GetID()); + } + } +} + +void Editor::DrawCarets(Surface *surface, ViewStyle &vsDraw, int lineDoc, int xStart, + PRectangle rcLine, LineLayout *ll, int subLine) { + // When drag is active it is the only caret drawn + bool drawDrag = posDrag.IsValid(); + if (hideSelection && !drawDrag) + return; + const int posLineStart = pdoc->LineStart(lineDoc); + // For each selection draw + for (size_t r=0; (r(vsDraw.styles[ll->EndLineStyle()].spaceWidth); + const int virtualOffset = posCaret.VirtualSpace() * spaceWidth; + if (ll->InLine(offset, subLine) && offset <= ll->numCharsBeforeEOL) { + int xposCaret = ll->positions[offset] + virtualOffset - ll->positions[ll->LineStart(subLine)]; + if (ll->wrapIndent != 0) { + int lineStart = ll->LineStart(subLine); + if (lineStart != 0) // Wrapped + xposCaret += ll->wrapIndent; + } + bool caretBlinkState = (caret.active && caret.on) || (!additionalCaretsBlink && !mainCaret); + bool caretVisibleState = additionalCaretsVisible || mainCaret; + if ((xposCaret >= 0) && (vsDraw.caretWidth > 0) && (vsDraw.caretStyle != CARETSTYLE_INVISIBLE) && + ((posDrag.IsValid()) || (caretBlinkState && caretVisibleState))) { + bool caretAtEOF = false; + bool caretAtEOL = false; + bool drawBlockCaret = false; + int widthOverstrikeCaret; + int caretWidthOffset = 0; + PRectangle rcCaret = rcLine; + + if (posCaret.Position() == pdoc->Length()) { // At end of document + caretAtEOF = true; + widthOverstrikeCaret = vsDraw.aveCharWidth; + } else if ((posCaret.Position() - posLineStart) >= ll->numCharsInLine) { // At end of line + caretAtEOL = true; + widthOverstrikeCaret = vsDraw.aveCharWidth; + } else { + widthOverstrikeCaret = ll->positions[offset + 1] - ll->positions[offset]; + } + if (widthOverstrikeCaret < 3) // Make sure its visible + widthOverstrikeCaret = 3; + + if (xposCaret > 0) + caretWidthOffset = 1; // Move back so overlaps both character cells. + xposCaret += xStart; + if (posDrag.IsValid()) { + /* Dragging text, use a line caret */ + rcCaret.left = xposCaret - caretWidthOffset; + rcCaret.right = rcCaret.left + vsDraw.caretWidth; + } else if (inOverstrike) { + /* Overstrike (insert mode), use a modified bar caret */ + rcCaret.top = rcCaret.bottom - 2; + rcCaret.left = xposCaret + 1; + rcCaret.right = rcCaret.left + widthOverstrikeCaret - 1; + } else if (vsDraw.caretStyle == CARETSTYLE_BLOCK) { + /* Block caret */ + rcCaret.left = xposCaret; + if (!caretAtEOL && !caretAtEOF && (ll->chars[offset] != '\t') && !(IsControlCharacter(ll->chars[offset]))) { + drawBlockCaret = true; + rcCaret.right = xposCaret + widthOverstrikeCaret; + } else { + rcCaret.right = xposCaret + vsDraw.aveCharWidth; + } + } else { + /* Line caret */ + rcCaret.left = xposCaret - caretWidthOffset; + rcCaret.right = rcCaret.left + vsDraw.caretWidth; + } + ColourAllocated caretColour = mainCaret ? vsDraw.caretcolour.allocated : vsDraw.additionalCaretColour.allocated; + if (drawBlockCaret) { + DrawBlockCaret(surface, vsDraw, ll, subLine, xStart, offset, posCaret.Position(), rcCaret, caretColour); + } else { + surface->FillRectangle(rcCaret, caretColour); + } + } + } + if (drawDrag) + break; + } +} + +void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) { + //Platform::DebugPrintf("Paint:%1d (%3d,%3d) ... (%3d,%3d)\n", + // paintingAllText, rcArea.left, rcArea.top, rcArea.right, rcArea.bottom); + + StyleToPositionInView(PositionAfterArea(rcArea)); + + pixmapLine->Release(); + RefreshStyleData(); + RefreshPixMaps(surfaceWindow); + + PRectangle rcClient = GetClientRectangle(); + //Platform::DebugPrintf("Client: (%3d,%3d) ... (%3d,%3d) %d\n", + // rcClient.left, rcClient.top, rcClient.right, rcClient.bottom); + + surfaceWindow->SetPalette(&palette, true); + pixmapLine->SetPalette(&palette, !hasFocus); + + int screenLinePaintFirst = rcArea.top / vs.lineHeight; + + int xStart = vs.fixedColumnWidth - xOffset; + int ypos = 0; + if (!bufferedDraw) + ypos += screenLinePaintFirst * vs.lineHeight; + int yposScreen = screenLinePaintFirst * vs.lineHeight; + + bool paintAbandonedByStyling = paintState == paintAbandoned; + if (needUpdateUI) { + // Deselect palette by selecting a temporary palette + Palette palTemp; + surfaceWindow->SetPalette(&palTemp, true); + + NotifyUpdateUI(); + needUpdateUI = false; + + RefreshStyleData(); + RefreshPixMaps(surfaceWindow); + surfaceWindow->SetPalette(&palette, true); + pixmapLine->SetPalette(&palette, !hasFocus); + } + + // Call priority lines wrap on a window of lines which are likely + // to rendered with the following paint (that is wrap the visible + // lines first). + int startLineToWrap = cs.DocFromDisplay(topLine) - 5; + if (startLineToWrap < 0) + startLineToWrap = 0; + if (WrapLines(false, startLineToWrap)) { + // The wrapping process has changed the height of some lines so + // abandon this paint for a complete repaint. + if (AbandonPaint()) { + return; + } + RefreshPixMaps(surfaceWindow); // In case pixmaps invalidated by scrollbar change + } + PLATFORM_ASSERT(pixmapSelPattern->Initialised()); + + if (paintState != paintAbandoned) { + PaintSelMargin(surfaceWindow, rcArea); + + PRectangle rcRightMargin = rcClient; + rcRightMargin.left = rcRightMargin.right - vs.rightMarginWidth; + if (rcArea.Intersects(rcRightMargin)) { + surfaceWindow->FillRectangle(rcRightMargin, vs.styles[STYLE_DEFAULT].back.allocated); + } + } + + if (paintState == paintAbandoned) { + // Either styling or NotifyUpdateUI noticed that painting is needed + // outside the current painting rectangle + //Platform::DebugPrintf("Abandoning paint\n"); + if (wrapState != eWrapNone) { + if (paintAbandonedByStyling) { + // Styling has spilled over a line end, such as occurs by starting a multiline + // comment. The width of subsequent text may have changed, so rewrap. + NeedWrapping(cs.DocFromDisplay(topLine)); + } + } + return; + } + //Platform::DebugPrintf("start display %d, offset = %d\n", pdoc->Length(), xOffset); + + // Do the painting + if (rcArea.right > vs.fixedColumnWidth) { + + Surface *surface = surfaceWindow; + if (bufferedDraw) { + surface = pixmapLine; + PLATFORM_ASSERT(pixmapLine->Initialised()); + } + surface->SetUnicodeMode(IsUnicodeMode()); + surface->SetDBCSMode(CodePage()); + + int visibleLine = topLine + screenLinePaintFirst; + + SelectionPosition posCaret = sel.RangeMain().caret; + if (posDrag.IsValid()) + posCaret = posDrag; + int lineCaret = pdoc->LineFromPosition(posCaret.Position()); + + // Remove selection margin from drawing area so text will not be drawn + // on it in unbuffered mode. + PRectangle rcTextArea = rcClient; + rcTextArea.left = vs.fixedColumnWidth; + rcTextArea.right -= vs.rightMarginWidth; + surfaceWindow->SetClip(rcTextArea); + + // Loop on visible lines + //double durLayout = 0.0; + //double durPaint = 0.0; + //double durCopy = 0.0; + //ElapsedTime etWhole; + int lineDocPrevious = -1; // Used to avoid laying out one document line multiple times + AutoLineLayout ll(llc, 0); + while (visibleLine < cs.LinesDisplayed() && yposScreen < rcArea.bottom) { + + int lineDoc = cs.DocFromDisplay(visibleLine); + // Only visible lines should be handled by the code within the loop + PLATFORM_ASSERT(cs.GetVisible(lineDoc)); + int lineStartSet = cs.DisplayFromDoc(lineDoc); + int subLine = visibleLine - lineStartSet; + + // Copy this line and its styles from the document into local arrays + // and determine the x position at which each character starts. + //ElapsedTime et; + if (lineDoc != lineDocPrevious) { + ll.Set(0); + ll.Set(RetrieveLineLayout(lineDoc)); + LayoutLine(lineDoc, surface, vs, ll, wrapWidth); + lineDocPrevious = lineDoc; + } + //durLayout += et.Duration(true); + + if (ll) { + ll->containsCaret = lineDoc == lineCaret; + if (hideSelection) { + ll->containsCaret = false; + } + + GetHotSpotRange(ll->hsStart, ll->hsEnd); + + PRectangle rcLine = rcClient; + rcLine.top = ypos; + rcLine.bottom = ypos + vs.lineHeight; + + Range rangeLine(pdoc->LineStart(lineDoc), pdoc->LineStart(lineDoc + 1)); + // Highlight the current braces if any + ll->SetBracesHighlight(rangeLine, braces, static_cast(bracesMatchStyle), + highlightGuideColumn * vs.spaceWidth); + + // Draw the line + DrawLine(surface, vs, lineDoc, visibleLine, xStart, rcLine, ll, subLine); + //durPaint += et.Duration(true); + + // Restore the previous styles for the brace highlights in case layout is in cache. + ll->RestoreBracesHighlight(rangeLine, braces); + + bool expanded = cs.GetExpanded(lineDoc); + // Paint the line above the fold + if ((expanded && (foldFlags & SC_FOLDFLAG_LINEBEFORE_EXPANDED)) + || + (!expanded && (foldFlags & SC_FOLDFLAG_LINEBEFORE_CONTRACTED))) { + if (pdoc->GetLevel(lineDoc) & SC_FOLDLEVELHEADERFLAG) { + PRectangle rcFoldLine = rcLine; + rcFoldLine.bottom = rcFoldLine.top + 1; + surface->FillRectangle(rcFoldLine, vs.styles[STYLE_DEFAULT].fore.allocated); + } + } + // Paint the line below the fold + if ((expanded && (foldFlags & SC_FOLDFLAG_LINEAFTER_EXPANDED)) + || + (!expanded && (foldFlags & SC_FOLDFLAG_LINEAFTER_CONTRACTED))) { + if (pdoc->GetLevel(lineDoc) & SC_FOLDLEVELHEADERFLAG) { + PRectangle rcFoldLine = rcLine; + rcFoldLine.top = rcFoldLine.bottom - 1; + surface->FillRectangle(rcFoldLine, vs.styles[STYLE_DEFAULT].fore.allocated); + } + } + + DrawCarets(surface, vs, lineDoc, xStart, rcLine, ll, subLine); + + if (bufferedDraw) { + Point from(vs.fixedColumnWidth, 0); + PRectangle rcCopyArea(vs.fixedColumnWidth, yposScreen, + rcClient.right, yposScreen + vs.lineHeight); + surfaceWindow->Copy(rcCopyArea, from, *pixmapLine); + } + + lineWidthMaxSeen = Platform::Maximum( + lineWidthMaxSeen, ll->positions[ll->numCharsInLine]); + //durCopy += et.Duration(true); + } + + if (!bufferedDraw) { + ypos += vs.lineHeight; + } + + yposScreen += vs.lineHeight; + visibleLine++; + + //gdk_flush(); + } + ll.Set(0); + //if (durPaint < 0.00000001) + // durPaint = 0.00000001; + + // Right column limit indicator + PRectangle rcBeyondEOF = rcClient; + rcBeyondEOF.left = vs.fixedColumnWidth; + rcBeyondEOF.right = rcBeyondEOF.right; + rcBeyondEOF.top = (cs.LinesDisplayed() - topLine) * vs.lineHeight; + if (rcBeyondEOF.top < rcBeyondEOF.bottom) { + surfaceWindow->FillRectangle(rcBeyondEOF, vs.styles[STYLE_DEFAULT].back.allocated); + if (vs.edgeState == EDGE_LINE) { + int edgeX = theEdge * vs.spaceWidth; + rcBeyondEOF.left = edgeX + xStart; + rcBeyondEOF.right = rcBeyondEOF.left + 1; + surfaceWindow->FillRectangle(rcBeyondEOF, vs.edgecolour.allocated); + } + } + //Platform::DebugPrintf( + //"Layout:%9.6g Paint:%9.6g Ratio:%9.6g Copy:%9.6g Total:%9.6g\n", + //durLayout, durPaint, durLayout / durPaint, durCopy, etWhole.Duration()); + NotifyPainted(); + } +} + +// Space (3 space characters) between line numbers and text when printing. +#define lineNumberPrintSpace " " + +ColourDesired InvertedLight(ColourDesired orig) { + unsigned int r = orig.GetRed(); + unsigned int g = orig.GetGreen(); + unsigned int b = orig.GetBlue(); + unsigned int l = (r + g + b) / 3; // There is a better calculation for this that matches human eye + unsigned int il = 0xff - l; + if (l == 0) + return ColourDesired(0xff, 0xff, 0xff); + r = r * il / l; + g = g * il / l; + b = b * il / l; + return ColourDesired(Platform::Minimum(r, 0xff), Platform::Minimum(g, 0xff), Platform::Minimum(b, 0xff)); +} + +// This is mostly copied from the Paint method but with some things omitted +// such as the margin markers, line numbers, selection and caret +// Should be merged back into a combined Draw method. +long Editor::FormatRange(bool draw, Sci_RangeToFormat *pfr) { + if (!pfr) + return 0; + + AutoSurface surface(pfr->hdc, this); + if (!surface) + return 0; + AutoSurface surfaceMeasure(pfr->hdcTarget, this); + if (!surfaceMeasure) { + return 0; + } + + // Can't use measurements cached for screen + posCache.Clear(); + + ViewStyle vsPrint(vs); + + // Modify the view style for printing as do not normally want any of the transient features to be printed + // Printing supports only the line number margin. + int lineNumberIndex = -1; + for (int margin = 0; margin < ViewStyle::margins; margin++) { + if ((vsPrint.ms[margin].style == SC_MARGIN_NUMBER) && (vsPrint.ms[margin].width > 0)) { + lineNumberIndex = margin; + } else { + vsPrint.ms[margin].width = 0; + } + } + vsPrint.showMarkedLines = false; + vsPrint.fixedColumnWidth = 0; + vsPrint.zoomLevel = printMagnification; + vsPrint.viewIndentationGuides = ivNone; + // Don't show the selection when printing + vsPrint.selbackset = false; + vsPrint.selforeset = false; + vsPrint.selAlpha = SC_ALPHA_NOALPHA; + vsPrint.selAdditionalAlpha = SC_ALPHA_NOALPHA; + vsPrint.whitespaceBackgroundSet = false; + vsPrint.whitespaceForegroundSet = false; + vsPrint.showCaretLineBackground = false; + + // Set colours for printing according to users settings + for (size_t sty = 0;sty < vsPrint.stylesSize;sty++) { + if (printColourMode == SC_PRINT_INVERTLIGHT) { + vsPrint.styles[sty].fore.desired = InvertedLight(vsPrint.styles[sty].fore.desired); + vsPrint.styles[sty].back.desired = InvertedLight(vsPrint.styles[sty].back.desired); + } else if (printColourMode == SC_PRINT_BLACKONWHITE) { + vsPrint.styles[sty].fore.desired = ColourDesired(0, 0, 0); + vsPrint.styles[sty].back.desired = ColourDesired(0xff, 0xff, 0xff); + } else if (printColourMode == SC_PRINT_COLOURONWHITE) { + vsPrint.styles[sty].back.desired = ColourDesired(0xff, 0xff, 0xff); + } else if (printColourMode == SC_PRINT_COLOURONWHITEDEFAULTBG) { + if (sty <= STYLE_DEFAULT) { + vsPrint.styles[sty].back.desired = ColourDesired(0xff, 0xff, 0xff); + } + } + } + // White background for the line numbers + vsPrint.styles[STYLE_LINENUMBER].back.desired = ColourDesired(0xff, 0xff, 0xff); + + vsPrint.Refresh(*surfaceMeasure); + // Determining width must hapen after fonts have been realised in Refresh + int lineNumberWidth = 0; + if (lineNumberIndex >= 0) { + lineNumberWidth = surfaceMeasure->WidthText(vsPrint.styles[STYLE_LINENUMBER].font, + "99999" lineNumberPrintSpace, 5 + istrlen(lineNumberPrintSpace)); + vsPrint.ms[lineNumberIndex].width = lineNumberWidth; + vsPrint.Refresh(*surfaceMeasure); // Recalculate fixedColumnWidth + } + // Ensure colours are set up + vsPrint.RefreshColourPalette(palette, true); + vsPrint.RefreshColourPalette(palette, false); + + int linePrintStart = pdoc->LineFromPosition(pfr->chrg.cpMin); + int linePrintLast = linePrintStart + (pfr->rc.bottom - pfr->rc.top) / vsPrint.lineHeight - 1; + if (linePrintLast < linePrintStart) + linePrintLast = linePrintStart; + int linePrintMax = pdoc->LineFromPosition(pfr->chrg.cpMax); + if (linePrintLast > linePrintMax) + linePrintLast = linePrintMax; + //Platform::DebugPrintf("Formatting lines=[%0d,%0d,%0d] top=%0d bottom=%0d line=%0d %0d\n", + // linePrintStart, linePrintLast, linePrintMax, pfr->rc.top, pfr->rc.bottom, vsPrint.lineHeight, + // surfaceMeasure->Height(vsPrint.styles[STYLE_LINENUMBER].font)); + int endPosPrint = pdoc->Length(); + if (linePrintLast < pdoc->LinesTotal()) + endPosPrint = pdoc->LineStart(linePrintLast + 1); + + // Ensure we are styled to where we are formatting. + pdoc->EnsureStyledTo(endPosPrint); + + int xStart = vsPrint.fixedColumnWidth + pfr->rc.left; + int ypos = pfr->rc.top; + + int lineDoc = linePrintStart; + + int nPrintPos = pfr->chrg.cpMin; + int visibleLine = 0; + int widthPrint = pfr->rc.right - pfr->rc.left - vsPrint.fixedColumnWidth; + if (printWrapState == eWrapNone) + widthPrint = LineLayout::wrapWidthInfinite; + + while (lineDoc <= linePrintLast && ypos < pfr->rc.bottom) { + + // When printing, the hdc and hdcTarget may be the same, so + // changing the state of surfaceMeasure may change the underlying + // state of surface. Therefore, any cached state is discarded before + // using each surface. + surfaceMeasure->FlushCachedState(); + + // Copy this line and its styles from the document into local arrays + // and determine the x position at which each character starts. + LineLayout ll(8000); + LayoutLine(lineDoc, surfaceMeasure, vsPrint, &ll, widthPrint); + + ll.containsCaret = false; + + PRectangle rcLine; + rcLine.left = pfr->rc.left; + rcLine.top = ypos; + rcLine.right = pfr->rc.right - 1; + rcLine.bottom = ypos + vsPrint.lineHeight; + + // When document line is wrapped over multiple display lines, find where + // to start printing from to ensure a particular position is on the first + // line of the page. + if (visibleLine == 0) { + int startWithinLine = nPrintPos - pdoc->LineStart(lineDoc); + for (int iwl = 0; iwl < ll.lines - 1; iwl++) { + if (ll.LineStart(iwl) <= startWithinLine && ll.LineStart(iwl + 1) >= startWithinLine) { + visibleLine = -iwl; + } + } + + if (ll.lines > 1 && startWithinLine >= ll.LineStart(ll.lines - 1)) { + visibleLine = -(ll.lines - 1); + } + } + + if (draw && lineNumberWidth && + (ypos + vsPrint.lineHeight <= pfr->rc.bottom) && + (visibleLine >= 0)) { + char number[100]; + sprintf(number, "%d" lineNumberPrintSpace, lineDoc + 1); + PRectangle rcNumber = rcLine; + rcNumber.right = rcNumber.left + lineNumberWidth; + // Right justify + rcNumber.left = rcNumber.right - surfaceMeasure->WidthText( + vsPrint.styles[STYLE_LINENUMBER].font, number, istrlen(number)); + surface->FlushCachedState(); + surface->DrawTextNoClip(rcNumber, vsPrint.styles[STYLE_LINENUMBER].font, + ypos + vsPrint.maxAscent, number, istrlen(number), + vsPrint.styles[STYLE_LINENUMBER].fore.allocated, + vsPrint.styles[STYLE_LINENUMBER].back.allocated); + } + + // Draw the line + surface->FlushCachedState(); + + for (int iwl = 0; iwl < ll.lines; iwl++) { + if (ypos + vsPrint.lineHeight <= pfr->rc.bottom) { + if (visibleLine >= 0) { + if (draw) { + rcLine.top = ypos; + rcLine.bottom = ypos + vsPrint.lineHeight; + DrawLine(surface, vsPrint, lineDoc, visibleLine, xStart, rcLine, &ll, iwl); + } + ypos += vsPrint.lineHeight; + } + visibleLine++; + if (iwl == ll.lines - 1) + nPrintPos = pdoc->LineStart(lineDoc + 1); + else + nPrintPos += ll.LineStart(iwl + 1) - ll.LineStart(iwl); + } + } + + ++lineDoc; + } + + // Clear cache so measurements are not used for screen + posCache.Clear(); + + return nPrintPos; +} + +int Editor::TextWidth(int style, const char *text) { + RefreshStyleData(); + AutoSurface surface(this); + if (surface) { + return surface->WidthText(vs.styles[style].font, text, istrlen(text)); + } else { + return 1; + } +} + +// Empty method is overridden on GTK+ to show / hide scrollbars +void Editor::ReconfigureScrollBars() {} + +void Editor::SetScrollBars() { + RefreshStyleData(); + + int nMax = MaxScrollPos(); + int nPage = LinesOnScreen(); + bool modified = ModifyScrollBars(nMax + nPage - 1, nPage); + if (modified) { + DwellEnd(true); + } + + // TODO: ensure always showing as many lines as possible + // May not be, if, for example, window made larger + if (topLine > MaxScrollPos()) { + SetTopLine(Platform::Clamp(topLine, 0, MaxScrollPos())); + SetVerticalScrollPos(); + Redraw(); + } + if (modified) { + if (!AbandonPaint()) + Redraw(); + } + //Platform::DebugPrintf("end max = %d page = %d\n", nMax, nPage); +} + +void Editor::ChangeSize() { + DropGraphics(); + SetScrollBars(); + if (wrapState != eWrapNone) { + PRectangle rcTextArea = GetClientRectangle(); + rcTextArea.left = vs.fixedColumnWidth; + rcTextArea.right -= vs.rightMarginWidth; + if (wrapWidth != rcTextArea.Width()) { + NeedWrapping(); + Redraw(); + } + } +} + +int Editor::InsertSpace(int position, unsigned int spaces) { + if (spaces > 0) { + std::string spaceText(spaces, ' '); + pdoc->InsertString(position, spaceText.c_str(), spaces); + position += spaces; + } + return position; +} + +void Editor::AddChar(char ch) { + char s[2]; + s[0] = ch; + s[1] = '\0'; + AddCharUTF(s, 1); +} + +void Editor::FilterSelections() { + if (!additionalSelectionTyping && (sel.Count() > 1)) { + SelectionRange rangeOnly = sel.RangeMain(); + InvalidateSelection(rangeOnly, true); + sel.SetSelection(rangeOnly); + } +} + +// AddCharUTF inserts an array of bytes which may or may not be in UTF-8. +void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) { + FilterSelections(); + { + UndoGroup ug(pdoc, (sel.Count() > 1) || !sel.Empty() || inOverstrike); + for (size_t r=0; rDeleteChars(positionInsert, sel.Range(r).Length()); + sel.Range(r).ClearVirtualSpace(); + } else { + // Range is all virtual so collapse to start of virtual space + sel.Range(r).MinimizeVirtualSpace(); + } + } else if (inOverstrike) { + if (positionInsert < pdoc->Length()) { + if (!IsEOLChar(pdoc->CharAt(positionInsert))) { + pdoc->DelChar(positionInsert); + sel.Range(r).ClearVirtualSpace(); + } + } + } + positionInsert = InsertSpace(positionInsert, sel.Range(r).caret.VirtualSpace()); + if (pdoc->InsertString(positionInsert, s, len)) { + sel.Range(r).caret.SetPosition(positionInsert + len); + sel.Range(r).anchor.SetPosition(positionInsert + len); + } + sel.Range(r).ClearVirtualSpace(); + // If in wrap mode rewrap current line so EnsureCaretVisible has accurate information + if (wrapState != eWrapNone) { + AutoSurface surface(this); + if (surface) { + if (WrapOneLine(surface, pdoc->LineFromPosition(positionInsert))) { + SetScrollBars(); + SetVerticalScrollPos(); + Redraw(); + } + } + } + } + } + } + if (wrapState != eWrapNone) { + SetScrollBars(); + } + ThinRectangularRange(); + // If in wrap mode rewrap current line so EnsureCaretVisible has accurate information + EnsureCaretVisible(); + // Avoid blinking during rapid typing: + ShowCaretAtCurrentPosition(); + if (!caretSticky) { + SetLastXChosen(); + } + + if (treatAsDBCS) { + NotifyChar((static_cast(s[0]) << 8) | + static_cast(s[1])); + } else { + int byte = static_cast(s[0]); + if ((byte < 0xC0) || (1 == len)) { + // Handles UTF-8 characters between 0x01 and 0x7F and single byte + // characters when not in UTF-8 mode. + // Also treats \0 and naked trail bytes 0x80 to 0xBF as valid + // characters representing themselves. + } else { + // Unroll 1 to 3 byte UTF-8 sequences. See reference data at: + // http://www.cl.cam.ac.uk/~mgk25/unicode.html + // http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt + if (byte < 0xE0) { + int byte2 = static_cast(s[1]); + if ((byte2 & 0xC0) == 0x80) { + // Two-byte-character lead-byte followed by a trail-byte. + byte = (((byte & 0x1F) << 6) | (byte2 & 0x3F)); + } + // A two-byte-character lead-byte not followed by trail-byte + // represents itself. + } else if (byte < 0xF0) { + int byte2 = static_cast(s[1]); + int byte3 = static_cast(s[2]); + if (((byte2 & 0xC0) == 0x80) && ((byte3 & 0xC0) == 0x80)) { + // Three-byte-character lead byte followed by two trail bytes. + byte = (((byte & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | + (byte3 & 0x3F)); + } + // A three-byte-character lead-byte not followed by two trail-bytes + // represents itself. + } + } + NotifyChar(byte); + } + + if (recordingMacro) { + NotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast(s)); + } +} + +void Editor::InsertPaste(SelectionPosition selStart, const char *text, int len) { + if (multiPasteMode == SC_MULTIPASTE_ONCE) { + selStart = SelectionPosition(InsertSpace(selStart.Position(), selStart.VirtualSpace())); + if (pdoc->InsertString(selStart.Position(), text, len)) { + SetEmptySelection(selStart.Position() + len); + } + } else { + // SC_MULTIPASTE_EACH + for (size_t r=0; rDeleteChars(positionInsert, sel.Range(r).Length()); + sel.Range(r).ClearVirtualSpace(); + } else { + // Range is all virtual so collapse to start of virtual space + sel.Range(r).MinimizeVirtualSpace(); + } + } + positionInsert = InsertSpace(positionInsert, sel.Range(r).caret.VirtualSpace()); + if (pdoc->InsertString(positionInsert, text, len)) { + sel.Range(r).caret.SetPosition(positionInsert + len); + sel.Range(r).anchor.SetPosition(positionInsert + len); + } + sel.Range(r).ClearVirtualSpace(); + } + } + } +} + +void Editor::ClearSelection() { + if (!sel.IsRectangular()) + FilterSelections(); + UndoGroup ug(pdoc); + for (size_t r=0; rDeleteChars(sel.Range(r).Start().Position(), + sel.Range(r).Length()); + sel.Range(r) = sel.Range(r).Start(); + } + } + } + ThinRectangularRange(); + sel.RemoveDuplicates(); + ClaimSelection(); +} + +void Editor::ClearAll() { + { + UndoGroup ug(pdoc); + if (0 != pdoc->Length()) { + pdoc->DeleteChars(0, pdoc->Length()); + } + if (!pdoc->IsReadOnly()) { + cs.Clear(); + pdoc->AnnotationClearAll(); + pdoc->MarginClearAll(); + } + } + sel.Clear(); + SetTopLine(0); + SetVerticalScrollPos(); + InvalidateStyleRedraw(); +} + +void Editor::ClearDocumentStyle() { + Decoration *deco = pdoc->decorations.root; + while (deco) { + // Save next in case deco deleted + Decoration *decoNext = deco->next; + if (deco->indicator < INDIC_CONTAINER) { + pdoc->decorations.SetCurrentIndicator(deco->indicator); + pdoc->DecorationFillRange(0, 0, pdoc->Length()); + } + deco = decoNext; + } + pdoc->StartStyling(0, '\377'); + pdoc->SetStyleFor(pdoc->Length(), 0); + cs.ShowAll(); + pdoc->ClearLevels(); +} + +void Editor::CopyAllowLine() { + SelectionText selectedText; + CopySelectionRange(&selectedText, true); + CopyToClipboard(selectedText); +} + +void Editor::Cut() { + pdoc->CheckReadOnly(); + if (!pdoc->IsReadOnly() && !SelectionContainsProtected()) { + Copy(); + ClearSelection(); + } +} + +void Editor::PasteRectangular(SelectionPosition pos, const char *ptr, int len) { + if (pdoc->IsReadOnly() || SelectionContainsProtected()) { + return; + } + sel.Clear(); + sel.RangeMain() = SelectionRange(pos); + int line = pdoc->LineFromPosition(sel.MainCaret()); + UndoGroup ug(pdoc); + sel.RangeMain().caret = SelectionPosition( + InsertSpace(sel.RangeMain().caret.Position(), sel.RangeMain().caret.VirtualSpace())); + int xInsert = XFromPosition(sel.RangeMain().caret); + bool prevCr = false; + while ((len > 0) && IsEOLChar(ptr[len-1])) + len--; + for (int i = 0; i < len; i++) { + if (IsEOLChar(ptr[i])) { + if ((ptr[i] == '\r') || (!prevCr)) + line++; + if (line >= pdoc->LinesTotal()) { + if (pdoc->eolMode != SC_EOL_LF) + pdoc->InsertChar(pdoc->Length(), '\r'); + if (pdoc->eolMode != SC_EOL_CR) + pdoc->InsertChar(pdoc->Length(), '\n'); + } + // Pad the end of lines with spaces if required + sel.RangeMain().caret.SetPosition(PositionFromLineX(line, xInsert)); + if ((XFromPosition(sel.MainCaret()) < xInsert) && (i + 1 < len)) { + while (XFromPosition(sel.MainCaret()) < xInsert) { + pdoc->InsertChar(sel.MainCaret(), ' '); + sel.RangeMain().caret.Add(1); + } + } + prevCr = ptr[i] == '\r'; + } else { + pdoc->InsertString(sel.MainCaret(), ptr + i, 1); + sel.RangeMain().caret.Add(1); + prevCr = false; + } + } + SetEmptySelection(pos); +} + +bool Editor::CanPaste() { + return !pdoc->IsReadOnly() && !SelectionContainsProtected(); +} + +void Editor::Clear() { + // If multiple selections, don't delete EOLS + if (sel.Empty()) { + UndoGroup ug(pdoc, sel.Count() > 1); + for (size_t r=0; rCharAt(sel.Range(r).caret.Position()))) { + pdoc->DelChar(sel.Range(r).caret.Position()); + sel.Range(r).ClearVirtualSpace(); + } // else multiple selection so don't eat line ends + } else { + sel.Range(r).ClearVirtualSpace(); + } + } + } else { + ClearSelection(); + } + sel.RemoveDuplicates(); +} + +void Editor::SelectAll() { + sel.Clear(); + SetSelection(0, pdoc->Length()); + Redraw(); +} + +void Editor::Undo() { + if (pdoc->CanUndo()) { + InvalidateCaret(); + int newPos = pdoc->Undo(); + if (newPos >= 0) + SetEmptySelection(newPos); + EnsureCaretVisible(); + } +} + +void Editor::Redo() { + if (pdoc->CanRedo()) { + int newPos = pdoc->Redo(); + if (newPos >= 0) + SetEmptySelection(newPos); + EnsureCaretVisible(); + } +} + +void Editor::DelChar() { + if (!RangeContainsProtected(sel.MainCaret(), sel.MainCaret() + 1)) { + pdoc->DelChar(sel.MainCaret()); + } + // Avoid blinking during rapid typing: + ShowCaretAtCurrentPosition(); +} + +void Editor::DelCharBack(bool allowLineStartDeletion) { + if (!sel.IsRectangular()) + FilterSelections(); + if (sel.IsRectangular()) + allowLineStartDeletion = false; + UndoGroup ug(pdoc, (sel.Count() > 1) || !sel.Empty()); + if (sel.Empty()) { + for (size_t r=0; rLineFromPosition(sel.Range(r).caret.Position()); + if (allowLineStartDeletion || (pdoc->LineStart(lineCurrentPos) != sel.Range(r).caret.Position())) { + if (pdoc->GetColumn(sel.Range(r).caret.Position()) <= pdoc->GetLineIndentation(lineCurrentPos) && + pdoc->GetColumn(sel.Range(r).caret.Position()) > 0 && pdoc->backspaceUnindents) { + UndoGroup ugInner(pdoc, !ug.Needed()); + int indentation = pdoc->GetLineIndentation(lineCurrentPos); + int indentationStep = pdoc->IndentSize(); + if (indentation % indentationStep == 0) { + pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep); + } else { + pdoc->SetLineIndentation(lineCurrentPos, indentation - (indentation % indentationStep)); + } + // SetEmptySelection + sel.Range(r) = SelectionRange(pdoc->GetLineIndentPosition(lineCurrentPos), + pdoc->GetLineIndentPosition(lineCurrentPos)); + } else { + pdoc->DelCharBack(sel.Range(r).caret.Position()); + } + } + } + } else { + sel.Range(r).ClearVirtualSpace(); + } + } + } else { + ClearSelection(); + } + sel.RemoveDuplicates(); + // Avoid blinking during rapid typing: + ShowCaretAtCurrentPosition(); +} + +void Editor::NotifyFocus(bool) {} + +void Editor::NotifyStyleToNeeded(int endStyleNeeded) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_STYLENEEDED; + scn.position = endStyleNeeded; + NotifyParent(scn); +} + +void Editor::NotifyStyleNeeded(Document*, void *, int endStyleNeeded) { + NotifyStyleToNeeded(endStyleNeeded); +} + +void Editor::NotifyChar(int ch) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_CHARADDED; + scn.ch = ch; + NotifyParent(scn); +} + +void Editor::NotifySavePoint(bool isSavePoint) { + SCNotification scn = {0}; + if (isSavePoint) { + scn.nmhdr.code = SCN_SAVEPOINTREACHED; + } else { + scn.nmhdr.code = SCN_SAVEPOINTLEFT; + } + NotifyParent(scn); +} + +void Editor::NotifyModifyAttempt() { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_MODIFYATTEMPTRO; + NotifyParent(scn); +} + +void Editor::NotifyDoubleClick(Point pt, bool shift, bool ctrl, bool alt) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_DOUBLECLICK; + scn.line = LineFromLocation(pt); + scn.position = PositionFromLocation(pt, true); + scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | + (alt ? SCI_ALT : 0); + NotifyParent(scn); +} + +void Editor::NotifyHotSpotDoubleClicked(int position, bool shift, bool ctrl, bool alt) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_HOTSPOTDOUBLECLICK; + scn.position = position; + scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | + (alt ? SCI_ALT : 0); + NotifyParent(scn); +} + +void Editor::NotifyHotSpotClicked(int position, bool shift, bool ctrl, bool alt) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_HOTSPOTCLICK; + scn.position = position; + scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | + (alt ? SCI_ALT : 0); + NotifyParent(scn); +} + +void Editor::NotifyUpdateUI() { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_UPDATEUI; + NotifyParent(scn); +} + +void Editor::NotifyPainted() { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_PAINTED; + NotifyParent(scn); +} + +void Editor::NotifyIndicatorClick(bool click, int position, bool shift, bool ctrl, bool alt) { + int mask = pdoc->decorations.AllOnFor(position); + if ((click && mask) || pdoc->decorations.clickNotified) { + SCNotification scn = {0}; + pdoc->decorations.clickNotified = click; + scn.nmhdr.code = click ? SCN_INDICATORCLICK : SCN_INDICATORRELEASE; + scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | (alt ? SCI_ALT : 0); + scn.position = position; + NotifyParent(scn); + } +} + +bool Editor::NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt) { + int marginClicked = -1; + int x = 0; + for (int margin = 0; margin < ViewStyle::margins; margin++) { + if ((pt.x > x) && (pt.x < x + vs.ms[margin].width)) + marginClicked = margin; + x += vs.ms[margin].width; + } + if ((marginClicked >= 0) && vs.ms[marginClicked].sensitive) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_MARGINCLICK; + scn.modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | + (alt ? SCI_ALT : 0); + scn.position = pdoc->LineStart(LineFromLocation(pt)); + scn.margin = marginClicked; + NotifyParent(scn); + return true; + } else { + return false; + } +} + +void Editor::NotifyNeedShown(int pos, int len) { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_NEEDSHOWN; + scn.position = pos; + scn.length = len; + NotifyParent(scn); +} + +void Editor::NotifyDwelling(Point pt, bool state) { + SCNotification scn = {0}; + scn.nmhdr.code = state ? SCN_DWELLSTART : SCN_DWELLEND; + scn.position = PositionFromLocation(pt, true); + scn.x = pt.x; + scn.y = pt.y; + NotifyParent(scn); +} + +void Editor::NotifyZoom() { + SCNotification scn = {0}; + scn.nmhdr.code = SCN_ZOOM; + NotifyParent(scn); +} + +// Notifications from document +void Editor::NotifyModifyAttempt(Document*, void *) { + //Platform::DebugPrintf("** Modify Attempt\n"); + NotifyModifyAttempt(); +} + +void Editor::NotifySavePoint(Document*, void *, bool atSavePoint) { + //Platform::DebugPrintf("** Save Point %s\n", atSavePoint ? "On" : "Off"); + NotifySavePoint(atSavePoint); +} + +void Editor::CheckModificationForWrap(DocModification mh) { + if (mh.modificationType & (SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT)) { + llc.Invalidate(LineLayout::llCheckTextAndStyle); + if (wrapState != eWrapNone) { + int lineDoc = pdoc->LineFromPosition(mh.position); + int lines = Platform::Maximum(0, mh.linesAdded); + NeedWrapping(lineDoc, lineDoc + lines + 1); + } + // Fix up annotation heights + int lineDoc = pdoc->LineFromPosition(mh.position); + int lines = Platform::Maximum(0, mh.linesAdded); + SetAnnotationHeights(lineDoc, lineDoc + lines + 2); + } +} + +// Move a position so it is still after the same character as before the insertion. +static inline int MovePositionForInsertion(int position, int startInsertion, int length) { + if (position > startInsertion) { + return position + length; + } + return position; +} + +// Move a position so it is still after the same character as before the deletion if that +// character is still present else after the previous surviving character. +static inline int MovePositionForDeletion(int position, int startDeletion, int length) { + if (position > startDeletion) { + int endDeletion = startDeletion + length; + if (position > endDeletion) { + return position - length; + } else { + return startDeletion; + } + } else { + return position; + } +} + +void Editor::NotifyModified(Document*, DocModification mh, void *) { + needUpdateUI = true; + if (paintState == painting) { + CheckForChangeOutsidePaint(Range(mh.position, mh.position + mh.length)); + } + if (mh.modificationType & SC_MOD_CHANGELINESTATE) { + if (paintState == painting) { + CheckForChangeOutsidePaint( + Range(pdoc->LineStart(mh.line), pdoc->LineStart(mh.line + 1))); + } else { + // Could check that change is before last visible line. + Redraw(); + } + } + if (mh.modificationType & (SC_MOD_CHANGESTYLE | SC_MOD_CHANGEINDICATOR)) { + if (mh.modificationType & SC_MOD_CHANGESTYLE) { + pdoc->IncrementStyleClock(); + } + if (paintState == notPainting) { + if (mh.position < pdoc->LineStart(topLine)) { + // Styling performed before this view + Redraw(); + } else { + InvalidateRange(mh.position, mh.position + mh.length); + } + } + if (mh.modificationType & SC_MOD_CHANGESTYLE) { + llc.Invalidate(LineLayout::llCheckTextAndStyle); + } + } else { + // Move selection and brace highlights + if (mh.modificationType & SC_MOD_INSERTTEXT) { + sel.MovePositions(true, mh.position, mh.length); + braces[0] = MovePositionForInsertion(braces[0], mh.position, mh.length); + braces[1] = MovePositionForInsertion(braces[1], mh.position, mh.length); + } else if (mh.modificationType & SC_MOD_DELETETEXT) { + sel.MovePositions(false, mh.position, mh.length); + braces[0] = MovePositionForDeletion(braces[0], mh.position, mh.length); + braces[1] = MovePositionForDeletion(braces[1], mh.position, mh.length); + } + if (cs.LinesDisplayed() < cs.LinesInDoc()) { + // Some lines are hidden so may need shown. + // TODO: check if the modified area is hidden. + if (mh.modificationType & SC_MOD_BEFOREINSERT) { + NotifyNeedShown(mh.position, 0); + } else if (mh.modificationType & SC_MOD_BEFOREDELETE) { + NotifyNeedShown(mh.position, mh.length); + } + } + if (mh.linesAdded != 0) { + // Update contraction state for inserted and removed lines + // lineOfPos should be calculated in context of state before modification, shouldn't it + int lineOfPos = pdoc->LineFromPosition(mh.position); + if (mh.linesAdded > 0) { + cs.InsertLines(lineOfPos, mh.linesAdded); + } else { + cs.DeleteLines(lineOfPos, -mh.linesAdded); + } + } + if (mh.modificationType & SC_MOD_CHANGEANNOTATION) { + int lineDoc = pdoc->LineFromPosition(mh.position); + if (vs.annotationVisible) { + cs.SetHeight(lineDoc, cs.GetHeight(lineDoc) + mh.annotationLinesAdded); + } + } + CheckModificationForWrap(mh); + if (mh.linesAdded != 0) { + // Avoid scrolling of display if change before current display + if (mh.position < posTopLine && !CanDeferToLastStep(mh)) { + int newTop = Platform::Clamp(topLine + mh.linesAdded, 0, MaxScrollPos()); + if (newTop != topLine) { + SetTopLine(newTop); + SetVerticalScrollPos(); + } + } + + //Platform::DebugPrintf("** %x Doc Changed\n", this); + // TODO: could invalidate from mh.startModification to end of screen + //InvalidateRange(mh.position, mh.position + mh.length); + if (paintState == notPainting && !CanDeferToLastStep(mh)) { + QueueStyling(pdoc->Length()); + Redraw(); + } + } else { + //Platform::DebugPrintf("** %x Line Changed %d .. %d\n", this, + // mh.position, mh.position + mh.length); + if (paintState == notPainting && mh.length && !CanEliminate(mh)) { + QueueStyling(mh.position + mh.length); + InvalidateRange(mh.position, mh.position + mh.length); + } + } + } + + if (mh.linesAdded != 0 && !CanDeferToLastStep(mh)) { + SetScrollBars(); + } + + if ((mh.modificationType & SC_MOD_CHANGEMARKER) || (mh.modificationType & SC_MOD_CHANGEMARGIN)) { + if ((paintState == notPainting) || !PaintContainsMargin()) { + if (mh.modificationType & SC_MOD_CHANGEFOLD) { + // Fold changes can affect the drawing of following lines so redraw whole margin + RedrawSelMargin(mh.line-1, true); + } else { + RedrawSelMargin(mh.line); + } + } + } + + // NOW pay the piper WRT "deferred" visual updates + if (IsLastStep(mh)) { + SetScrollBars(); + Redraw(); + } + + // If client wants to see this modification + if (mh.modificationType & modEventMask) { + if ((mh.modificationType & (SC_MOD_CHANGESTYLE | SC_MOD_CHANGEINDICATOR)) == 0) { + // Real modification made to text of document. + NotifyChange(); // Send EN_CHANGE + } + + SCNotification scn = {0}; + scn.nmhdr.code = SCN_MODIFIED; + scn.position = mh.position; + scn.modificationType = mh.modificationType; + scn.text = mh.text; + scn.length = mh.length; + scn.linesAdded = mh.linesAdded; + scn.line = mh.line; + scn.foldLevelNow = mh.foldLevelNow; + scn.foldLevelPrev = mh.foldLevelPrev; + scn.token = mh.token; + scn.annotationLinesAdded = mh.annotationLinesAdded; + NotifyParent(scn); + } +} + +void Editor::NotifyDeleted(Document *, void *) { + /* Do nothing */ +} + +void Editor::NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { + + // Enumerates all macroable messages + switch (iMessage) { + case SCI_CUT: + case SCI_COPY: + case SCI_PASTE: + case SCI_CLEAR: + case SCI_REPLACESEL: + case SCI_ADDTEXT: + case SCI_INSERTTEXT: + case SCI_APPENDTEXT: + case SCI_CLEARALL: + case SCI_SELECTALL: + case SCI_GOTOLINE: + case SCI_GOTOPOS: + case SCI_SEARCHANCHOR: + case SCI_SEARCHNEXT: + case SCI_SEARCHPREV: + case SCI_LINEDOWN: + case SCI_LINEDOWNEXTEND: + case SCI_PARADOWN: + case SCI_PARADOWNEXTEND: + case SCI_LINEUP: + case SCI_LINEUPEXTEND: + case SCI_PARAUP: + case SCI_PARAUPEXTEND: + case SCI_CHARLEFT: + case SCI_CHARLEFTEXTEND: + case SCI_CHARRIGHT: + case SCI_CHARRIGHTEXTEND: + case SCI_WORDLEFT: + case SCI_WORDLEFTEXTEND: + case SCI_WORDRIGHT: + case SCI_WORDRIGHTEXTEND: + case SCI_WORDPARTLEFT: + case SCI_WORDPARTLEFTEXTEND: + case SCI_WORDPARTRIGHT: + case SCI_WORDPARTRIGHTEXTEND: + case SCI_WORDLEFTEND: + case SCI_WORDLEFTENDEXTEND: + case SCI_WORDRIGHTEND: + case SCI_WORDRIGHTENDEXTEND: + case SCI_HOME: + case SCI_HOMEEXTEND: + case SCI_LINEEND: + case SCI_LINEENDEXTEND: + case SCI_HOMEWRAP: + case SCI_HOMEWRAPEXTEND: + case SCI_LINEENDWRAP: + case SCI_LINEENDWRAPEXTEND: + case SCI_DOCUMENTSTART: + case SCI_DOCUMENTSTARTEXTEND: + case SCI_DOCUMENTEND: + case SCI_DOCUMENTENDEXTEND: + case SCI_STUTTEREDPAGEUP: + case SCI_STUTTEREDPAGEUPEXTEND: + case SCI_STUTTEREDPAGEDOWN: + case SCI_STUTTEREDPAGEDOWNEXTEND: + case SCI_PAGEUP: + case SCI_PAGEUPEXTEND: + case SCI_PAGEDOWN: + case SCI_PAGEDOWNEXTEND: + case SCI_EDITTOGGLEOVERTYPE: + case SCI_CANCEL: + case SCI_DELETEBACK: + case SCI_TAB: + case SCI_BACKTAB: + case SCI_FORMFEED: + case SCI_VCHOME: + case SCI_VCHOMEEXTEND: + case SCI_VCHOMEWRAP: + case SCI_VCHOMEWRAPEXTEND: + case SCI_DELWORDLEFT: + case SCI_DELWORDRIGHT: + case SCI_DELWORDRIGHTEND: + case SCI_DELLINELEFT: + case SCI_DELLINERIGHT: + case SCI_LINECOPY: + case SCI_LINECUT: + case SCI_LINEDELETE: + case SCI_LINETRANSPOSE: + case SCI_LINEDUPLICATE: + case SCI_LOWERCASE: + case SCI_UPPERCASE: + case SCI_LINESCROLLDOWN: + case SCI_LINESCROLLUP: + case SCI_DELETEBACKNOTLINE: + case SCI_HOMEDISPLAY: + case SCI_HOMEDISPLAYEXTEND: + case SCI_LINEENDDISPLAY: + case SCI_LINEENDDISPLAYEXTEND: + case SCI_SETSELECTIONMODE: + case SCI_LINEDOWNRECTEXTEND: + case SCI_LINEUPRECTEXTEND: + case SCI_CHARLEFTRECTEXTEND: + case SCI_CHARRIGHTRECTEXTEND: + case SCI_HOMERECTEXTEND: + case SCI_VCHOMERECTEXTEND: + case SCI_LINEENDRECTEXTEND: + case SCI_PAGEUPRECTEXTEND: + case SCI_PAGEDOWNRECTEXTEND: + case SCI_SELECTIONDUPLICATE: + case SCI_COPYALLOWLINE: + break; + + // Filter out all others like display changes. Also, newlines are redundant + // with char insert messages. + case SCI_NEWLINE: + default: + // printf("Filtered out %ld of macro recording\n", iMessage); + return ; + } + + // Send notification + SCNotification scn = {0}; + scn.nmhdr.code = SCN_MACRORECORD; + scn.message = iMessage; + scn.wParam = wParam; + scn.lParam = lParam; + NotifyParent(scn); +} + +/** + * Force scroll and keep position relative to top of window. + * + * If stuttered = true and not already at first/last row, move to first/last row of window. + * If stuttered = true and already at first/last row, scroll as normal. + */ +void Editor::PageMove(int direction, Selection::selTypes selt, bool stuttered) { + int topLineNew, newPos; + + // I consider only the caretYSlop, and ignore the caretYPolicy-- is that a problem? + int currentLine = pdoc->LineFromPosition(sel.MainCaret()); + int topStutterLine = topLine + caretYSlop; + int bottomStutterLine = + pdoc->LineFromPosition(PositionFromLocation( + Point(lastXChosen - xOffset, direction * vs.lineHeight * LinesToScroll()))) + - caretYSlop - 1; + + if (stuttered && (direction < 0 && currentLine > topStutterLine)) { + topLineNew = topLine; + newPos = PositionFromLocation(Point(lastXChosen - xOffset, vs.lineHeight * caretYSlop)); + + } else if (stuttered && (direction > 0 && currentLine < bottomStutterLine)) { + topLineNew = topLine; + newPos = PositionFromLocation(Point(lastXChosen - xOffset, vs.lineHeight * (LinesToScroll() - caretYSlop))); + + } else { + Point pt = LocationFromPosition(sel.MainCaret()); + + topLineNew = Platform::Clamp( + topLine + direction * LinesToScroll(), 0, MaxScrollPos()); + newPos = PositionFromLocation( + Point(lastXChosen - xOffset, pt.y + direction * (vs.lineHeight * LinesToScroll()))); + } + + if (topLineNew != topLine) { + SetTopLine(topLineNew); + MovePositionTo(SelectionPosition(newPos), selt); + Redraw(); + SetVerticalScrollPos(); + } else { + MovePositionTo(SelectionPosition(newPos), selt); + } +} + +void Editor::ChangeCaseOfSelection(int caseMapping) { + UndoGroup ug(pdoc); + for (size_t r=0; r 0) { + std::string sText(text, rangeBytes); + + std::string sMapped = CaseMapString(sText, caseMapping); + + if (sMapped != sText) { + size_t firstDifference = 0; + while (sMapped[firstDifference] == sText[firstDifference]) + firstDifference++; + size_t lastDifference = sMapped.size() - 1; + while (sMapped[lastDifference] == sText[lastDifference]) + lastDifference--; + size_t endSame = sMapped.size() - 1 - lastDifference; + pdoc->DeleteChars(currentNoVS.Start().Position() + firstDifference, + rangeBytes - firstDifference - endSame); + pdoc->InsertString(currentNoVS.Start().Position() + firstDifference, + sMapped.c_str() + firstDifference, lastDifference - firstDifference + 1); + // Automatic movement changes selection so reset to exactly the same as it was. + sel.Range(r) = current; + } +} + delete []text; + } +} + +void Editor::LineTranspose() { + int line = pdoc->LineFromPosition(sel.MainCaret()); + if (line > 0) { + UndoGroup ug(pdoc); + int startPrev = pdoc->LineStart(line - 1); + int endPrev = pdoc->LineEnd(line - 1); + int start = pdoc->LineStart(line); + int end = pdoc->LineEnd(line); + char *line1 = CopyRange(startPrev, endPrev); + int len1 = endPrev - startPrev; + char *line2 = CopyRange(start, end); + int len2 = end - start; + pdoc->DeleteChars(start, len2); + pdoc->DeleteChars(startPrev, len1); + pdoc->InsertString(startPrev, line2, len2); + pdoc->InsertString(start - len1 + len2, line1, len1); + MovePositionTo(SelectionPosition(start - len1 + len2)); + delete []line1; + delete []line2; + } +} + +void Editor::Duplicate(bool forLine) { + if (sel.Empty()) { + forLine = true; + } + UndoGroup ug(pdoc, sel.Count() > 1); + SelectionPosition last; + const char *eol = ""; + int eolLen = 0; + if (forLine) { + eol = StringFromEOLMode(pdoc->eolMode); + eolLen = istrlen(eol); + } + for (size_t r=0; rLineFromPosition(sel.Range(r).caret.Position()); + start = SelectionPosition(pdoc->LineStart(line)); + end = SelectionPosition(pdoc->LineEnd(line)); + } + char *text = CopyRange(start.Position(), end.Position()); + if (forLine) + pdoc->InsertString(end.Position(), eol, eolLen); + pdoc->InsertString(end.Position() + eolLen, text, SelectionRange(end, start).Length()); + delete []text; + } + if (sel.Count() && sel.IsRectangular()) { + SelectionPosition last = sel.Last(); + if (forLine) { + int line = pdoc->LineFromPosition(last.Position()); + last = SelectionPosition(last.Position() + pdoc->LineStart(line+1) - pdoc->LineStart(line)); + } + if (sel.Rectangular().anchor > sel.Rectangular().caret) + sel.Rectangular().anchor = last; + else + sel.Rectangular().caret = last; + SetRectangularRange(); + } +} + +void Editor::CancelModes() { + sel.SetMoveExtends(false); +} + +void Editor::NewLine() { + ClearSelection(); + const char *eol = "\n"; + if (pdoc->eolMode == SC_EOL_CRLF) { + eol = "\r\n"; + } else if (pdoc->eolMode == SC_EOL_CR) { + eol = "\r"; + } // else SC_EOL_LF -> "\n" already set + if (pdoc->InsertCString(sel.MainCaret(), eol)) { + SetEmptySelection(sel.MainCaret() + istrlen(eol)); + while (*eol) { + NotifyChar(*eol); + if (recordingMacro) { + char txt[2]; + txt[0] = *eol; + txt[1] = '\0'; + NotifyMacroRecord(SCI_REPLACESEL, 0, reinterpret_cast(txt)); + } + eol++; + } + } + SetLastXChosen(); + SetScrollBars(); + EnsureCaretVisible(); + // Avoid blinking during rapid typing: + ShowCaretAtCurrentPosition(); +} + +void Editor::CursorUpOrDown(int direction, Selection::selTypes selt) { + SelectionPosition caretToUse = sel.Range(sel.Main()).caret; + if (sel.IsRectangular()) { + if (selt == Selection::noSel) { + caretToUse = (direction > 0) ? sel.Limits().end : sel.Limits().start; + } else { + caretToUse = sel.Rectangular().caret; + } + } + Point pt = LocationFromPosition(caretToUse); + int lineDoc = pdoc->LineFromPosition(caretToUse.Position()); + Point ptStartLine = LocationFromPosition(pdoc->LineStart(lineDoc)); + int subLine = (pt.y - ptStartLine.y) / vs.lineHeight; + int commentLines = vs.annotationVisible ? pdoc->AnnotationLines(lineDoc) : 0; + SelectionPosition posNew = SPositionFromLocation( + Point(lastXChosen - xOffset, pt.y + direction * vs.lineHeight), false, false, UserVirtualSpace()); + if ((direction > 0) && (subLine >= (cs.GetHeight(lineDoc) - 1 - commentLines))) { + posNew = SPositionFromLocation( + Point(lastXChosen - xOffset, pt.y + (commentLines + 1) * vs.lineHeight), false, false, UserVirtualSpace()); + } + if (direction < 0) { + // Line wrapping may lead to a location on the same line, so + // seek back if that is the case. + // There is an equivalent case when moving down which skips + // over a line but as that does not trap the user it is fine. + Point ptNew = LocationFromPosition(posNew.Position()); + while ((posNew.Position() > 0) && (pt.y == ptNew.y)) { + posNew.Add(- 1); + posNew.SetVirtualSpace(0); + ptNew = LocationFromPosition(posNew.Position()); + } + } + MovePositionTo(posNew, selt); +} + +void Editor::ParaUpOrDown(int direction, Selection::selTypes selt) { + int lineDoc, savedPos = sel.MainCaret(); + do { + MovePositionTo(SelectionPosition(direction > 0 ? pdoc->ParaDown(sel.MainCaret()) : pdoc->ParaUp(sel.MainCaret())), selt); + lineDoc = pdoc->LineFromPosition(sel.MainCaret()); + if (direction > 0) { + if (sel.MainCaret() >= pdoc->Length() && !cs.GetVisible(lineDoc)) { + if (selt == Selection::noSel) { + MovePositionTo(SelectionPosition(pdoc->LineEndPosition(savedPos))); + } + break; + } + } + } while (!cs.GetVisible(lineDoc)); +} + +int Editor::StartEndDisplayLine(int pos, bool start) { + RefreshStyleData(); + int line = pdoc->LineFromPosition(pos); + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(line)); + int posRet = INVALID_POSITION; + if (surface && ll) { + unsigned int posLineStart = pdoc->LineStart(line); + LayoutLine(line, surface, vs, ll, wrapWidth); + int posInLine = pos - posLineStart; + if (posInLine <= ll->maxLineLength) { + for (int subLine = 0; subLine < ll->lines; subLine++) { + if ((posInLine >= ll->LineStart(subLine)) && (posInLine <= ll->LineStart(subLine + 1))) { + if (start) { + posRet = ll->LineStart(subLine) + posLineStart; + } else { + if (subLine == ll->lines - 1) + posRet = ll->LineStart(subLine + 1) + posLineStart; + else + posRet = ll->LineStart(subLine + 1) + posLineStart - 1; + } + } + } + } + } + if (posRet == INVALID_POSITION) { + return pos; + } else { + return posRet; + } +} + +int Editor::KeyCommand(unsigned int iMessage) { + switch (iMessage) { + case SCI_LINEDOWN: + CursorUpOrDown(1); + break; + case SCI_LINEDOWNEXTEND: + CursorUpOrDown(1, Selection::selStream); + break; + case SCI_LINEDOWNRECTEXTEND: + CursorUpOrDown(1, Selection::selRectangle); + break; + case SCI_PARADOWN: + ParaUpOrDown(1); + break; + case SCI_PARADOWNEXTEND: + ParaUpOrDown(1, Selection::selStream); + break; + case SCI_LINESCROLLDOWN: + ScrollTo(topLine + 1); + MoveCaretInsideView(false); + break; + case SCI_LINEUP: + CursorUpOrDown(-1); + break; + case SCI_LINEUPEXTEND: + CursorUpOrDown(-1, Selection::selStream); + break; + case SCI_LINEUPRECTEXTEND: + CursorUpOrDown(-1, Selection::selRectangle); + break; + case SCI_PARAUP: + ParaUpOrDown(-1); + break; + case SCI_PARAUPEXTEND: + ParaUpOrDown(-1, Selection::selStream); + break; + case SCI_LINESCROLLUP: + ScrollTo(topLine - 1); + MoveCaretInsideView(false); + break; + case SCI_CHARLEFT: + if (SelectionEmpty() || sel.MoveExtends()) { + if ((sel.Count() == 1) && pdoc->IsLineEndPosition(sel.MainCaret()) && sel.RangeMain().caret.VirtualSpace()) { + SelectionPosition spCaret = sel.RangeMain().caret; + spCaret.SetVirtualSpace(spCaret.VirtualSpace() - 1); + MovePositionTo(spCaret); + } else { + MovePositionTo(MovePositionSoVisible( + SelectionPosition((sel.LimitsForRectangularElseMain().start).Position() - 1), -1)); + } + } else { + MovePositionTo(sel.LimitsForRectangularElseMain().start); + } + SetLastXChosen(); + break; + case SCI_CHARLEFTEXTEND: + if (pdoc->IsLineEndPosition(sel.MainCaret()) && sel.RangeMain().caret.VirtualSpace()) { + SelectionPosition spCaret = sel.RangeMain().caret; + spCaret.SetVirtualSpace(spCaret.VirtualSpace() - 1); + MovePositionTo(spCaret, Selection::selStream); + } else { + MovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() - 1), -1), Selection::selStream); + } + SetLastXChosen(); + break; + case SCI_CHARLEFTRECTEXTEND: + if (pdoc->IsLineEndPosition(sel.MainCaret()) && sel.RangeMain().caret.VirtualSpace()) { + SelectionPosition spCaret = sel.RangeMain().caret; + spCaret.SetVirtualSpace(spCaret.VirtualSpace() - 1); + MovePositionTo(spCaret, Selection::selRectangle); + } else { + MovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() - 1), -1), Selection::selRectangle); + } + SetLastXChosen(); + break; + case SCI_CHARRIGHT: + if (SelectionEmpty() || sel.MoveExtends()) { + if ((virtualSpaceOptions & SCVS_USERACCESSIBLE) && pdoc->IsLineEndPosition(sel.MainCaret())) { + SelectionPosition spCaret = sel.RangeMain().caret; + spCaret.SetVirtualSpace(spCaret.VirtualSpace() + 1); + MovePositionTo(spCaret); + } else { + MovePositionTo(MovePositionSoVisible( + SelectionPosition((sel.LimitsForRectangularElseMain().end).Position() + 1), 1)); + } + } else { + MovePositionTo(sel.LimitsForRectangularElseMain().end); + } + SetLastXChosen(); + break; + case SCI_CHARRIGHTEXTEND: + if ((virtualSpaceOptions & SCVS_USERACCESSIBLE) && pdoc->IsLineEndPosition(sel.MainCaret())) { + SelectionPosition spCaret = sel.RangeMain().caret; + spCaret.SetVirtualSpace(spCaret.VirtualSpace() + 1); + MovePositionTo(spCaret, Selection::selStream); + } else { + MovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() + 1), 1), Selection::selStream); + } + SetLastXChosen(); + break; + case SCI_CHARRIGHTRECTEXTEND: + if ((virtualSpaceOptions & SCVS_RECTANGULARSELECTION) && pdoc->IsLineEndPosition(sel.MainCaret())) { + SelectionPosition spCaret = sel.RangeMain().caret; + spCaret.SetVirtualSpace(spCaret.VirtualSpace() + 1); + MovePositionTo(spCaret, Selection::selRectangle); + } else { + MovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() + 1), 1), Selection::selRectangle); + } + SetLastXChosen(); + break; + case SCI_WORDLEFT: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(sel.MainCaret(), -1), -1)); + SetLastXChosen(); + break; + case SCI_WORDLEFTEXTEND: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(sel.MainCaret(), -1), -1), Selection::selStream); + SetLastXChosen(); + break; + case SCI_WORDRIGHT: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(sel.MainCaret(), 1), 1)); + SetLastXChosen(); + break; + case SCI_WORDRIGHTEXTEND: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordStart(sel.MainCaret(), 1), 1), Selection::selStream); + SetLastXChosen(); + break; + + case SCI_WORDLEFTEND: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(sel.MainCaret(), -1), -1)); + SetLastXChosen(); + break; + case SCI_WORDLEFTENDEXTEND: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(sel.MainCaret(), -1), -1), Selection::selStream); + SetLastXChosen(); + break; + case SCI_WORDRIGHTEND: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(sel.MainCaret(), 1), 1)); + SetLastXChosen(); + break; + case SCI_WORDRIGHTENDEXTEND: + MovePositionTo(MovePositionSoVisible(pdoc->NextWordEnd(sel.MainCaret(), 1), 1), Selection::selStream); + SetLastXChosen(); + break; + + case SCI_HOME: + MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(sel.MainCaret()))); + SetLastXChosen(); + break; + case SCI_HOMEEXTEND: + MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(sel.MainCaret())), Selection::selStream); + SetLastXChosen(); + break; + case SCI_HOMERECTEXTEND: + MovePositionTo(pdoc->LineStart(pdoc->LineFromPosition(sel.MainCaret())), Selection::selRectangle); + SetLastXChosen(); + break; + case SCI_LINEEND: + MovePositionTo(pdoc->LineEndPosition(sel.MainCaret())); + SetLastXChosen(); + break; + case SCI_LINEENDEXTEND: + MovePositionTo(pdoc->LineEndPosition(sel.MainCaret()), Selection::selStream); + SetLastXChosen(); + break; + case SCI_LINEENDRECTEXTEND: + MovePositionTo(pdoc->LineEndPosition(sel.MainCaret()), Selection::selRectangle); + SetLastXChosen(); + break; + case SCI_HOMEWRAP: { + SelectionPosition homePos = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), true), -1); + if (sel.RangeMain().caret <= homePos) + homePos = SelectionPosition(pdoc->LineStart(pdoc->LineFromPosition(sel.MainCaret()))); + MovePositionTo(homePos); + SetLastXChosen(); + } + break; + case SCI_HOMEWRAPEXTEND: { + SelectionPosition homePos = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), true), -1); + if (sel.RangeMain().caret <= homePos) + homePos = SelectionPosition(pdoc->LineStart(pdoc->LineFromPosition(sel.MainCaret()))); + MovePositionTo(homePos, Selection::selStream); + SetLastXChosen(); + } + break; + case SCI_LINEENDWRAP: { + SelectionPosition endPos = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), false), 1); + SelectionPosition realEndPos = SelectionPosition(pdoc->LineEndPosition(sel.MainCaret())); + if (endPos > realEndPos // if moved past visible EOLs + || sel.RangeMain().caret >= endPos) // if at end of display line already + endPos = realEndPos; + MovePositionTo(endPos); + SetLastXChosen(); + } + break; + case SCI_LINEENDWRAPEXTEND: { + SelectionPosition endPos = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), false), 1); + SelectionPosition realEndPos = SelectionPosition(pdoc->LineEndPosition(sel.MainCaret())); + if (endPos > realEndPos // if moved past visible EOLs + || sel.RangeMain().caret >= endPos) // if at end of display line already + endPos = realEndPos; + MovePositionTo(endPos, Selection::selStream); + SetLastXChosen(); + } + break; + case SCI_DOCUMENTSTART: + MovePositionTo(0); + SetLastXChosen(); + break; + case SCI_DOCUMENTSTARTEXTEND: + MovePositionTo(0, Selection::selStream); + SetLastXChosen(); + break; + case SCI_DOCUMENTEND: + MovePositionTo(pdoc->Length()); + SetLastXChosen(); + break; + case SCI_DOCUMENTENDEXTEND: + MovePositionTo(pdoc->Length(), Selection::selStream); + SetLastXChosen(); + break; + case SCI_STUTTEREDPAGEUP: + PageMove(-1, Selection::noSel, true); + break; + case SCI_STUTTEREDPAGEUPEXTEND: + PageMove(-1, Selection::selStream, true); + break; + case SCI_STUTTEREDPAGEDOWN: + PageMove(1, Selection::noSel, true); + break; + case SCI_STUTTEREDPAGEDOWNEXTEND: + PageMove(1, Selection::selStream, true); + break; + case SCI_PAGEUP: + PageMove(-1); + break; + case SCI_PAGEUPEXTEND: + PageMove(-1, Selection::selStream); + break; + case SCI_PAGEUPRECTEXTEND: + PageMove(-1, Selection::selRectangle); + break; + case SCI_PAGEDOWN: + PageMove(1); + break; + case SCI_PAGEDOWNEXTEND: + PageMove(1, Selection::selStream); + break; + case SCI_PAGEDOWNRECTEXTEND: + PageMove(1, Selection::selRectangle); + break; + case SCI_EDITTOGGLEOVERTYPE: + inOverstrike = !inOverstrike; + DropCaret(); + ShowCaretAtCurrentPosition(); + NotifyUpdateUI(); + break; + case SCI_CANCEL: // Cancel any modes - handled in subclass + // Also unselect text + CancelModes(); + break; + case SCI_DELETEBACK: + DelCharBack(true); + if (!caretSticky) { + SetLastXChosen(); + } + EnsureCaretVisible(); + break; + case SCI_DELETEBACKNOTLINE: + DelCharBack(false); + if (!caretSticky) { + SetLastXChosen(); + } + EnsureCaretVisible(); + break; + case SCI_TAB: + Indent(true); + if (!caretSticky) { + SetLastXChosen(); + } + EnsureCaretVisible(); + ShowCaretAtCurrentPosition(); // Avoid blinking + break; + case SCI_BACKTAB: + Indent(false); + if (!caretSticky) { + SetLastXChosen(); + } + EnsureCaretVisible(); + ShowCaretAtCurrentPosition(); // Avoid blinking + break; + case SCI_NEWLINE: + NewLine(); + break; + case SCI_FORMFEED: + AddChar('\f'); + break; + case SCI_VCHOME: + MovePositionTo(pdoc->VCHomePosition(sel.MainCaret())); + SetLastXChosen(); + break; + case SCI_VCHOMEEXTEND: + MovePositionTo(pdoc->VCHomePosition(sel.MainCaret()), Selection::selStream); + SetLastXChosen(); + break; + case SCI_VCHOMERECTEXTEND: + MovePositionTo(pdoc->VCHomePosition(sel.MainCaret()), Selection::selRectangle); + SetLastXChosen(); + break; + case SCI_VCHOMEWRAP: { + SelectionPosition homePos = SelectionPosition(pdoc->VCHomePosition(sel.MainCaret())); + SelectionPosition viewLineStart = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), true), -1); + if ((viewLineStart < sel.RangeMain().caret) && (viewLineStart > homePos)) + homePos = viewLineStart; + + MovePositionTo(homePos); + SetLastXChosen(); + } + break; + case SCI_VCHOMEWRAPEXTEND: { + SelectionPosition homePos = SelectionPosition(pdoc->VCHomePosition(sel.MainCaret())); + SelectionPosition viewLineStart = MovePositionSoVisible(StartEndDisplayLine(sel.MainCaret(), true), -1); + if ((viewLineStart < sel.RangeMain().caret) && (viewLineStart > homePos)) + homePos = viewLineStart; + + MovePositionTo(homePos, Selection::selStream); + SetLastXChosen(); + } + break; + case SCI_ZOOMIN: + if (vs.zoomLevel < 20) { + vs.zoomLevel++; + InvalidateStyleRedraw(); + NotifyZoom(); + } + break; + case SCI_ZOOMOUT: + if (vs.zoomLevel > -10) { + vs.zoomLevel--; + InvalidateStyleRedraw(); + NotifyZoom(); + } + break; + case SCI_DELWORDLEFT: { + int startWord = pdoc->NextWordStart(sel.MainCaret(), -1); + pdoc->DeleteChars(startWord, sel.MainCaret() - startWord); + sel.RangeMain().ClearVirtualSpace(); + SetLastXChosen(); + } + break; + case SCI_DELWORDRIGHT: { + UndoGroup ug(pdoc); + sel.RangeMain().caret = SelectionPosition( + InsertSpace(sel.RangeMain().caret.Position(), sel.RangeMain().caret.VirtualSpace())); + int endWord = pdoc->NextWordStart(sel.MainCaret(), 1); + pdoc->DeleteChars(sel.MainCaret(), endWord - sel.MainCaret()); + } + break; + case SCI_DELWORDRIGHTEND: { + UndoGroup ug(pdoc); + sel.RangeMain().caret = SelectionPosition( + InsertSpace(sel.RangeMain().caret.Position(), sel.RangeMain().caret.VirtualSpace())); + int endWord = pdoc->NextWordEnd(sel.MainCaret(), 1); + pdoc->DeleteChars(sel.MainCaret(), endWord - sel.MainCaret()); + } + break; + case SCI_DELLINELEFT: { + int line = pdoc->LineFromPosition(sel.MainCaret()); + int start = pdoc->LineStart(line); + pdoc->DeleteChars(start, sel.MainCaret() - start); + sel.RangeMain().ClearVirtualSpace(); + SetLastXChosen(); + } + break; + case SCI_DELLINERIGHT: { + int line = pdoc->LineFromPosition(sel.MainCaret()); + int end = pdoc->LineEnd(line); + pdoc->DeleteChars(sel.MainCaret(), end - sel.MainCaret()); + } + break; + case SCI_LINECOPY: { + int lineStart = pdoc->LineFromPosition(SelectionStart().Position()); + int lineEnd = pdoc->LineFromPosition(SelectionEnd().Position()); + CopyRangeToClipboard(pdoc->LineStart(lineStart), + pdoc->LineStart(lineEnd + 1)); + } + break; + case SCI_LINECUT: { + int lineStart = pdoc->LineFromPosition(SelectionStart().Position()); + int lineEnd = pdoc->LineFromPosition(SelectionEnd().Position()); + int start = pdoc->LineStart(lineStart); + int end = pdoc->LineStart(lineEnd + 1); + SetSelection(start, end); + Cut(); + SetLastXChosen(); + } + break; + case SCI_LINEDELETE: { + int line = pdoc->LineFromPosition(sel.MainCaret()); + int start = pdoc->LineStart(line); + int end = pdoc->LineStart(line + 1); + pdoc->DeleteChars(start, end - start); + } + break; + case SCI_LINETRANSPOSE: + LineTranspose(); + break; + case SCI_LINEDUPLICATE: + Duplicate(true); + break; + case SCI_SELECTIONDUPLICATE: + Duplicate(false); + break; + case SCI_LOWERCASE: + ChangeCaseOfSelection(cmLower); + break; + case SCI_UPPERCASE: + ChangeCaseOfSelection(cmUpper); + break; + case SCI_WORDPARTLEFT: + MovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(sel.MainCaret()), -1)); + SetLastXChosen(); + break; + case SCI_WORDPARTLEFTEXTEND: + MovePositionTo(MovePositionSoVisible(pdoc->WordPartLeft(sel.MainCaret()), -1), Selection::selStream); + SetLastXChosen(); + break; + case SCI_WORDPARTRIGHT: + MovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(sel.MainCaret()), 1)); + SetLastXChosen(); + break; + case SCI_WORDPARTRIGHTEXTEND: + MovePositionTo(MovePositionSoVisible(pdoc->WordPartRight(sel.MainCaret()), 1), Selection::selStream); + SetLastXChosen(); + break; + case SCI_HOMEDISPLAY: + MovePositionTo(MovePositionSoVisible( + StartEndDisplayLine(sel.MainCaret(), true), -1)); + SetLastXChosen(); + break; + case SCI_HOMEDISPLAYEXTEND: + MovePositionTo(MovePositionSoVisible( + StartEndDisplayLine(sel.MainCaret(), true), -1), Selection::selStream); + SetLastXChosen(); + break; + case SCI_LINEENDDISPLAY: + MovePositionTo(MovePositionSoVisible( + StartEndDisplayLine(sel.MainCaret(), false), 1)); + SetLastXChosen(); + break; + case SCI_LINEENDDISPLAYEXTEND: + MovePositionTo(MovePositionSoVisible( + StartEndDisplayLine(sel.MainCaret(), false), 1), Selection::selStream); + SetLastXChosen(); + break; + } + return 0; +} + +int Editor::KeyDefault(int, int) { + return 0; +} + +int Editor::KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed) { + DwellEnd(false); + int modifiers = (shift ? SCI_SHIFT : 0) | (ctrl ? SCI_CTRL : 0) | + (alt ? SCI_ALT : 0); + int msg = kmap.Find(key, modifiers); + if (msg) { + if (consumed) + *consumed = true; + return WndProc(msg, 0, 0); + } else { + if (consumed) + *consumed = false; + return KeyDefault(key, modifiers); + } +} + +void Editor::SetWhitespaceVisible(int view) { + vs.viewWhitespace = static_cast(view); +} + +int Editor::GetWhitespaceVisible() { + return vs.viewWhitespace; +} + +void Editor::Indent(bool forwards) { + for (size_t r=0; rLineFromPosition(sel.Range(r).anchor.Position()); + int caretPosition = sel.Range(r).caret.Position(); + int lineCurrentPos = pdoc->LineFromPosition(caretPosition); + if (lineOfAnchor == lineCurrentPos) { + if (forwards) { + UndoGroup ug(pdoc); + pdoc->DeleteChars(sel.Range(r).Start().Position(), sel.Range(r).Length()); + caretPosition = sel.Range(r).caret.Position(); + if (pdoc->GetColumn(caretPosition) <= pdoc->GetColumn(pdoc->GetLineIndentPosition(lineCurrentPos)) && + pdoc->tabIndents) { + int indentation = pdoc->GetLineIndentation(lineCurrentPos); + int indentationStep = pdoc->IndentSize(); + pdoc->SetLineIndentation(lineCurrentPos, indentation + indentationStep - indentation % indentationStep); + sel.Range(r) = SelectionRange(pdoc->GetLineIndentPosition(lineCurrentPos)); + } else { + if (pdoc->useTabs) { + pdoc->InsertChar(caretPosition, '\t'); + sel.Range(r) = SelectionRange(caretPosition+1); + } else { + int numSpaces = (pdoc->tabInChars) - + (pdoc->GetColumn(caretPosition) % (pdoc->tabInChars)); + if (numSpaces < 1) + numSpaces = pdoc->tabInChars; + for (int i = 0; i < numSpaces; i++) { + pdoc->InsertChar(caretPosition + i, ' '); + } + sel.Range(r) = SelectionRange(caretPosition+numSpaces); + } + } + } else { + if (pdoc->GetColumn(caretPosition) <= pdoc->GetLineIndentation(lineCurrentPos) && + pdoc->tabIndents) { + UndoGroup ug(pdoc); + int indentation = pdoc->GetLineIndentation(lineCurrentPos); + int indentationStep = pdoc->IndentSize(); + pdoc->SetLineIndentation(lineCurrentPos, indentation - indentationStep); + sel.Range(r) = SelectionRange(pdoc->GetLineIndentPosition(lineCurrentPos)); + } else { + int newColumn = ((pdoc->GetColumn(caretPosition) - 1) / pdoc->tabInChars) * + pdoc->tabInChars; + if (newColumn < 0) + newColumn = 0; + int newPos = caretPosition; + while (pdoc->GetColumn(newPos) > newColumn) + newPos--; + sel.Range(r) = SelectionRange(newPos); + } + } + } else { // Multiline + int anchorPosOnLine = sel.Range(r).anchor.Position() - pdoc->LineStart(lineOfAnchor); + int currentPosPosOnLine = caretPosition - pdoc->LineStart(lineCurrentPos); + // Multiple lines selected so indent / dedent + int lineTopSel = Platform::Minimum(lineOfAnchor, lineCurrentPos); + int lineBottomSel = Platform::Maximum(lineOfAnchor, lineCurrentPos); + if (pdoc->LineStart(lineBottomSel) == sel.Range(r).anchor.Position() || pdoc->LineStart(lineBottomSel) == caretPosition) + lineBottomSel--; // If not selecting any characters on a line, do not indent + { + UndoGroup ug(pdoc); + pdoc->Indent(forwards, lineBottomSel, lineTopSel); + } + if (lineOfAnchor < lineCurrentPos) { + if (currentPosPosOnLine == 0) + sel.Range(r) = SelectionRange(pdoc->LineStart(lineCurrentPos), pdoc->LineStart(lineOfAnchor)); + else + sel.Range(r) = SelectionRange(pdoc->LineStart(lineCurrentPos + 1), pdoc->LineStart(lineOfAnchor)); + } else { + if (anchorPosOnLine == 0) + sel.Range(r) = SelectionRange(pdoc->LineStart(lineCurrentPos), pdoc->LineStart(lineOfAnchor)); + else + sel.Range(r) = SelectionRange(pdoc->LineStart(lineCurrentPos), pdoc->LineStart(lineOfAnchor + 1)); + } + } + } +} + +class CaseFolderASCII : public CaseFolderTable { +public: + CaseFolderASCII() { + StandardASCII(); + } + ~CaseFolderASCII() { + } + virtual size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) { + if (lenMixed > sizeFolded) { + return 0; + } else { + for (size_t i=0; i(mixed[i])]; + } + return lenMixed; + } + } +}; + + +CaseFolder *Editor::CaseFolderForEncoding() { + // Simple default that only maps ASCII upper case to lower case. + return new CaseFolderASCII(); +} + +/** + * Search of a text in the document, in the given range. + * @return The position of the found text, -1 if not found. + */ +long Editor::FindText( + uptr_t wParam, ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD, + ///< @c SCFIND_WORDSTART, @c SCFIND_REGEXP or @c SCFIND_POSIX. + sptr_t lParam) { ///< @c TextToFind structure: The text to search for in the given range. + + Sci_TextToFind *ft = reinterpret_cast(lParam); + int lengthFound = istrlen(ft->lpstrText); + std::auto_ptr pcf(CaseFolderForEncoding()); + int pos = pdoc->FindText(ft->chrg.cpMin, ft->chrg.cpMax, ft->lpstrText, + (wParam & SCFIND_MATCHCASE) != 0, + (wParam & SCFIND_WHOLEWORD) != 0, + (wParam & SCFIND_WORDSTART) != 0, + (wParam & SCFIND_REGEXP) != 0, + wParam, + &lengthFound, + pcf.get()); + if (pos != -1) { + ft->chrgText.cpMin = pos; + ft->chrgText.cpMax = pos + lengthFound; + } + return pos; +} + +/** + * Relocatable search support : Searches relative to current selection + * point and sets the selection to the found text range with + * each search. + */ +/** + * Anchor following searches at current selection start: This allows + * multiple incremental interactive searches to be macro recorded + * while still setting the selection to found text so the find/select + * operation is self-contained. + */ +void Editor::SearchAnchor() { + searchAnchor = SelectionStart().Position(); +} + +/** + * Find text from current search anchor: Must call @c SearchAnchor first. + * Used for next text and previous text requests. + * @return The position of the found text, -1 if not found. + */ +long Editor::SearchText( + unsigned int iMessage, ///< Accepts both @c SCI_SEARCHNEXT and @c SCI_SEARCHPREV. + uptr_t wParam, ///< Search modes : @c SCFIND_MATCHCASE, @c SCFIND_WHOLEWORD, + ///< @c SCFIND_WORDSTART, @c SCFIND_REGEXP or @c SCFIND_POSIX. + sptr_t lParam) { ///< The text to search for. + + const char *txt = reinterpret_cast(lParam); + int pos; + int lengthFound = istrlen(txt); + std::auto_ptr pcf(CaseFolderForEncoding()); + if (iMessage == SCI_SEARCHNEXT) { + pos = pdoc->FindText(searchAnchor, pdoc->Length(), txt, + (wParam & SCFIND_MATCHCASE) != 0, + (wParam & SCFIND_WHOLEWORD) != 0, + (wParam & SCFIND_WORDSTART) != 0, + (wParam & SCFIND_REGEXP) != 0, + wParam, + &lengthFound, + pcf.get()); + } else { + pos = pdoc->FindText(searchAnchor, 0, txt, + (wParam & SCFIND_MATCHCASE) != 0, + (wParam & SCFIND_WHOLEWORD) != 0, + (wParam & SCFIND_WORDSTART) != 0, + (wParam & SCFIND_REGEXP) != 0, + wParam, + &lengthFound, + pcf.get()); + } + if (pos != -1) { + SetSelection(pos, pos + lengthFound); + } + + return pos; +} + +std::string Editor::CaseMapString(const std::string &s, int caseMapping) { + std::string ret(s); + for (size_t i=0; i= 'a' && ret[i] <= 'z') + ret[i] = static_cast(ret[i] - 'a' + 'A'); + break; + case cmLower: + if (ret[i] >= 'A' && ret[i] <= 'Z') + ret[i] = static_cast(ret[i] - 'A' + 'a'); + break; + } + } + return ret; +} + +/** + * Search for text in the target range of the document. + * @return The position of the found text, -1 if not found. + */ +long Editor::SearchInTarget(const char *text, int length) { + int lengthFound = length; + + std::auto_ptr pcf(CaseFolderForEncoding()); + int pos = pdoc->FindText(targetStart, targetEnd, text, + (searchFlags & SCFIND_MATCHCASE) != 0, + (searchFlags & SCFIND_WHOLEWORD) != 0, + (searchFlags & SCFIND_WORDSTART) != 0, + (searchFlags & SCFIND_REGEXP) != 0, + searchFlags, + &lengthFound, + pcf.get()); + if (pos != -1) { + targetStart = pos; + targetEnd = pos + lengthFound; + } + return pos; +} + +void Editor::GoToLine(int lineNo) { + if (lineNo > pdoc->LinesTotal()) + lineNo = pdoc->LinesTotal(); + if (lineNo < 0) + lineNo = 0; + SetEmptySelection(pdoc->LineStart(lineNo)); + ShowCaretAtCurrentPosition(); + EnsureCaretVisible(); +} + +static bool Close(Point pt1, Point pt2) { + if (abs(pt1.x - pt2.x) > 3) + return false; + if (abs(pt1.y - pt2.y) > 3) + return false; + return true; +} + +char *Editor::CopyRange(int start, int end) { + char *text = 0; + if (start < end) { + int len = end - start; + text = new char[len + 1]; + for (int i = 0; i < len; i++) { + text[i] = pdoc->CharAt(start + i); + } + text[len] = '\0'; + } + return text; +} + +void Editor::CopySelectionRange(SelectionText *ss, bool allowLineCopy) { + if (sel.Empty()) { + if (allowLineCopy) { + int currentLine = pdoc->LineFromPosition(sel.MainCaret()); + int start = pdoc->LineStart(currentLine); + int end = pdoc->LineEnd(currentLine); + + char *text = CopyRange(start, end); + int textLen = text ? strlen(text) : 0; + // include room for \r\n\0 + textLen += 3; + char *textWithEndl = new char[textLen]; + textWithEndl[0] = '\0'; + if (text) + strncat(textWithEndl, text, textLen); + if (pdoc->eolMode != SC_EOL_LF) + strncat(textWithEndl, "\r", textLen); + if (pdoc->eolMode != SC_EOL_CR) + strncat(textWithEndl, "\n", textLen); + ss->Set(textWithEndl, strlen(textWithEndl) + 1, + pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false, true); + delete []text; + } + } else { + int delimiterLength = 0; + if (sel.selType == Selection::selRectangle) { + if (pdoc->eolMode == SC_EOL_CRLF) { + delimiterLength = 2; + } else { + delimiterLength = 1; + } + } + int size = sel.Length() + delimiterLength * sel.Count(); + char *text = new char[size + 1]; + int j = 0; + std::vector rangesInOrder = sel.RangesCopy(); + if (sel.selType == Selection::selRectangle) + std::sort(rangesInOrder.begin(), rangesInOrder.end()); + for (size_t r=0; rCharAt(i); + } + if (sel.selType == Selection::selRectangle) { + if (pdoc->eolMode != SC_EOL_LF) { + text[j++] = '\r'; + } + if (pdoc->eolMode != SC_EOL_CR) { + text[j++] = '\n'; + } + } + } + text[size] = '\0'; + ss->Set(text, size + 1, pdoc->dbcsCodePage, + vs.styles[STYLE_DEFAULT].characterSet, sel.IsRectangular(), sel.selType == Selection::selLines); + } +} + +void Editor::CopyRangeToClipboard(int start, int end) { + start = pdoc->ClampPositionIntoDocument(start); + end = pdoc->ClampPositionIntoDocument(end); + SelectionText selectedText; + selectedText.Set(CopyRange(start, end), end - start + 1, + pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false, false); + CopyToClipboard(selectedText); +} + +void Editor::CopyText(int length, const char *text) { + SelectionText selectedText; + selectedText.Copy(text, length + 1, + pdoc->dbcsCodePage, vs.styles[STYLE_DEFAULT].characterSet, false, false); + CopyToClipboard(selectedText); +} + +void Editor::SetDragPosition(SelectionPosition newPos) { + if (newPos.Position() >= 0) { + newPos = MovePositionOutsideChar(newPos, 1); + posDrop = newPos; + } + if (!(posDrag == newPos)) { + caret.on = true; + SetTicking(true); + InvalidateCaret(); + posDrag = newPos; + InvalidateCaret(); + } +} + +void Editor::DisplayCursor(Window::Cursor c) { + if (cursorMode == SC_CURSORNORMAL) + wMain.SetCursor(c); + else + wMain.SetCursor(static_cast(cursorMode)); +} + +bool Editor::DragThreshold(Point ptStart, Point ptNow) { + int xMove = ptStart.x - ptNow.x; + int yMove = ptStart.y - ptNow.y; + int distanceSquared = xMove * xMove + yMove * yMove; + return distanceSquared > 16; +} + +void Editor::StartDrag() { + // Always handled by subclasses + //SetMouseCapture(true); + //DisplayCursor(Window::cursorArrow); +} + +void Editor::DropAt(SelectionPosition position, const char *value, bool moving, bool rectangular) { + //Platform::DebugPrintf("DropAt %d %d\n", inDragDrop, position); + if (inDragDrop == ddDragging) + dropWentOutside = false; + + bool positionWasInSelection = PositionInSelection(position.Position()); + + bool positionOnEdgeOfSelection = + (position == SelectionStart()) || (position == SelectionEnd()); + + if ((inDragDrop != ddDragging) || !(positionWasInSelection) || + (positionOnEdgeOfSelection && !moving)) { + + SelectionPosition selStart = SelectionStart(); + SelectionPosition selEnd = SelectionEnd(); + + UndoGroup ug(pdoc); + + SelectionPosition positionAfterDeletion = position; + if ((inDragDrop == ddDragging) && moving) { + // Remove dragged out text + if (rectangular || sel.selType == Selection::selLines) { + for (size_t r=0; r= sel.Range(r).Start()) { + if (position > sel.Range(r).End()) { + positionAfterDeletion.Add(-sel.Range(r).Length()); + } else { + positionAfterDeletion.Add(-SelectionRange(position, sel.Range(r).Start()).Length()); + } + } + } + } else { + if (position > selStart) { + positionAfterDeletion.Add(-SelectionRange(selEnd, selStart).Length()); + } + } + ClearSelection(); + } + position = positionAfterDeletion; + + if (rectangular) { + PasteRectangular(position, value, istrlen(value)); + // Should try to select new rectangle but it may not be a rectangle now so just select the drop position + SetEmptySelection(position); + } else { + position = MovePositionOutsideChar(position, sel.MainCaret() - position.Position()); + position = SelectionPosition(InsertSpace(position.Position(), position.VirtualSpace())); + if (pdoc->InsertCString(position.Position(), value)) { + SelectionPosition posAfterInsertion = position; + posAfterInsertion.Add(istrlen(value)); + SetSelection(posAfterInsertion, position); + } + } + } else if (inDragDrop == ddDragging) { + SetEmptySelection(position); + } +} + +/** + * @return true if given position is inside the selection, + */ +bool Editor::PositionInSelection(int pos) { + pos = MovePositionOutsideChar(pos, sel.MainCaret() - pos); + for (size_t r=0; r xPos) { + hit = false; + } + } + if (hit) + return true; + } + } + return false; +} + +bool Editor::PointInSelMargin(Point pt) { + // Really means: "Point in a margin" + if (vs.fixedColumnWidth > 0) { // There is a margin + PRectangle rcSelMargin = GetClientRectangle(); + rcSelMargin.right = vs.fixedColumnWidth - vs.leftMarginWidth; + return rcSelMargin.Contains(pt); + } else { + return false; + } +} + +void Editor::LineSelection(int lineCurrent_, int lineAnchor_) { + if (lineAnchor_ < lineCurrent_) { + SetSelection(pdoc->LineStart(lineCurrent_ + 1), + pdoc->LineStart(lineAnchor_)); + } else if (lineAnchor_ > lineCurrent_) { + SetSelection(pdoc->LineStart(lineCurrent_), + pdoc->LineStart(lineAnchor_ + 1)); + } else { // Same line, select it + SetSelection(pdoc->LineStart(lineAnchor_ + 1), + pdoc->LineStart(lineAnchor_)); + } +} + +void Editor::DwellEnd(bool mouseMoved) { + if (mouseMoved) + ticksToDwell = dwellDelay; + else + ticksToDwell = SC_TIME_FOREVER; + if (dwelling && (dwellDelay < SC_TIME_FOREVER)) { + dwelling = false; + NotifyDwelling(ptMouseLast, dwelling); + } +} + +void Editor::MouseLeave() { + SetHotSpotRange(NULL); +} + +static bool AllowVirtualSpace(int virtualSpaceOptions, bool rectangular) { + return ((virtualSpaceOptions & SCVS_USERACCESSIBLE) != 0) + || (rectangular && ((virtualSpaceOptions & SCVS_RECTANGULARSELECTION) != 0)); +} + +void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) { + //Platform::DebugPrintf("ButtonDown %d %d = %d alt=%d %d\n", curTime, lastClickTime, curTime - lastClickTime, alt, inDragDrop); + ptMouseLast = pt; + SelectionPosition newPos = SPositionFromLocation(pt, false, false, AllowVirtualSpace(virtualSpaceOptions, alt)); + newPos = MovePositionOutsideChar(newPos, sel.MainCaret() - newPos.Position()); + inDragDrop = ddNone; + sel.SetMoveExtends(false); + + bool processed = NotifyMarginClick(pt, shift, ctrl, alt); + if (processed) + return; + + NotifyIndicatorClick(true, newPos.Position(), shift, ctrl, alt); + + bool inSelMargin = PointInSelMargin(pt); + if (shift & !inSelMargin) { + SetSelection(newPos.Position()); + } + if (((curTime - lastClickTime) < Platform::DoubleClickTime()) && Close(pt, lastClick)) { + //Platform::DebugPrintf("Double click %d %d = %d\n", curTime, lastClickTime, curTime - lastClickTime); + SetMouseCapture(true); + SetEmptySelection(newPos.Position()); + bool doubleClick = false; + // Stop mouse button bounce changing selection type + if (!Platform::MouseButtonBounce() || curTime != lastClickTime) { + if (selectionType == selChar) { + selectionType = selWord; + doubleClick = true; + } else if (selectionType == selWord) { + selectionType = selLine; + } else { + selectionType = selChar; + originalAnchorPos = sel.MainCaret(); + } + } + + if (selectionType == selWord) { + if (sel.MainCaret() >= originalAnchorPos) { // Moved forward + SetSelection(pdoc->ExtendWordSelect(sel.MainCaret(), 1), + pdoc->ExtendWordSelect(originalAnchorPos, -1)); + } else { // Moved backward + SetSelection(pdoc->ExtendWordSelect(sel.MainCaret(), -1), + pdoc->ExtendWordSelect(originalAnchorPos, 1)); + } + } else if (selectionType == selLine) { + lineAnchor = LineFromLocation(pt); + SetSelection(pdoc->LineStart(lineAnchor + 1), pdoc->LineStart(lineAnchor)); + //Platform::DebugPrintf("Triple click: %d - %d\n", anchor, currentPos); + } else { + SetEmptySelection(sel.MainCaret()); + } + //Platform::DebugPrintf("Double click: %d - %d\n", anchor, currentPos); + if (doubleClick) { + NotifyDoubleClick(pt, shift, ctrl, alt); + if (PositionIsHotspot(newPos.Position())) + NotifyHotSpotDoubleClicked(newPos.Position(), shift, ctrl, alt); + } + } else { // Single click + if (inSelMargin) { + sel.selType = Selection::selStream; + if (ctrl) { + SelectAll(); + lastClickTime = curTime; + return; + } + if (!shift) { + lineAnchor = LineFromLocation(pt); + // Single click in margin: select whole line + LineSelection(lineAnchor, lineAnchor); + SetSelection(pdoc->LineStart(lineAnchor + 1), + pdoc->LineStart(lineAnchor)); + } else { + // Single shift+click in margin: select from line anchor to clicked line + if (sel.MainAnchor() > sel.MainCaret()) + lineAnchor = pdoc->LineFromPosition(sel.MainAnchor() - 1); + else + lineAnchor = pdoc->LineFromPosition(sel.MainAnchor()); + int lineStart = LineFromLocation(pt); + LineSelection(lineStart, lineAnchor); + //lineAnchor = lineStart; // Keep the same anchor for ButtonMove + } + + SetDragPosition(SelectionPosition(invalidPosition)); + SetMouseCapture(true); + selectionType = selLine; + } else { + if (PointIsHotspot(pt)) { + NotifyHotSpotClicked(newPos.Position(), shift, ctrl, alt); + } + if (!shift) { + if (PointInSelection(pt) && !SelectionEmpty()) + inDragDrop = ddInitial; + else + inDragDrop = ddNone; + } + SetMouseCapture(true); + if (inDragDrop != ddInitial) { + SetDragPosition(SelectionPosition(invalidPosition)); + if (!shift) { + if (ctrl && multipleSelection) { + SelectionRange range(newPos); + sel.TentativeSelection(range); + InvalidateSelection(range, true); + } else { + InvalidateSelection(SelectionRange(newPos), true); + if (sel.Count() > 1) + Redraw(); + sel.Clear(); + sel.selType = alt ? Selection::selRectangle : Selection::selStream; + SetSelection(newPos, newPos); + } + } + SelectionPosition anchorCurrent = newPos; + if (shift) + anchorCurrent = sel.IsRectangular() ? + sel.Rectangular().anchor : sel.RangeMain().anchor; + sel.selType = alt ? Selection::selRectangle : Selection::selStream; + selectionType = selChar; + originalAnchorPos = sel.MainCaret(); + sel.Rectangular() = SelectionRange(newPos, anchorCurrent); + SetRectangularRange(); + } + } + } + lastClickTime = curTime; + lastXChosen = pt.x + xOffset; + ShowCaretAtCurrentPosition(); +} + +bool Editor::PositionIsHotspot(int position) { + return vs.styles[pdoc->StyleAt(position) & pdoc->stylingBitsMask].hotspot; +} + +bool Editor::PointIsHotspot(Point pt) { + int pos = PositionFromLocation(pt, true); + if (pos == INVALID_POSITION) + return false; + return PositionIsHotspot(pos); +} + +void Editor::SetHotSpotRange(Point *pt) { + if (pt) { + int pos = PositionFromLocation(*pt); + + // If we don't limit this to word characters then the + // range can encompass more than the run range and then + // the underline will not be drawn properly. + int hsStart_ = pdoc->ExtendStyleRange(pos, -1, vs.hotspotSingleLine); + int hsEnd_ = pdoc->ExtendStyleRange(pos, 1, vs.hotspotSingleLine); + + // Only invalidate the range if the hotspot range has changed... + if (hsStart_ != hsStart || hsEnd_ != hsEnd) { + if (hsStart != -1) { + InvalidateRange(hsStart, hsEnd); + } + hsStart = hsStart_; + hsEnd = hsEnd_; + InvalidateRange(hsStart, hsEnd); + } + } else { + if (hsStart != -1) { + int hsStart_ = hsStart; + int hsEnd_ = hsEnd; + hsStart = -1; + hsEnd = -1; + InvalidateRange(hsStart_, hsEnd_); + } else { + hsStart = -1; + hsEnd = -1; + } + } +} + +void Editor::GetHotSpotRange(int& hsStart_, int& hsEnd_) { + hsStart_ = hsStart; + hsEnd_ = hsEnd; +} + +void Editor::ButtonMove(Point pt) { + if ((ptMouseLast.x != pt.x) || (ptMouseLast.y != pt.y)) { + DwellEnd(true); + } + + SelectionPosition movePos = SPositionFromLocation(pt, false, false, + AllowVirtualSpace(virtualSpaceOptions, sel.IsRectangular())); + movePos = MovePositionOutsideChar(movePos, sel.MainCaret() - movePos.Position()); + + if (inDragDrop == ddInitial) { + if (DragThreshold(ptMouseLast, pt)) { + SetMouseCapture(false); + SetDragPosition(movePos); + CopySelectionRange(&drag); + StartDrag(); + } + return; + } + + ptMouseLast = pt; + //Platform::DebugPrintf("Move %d %d\n", pt.x, pt.y); + if (HaveMouseCapture()) { + + // Slow down autoscrolling/selection + autoScrollTimer.ticksToWait -= timer.tickSize; + if (autoScrollTimer.ticksToWait > 0) + return; + autoScrollTimer.ticksToWait = autoScrollDelay; + + // Adjust selection + if (posDrag.IsValid()) { + SetDragPosition(movePos); + } else { + if (selectionType == selChar) { + if (sel.IsRectangular()) { + sel.Rectangular() = SelectionRange(movePos, sel.Rectangular().anchor); + SetSelection(movePos, sel.RangeMain().anchor); + } else if (sel.Count() > 1) { + SelectionRange range(movePos, sel.RangeMain().anchor); + sel.TentativeSelection(range); + InvalidateSelection(range, true); + } else { + SetSelection(movePos, sel.RangeMain().anchor); + } + } else if (selectionType == selWord) { + // Continue selecting by word + if (movePos.Position() == originalAnchorPos) { // Didn't move + // No need to do anything. Previously this case was lumped + // in with "Moved forward", but that can be harmful in this + // case: a handler for the NotifyDoubleClick re-adjusts + // the selection for a fancier definition of "word" (for + // example, in Perl it is useful to include the leading + // '$', '%' or '@' on variables for word selection). In this + // the ButtonMove() called via Tick() for auto-scrolling + // could result in the fancier word selection adjustment + // being unmade. + } else if (movePos.Position() > originalAnchorPos) { // Moved forward + SetSelection(pdoc->ExtendWordSelect(movePos.Position(), 1), + pdoc->ExtendWordSelect(originalAnchorPos, -1)); + } else { // Moved backward + SetSelection(pdoc->ExtendWordSelect(movePos.Position(), -1), + pdoc->ExtendWordSelect(originalAnchorPos, 1)); + } + } else { + // Continue selecting by line + int lineMove = LineFromLocation(pt); + LineSelection(lineMove, lineAnchor); + } + } + + // Autoscroll + PRectangle rcClient = GetClientRectangle(); + if (pt.y > rcClient.bottom) { + int lineMove = cs.DisplayFromDoc(LineFromLocation(pt)); + if (lineMove < 0) { + lineMove = cs.DisplayFromDoc(pdoc->LinesTotal() - 1); + } + ScrollTo(lineMove - LinesOnScreen() + 1); + Redraw(); + } else if (pt.y < rcClient.top) { + int lineMove = cs.DisplayFromDoc(LineFromLocation(pt)); + ScrollTo(lineMove - 1); + Redraw(); + } + EnsureCaretVisible(false, false, true); + + if (hsStart != -1 && !PositionIsHotspot(movePos.Position())) + SetHotSpotRange(NULL); + + } else { + if (vs.fixedColumnWidth > 0) { // There is a margin + if (PointInSelMargin(pt)) { + DisplayCursor(Window::cursorReverseArrow); + SetHotSpotRange(NULL); + return; // No need to test for selection + } + } + // Display regular (drag) cursor over selection + if (PointInSelection(pt) && !SelectionEmpty()) { + DisplayCursor(Window::cursorArrow); + } else if (PointIsHotspot(pt)) { + DisplayCursor(Window::cursorHand); + SetHotSpotRange(&pt); + } else { + DisplayCursor(Window::cursorText); + SetHotSpotRange(NULL); + } + } +} + +void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) { + //Platform::DebugPrintf("ButtonUp %d %d\n", HaveMouseCapture(), inDragDrop); + SelectionPosition newPos = SPositionFromLocation(pt, false, false, + AllowVirtualSpace(virtualSpaceOptions, sel.IsRectangular())); + newPos = MovePositionOutsideChar(newPos, sel.MainCaret() - newPos.Position()); + if (inDragDrop == ddInitial) { + inDragDrop = ddNone; + SetEmptySelection(newPos.Position()); + } + if (HaveMouseCapture()) { + if (PointInSelMargin(pt)) { + DisplayCursor(Window::cursorReverseArrow); + } else { + DisplayCursor(Window::cursorText); + SetHotSpotRange(NULL); + } + ptMouseLast = pt; + SetMouseCapture(false); + NotifyIndicatorClick(false, newPos.Position(), false, false, false); + if (inDragDrop == ddDragging) { + SelectionPosition selStart = SelectionStart(); + SelectionPosition selEnd = SelectionEnd(); + if (selStart < selEnd) { + if (drag.len) { + if (ctrl) { + if (pdoc->InsertString(newPos.Position(), drag.s, drag.len)) { + SetSelection(newPos.Position(), newPos.Position() + drag.len); + } + } else if (newPos < selStart) { + pdoc->DeleteChars(selStart.Position(), drag.len); + if (pdoc->InsertString(newPos.Position(), drag.s, drag.len)) { + SetSelection(newPos.Position(), newPos.Position() + drag.len); + } + } else if (newPos > selEnd) { + pdoc->DeleteChars(selStart.Position(), drag.len); + newPos.Add(-drag.len); + if (pdoc->InsertString(newPos.Position(), drag.s, drag.len)) { + SetSelection(newPos.Position(), newPos.Position() + drag.len); + } + } else { + SetEmptySelection(newPos.Position()); + } + drag.Free(); + } + selectionType = selChar; + } + } else { + if (selectionType == selChar) { + if (sel.Count() > 1) { + sel.RangeMain() = + SelectionRange(newPos, sel.Range(sel.Count() - 1).anchor); + InvalidateSelection(sel.RangeMain(), true); + } else { + SetSelection(newPos, sel.RangeMain().anchor); + } + } + sel.CommitTentative(); + } + SetRectangularRange(); + lastClickTime = curTime; + lastClick = pt; + lastXChosen = pt.x + xOffset; + if (sel.selType == Selection::selStream) { + SetLastXChosen(); + } + inDragDrop = ddNone; + EnsureCaretVisible(false); + } +} + +// Called frequently to perform background UI including +// caret blinking and automatic scrolling. +void Editor::Tick() { + if (HaveMouseCapture()) { + // Auto scroll + ButtonMove(ptMouseLast); + } + if (caret.period > 0) { + timer.ticksToWait -= timer.tickSize; + if (timer.ticksToWait <= 0) { + caret.on = !caret.on; + timer.ticksToWait = caret.period; + if (caret.active) { + InvalidateCaret(); + } + } + } + if (horizontalScrollBarVisible && trackLineWidth && (lineWidthMaxSeen > scrollWidth)) { + scrollWidth = lineWidthMaxSeen; + SetScrollBars(); + } + if ((dwellDelay < SC_TIME_FOREVER) && + (ticksToDwell > 0) && + (!HaveMouseCapture())) { + ticksToDwell -= timer.tickSize; + if (ticksToDwell <= 0) { + dwelling = true; + NotifyDwelling(ptMouseLast, dwelling); + } + } +} + +bool Editor::Idle() { + + bool idleDone; + + bool wrappingDone = wrapState == eWrapNone; + + if (!wrappingDone) { + // Wrap lines during idle. + WrapLines(false, -1); + // No more wrapping + if (wrapStart == wrapEnd) + wrappingDone = true; + } + + // Add more idle things to do here, but make sure idleDone is + // set correctly before the function returns. returning + // false will stop calling this idle funtion until SetIdle() is + // called again. + + idleDone = wrappingDone; // && thatDone && theOtherThingDone... + + return !idleDone; +} + +void Editor::SetFocusState(bool focusState) { + hasFocus = focusState; + NotifyFocus(hasFocus); + if (hasFocus) { + ShowCaretAtCurrentPosition(); + } else { + CancelModes(); + DropCaret(); + } +} + +int Editor::PositionAfterArea(PRectangle rcArea) { + // The start of the document line after the display line after the area + // This often means that the line after a modification is restyled which helps + // detect multiline comment additions and heals single line comments + int lineAfter = topLine + (rcArea.bottom - 1) / vs.lineHeight + 1; + if (lineAfter < cs.LinesDisplayed()) + return pdoc->LineStart(cs.DocFromDisplay(lineAfter) + 1); + else + return pdoc->Length(); +} + +// Style to a position within the view. If this causes a change at end of last line then +// affects later lines so style all the viewed text. +void Editor::StyleToPositionInView(Position pos) { + int endWindow = PositionAfterArea(GetClientRectangle()); + if (pos > endWindow) + pos = endWindow; + int styleAtEnd = pdoc->StyleAt(pos-1); + pdoc->EnsureStyledTo(pos); + if ((endWindow > pos) && (styleAtEnd != pdoc->StyleAt(pos-1))) { + // Style at end of line changed so is multi-line change like starting a comment + // so require rest of window to be styled. + pdoc->EnsureStyledTo(endWindow); + } +} + +void Editor::IdleStyling() { + // Style the line after the modification as this allows modifications that change just the + // line of the modification to heal instead of propagating to the rest of the window. + StyleToPositionInView(pdoc->LineStart(pdoc->LineFromPosition(styleNeeded.upTo) + 2)); + + if (needUpdateUI) { + NotifyUpdateUI(); + needUpdateUI = false; + } + styleNeeded.Reset(); +} + +void Editor::QueueStyling(int upTo) { + styleNeeded.NeedUpTo(upTo); +} + +bool Editor::PaintContains(PRectangle rc) { + if (rc.Empty()) { + return true; + } else { + return rcPaint.Contains(rc); + } +} + +bool Editor::PaintContainsMargin() { + PRectangle rcSelMargin = GetClientRectangle(); + rcSelMargin.right = vs.fixedColumnWidth; + return PaintContains(rcSelMargin); +} + +void Editor::CheckForChangeOutsidePaint(Range r) { + if (paintState == painting && !paintingAllText) { + //Platform::DebugPrintf("Checking range in paint %d-%d\n", r.start, r.end); + if (!r.Valid()) + return; + + PRectangle rcRange = RectangleFromRange(r.start, r.end); + PRectangle rcText = GetTextRectangle(); + if (rcRange.top < rcText.top) { + rcRange.top = rcText.top; + } + if (rcRange.bottom > rcText.bottom) { + rcRange.bottom = rcText.bottom; + } + + if (!PaintContains(rcRange)) { + AbandonPaint(); + } + } +} + +void Editor::SetBraceHighlight(Position pos0, Position pos1, int matchStyle) { + if ((pos0 != braces[0]) || (pos1 != braces[1]) || (matchStyle != bracesMatchStyle)) { + if ((braces[0] != pos0) || (matchStyle != bracesMatchStyle)) { + CheckForChangeOutsidePaint(Range(braces[0])); + CheckForChangeOutsidePaint(Range(pos0)); + braces[0] = pos0; + } + if ((braces[1] != pos1) || (matchStyle != bracesMatchStyle)) { + CheckForChangeOutsidePaint(Range(braces[1])); + CheckForChangeOutsidePaint(Range(pos1)); + braces[1] = pos1; + } + bracesMatchStyle = matchStyle; + if (paintState == notPainting) { + Redraw(); + } + } +} + +void Editor::SetAnnotationHeights(int start, int end) { + if (vs.annotationVisible) { + for (int line=start; lineAnnotationLines(line) + 1); + } + } +} + +void Editor::SetDocPointer(Document *document) { + //Platform::DebugPrintf("** %x setdoc to %x\n", pdoc, document); + pdoc->RemoveWatcher(this, 0); + pdoc->Release(); + if (document == NULL) { + pdoc = new Document(); + } else { + pdoc = document; + } + pdoc->AddRef(); + + // Ensure all positions within document + sel.Clear(); + targetStart = 0; + targetEnd = 0; + + braces[0] = invalidPosition; + braces[1] = invalidPosition; + + // Reset the contraction state to fully shown. + cs.Clear(); + cs.InsertLines(0, pdoc->LinesTotal() - 1); + SetAnnotationHeights(0, pdoc->LinesTotal()); + llc.Deallocate(); + NeedWrapping(); + + pdoc->AddWatcher(this, 0); + SetScrollBars(); + Redraw(); +} + +void Editor::SetAnnotationVisible(int visible) { + if (vs.annotationVisible != visible) { + bool changedFromOrToHidden = ((vs.annotationVisible != 0) != (visible != 0)); + vs.annotationVisible = visible; + if (changedFromOrToHidden) { + int dir = vs.annotationVisible ? 1 : -1; + for (int line=0; lineLinesTotal(); line++) { + int annotationLines = pdoc->AnnotationLines(line); + if (annotationLines > 0) { + cs.SetHeight(line, cs.GetHeight(line) + annotationLines * dir); + } + } + } + } +} + +/** + * Recursively expand a fold, making lines visible except where they have an unexpanded parent. + */ +void Editor::Expand(int &line, bool doExpand) { + int lineMaxSubord = pdoc->GetLastChild(line); + line++; + while (line <= lineMaxSubord) { + if (doExpand) + cs.SetVisible(line, line, true); + int level = pdoc->GetLevel(line); + if (level & SC_FOLDLEVELHEADERFLAG) { + if (doExpand && cs.GetExpanded(line)) { + Expand(line, true); + } else { + Expand(line, false); + } + } else { + line++; + } + } +} + +void Editor::ToggleContraction(int line) { + if (line >= 0) { + if ((pdoc->GetLevel(line) & SC_FOLDLEVELHEADERFLAG) == 0) { + line = pdoc->GetFoldParent(line); + if (line < 0) + return; + } + + if (cs.GetExpanded(line)) { + int lineMaxSubord = pdoc->GetLastChild(line); + cs.SetExpanded(line, 0); + if (lineMaxSubord > line) { + cs.SetVisible(line + 1, lineMaxSubord, false); + + int lineCurrent = pdoc->LineFromPosition(sel.MainCaret()); + if (lineCurrent > line && lineCurrent <= lineMaxSubord) { + // This does not re-expand the fold + EnsureCaretVisible(); + } + + SetScrollBars(); + Redraw(); + } + + } else { + if (!(cs.GetVisible(line))) { + EnsureLineVisible(line, false); + GoToLine(line); + } + cs.SetExpanded(line, 1); + Expand(line, true); + SetScrollBars(); + Redraw(); + } + } +} + +/** + * Recurse up from this line to find any folds that prevent this line from being visible + * and unfold them all. + */ +void Editor::EnsureLineVisible(int lineDoc, bool enforcePolicy) { + + // In case in need of wrapping to ensure DisplayFromDoc works. + WrapLines(true, -1); + + if (!cs.GetVisible(lineDoc)) { + int lineParent = pdoc->GetFoldParent(lineDoc); + if (lineParent >= 0) { + if (lineDoc != lineParent) + EnsureLineVisible(lineParent, enforcePolicy); + if (!cs.GetExpanded(lineParent)) { + cs.SetExpanded(lineParent, 1); + Expand(lineParent, true); + } + } + SetScrollBars(); + Redraw(); + } + if (enforcePolicy) { + int lineDisplay = cs.DisplayFromDoc(lineDoc); + if (visiblePolicy & VISIBLE_SLOP) { + if ((topLine > lineDisplay) || ((visiblePolicy & VISIBLE_STRICT) && (topLine + visibleSlop > lineDisplay))) { + SetTopLine(Platform::Clamp(lineDisplay - visibleSlop, 0, MaxScrollPos())); + SetVerticalScrollPos(); + Redraw(); + } else if ((lineDisplay > topLine + LinesOnScreen() - 1) || + ((visiblePolicy & VISIBLE_STRICT) && (lineDisplay > topLine + LinesOnScreen() - 1 - visibleSlop))) { + SetTopLine(Platform::Clamp(lineDisplay - LinesOnScreen() + 1 + visibleSlop, 0, MaxScrollPos())); + SetVerticalScrollPos(); + Redraw(); + } + } else { + if ((topLine > lineDisplay) || (lineDisplay > topLine + LinesOnScreen() - 1) || (visiblePolicy & VISIBLE_STRICT)) { + SetTopLine(Platform::Clamp(lineDisplay - LinesOnScreen() / 2 + 1, 0, MaxScrollPos())); + SetVerticalScrollPos(); + Redraw(); + } + } + } +} + +int Editor::GetTag(char *tagValue, int tagNumber) { + char name[3] = "\\?"; + const char *text = 0; + int length = 0; + if ((tagNumber >= 1) && (tagNumber <= 9)) { + name[1] = static_cast(tagNumber + '0'); + length = 2; + text = pdoc->SubstituteByPosition(name, &length); + } + if (tagValue) { + if (text) + memcpy(tagValue, text, length + 1); + else + *tagValue = '\0'; + } + return length; +} + +int Editor::ReplaceTarget(bool replacePatterns, const char *text, int length) { + UndoGroup ug(pdoc); + if (length == -1) + length = istrlen(text); + if (replacePatterns) { + text = pdoc->SubstituteByPosition(text, &length); + if (!text) { + return 0; + } + } + if (targetStart != targetEnd) + pdoc->DeleteChars(targetStart, targetEnd - targetStart); + targetEnd = targetStart; + pdoc->InsertString(targetStart, text, length); + targetEnd = targetStart + length; + return length; +} + +bool Editor::IsUnicodeMode() const { + return pdoc && (SC_CP_UTF8 == pdoc->dbcsCodePage); +} + +int Editor::CodePage() const { + if (pdoc) + return pdoc->dbcsCodePage; + else + return 0; +} + +int Editor::WrapCount(int line) { + AutoSurface surface(this); + AutoLineLayout ll(llc, RetrieveLineLayout(line)); + + if (surface && ll) { + LayoutLine(line, surface, vs, ll, wrapWidth); + return ll->lines; + } else { + return 1; + } +} + +void Editor::AddStyledText(char *buffer, int appendLength) { + // The buffer consists of alternating character bytes and style bytes + size_t textLength = appendLength / 2; + char *text = new char[textLength]; + size_t i; + for (i = 0;i < textLength;i++) { + text[i] = buffer[i*2]; + } + pdoc->InsertString(CurrentPosition(), text, textLength); + for (i = 0;i < textLength;i++) { + text[i] = buffer[i*2+1]; + } + pdoc->StartStyling(CurrentPosition(), static_cast(0xff)); + pdoc->SetStyles(textLength, text); + delete []text; + SetEmptySelection(sel.MainCaret() + textLength); +} + +static bool ValidMargin(unsigned long wParam) { + return wParam < ViewStyle::margins; +} + +static char *CharPtrFromSPtr(sptr_t lParam) { + return reinterpret_cast(lParam); +} + +void Editor::StyleSetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { + vs.EnsureStyle(wParam); + switch (iMessage) { + case SCI_STYLESETFORE: + vs.styles[wParam].fore.desired = ColourDesired(lParam); + break; + case SCI_STYLESETBACK: + vs.styles[wParam].back.desired = ColourDesired(lParam); + break; + case SCI_STYLESETBOLD: + vs.styles[wParam].bold = lParam != 0; + break; + case SCI_STYLESETITALIC: + vs.styles[wParam].italic = lParam != 0; + break; + case SCI_STYLESETEOLFILLED: + vs.styles[wParam].eolFilled = lParam != 0; + break; + case SCI_STYLESETSIZE: + vs.styles[wParam].size = lParam; + break; + case SCI_STYLESETFONT: + if (lParam != 0) { + vs.SetStyleFontName(wParam, CharPtrFromSPtr(lParam)); + } + break; + case SCI_STYLESETUNDERLINE: + vs.styles[wParam].underline = lParam != 0; + break; + case SCI_STYLESETCASE: + vs.styles[wParam].caseForce = static_cast(lParam); + break; + case SCI_STYLESETCHARACTERSET: + vs.styles[wParam].characterSet = lParam; + break; + case SCI_STYLESETVISIBLE: + vs.styles[wParam].visible = lParam != 0; + break; + case SCI_STYLESETCHANGEABLE: + vs.styles[wParam].changeable = lParam != 0; + break; + case SCI_STYLESETHOTSPOT: + vs.styles[wParam].hotspot = lParam != 0; + break; + } + InvalidateStyleRedraw(); +} + +sptr_t Editor::StyleGetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { + vs.EnsureStyle(wParam); + switch (iMessage) { + case SCI_STYLEGETFORE: + return vs.styles[wParam].fore.desired.AsLong(); + case SCI_STYLEGETBACK: + return vs.styles[wParam].back.desired.AsLong(); + case SCI_STYLEGETBOLD: + return vs.styles[wParam].bold ? 1 : 0; + case SCI_STYLEGETITALIC: + return vs.styles[wParam].italic ? 1 : 0; + case SCI_STYLEGETEOLFILLED: + return vs.styles[wParam].eolFilled ? 1 : 0; + case SCI_STYLEGETSIZE: + return vs.styles[wParam].size; + case SCI_STYLEGETFONT: + if (!vs.styles[wParam].fontName) + return 0; + if (lParam != 0) + strcpy(CharPtrFromSPtr(lParam), vs.styles[wParam].fontName); + return strlen(vs.styles[wParam].fontName); + case SCI_STYLEGETUNDERLINE: + return vs.styles[wParam].underline ? 1 : 0; + case SCI_STYLEGETCASE: + return static_cast(vs.styles[wParam].caseForce); + case SCI_STYLEGETCHARACTERSET: + return vs.styles[wParam].characterSet; + case SCI_STYLEGETVISIBLE: + return vs.styles[wParam].visible ? 1 : 0; + case SCI_STYLEGETCHANGEABLE: + return vs.styles[wParam].changeable ? 1 : 0; + case SCI_STYLEGETHOTSPOT: + return vs.styles[wParam].hotspot ? 1 : 0; + } + return 0; +} + +sptr_t Editor::StringResult(sptr_t lParam, const char *val) { + const int n = strlen(val); + if (lParam != 0) { + char *ptr = reinterpret_cast(lParam); + strcpy(ptr, val); + } + return n; // Not including NUL +} + +sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { + //Platform::DebugPrintf("S start wnd proc %d %d %d\n",iMessage, wParam, lParam); + + // Optional macro recording hook + if (recordingMacro) + NotifyMacroRecord(iMessage, wParam, lParam); + + switch (iMessage) { + + case SCI_GETTEXT: { + if (lParam == 0) + return pdoc->Length() + 1; + if (wParam == 0) + return 0; + char *ptr = CharPtrFromSPtr(lParam); + unsigned int iChar = 0; + for (; iChar < wParam - 1; iChar++) + ptr[iChar] = pdoc->CharAt(iChar); + ptr[iChar] = '\0'; + return iChar; + } + + case SCI_SETTEXT: { + if (lParam == 0) + return 0; + UndoGroup ug(pdoc); + pdoc->DeleteChars(0, pdoc->Length()); + SetEmptySelection(0); + pdoc->InsertCString(0, CharPtrFromSPtr(lParam)); + return 1; + } + + case SCI_GETTEXTLENGTH: + return pdoc->Length(); + + case SCI_CUT: + Cut(); + SetLastXChosen(); + break; + + case SCI_COPY: + Copy(); + break; + + case SCI_COPYALLOWLINE: + CopyAllowLine(); + break; + + case SCI_COPYRANGE: + CopyRangeToClipboard(wParam, lParam); + break; + + case SCI_COPYTEXT: + CopyText(wParam, CharPtrFromSPtr(lParam)); + break; + + case SCI_PASTE: + Paste(); + if (!caretSticky) { + SetLastXChosen(); + } + EnsureCaretVisible(); + break; + + case SCI_CLEAR: + Clear(); + SetLastXChosen(); + EnsureCaretVisible(); + break; + + case SCI_UNDO: + Undo(); + SetLastXChosen(); + break; + + case SCI_CANUNDO: + return (pdoc->CanUndo() && !pdoc->IsReadOnly()) ? 1 : 0; + + case SCI_EMPTYUNDOBUFFER: + pdoc->DeleteUndoHistory(); + return 0; + + case SCI_GETFIRSTVISIBLELINE: + return topLine; + + case SCI_SETFIRSTVISIBLELINE: + ScrollTo(wParam); + break; + + case SCI_GETLINE: { // Risk of overwriting the end of the buffer + int lineStart = pdoc->LineStart(wParam); + int lineEnd = pdoc->LineStart(wParam + 1); + if (lParam == 0) { + return lineEnd - lineStart; + } + char *ptr = CharPtrFromSPtr(lParam); + int iPlace = 0; + for (int iChar = lineStart; iChar < lineEnd; iChar++) { + ptr[iPlace++] = pdoc->CharAt(iChar); + } + return iPlace; + } + + case SCI_GETLINECOUNT: + if (pdoc->LinesTotal() == 0) + return 1; + else + return pdoc->LinesTotal(); + + case SCI_GETMODIFY: + return !pdoc->IsSavePoint(); + + case SCI_SETSEL: { + int nStart = static_cast(wParam); + int nEnd = static_cast(lParam); + if (nEnd < 0) + nEnd = pdoc->Length(); + if (nStart < 0) + nStart = nEnd; // Remove selection + InvalidateSelection(SelectionRange(nStart, nEnd)); + sel.Clear(); + sel.selType = Selection::selStream; + SetSelection(nEnd, nStart); + EnsureCaretVisible(); + } + break; + + case SCI_GETSELTEXT: { + SelectionText selectedText; + CopySelectionRange(&selectedText); + if (lParam == 0) { + return selectedText.len ? selectedText.len : 1; + } else { + char *ptr = CharPtrFromSPtr(lParam); + int iChar = 0; + if (selectedText.len) { + for (; iChar < selectedText.len; iChar++) + ptr[iChar] = selectedText.s[iChar]; + } else { + ptr[0] = '\0'; + } + return iChar; + } + } + + case SCI_LINEFROMPOSITION: + if (static_cast(wParam) < 0) + return 0; + return pdoc->LineFromPosition(wParam); + + case SCI_POSITIONFROMLINE: + if (static_cast(wParam) < 0) + wParam = pdoc->LineFromPosition(SelectionStart().Position()); + if (wParam == 0) + return 0; // Even if there is no text, there is a first line that starts at 0 + if (static_cast(wParam) > pdoc->LinesTotal()) + return -1; + //if (wParam > pdoc->LineFromPosition(pdoc->Length())) // Useful test, anyway... + // return -1; + return pdoc->LineStart(wParam); + + // Replacement of the old Scintilla interpretation of EM_LINELENGTH + case SCI_LINELENGTH: + if ((static_cast(wParam) < 0) || + (static_cast(wParam) > pdoc->LineFromPosition(pdoc->Length()))) + return 0; + return pdoc->LineStart(wParam + 1) - pdoc->LineStart(wParam); + + case SCI_REPLACESEL: { + if (lParam == 0) + return 0; + UndoGroup ug(pdoc); + ClearSelection(); + char *replacement = CharPtrFromSPtr(lParam); + pdoc->InsertCString(sel.MainCaret(), replacement); + SetEmptySelection(sel.MainCaret() + istrlen(replacement)); + EnsureCaretVisible(); + } + break; + + case SCI_SETTARGETSTART: + targetStart = wParam; + break; + + case SCI_GETTARGETSTART: + return targetStart; + + case SCI_SETTARGETEND: + targetEnd = wParam; + break; + + case SCI_GETTARGETEND: + return targetEnd; + + case SCI_TARGETFROMSELECTION: + if (sel.MainCaret() < sel.MainAnchor()) { + targetStart = sel.MainCaret(); + targetEnd = sel.MainAnchor(); + } else { + targetStart = sel.MainAnchor(); + targetEnd = sel.MainCaret(); + } + break; + + case SCI_REPLACETARGET: + PLATFORM_ASSERT(lParam); + return ReplaceTarget(false, CharPtrFromSPtr(lParam), wParam); + + case SCI_REPLACETARGETRE: + PLATFORM_ASSERT(lParam); + return ReplaceTarget(true, CharPtrFromSPtr(lParam), wParam); + + case SCI_SEARCHINTARGET: + PLATFORM_ASSERT(lParam); + return SearchInTarget(CharPtrFromSPtr(lParam), wParam); + + case SCI_SETSEARCHFLAGS: + searchFlags = wParam; + break; + + case SCI_GETSEARCHFLAGS: + return searchFlags; + + case SCI_GETTAG: + return GetTag(CharPtrFromSPtr(lParam), wParam); + + case SCI_POSITIONBEFORE: + return pdoc->MovePositionOutsideChar(wParam - 1, -1, true); + + case SCI_POSITIONAFTER: + return pdoc->MovePositionOutsideChar(wParam + 1, 1, true); + + case SCI_LINESCROLL: + ScrollTo(topLine + lParam); + HorizontalScrollTo(xOffset + wParam * vs.spaceWidth); + return 1; + + case SCI_SETXOFFSET: + xOffset = wParam; + SetHorizontalScrollPos(); + Redraw(); + break; + + case SCI_GETXOFFSET: + return xOffset; + + case SCI_CHOOSECARETX: + SetLastXChosen(); + break; + + case SCI_SCROLLCARET: + EnsureCaretVisible(); + break; + + case SCI_SETREADONLY: + pdoc->SetReadOnly(wParam != 0); + return 1; + + case SCI_GETREADONLY: + return pdoc->IsReadOnly(); + + case SCI_CANPASTE: + return CanPaste(); + + case SCI_POINTXFROMPOSITION: + if (lParam < 0) { + return 0; + } else { + Point pt = LocationFromPosition(lParam); + return pt.x; + } + + case SCI_POINTYFROMPOSITION: + if (lParam < 0) { + return 0; + } else { + Point pt = LocationFromPosition(lParam); + return pt.y; + } + + case SCI_FINDTEXT: + return FindText(wParam, lParam); + + case SCI_GETTEXTRANGE: { + if (lParam == 0) + return 0; + Sci_TextRange *tr = reinterpret_cast(lParam); + int cpMax = tr->chrg.cpMax; + if (cpMax == -1) + cpMax = pdoc->Length(); + PLATFORM_ASSERT(cpMax <= pdoc->Length()); + int len = cpMax - tr->chrg.cpMin; // No -1 as cpMin and cpMax are referring to inter character positions + pdoc->GetCharRange(tr->lpstrText, tr->chrg.cpMin, len); + // Spec says copied text is terminated with a NUL + tr->lpstrText[len] = '\0'; + return len; // Not including NUL + } + + case SCI_HIDESELECTION: + hideSelection = wParam != 0; + Redraw(); + break; + + case SCI_FORMATRANGE: + return FormatRange(wParam != 0, reinterpret_cast(lParam)); + + case SCI_GETMARGINLEFT: + return vs.leftMarginWidth; + + case SCI_GETMARGINRIGHT: + return vs.rightMarginWidth; + + case SCI_SETMARGINLEFT: + vs.leftMarginWidth = lParam; + InvalidateStyleRedraw(); + break; + + case SCI_SETMARGINRIGHT: + vs.rightMarginWidth = lParam; + InvalidateStyleRedraw(); + break; + + // Control specific mesages + + case SCI_ADDTEXT: { + if (lParam == 0) + return 0; + pdoc->InsertString(CurrentPosition(), CharPtrFromSPtr(lParam), wParam); + SetEmptySelection(sel.MainCaret() + wParam); + return 0; + } + + case SCI_ADDSTYLEDTEXT: + if (lParam) + AddStyledText(CharPtrFromSPtr(lParam), wParam); + return 0; + + case SCI_INSERTTEXT: { + if (lParam == 0) + return 0; + int insertPos = wParam; + if (static_cast(wParam) == -1) + insertPos = CurrentPosition(); + int newCurrent = CurrentPosition(); + char *sz = CharPtrFromSPtr(lParam); + pdoc->InsertCString(insertPos, sz); + if (newCurrent > insertPos) + newCurrent += istrlen(sz); + SetEmptySelection(newCurrent); + return 0; + } + + case SCI_APPENDTEXT: + pdoc->InsertString(pdoc->Length(), CharPtrFromSPtr(lParam), wParam); + return 0; + + case SCI_CLEARALL: + ClearAll(); + return 0; + + case SCI_CLEARDOCUMENTSTYLE: + ClearDocumentStyle(); + return 0; + + case SCI_SETUNDOCOLLECTION: + pdoc->SetUndoCollection(wParam != 0); + return 0; + + case SCI_GETUNDOCOLLECTION: + return pdoc->IsCollectingUndo(); + + case SCI_BEGINUNDOACTION: + pdoc->BeginUndoAction(); + return 0; + + case SCI_ENDUNDOACTION: + pdoc->EndUndoAction(); + return 0; + + case SCI_GETCARETPERIOD: + return caret.period; + + case SCI_SETCARETPERIOD: + caret.period = wParam; + break; + + case SCI_SETWORDCHARS: { + pdoc->SetDefaultCharClasses(false); + if (lParam == 0) + return 0; + pdoc->SetCharClasses(reinterpret_cast(lParam), CharClassify::ccWord); + } + break; + + case SCI_SETWHITESPACECHARS: { + if (lParam == 0) + return 0; + pdoc->SetCharClasses(reinterpret_cast(lParam), CharClassify::ccSpace); + } + break; + + case SCI_SETCHARSDEFAULT: + pdoc->SetDefaultCharClasses(true); + break; + + case SCI_GETLENGTH: + return pdoc->Length(); + + case SCI_ALLOCATE: + pdoc->Allocate(wParam); + break; + + case SCI_GETCHARAT: + return pdoc->CharAt(wParam); + + case SCI_SETCURRENTPOS: + if (sel.IsRectangular()) { + sel.Rectangular().caret.SetPosition(wParam); + SetRectangularRange(); + Redraw(); + } else { + SetSelection(wParam, sel.MainAnchor()); + } + break; + + case SCI_GETCURRENTPOS: + return sel.IsRectangular() ? sel.Rectangular().caret.Position() : sel.MainCaret(); + + case SCI_SETANCHOR: + if (sel.IsRectangular()) { + sel.Rectangular().anchor.SetPosition(wParam); + SetRectangularRange(); + Redraw(); + } else { + SetSelection(sel.MainCaret(), wParam); + } + break; + + case SCI_GETANCHOR: + return sel.IsRectangular() ? sel.Rectangular().anchor.Position() : sel.MainAnchor(); + + case SCI_SETSELECTIONSTART: + SetSelection(Platform::Maximum(sel.MainCaret(), wParam), wParam); + break; + + case SCI_GETSELECTIONSTART: + return sel.LimitsForRectangularElseMain().start.Position(); + + case SCI_SETSELECTIONEND: + SetSelection(wParam, Platform::Minimum(sel.MainAnchor(), wParam)); + break; + + case SCI_GETSELECTIONEND: + return sel.LimitsForRectangularElseMain().end.Position(); + + case SCI_SETPRINTMAGNIFICATION: + printMagnification = wParam; + break; + + case SCI_GETPRINTMAGNIFICATION: + return printMagnification; + + case SCI_SETPRINTCOLOURMODE: + printColourMode = wParam; + break; + + case SCI_GETPRINTCOLOURMODE: + return printColourMode; + + case SCI_SETPRINTWRAPMODE: + printWrapState = (wParam == SC_WRAP_WORD) ? eWrapWord : eWrapNone; + break; + + case SCI_GETPRINTWRAPMODE: + return printWrapState; + + case SCI_GETSTYLEAT: + if (static_cast(wParam) >= pdoc->Length()) + return 0; + else + return pdoc->StyleAt(wParam); + + case SCI_REDO: + Redo(); + break; + + case SCI_SELECTALL: + SelectAll(); + break; + + case SCI_SETSAVEPOINT: + pdoc->SetSavePoint(); + break; + + case SCI_GETSTYLEDTEXT: { + if (lParam == 0) + return 0; + Sci_TextRange *tr = reinterpret_cast(lParam); + int iPlace = 0; + for (int iChar = tr->chrg.cpMin; iChar < tr->chrg.cpMax; iChar++) { + tr->lpstrText[iPlace++] = pdoc->CharAt(iChar); + tr->lpstrText[iPlace++] = pdoc->StyleAt(iChar); + } + tr->lpstrText[iPlace] = '\0'; + tr->lpstrText[iPlace + 1] = '\0'; + return iPlace; + } + + case SCI_CANREDO: + return (pdoc->CanRedo() && !pdoc->IsReadOnly()) ? 1 : 0; + + case SCI_MARKERLINEFROMHANDLE: + return pdoc->LineFromHandle(wParam); + + case SCI_MARKERDELETEHANDLE: + pdoc->DeleteMarkFromHandle(wParam); + break; + + case SCI_GETVIEWWS: + return vs.viewWhitespace; + + case SCI_SETVIEWWS: + vs.viewWhitespace = static_cast(wParam); + Redraw(); + break; + + case SCI_GETWHITESPACESIZE: + return vs.whitespaceSize; + + case SCI_SETWHITESPACESIZE: + vs.whitespaceSize = static_cast(wParam); + Redraw(); + break; + + case SCI_POSITIONFROMPOINT: + return PositionFromLocation(Point(wParam, lParam), false, false); + + case SCI_POSITIONFROMPOINTCLOSE: + return PositionFromLocation(Point(wParam, lParam), true, false); + + case SCI_CHARPOSITIONFROMPOINT: + return PositionFromLocation(Point(wParam, lParam), false, true); + + case SCI_CHARPOSITIONFROMPOINTCLOSE: + return PositionFromLocation(Point(wParam, lParam), true, true); + + case SCI_GOTOLINE: + GoToLine(wParam); + break; + + case SCI_GOTOPOS: + SetEmptySelection(wParam); + EnsureCaretVisible(); + Redraw(); + break; + + case SCI_GETCURLINE: { + int lineCurrentPos = pdoc->LineFromPosition(sel.MainCaret()); + int lineStart = pdoc->LineStart(lineCurrentPos); + unsigned int lineEnd = pdoc->LineStart(lineCurrentPos + 1); + if (lParam == 0) { + return 1 + lineEnd - lineStart; + } + PLATFORM_ASSERT(wParam > 0); + char *ptr = CharPtrFromSPtr(lParam); + unsigned int iPlace = 0; + for (unsigned int iChar = lineStart; iChar < lineEnd && iPlace < wParam - 1; iChar++) { + ptr[iPlace++] = pdoc->CharAt(iChar); + } + ptr[iPlace] = '\0'; + return sel.MainCaret() - lineStart; + } + + case SCI_GETENDSTYLED: + return pdoc->GetEndStyled(); + + case SCI_GETEOLMODE: + return pdoc->eolMode; + + case SCI_SETEOLMODE: + pdoc->eolMode = wParam; + break; + + case SCI_STARTSTYLING: + pdoc->StartStyling(wParam, static_cast(lParam)); + break; + + case SCI_SETSTYLING: + pdoc->SetStyleFor(wParam, static_cast(lParam)); + break; + + case SCI_SETSTYLINGEX: // Specify a complete styling buffer + if (lParam == 0) + return 0; + pdoc->SetStyles(wParam, CharPtrFromSPtr(lParam)); + break; + + case SCI_SETBUFFEREDDRAW: + bufferedDraw = wParam != 0; + break; + + case SCI_GETBUFFEREDDRAW: + return bufferedDraw; + + case SCI_GETTWOPHASEDRAW: + return twoPhaseDraw; + + case SCI_SETTWOPHASEDRAW: + twoPhaseDraw = wParam != 0; + InvalidateStyleRedraw(); + break; + + case SCI_SETFONTQUALITY: + vs.extraFontFlag &= ~SC_EFF_QUALITY_MASK; + vs.extraFontFlag |= (wParam & SC_EFF_QUALITY_MASK); + InvalidateStyleRedraw(); + break; + + case SCI_GETFONTQUALITY: + return (vs.extraFontFlag & SC_EFF_QUALITY_MASK); + + case SCI_SETTABWIDTH: + if (wParam > 0) { + pdoc->tabInChars = wParam; + if (pdoc->indentInChars == 0) + pdoc->actualIndentInChars = pdoc->tabInChars; + } + InvalidateStyleRedraw(); + break; + + case SCI_GETTABWIDTH: + return pdoc->tabInChars; + + case SCI_SETINDENT: + pdoc->indentInChars = wParam; + if (pdoc->indentInChars != 0) + pdoc->actualIndentInChars = pdoc->indentInChars; + else + pdoc->actualIndentInChars = pdoc->tabInChars; + InvalidateStyleRedraw(); + break; + + case SCI_GETINDENT: + return pdoc->indentInChars; + + case SCI_SETUSETABS: + pdoc->useTabs = wParam != 0; + InvalidateStyleRedraw(); + break; + + case SCI_GETUSETABS: + return pdoc->useTabs; + + case SCI_SETLINEINDENTATION: + pdoc->SetLineIndentation(wParam, lParam); + break; + + case SCI_GETLINEINDENTATION: + return pdoc->GetLineIndentation(wParam); + + case SCI_GETLINEINDENTPOSITION: + return pdoc->GetLineIndentPosition(wParam); + + case SCI_SETTABINDENTS: + pdoc->tabIndents = wParam != 0; + break; + + case SCI_GETTABINDENTS: + return pdoc->tabIndents; + + case SCI_SETBACKSPACEUNINDENTS: + pdoc->backspaceUnindents = wParam != 0; + break; + + case SCI_GETBACKSPACEUNINDENTS: + return pdoc->backspaceUnindents; + + case SCI_SETMOUSEDWELLTIME: + dwellDelay = wParam; + ticksToDwell = dwellDelay; + break; + + case SCI_GETMOUSEDWELLTIME: + return dwellDelay; + + case SCI_WORDSTARTPOSITION: + return pdoc->ExtendWordSelect(wParam, -1, lParam != 0); + + case SCI_WORDENDPOSITION: + return pdoc->ExtendWordSelect(wParam, 1, lParam != 0); + + case SCI_SETWRAPMODE: + switch (wParam) { + case SC_WRAP_WORD: + wrapState = eWrapWord; + break; + case SC_WRAP_CHAR: + wrapState = eWrapChar; + break; + default: + wrapState = eWrapNone; + break; + } + xOffset = 0; + InvalidateStyleRedraw(); + ReconfigureScrollBars(); + break; + + case SCI_GETWRAPMODE: + return wrapState; + + case SCI_SETWRAPVISUALFLAGS: + if (wrapVisualFlags != static_cast(wParam)) { + wrapVisualFlags = wParam; + InvalidateStyleRedraw(); + ReconfigureScrollBars(); + } + break; + + case SCI_GETWRAPVISUALFLAGS: + return wrapVisualFlags; + + case SCI_SETWRAPVISUALFLAGSLOCATION: + wrapVisualFlagsLocation = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETWRAPVISUALFLAGSLOCATION: + return wrapVisualFlagsLocation; + + case SCI_SETWRAPSTARTINDENT: + if (wrapVisualStartIndent != static_cast(wParam)) { + wrapVisualStartIndent = wParam; + InvalidateStyleRedraw(); + ReconfigureScrollBars(); + } + break; + + case SCI_GETWRAPSTARTINDENT: + return wrapVisualStartIndent; + + case SCI_SETWRAPINDENTMODE: + if (wrapIndentMode != static_cast(wParam)) { + wrapIndentMode = wParam; + InvalidateStyleRedraw(); + ReconfigureScrollBars(); + } + break; + + case SCI_GETWRAPINDENTMODE: + return wrapIndentMode; + + case SCI_SETLAYOUTCACHE: + llc.SetLevel(wParam); + break; + + case SCI_GETLAYOUTCACHE: + return llc.GetLevel(); + + case SCI_SETPOSITIONCACHE: + posCache.SetSize(wParam); + break; + + case SCI_GETPOSITIONCACHE: + return posCache.GetSize(); + + case SCI_SETSCROLLWIDTH: + PLATFORM_ASSERT(wParam > 0); + if ((wParam > 0) && (wParam != static_cast(scrollWidth))) { + lineWidthMaxSeen = 0; + scrollWidth = wParam; + SetScrollBars(); + } + break; + + case SCI_GETSCROLLWIDTH: + return scrollWidth; + + case SCI_SETSCROLLWIDTHTRACKING: + trackLineWidth = wParam != 0; + break; + + case SCI_GETSCROLLWIDTHTRACKING: + return trackLineWidth; + + case SCI_LINESJOIN: + LinesJoin(); + break; + + case SCI_LINESSPLIT: + LinesSplit(wParam); + break; + + case SCI_TEXTWIDTH: + PLATFORM_ASSERT(wParam < vs.stylesSize); + PLATFORM_ASSERT(lParam); + return TextWidth(wParam, CharPtrFromSPtr(lParam)); + + case SCI_TEXTHEIGHT: + return vs.lineHeight; + + case SCI_SETENDATLASTLINE: + PLATFORM_ASSERT((wParam == 0) || (wParam == 1)); + if (endAtLastLine != (wParam != 0)) { + endAtLastLine = wParam != 0; + SetScrollBars(); + } + break; + + case SCI_GETENDATLASTLINE: + return endAtLastLine; + + case SCI_SETCARETSTICKY: + PLATFORM_ASSERT((wParam == 0) || (wParam == 1)); + if (caretSticky != (wParam != 0)) { + caretSticky = wParam != 0; + } + break; + + case SCI_GETCARETSTICKY: + return caretSticky; + + case SCI_TOGGLECARETSTICKY: + caretSticky = !caretSticky; + break; + + case SCI_GETCOLUMN: + return pdoc->GetColumn(wParam); + + case SCI_FINDCOLUMN: + return pdoc->FindColumn(wParam, lParam); + + case SCI_SETHSCROLLBAR : + if (horizontalScrollBarVisible != (wParam != 0)) { + horizontalScrollBarVisible = wParam != 0; + SetScrollBars(); + ReconfigureScrollBars(); + } + break; + + case SCI_GETHSCROLLBAR: + return horizontalScrollBarVisible; + + case SCI_SETVSCROLLBAR: + if (verticalScrollBarVisible != (wParam != 0)) { + verticalScrollBarVisible = wParam != 0; + SetScrollBars(); + ReconfigureScrollBars(); + } + break; + + case SCI_GETVSCROLLBAR: + return verticalScrollBarVisible; + + case SCI_SETINDENTATIONGUIDES: + vs.viewIndentationGuides = IndentView(wParam); + Redraw(); + break; + + case SCI_GETINDENTATIONGUIDES: + return vs.viewIndentationGuides; + + case SCI_SETHIGHLIGHTGUIDE: + if ((highlightGuideColumn != static_cast(wParam)) || (wParam > 0)) { + highlightGuideColumn = wParam; + Redraw(); + } + break; + + case SCI_GETHIGHLIGHTGUIDE: + return highlightGuideColumn; + + case SCI_GETLINEENDPOSITION: + return pdoc->LineEnd(wParam); + + case SCI_SETCODEPAGE: + if (ValidCodePage(wParam)) { + pdoc->dbcsCodePage = wParam; + InvalidateStyleRedraw(); + } + break; + + case SCI_GETCODEPAGE: + return pdoc->dbcsCodePage; + + case SCI_SETUSEPALETTE: + palette.allowRealization = wParam != 0; + InvalidateStyleRedraw(); + break; + + case SCI_GETUSEPALETTE: + return palette.allowRealization; + + // Marker definition and setting + case SCI_MARKERDEFINE: + if (wParam <= MARKER_MAX) + vs.markers[wParam].markType = lParam; + InvalidateStyleData(); + RedrawSelMargin(); + break; + + case SCI_MARKERSYMBOLDEFINED: + if (wParam <= MARKER_MAX) + return vs.markers[wParam].markType; + else + return 0; + + case SCI_MARKERSETFORE: + if (wParam <= MARKER_MAX) + vs.markers[wParam].fore.desired = ColourDesired(lParam); + InvalidateStyleData(); + RedrawSelMargin(); + break; + case SCI_MARKERSETBACK: + if (wParam <= MARKER_MAX) + vs.markers[wParam].back.desired = ColourDesired(lParam); + InvalidateStyleData(); + RedrawSelMargin(); + break; + case SCI_MARKERSETALPHA: + if (wParam <= MARKER_MAX) + vs.markers[wParam].alpha = lParam; + InvalidateStyleRedraw(); + break; + case SCI_MARKERADD: { + int markerID = pdoc->AddMark(wParam, lParam); + return markerID; + } + case SCI_MARKERADDSET: + if (lParam != 0) + pdoc->AddMarkSet(wParam, lParam); + break; + + case SCI_MARKERDELETE: + pdoc->DeleteMark(wParam, lParam); + break; + + case SCI_MARKERDELETEALL: + pdoc->DeleteAllMarks(static_cast(wParam)); + break; + + case SCI_MARKERGET: + return pdoc->GetMark(wParam); + + case SCI_MARKERNEXT: { + int lt = pdoc->LinesTotal(); + for (int iLine = wParam; iLine < lt; iLine++) { + if ((pdoc->GetMark(iLine) & lParam) != 0) + return iLine; + } + } + return -1; + + case SCI_MARKERPREVIOUS: { + for (int iLine = wParam; iLine >= 0; iLine--) { + if ((pdoc->GetMark(iLine) & lParam) != 0) + return iLine; + } + } + return -1; + + case SCI_MARKERDEFINEPIXMAP: + if (wParam <= MARKER_MAX) { + vs.markers[wParam].SetXPM(CharPtrFromSPtr(lParam)); + }; + InvalidateStyleData(); + RedrawSelMargin(); + break; + + case SCI_SETMARGINTYPEN: + if (ValidMargin(wParam)) { + vs.ms[wParam].style = lParam; + InvalidateStyleRedraw(); + } + break; + + case SCI_GETMARGINTYPEN: + if (ValidMargin(wParam)) + return vs.ms[wParam].style; + else + return 0; + + case SCI_SETMARGINWIDTHN: + if (ValidMargin(wParam)) { + // Short-circuit if the width is unchanged, to avoid unnecessary redraw. + if (vs.ms[wParam].width != lParam) { + vs.ms[wParam].width = lParam; + InvalidateStyleRedraw(); + } + } + break; + + case SCI_GETMARGINWIDTHN: + if (ValidMargin(wParam)) + return vs.ms[wParam].width; + else + return 0; + + case SCI_SETMARGINMASKN: + if (ValidMargin(wParam)) { + vs.ms[wParam].mask = lParam; + InvalidateStyleRedraw(); + } + break; + + case SCI_GETMARGINMASKN: + if (ValidMargin(wParam)) + return vs.ms[wParam].mask; + else + return 0; + + case SCI_SETMARGINSENSITIVEN: + if (ValidMargin(wParam)) { + vs.ms[wParam].sensitive = lParam != 0; + InvalidateStyleRedraw(); + } + break; + + case SCI_GETMARGINSENSITIVEN: + if (ValidMargin(wParam)) + return vs.ms[wParam].sensitive ? 1 : 0; + else + return 0; + + case SCI_STYLECLEARALL: + vs.ClearStyles(); + InvalidateStyleRedraw(); + break; + + case SCI_STYLESETFORE: + case SCI_STYLESETBACK: + case SCI_STYLESETBOLD: + case SCI_STYLESETITALIC: + case SCI_STYLESETEOLFILLED: + case SCI_STYLESETSIZE: + case SCI_STYLESETFONT: + case SCI_STYLESETUNDERLINE: + case SCI_STYLESETCASE: + case SCI_STYLESETCHARACTERSET: + case SCI_STYLESETVISIBLE: + case SCI_STYLESETCHANGEABLE: + case SCI_STYLESETHOTSPOT: + StyleSetMessage(iMessage, wParam, lParam); + break; + + case SCI_STYLEGETFORE: + case SCI_STYLEGETBACK: + case SCI_STYLEGETBOLD: + case SCI_STYLEGETITALIC: + case SCI_STYLEGETEOLFILLED: + case SCI_STYLEGETSIZE: + case SCI_STYLEGETFONT: + case SCI_STYLEGETUNDERLINE: + case SCI_STYLEGETCASE: + case SCI_STYLEGETCHARACTERSET: + case SCI_STYLEGETVISIBLE: + case SCI_STYLEGETCHANGEABLE: + case SCI_STYLEGETHOTSPOT: + return StyleGetMessage(iMessage, wParam, lParam); + + case SCI_STYLERESETDEFAULT: + vs.ResetDefaultStyle(); + InvalidateStyleRedraw(); + break; + case SCI_SETSTYLEBITS: + vs.EnsureStyle((1 << wParam) - 1); + pdoc->SetStylingBits(wParam); + break; + + case SCI_GETSTYLEBITS: + return pdoc->stylingBits; + + case SCI_SETLINESTATE: + return pdoc->SetLineState(wParam, lParam); + + case SCI_GETLINESTATE: + return pdoc->GetLineState(wParam); + + case SCI_GETMAXLINESTATE: + return pdoc->GetMaxLineState(); + + case SCI_GETCARETLINEVISIBLE: + return vs.showCaretLineBackground; + case SCI_SETCARETLINEVISIBLE: + vs.showCaretLineBackground = wParam != 0; + InvalidateStyleRedraw(); + break; + case SCI_GETCARETLINEBACK: + return vs.caretLineBackground.desired.AsLong(); + case SCI_SETCARETLINEBACK: + vs.caretLineBackground.desired = wParam; + InvalidateStyleRedraw(); + break; + case SCI_GETCARETLINEBACKALPHA: + return vs.caretLineAlpha; + case SCI_SETCARETLINEBACKALPHA: + vs.caretLineAlpha = wParam; + InvalidateStyleRedraw(); + break; + + // Folding messages + + case SCI_VISIBLEFROMDOCLINE: + return cs.DisplayFromDoc(wParam); + + case SCI_DOCLINEFROMVISIBLE: + return cs.DocFromDisplay(wParam); + + case SCI_WRAPCOUNT: + return WrapCount(wParam); + + case SCI_SETFOLDLEVEL: { + int prev = pdoc->SetLevel(wParam, lParam); + if (prev != lParam) + RedrawSelMargin(); + return prev; + } + + case SCI_GETFOLDLEVEL: + return pdoc->GetLevel(wParam); + + case SCI_GETLASTCHILD: + return pdoc->GetLastChild(wParam, lParam); + + case SCI_GETFOLDPARENT: + return pdoc->GetFoldParent(wParam); + + case SCI_SHOWLINES: + cs.SetVisible(wParam, lParam, true); + SetScrollBars(); + Redraw(); + break; + + case SCI_HIDELINES: + if (wParam > 0) + cs.SetVisible(wParam, lParam, false); + SetScrollBars(); + Redraw(); + break; + + case SCI_GETLINEVISIBLE: + return cs.GetVisible(wParam); + + case SCI_SETFOLDEXPANDED: + if (cs.SetExpanded(wParam, lParam != 0)) { + RedrawSelMargin(); + } + break; + + case SCI_GETFOLDEXPANDED: + return cs.GetExpanded(wParam); + + case SCI_SETFOLDFLAGS: + foldFlags = wParam; + Redraw(); + break; + + case SCI_TOGGLEFOLD: + ToggleContraction(wParam); + break; + + case SCI_ENSUREVISIBLE: + EnsureLineVisible(wParam, false); + break; + + case SCI_ENSUREVISIBLEENFORCEPOLICY: + EnsureLineVisible(wParam, true); + break; + + case SCI_SEARCHANCHOR: + SearchAnchor(); + break; + + case SCI_SEARCHNEXT: + case SCI_SEARCHPREV: + return SearchText(iMessage, wParam, lParam); + + case SCI_SETXCARETPOLICY: + caretXPolicy = wParam; + caretXSlop = lParam; + break; + + case SCI_SETYCARETPOLICY: + caretYPolicy = wParam; + caretYSlop = lParam; + break; + + case SCI_SETVISIBLEPOLICY: + visiblePolicy = wParam; + visibleSlop = lParam; + break; + + case SCI_LINESONSCREEN: + return LinesOnScreen(); + + case SCI_SETSELFORE: + vs.selforeset = wParam != 0; + vs.selforeground.desired = ColourDesired(lParam); + vs.selAdditionalForeground.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + break; + + case SCI_SETSELBACK: + vs.selbackset = wParam != 0; + vs.selbackground.desired = ColourDesired(lParam); + vs.selAdditionalBackground.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + break; + + case SCI_SETSELALPHA: + vs.selAlpha = wParam; + vs.selAdditionalAlpha = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETSELALPHA: + return vs.selAlpha; + + case SCI_GETSELEOLFILLED: + return vs.selEOLFilled; + + case SCI_SETSELEOLFILLED: + vs.selEOLFilled = wParam != 0; + InvalidateStyleRedraw(); + break; + + case SCI_SETWHITESPACEFORE: + vs.whitespaceForegroundSet = wParam != 0; + vs.whitespaceForeground.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + break; + + case SCI_SETWHITESPACEBACK: + vs.whitespaceBackgroundSet = wParam != 0; + vs.whitespaceBackground.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + break; + + case SCI_SETCARETFORE: + vs.caretcolour.desired = ColourDesired(wParam); + InvalidateStyleRedraw(); + break; + + case SCI_GETCARETFORE: + return vs.caretcolour.desired.AsLong(); + + case SCI_SETCARETSTYLE: + if (wParam >= CARETSTYLE_INVISIBLE && wParam <= CARETSTYLE_BLOCK) + vs.caretStyle = wParam; + else + /* Default to the line caret */ + vs.caretStyle = CARETSTYLE_LINE; + InvalidateStyleRedraw(); + break; + + case SCI_GETCARETSTYLE: + return vs.caretStyle; + + case SCI_SETCARETWIDTH: + if (wParam <= 0) + vs.caretWidth = 0; + else if (wParam >= 3) + vs.caretWidth = 3; + else + vs.caretWidth = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETCARETWIDTH: + return vs.caretWidth; + + case SCI_ASSIGNCMDKEY: + kmap.AssignCmdKey(Platform::LowShortFromLong(wParam), + Platform::HighShortFromLong(wParam), lParam); + break; + + case SCI_CLEARCMDKEY: + kmap.AssignCmdKey(Platform::LowShortFromLong(wParam), + Platform::HighShortFromLong(wParam), SCI_NULL); + break; + + case SCI_CLEARALLCMDKEYS: + kmap.Clear(); + break; + + case SCI_INDICSETSTYLE: + if (wParam <= INDIC_MAX) { + vs.indicators[wParam].style = lParam; + InvalidateStyleRedraw(); + } + break; + + case SCI_INDICGETSTYLE: + return (wParam <= INDIC_MAX) ? vs.indicators[wParam].style : 0; + + case SCI_INDICSETFORE: + if (wParam <= INDIC_MAX) { + vs.indicators[wParam].fore.desired = ColourDesired(lParam); + InvalidateStyleRedraw(); + } + break; + + case SCI_INDICGETFORE: + return (wParam <= INDIC_MAX) ? vs.indicators[wParam].fore.desired.AsLong() : 0; + + case SCI_INDICSETUNDER: + if (wParam <= INDIC_MAX) { + vs.indicators[wParam].under = lParam != 0; + InvalidateStyleRedraw(); + } + break; + + case SCI_INDICGETUNDER: + return (wParam <= INDIC_MAX) ? vs.indicators[wParam].under : 0; + + case SCI_INDICSETALPHA: + if (wParam <= INDIC_MAX && lParam >=0 && lParam <= 100) { + vs.indicators[wParam].fillAlpha = lParam; + InvalidateStyleRedraw(); + } + break; + + case SCI_INDICGETALPHA: + return (wParam <= INDIC_MAX) ? vs.indicators[wParam].fillAlpha : 0; + + case SCI_SETINDICATORCURRENT: + pdoc->decorations.SetCurrentIndicator(wParam); + break; + case SCI_GETINDICATORCURRENT: + return pdoc->decorations.GetCurrentIndicator(); + case SCI_SETINDICATORVALUE: + pdoc->decorations.SetCurrentValue(wParam); + break; + case SCI_GETINDICATORVALUE: + return pdoc->decorations.GetCurrentValue(); + + case SCI_INDICATORFILLRANGE: + pdoc->DecorationFillRange(wParam, pdoc->decorations.GetCurrentValue(), lParam); + break; + + case SCI_INDICATORCLEARRANGE: + pdoc->DecorationFillRange(wParam, 0, lParam); + break; + + case SCI_INDICATORALLONFOR: + return pdoc->decorations.AllOnFor(wParam); + + case SCI_INDICATORVALUEAT: + return pdoc->decorations.ValueAt(wParam, lParam); + + case SCI_INDICATORSTART: + return pdoc->decorations.Start(wParam, lParam); + + case SCI_INDICATOREND: + return pdoc->decorations.End(wParam, lParam); + + case SCI_LINEDOWN: + case SCI_LINEDOWNEXTEND: + case SCI_PARADOWN: + case SCI_PARADOWNEXTEND: + case SCI_LINEUP: + case SCI_LINEUPEXTEND: + case SCI_PARAUP: + case SCI_PARAUPEXTEND: + case SCI_CHARLEFT: + case SCI_CHARLEFTEXTEND: + case SCI_CHARRIGHT: + case SCI_CHARRIGHTEXTEND: + case SCI_WORDLEFT: + case SCI_WORDLEFTEXTEND: + case SCI_WORDRIGHT: + case SCI_WORDRIGHTEXTEND: + case SCI_WORDLEFTEND: + case SCI_WORDLEFTENDEXTEND: + case SCI_WORDRIGHTEND: + case SCI_WORDRIGHTENDEXTEND: + case SCI_HOME: + case SCI_HOMEEXTEND: + case SCI_LINEEND: + case SCI_LINEENDEXTEND: + case SCI_HOMEWRAP: + case SCI_HOMEWRAPEXTEND: + case SCI_LINEENDWRAP: + case SCI_LINEENDWRAPEXTEND: + case SCI_DOCUMENTSTART: + case SCI_DOCUMENTSTARTEXTEND: + case SCI_DOCUMENTEND: + case SCI_DOCUMENTENDEXTEND: + + case SCI_STUTTEREDPAGEUP: + case SCI_STUTTEREDPAGEUPEXTEND: + case SCI_STUTTEREDPAGEDOWN: + case SCI_STUTTEREDPAGEDOWNEXTEND: + + case SCI_PAGEUP: + case SCI_PAGEUPEXTEND: + case SCI_PAGEDOWN: + case SCI_PAGEDOWNEXTEND: + case SCI_EDITTOGGLEOVERTYPE: + case SCI_CANCEL: + case SCI_DELETEBACK: + case SCI_TAB: + case SCI_BACKTAB: + case SCI_NEWLINE: + case SCI_FORMFEED: + case SCI_VCHOME: + case SCI_VCHOMEEXTEND: + case SCI_VCHOMEWRAP: + case SCI_VCHOMEWRAPEXTEND: + case SCI_ZOOMIN: + case SCI_ZOOMOUT: + case SCI_DELWORDLEFT: + case SCI_DELWORDRIGHT: + case SCI_DELWORDRIGHTEND: + case SCI_DELLINELEFT: + case SCI_DELLINERIGHT: + case SCI_LINECOPY: + case SCI_LINECUT: + case SCI_LINEDELETE: + case SCI_LINETRANSPOSE: + case SCI_LINEDUPLICATE: + case SCI_LOWERCASE: + case SCI_UPPERCASE: + case SCI_LINESCROLLDOWN: + case SCI_LINESCROLLUP: + case SCI_WORDPARTLEFT: + case SCI_WORDPARTLEFTEXTEND: + case SCI_WORDPARTRIGHT: + case SCI_WORDPARTRIGHTEXTEND: + case SCI_DELETEBACKNOTLINE: + case SCI_HOMEDISPLAY: + case SCI_HOMEDISPLAYEXTEND: + case SCI_LINEENDDISPLAY: + case SCI_LINEENDDISPLAYEXTEND: + case SCI_LINEDOWNRECTEXTEND: + case SCI_LINEUPRECTEXTEND: + case SCI_CHARLEFTRECTEXTEND: + case SCI_CHARRIGHTRECTEXTEND: + case SCI_HOMERECTEXTEND: + case SCI_VCHOMERECTEXTEND: + case SCI_LINEENDRECTEXTEND: + case SCI_PAGEUPRECTEXTEND: + case SCI_PAGEDOWNRECTEXTEND: + case SCI_SELECTIONDUPLICATE: + return KeyCommand(iMessage); + + case SCI_BRACEHIGHLIGHT: + SetBraceHighlight(static_cast(wParam), lParam, STYLE_BRACELIGHT); + break; + + case SCI_BRACEBADLIGHT: + SetBraceHighlight(static_cast(wParam), -1, STYLE_BRACEBAD); + break; + + case SCI_BRACEMATCH: + // wParam is position of char to find brace for, + // lParam is maximum amount of text to restyle to find it + return pdoc->BraceMatch(wParam, lParam); + + case SCI_GETVIEWEOL: + return vs.viewEOL; + + case SCI_SETVIEWEOL: + vs.viewEOL = wParam != 0; + InvalidateStyleRedraw(); + break; + + case SCI_SETZOOM: + vs.zoomLevel = wParam; + InvalidateStyleRedraw(); + NotifyZoom(); + break; + + case SCI_GETZOOM: + return vs.zoomLevel; + + case SCI_GETEDGECOLUMN: + return theEdge; + + case SCI_SETEDGECOLUMN: + theEdge = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETEDGEMODE: + return vs.edgeState; + + case SCI_SETEDGEMODE: + vs.edgeState = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETEDGECOLOUR: + return vs.edgecolour.desired.AsLong(); + + case SCI_SETEDGECOLOUR: + vs.edgecolour.desired = ColourDesired(wParam); + InvalidateStyleRedraw(); + break; + + case SCI_GETDOCPOINTER: + return reinterpret_cast(pdoc); + + case SCI_SETDOCPOINTER: + CancelModes(); + SetDocPointer(reinterpret_cast(lParam)); + return 0; + + case SCI_CREATEDOCUMENT: { + Document *doc = new Document(); + if (doc) { + doc->AddRef(); + } + return reinterpret_cast(doc); + } + + case SCI_ADDREFDOCUMENT: + (reinterpret_cast(lParam))->AddRef(); + break; + + case SCI_RELEASEDOCUMENT: + (reinterpret_cast(lParam))->Release(); + break; + + case SCI_SETMODEVENTMASK: + modEventMask = wParam; + return 0; + + case SCI_GETMODEVENTMASK: + return modEventMask; + + case SCI_CONVERTEOLS: + pdoc->ConvertLineEnds(wParam); + SetSelection(sel.MainCaret(), sel.MainAnchor()); // Ensure selection inside document + return 0; + + case SCI_SETLENGTHFORENCODE: + lengthForEncode = wParam; + return 0; + + case SCI_SELECTIONISRECTANGLE: + return sel.selType == Selection::selRectangle ? 1 : 0; + + case SCI_SETSELECTIONMODE: { + switch (wParam) { + case SC_SEL_STREAM: + sel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::selStream)); + sel.selType = Selection::selStream; + break; + case SC_SEL_RECTANGLE: + sel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::selRectangle)); + sel.selType = Selection::selRectangle; + break; + case SC_SEL_LINES: + sel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::selLines)); + sel.selType = Selection::selLines; + break; + case SC_SEL_THIN: + sel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::selThin)); + sel.selType = Selection::selThin; + break; + default: + sel.SetMoveExtends(!sel.MoveExtends() || (sel.selType != Selection::selStream)); + sel.selType = Selection::selStream; + } + InvalidateSelection(sel.RangeMain(), true); + } + case SCI_GETSELECTIONMODE: + switch (sel.selType) { + case Selection::selStream: + return SC_SEL_STREAM; + case Selection::selRectangle: + return SC_SEL_RECTANGLE; + case Selection::selLines: + return SC_SEL_LINES; + case Selection::selThin: + return SC_SEL_THIN; + default: // ?! + return SC_SEL_STREAM; + } + case SCI_GETLINESELSTARTPOSITION: + case SCI_GETLINESELENDPOSITION: { + SelectionSegment segmentLine(SelectionPosition(pdoc->LineStart(wParam)), + SelectionPosition(pdoc->LineEnd(wParam))); + for (size_t r=0; r(pdoc->BufferPointer()); + + case SCI_SETEXTRAASCENT: + vs.extraAscent = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETEXTRAASCENT: + return vs.extraAscent; + + case SCI_SETEXTRADESCENT: + vs.extraDescent = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETEXTRADESCENT: + return vs.extraDescent; + + case SCI_MARGINSETSTYLEOFFSET: + vs.marginStyleOffset = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_MARGINGETSTYLEOFFSET: + return vs.marginStyleOffset; + + case SCI_MARGINSETTEXT: + pdoc->MarginSetText(wParam, CharPtrFromSPtr(lParam)); + break; + + case SCI_MARGINGETTEXT: { + const StyledText st = pdoc->MarginStyledText(wParam); + if (lParam) { + if (st.text) + memcpy(CharPtrFromSPtr(lParam), st.text, st.length); + else + strcpy(CharPtrFromSPtr(lParam), ""); + } + return st.length; + } + + case SCI_MARGINSETSTYLE: + pdoc->MarginSetStyle(wParam, lParam); + break; + + case SCI_MARGINGETSTYLE: { + const StyledText st = pdoc->MarginStyledText(wParam); + return st.style; + } + + case SCI_MARGINSETSTYLES: + pdoc->MarginSetStyles(wParam, reinterpret_cast(lParam)); + break; + + case SCI_MARGINGETSTYLES: { + const StyledText st = pdoc->MarginStyledText(wParam); + if (lParam) { + if (st.styles) + memcpy(CharPtrFromSPtr(lParam), st.styles, st.length); + else + strcpy(CharPtrFromSPtr(lParam), ""); + } + return st.styles ? st.length : 0; + } + + case SCI_MARGINTEXTCLEARALL: + pdoc->MarginClearAll(); + break; + + case SCI_ANNOTATIONSETTEXT: + pdoc->AnnotationSetText(wParam, CharPtrFromSPtr(lParam)); + break; + + case SCI_ANNOTATIONGETTEXT: { + const StyledText st = pdoc->AnnotationStyledText(wParam); + if (lParam) { + if (st.text) + memcpy(CharPtrFromSPtr(lParam), st.text, st.length); + else + strcpy(CharPtrFromSPtr(lParam), ""); + } + return st.length; + } + + case SCI_ANNOTATIONGETSTYLE: { + const StyledText st = pdoc->AnnotationStyledText(wParam); + return st.style; + } + + case SCI_ANNOTATIONSETSTYLE: + pdoc->AnnotationSetStyle(wParam, lParam); + break; + + case SCI_ANNOTATIONSETSTYLES: + pdoc->AnnotationSetStyles(wParam, reinterpret_cast(lParam)); + break; + + case SCI_ANNOTATIONGETSTYLES: { + const StyledText st = pdoc->AnnotationStyledText(wParam); + if (lParam) { + if (st.styles) + memcpy(CharPtrFromSPtr(lParam), st.styles, st.length); + else + strcpy(CharPtrFromSPtr(lParam), ""); + } + return st.styles ? st.length : 0; + } + + case SCI_ANNOTATIONGETLINES: + return pdoc->AnnotationLines(wParam); + + case SCI_ANNOTATIONCLEARALL: + pdoc->AnnotationClearAll(); + break; + + case SCI_ANNOTATIONSETVISIBLE: + SetAnnotationVisible(wParam); + break; + + case SCI_ANNOTATIONGETVISIBLE: + return vs.annotationVisible; + + case SCI_ANNOTATIONSETSTYLEOFFSET: + vs.annotationStyleOffset = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_ANNOTATIONGETSTYLEOFFSET: + return vs.annotationStyleOffset; + + case SCI_ADDUNDOACTION: + pdoc->AddUndoAction(wParam, lParam & UNDO_MAY_COALESCE); + break; + + case SCI_SETMULTIPLESELECTION: + multipleSelection = wParam != 0; + InvalidateCaret(); + break; + + case SCI_GETMULTIPLESELECTION: + return multipleSelection; + + case SCI_SETADDITIONALSELECTIONTYPING: + additionalSelectionTyping = wParam != 0; + InvalidateCaret(); + break; + + case SCI_GETADDITIONALSELECTIONTYPING: + return additionalSelectionTyping; + + case SCI_SETMULTIPASTE: + multiPasteMode = wParam; + break; + + case SCI_GETMULTIPASTE: + return multiPasteMode; + + case SCI_SETADDITIONALCARETSBLINK: + additionalCaretsBlink = wParam != 0; + InvalidateCaret(); + break; + + case SCI_GETADDITIONALCARETSBLINK: + return additionalCaretsBlink; + + case SCI_SETADDITIONALCARETSVISIBLE: + additionalCaretsVisible = wParam != 0; + InvalidateCaret(); + break; + + case SCI_GETADDITIONALCARETSVISIBLE: + return additionalCaretsVisible; + + case SCI_GETSELECTIONS: + return sel.Count(); + + case SCI_CLEARSELECTIONS: + sel.Clear(); + Redraw(); + break; + + case SCI_SETSELECTION: + sel.SetSelection(SelectionRange(wParam, lParam)); + Redraw(); + break; + + case SCI_ADDSELECTION: + sel.AddSelection(SelectionRange(wParam, lParam)); + Redraw(); + break; + + case SCI_SETMAINSELECTION: + sel.SetMain(wParam); + Redraw(); + break; + + case SCI_GETMAINSELECTION: + return sel.Main(); + + case SCI_SETSELECTIONNCARET: + sel.Range(wParam).caret.SetPosition(lParam); + Redraw(); + break; + + case SCI_GETSELECTIONNCARET: + return sel.Range(wParam).caret.Position(); + + case SCI_SETSELECTIONNANCHOR: + sel.Range(wParam).anchor.SetPosition(lParam); + Redraw(); + break; + case SCI_GETSELECTIONNANCHOR: + return sel.Range(wParam).anchor.Position(); + + case SCI_SETSELECTIONNCARETVIRTUALSPACE: + sel.Range(wParam).caret.SetVirtualSpace(lParam); + Redraw(); + break; + + case SCI_GETSELECTIONNCARETVIRTUALSPACE: + return sel.Range(wParam).caret.VirtualSpace(); + + case SCI_SETSELECTIONNANCHORVIRTUALSPACE: + sel.Range(wParam).anchor.SetVirtualSpace(lParam); + Redraw(); + break; + + case SCI_GETSELECTIONNANCHORVIRTUALSPACE: + return sel.Range(wParam).anchor.VirtualSpace(); + + case SCI_SETSELECTIONNSTART: + sel.Range(wParam).anchor.SetPosition(lParam); + Redraw(); + break; + + case SCI_GETSELECTIONNSTART: + return sel.Range(wParam).Start().Position(); + + case SCI_SETSELECTIONNEND: + sel.Range(wParam).caret.SetPosition(lParam); + Redraw(); + break; + + case SCI_GETSELECTIONNEND: + return sel.Range(wParam).End().Position(); + + case SCI_SETRECTANGULARSELECTIONCARET: + if (!sel.IsRectangular()) + sel.Clear(); + sel.selType = Selection::selRectangle; + sel.Rectangular().caret.SetPosition(wParam); + SetRectangularRange(); + Redraw(); + break; + + case SCI_GETRECTANGULARSELECTIONCARET: + return sel.Rectangular().caret.Position(); + + case SCI_SETRECTANGULARSELECTIONANCHOR: + if (!sel.IsRectangular()) + sel.Clear(); + sel.selType = Selection::selRectangle; + sel.Rectangular().anchor.SetPosition(wParam); + SetRectangularRange(); + Redraw(); + break; + + case SCI_GETRECTANGULARSELECTIONANCHOR: + return sel.Rectangular().anchor.Position(); + + case SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE: + if (!sel.IsRectangular()) + sel.Clear(); + sel.selType = Selection::selRectangle; + sel.Rectangular().caret.SetVirtualSpace(wParam); + SetRectangularRange(); + Redraw(); + break; + + case SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE: + return sel.Rectangular().caret.VirtualSpace(); + + case SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE: + if (!sel.IsRectangular()) + sel.Clear(); + sel.selType = Selection::selRectangle; + sel.Rectangular().anchor.SetVirtualSpace(wParam); + SetRectangularRange(); + Redraw(); + break; + + case SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE: + return sel.Rectangular().anchor.VirtualSpace(); + + case SCI_SETVIRTUALSPACEOPTIONS: + virtualSpaceOptions = wParam; + break; + + case SCI_GETVIRTUALSPACEOPTIONS: + return virtualSpaceOptions; + + case SCI_SETADDITIONALSELFORE: + vs.selAdditionalForeground.desired = ColourDesired(wParam); + InvalidateStyleRedraw(); + break; + + case SCI_SETADDITIONALSELBACK: + vs.selAdditionalBackground.desired = ColourDesired(wParam); + InvalidateStyleRedraw(); + break; + + case SCI_SETADDITIONALSELALPHA: + vs.selAdditionalAlpha = wParam; + InvalidateStyleRedraw(); + break; + + case SCI_GETADDITIONALSELALPHA: + return vs.selAdditionalAlpha; + + case SCI_SETADDITIONALCARETFORE: + vs.additionalCaretColour.desired = ColourDesired(wParam); + InvalidateStyleRedraw(); + break; + + case SCI_GETADDITIONALCARETFORE: + return vs.additionalCaretColour.desired.AsLong(); + + case SCI_ROTATESELECTION: + sel.RotateMain(); + InvalidateSelection(sel.RangeMain(), true); + break; + + case SCI_SWAPMAINANCHORCARET: + InvalidateSelection(sel.RangeMain()); + sel.RangeMain() = SelectionRange(sel.RangeMain().anchor, sel.RangeMain().caret); + break; + + default: + return DefWndProc(iMessage, wParam, lParam); + } + //Platform::DebugPrintf("end wnd proc\n"); + return 0l; +} diff --git a/sdk/wxscintilla/src/scintilla/src/Editor.h b/sdk/wxscintilla/src/scintilla/src/Editor.h new file mode 100644 index 0000000..d3df42d --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/Editor.h @@ -0,0 +1,590 @@ +// Scintilla source code edit control +/** @file Editor.h + ** Defines the main editor class. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef EDITOR_H +#define EDITOR_H + +// Eran Ifrah +#include +// Eran Ifrah - END + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +/** + */ +class Caret { +public: + bool active; + bool on; + int period; + + Caret(); +}; + +/** + */ +class Timer { +public: + bool ticking; + int ticksToWait; + enum {tickSize = 100}; + TickerID tickerID; + + Timer(); +}; + +/** + */ +class Idler { +public: + bool state; + IdlerID idlerID; + + Idler(); +}; + +/** + * When platform has a way to generate an event before painting, + * accumulate needed styling range in StyleNeeded to avoid unnecessary work. + */ +class StyleNeeded { +public: + bool active; + Position upTo; + + StyleNeeded() : active(false), upTo(0) {} + void Reset() { + active = false; + upTo = 0; + } + void NeedUpTo(Position pos) { + if (upTo < pos) + upTo = pos; + } +}; + +/** + * Hold a piece of text selected for copying or dragging. + * The text is expected to hold a terminating '\0' and this is counted in len. + */ +class SelectionText { +public: + char *s; + int len; + bool rectangular; + bool lineCopy; + int codePage; + int characterSet; + SelectionText() : s(0), len(0), rectangular(false), lineCopy(false), codePage(0), characterSet(0) {} + ~SelectionText() { + Free(); + } + void Free() { + Set(0, 0, 0, 0, false, false); + } + void Set(char *s_, int len_, int codePage_, int characterSet_, bool rectangular_, bool lineCopy_) { + delete []s; + s = s_; + if (s) + len = len_; + else + len = 0; + codePage = codePage_; + characterSet = characterSet_; + rectangular = rectangular_; + lineCopy = lineCopy_; + } + void Copy(const char *s_, int len_, int codePage_, int characterSet_, bool rectangular_, bool lineCopy_) { + delete []s; + s = 0; + s = new char[len_]; + len = len_; + for (int i = 0; i < len_; i++) { + s[i] = s_[i]; + } + codePage = codePage_; + characterSet = characterSet_; + rectangular = rectangular_; + lineCopy = lineCopy_; + } + void Copy(const SelectionText &other) { + Copy(other.s, other.len, other.codePage, other.characterSet, other.rectangular, other.lineCopy); + } +}; + +/** + */ +class Editor : public DocWatcher { + // Private so Editor objects can not be copied + Editor(const Editor &); + Editor &operator=(const Editor &); + +protected: // ScintillaBase subclass needs access to much of Editor + + /** On GTK+, Scintilla is a container widget holding two scroll bars + * whereas on Windows there is just one window with both scroll bars turned on. */ + Window wMain; ///< The Scintilla parent window + + /** Style resources may be expensive to allocate so are cached between uses. + * When a style attribute is changed, this cache is flushed. */ + bool stylesValid; + ViewStyle vs; + Palette palette; + + int printMagnification; + int printColourMode; + int printWrapState; + int cursorMode; + int controlCharSymbol; + + bool hasFocus; + bool hideSelection; + bool inOverstrike; + bool mouseDownCaptures; + + /** In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to + * the screen. This avoids flashing but is about 30% slower. */ + bool bufferedDraw; + /** In twoPhaseDraw mode, drawing is performed in two phases, first the background + * and then the foreground. This avoids chopping off characters that overlap the next run. */ + bool twoPhaseDraw; + + int xOffset; ///< Horizontal scrolled amount in pixels + int xCaretMargin; ///< Ensure this many pixels visible on both sides of caret + bool horizontalScrollBarVisible; + int scrollWidth; + bool trackLineWidth; + int lineWidthMaxSeen; + bool verticalScrollBarVisible; + bool endAtLastLine; + bool caretSticky; + bool multipleSelection; + bool additionalSelectionTyping; + int multiPasteMode; + bool additionalCaretsBlink; + bool additionalCaretsVisible; + + int virtualSpaceOptions; + + Surface *pixmapLine; + Surface *pixmapSelMargin; + Surface *pixmapSelPattern; + Surface *pixmapIndentGuide; + Surface *pixmapIndentGuideHighlight; + + LineLayoutCache llc; + PositionCache posCache; + + KeyMap kmap; + + Caret caret; + Timer timer; + Timer autoScrollTimer; + enum { autoScrollDelay = 200 }; + + Idler idler; + + Point lastClick; + unsigned int lastClickTime; + int dwellDelay; + int ticksToDwell; + bool dwelling; + enum { selChar, selWord, selLine } selectionType; + Point ptMouseLast; + enum { ddNone, ddInitial, ddDragging } inDragDrop; + bool dropWentOutside; + SelectionPosition posDrag; + SelectionPosition posDrop; + int lastXChosen; + int lineAnchor; + int originalAnchorPos; + int targetStart; + int targetEnd; + int searchFlags; + int topLine; + int posTopLine; + int lengthForEncode; + + bool needUpdateUI; + Position braces[2]; + int bracesMatchStyle; + int highlightGuideColumn; + + int theEdge; + + enum { notPainting, painting, paintAbandoned } paintState; + PRectangle rcPaint; + bool paintingAllText; + StyleNeeded styleNeeded; + + int modEventMask; + + SelectionText drag; + Selection sel; + bool primarySelection; + + int caretXPolicy; + int caretXSlop; ///< Ensure this many pixels visible on both sides of caret + + int caretYPolicy; + int caretYSlop; ///< Ensure this many lines visible on both sides of caret + + int visiblePolicy; + int visibleSlop; + + int searchAnchor; + + bool recordingMacro; + + int foldFlags; + ContractionState cs; + + // Hotspot support + int hsStart; + int hsEnd; + + // Wrapping support + enum { eWrapNone, eWrapWord, eWrapChar } wrapState; + enum { wrapLineLarge = 0x7ffffff }; + int wrapWidth; + int wrapStart; + int wrapEnd; + int wrapVisualFlags; + int wrapVisualFlagsLocation; + int wrapVisualStartIndent; + int wrapAddIndent; // This will be added to initial indent of line + int wrapIndentMode; // SC_WRAPINDENT_FIXED, _SAME, _INDENT + + bool convertPastes; + + Document *pdoc; + + Editor(); + virtual ~Editor(); + virtual void Initialise() = 0; + virtual void Finalise(); + + void InvalidateStyleData(); + void InvalidateStyleRedraw(); + virtual void RefreshColourPalette(Palette &pal, bool want); + void RefreshStyleData(); + void DropGraphics(); + + virtual PRectangle GetClientRectangle(); + PRectangle GetTextRectangle(); + + int LinesOnScreen(); + int LinesToScroll(); + int MaxScrollPos(); + SelectionPosition ClampPositionIntoDocument(SelectionPosition sp) const; + Point LocationFromPosition(SelectionPosition pos); + Point LocationFromPosition(int pos); + int XFromPosition(int pos); + int XFromPosition(SelectionPosition sp); + SelectionPosition SPositionFromLocation(Point pt, bool canReturnInvalid=false, bool charPosition=false, bool virtualSpace=true); + int PositionFromLocation(Point pt, bool canReturnInvalid=false, bool charPosition=false); + SelectionPosition SPositionFromLineX(int lineDoc, int x); + int PositionFromLineX(int line, int x); + int LineFromLocation(Point pt); + void SetTopLine(int topLineNew); + + bool AbandonPaint(); + void RedrawRect(PRectangle rc); + void Redraw(); + void RedrawSelMargin(int line=-1, bool allAfter=false); + PRectangle RectangleFromRange(int start, int end); + void InvalidateRange(int start, int end); + + bool UserVirtualSpace() const { + return ((virtualSpaceOptions & SCVS_USERACCESSIBLE) != 0); + } + int CurrentPosition(); + bool SelectionEmpty(); + SelectionPosition SelectionStart(); + SelectionPosition SelectionEnd(); + void SetRectangularRange(); + void ThinRectangularRange(); + void InvalidateSelection(SelectionRange newMain, bool invalidateWholeSelection=false); + void SetSelection(SelectionPosition currentPos_, SelectionPosition anchor_); + void SetSelection(int currentPos_, int anchor_); + void SetSelection(SelectionPosition currentPos_); + void SetSelection(int currentPos_); + void SetEmptySelection(SelectionPosition currentPos_); + void SetEmptySelection(int currentPos_); + bool RangeContainsProtected(int start, int end) const; + bool SelectionContainsProtected(); + int MovePositionOutsideChar(int pos, int moveDir, bool checkLineEnd=true) const; + SelectionPosition MovePositionOutsideChar(SelectionPosition pos, int moveDir, bool checkLineEnd=true) const; + int MovePositionTo(SelectionPosition newPos, Selection::selTypes sel=Selection::noSel, bool ensureVisible=true); + int MovePositionTo(int newPos, Selection::selTypes sel=Selection::noSel, bool ensureVisible=true); + SelectionPosition MovePositionSoVisible(SelectionPosition pos, int moveDir); + SelectionPosition MovePositionSoVisible(int pos, int moveDir); + Point PointMainCaret(); + void SetLastXChosen(); + + void ScrollTo(int line, bool moveThumb=true); + virtual void ScrollText(int linesToMove); + void HorizontalScrollTo(int xPos); + void MoveCaretInsideView(bool ensureVisible=true); + int DisplayFromPosition(int pos); + + struct XYScrollPosition { + int xOffset; + int topLine; + XYScrollPosition(int xOffset_, int topLine_) : xOffset(xOffset_), topLine(topLine_) {} + }; + XYScrollPosition XYScrollToMakeVisible(const bool useMargin, const bool vert, const bool horiz); + void SetXYScroll(XYScrollPosition newXY); + void EnsureCaretVisible(bool useMargin=true, bool vert=true, bool horiz=true); + void ShowCaretAtCurrentPosition(); + void DropCaret(); + void InvalidateCaret(); + virtual void UpdateSystemCaret(); + + void NeedWrapping(int docLineStart = 0, int docLineEnd = wrapLineLarge); + bool WrapOneLine(Surface *surface, int lineToWrap); + bool WrapLines(bool fullWrap, int priorityWrapLineStart); + void LinesJoin(); + void LinesSplit(int pixelWidth); + + int SubstituteMarkerIfEmpty(int markerCheck, int markerDefault); + void PaintSelMargin(Surface *surface, PRectangle &rc); + LineLayout *RetrieveLineLayout(int lineNumber); + void LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayout *ll, + int width=LineLayout::wrapWidthInfinite); + ColourAllocated SelectionBackground(ViewStyle &vsDraw, bool main); + ColourAllocated TextBackground(ViewStyle &vsDraw, bool overrideBackground, ColourAllocated background, int inSelection, bool inHotspot, int styleMain, int i, LineLayout *ll); + void DrawIndentGuide(Surface *surface, int lineVisible, int lineHeight, int start, PRectangle rcSegment, bool highlight); + void DrawWrapMarker(Surface *surface, PRectangle rcPlace, bool isEndMarker, ColourAllocated wrapColour); + void DrawEOL(Surface *surface, ViewStyle &vsDraw, PRectangle rcLine, LineLayout *ll, + int line, int lineEnd, int xStart, int subLine, int subLineStart, + bool overrideBackground, ColourAllocated background, + bool drawWrapMark, ColourAllocated wrapColour); + void DrawIndicators(Surface *surface, ViewStyle &vsDraw, int line, int xStart, + PRectangle rcLine, LineLayout *ll, int subLine, int lineEnd, bool under); + void DrawAnnotation(Surface *surface, ViewStyle &vsDraw, int line, int xStart, + PRectangle rcLine, LineLayout *ll, int subLine); + void DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVisible, int xStart, + PRectangle rcLine, LineLayout *ll, int subLine); + void DrawBlockCaret(Surface *surface, ViewStyle &vsDraw, LineLayout *ll, int subLine, + int xStart, int offset, int posCaret, PRectangle rcCaret, ColourAllocated caretColour); + void DrawCarets(Surface *surface, ViewStyle &vsDraw, int line, int xStart, + PRectangle rcLine, LineLayout *ll, int subLine); + void RefreshPixMaps(Surface *surfaceWindow); + void Paint(Surface *surfaceWindow, PRectangle rcArea); + long FormatRange(bool draw, Sci_RangeToFormat *pfr); + int TextWidth(int style, const char *text); + + virtual void SetVerticalScrollPos() = 0; + virtual void SetHorizontalScrollPos() = 0; + virtual bool ModifyScrollBars(int nMax, int nPage) = 0; + virtual void ReconfigureScrollBars(); + void SetScrollBars(); + void ChangeSize(); + + void FilterSelections(); + int InsertSpace(int position, unsigned int spaces); + void AddChar(char ch); + virtual void AddCharUTF(char *s, unsigned int len, bool treatAsDBCS=false); + void InsertPaste(SelectionPosition selStart, const char *text, int len); + void ClearSelection(); + void ClearAll(); + void ClearDocumentStyle(); + void Cut(); + void PasteRectangular(SelectionPosition pos, const char *ptr, int len); + virtual void Copy() = 0; + virtual void CopyAllowLine(); + virtual bool CanPaste(); + virtual void Paste() = 0; + void Clear(); + void SelectAll(); + void Undo(); + void Redo(); + void DelChar(); + void DelCharBack(bool allowLineStartDeletion); + virtual void ClaimSelection() = 0; + + virtual void NotifyChange() = 0; + virtual void NotifyFocus(bool focus); + virtual int GetCtrlID() { return ctrlID; } + virtual void NotifyParent(SCNotification scn) = 0; + virtual void NotifyStyleToNeeded(int endStyleNeeded); + void NotifyChar(int ch); + void NotifySavePoint(bool isSavePoint); + void NotifyModifyAttempt(); + virtual void NotifyDoubleClick(Point pt, bool shift, bool ctrl, bool alt); + void NotifyHotSpotClicked(int position, bool shift, bool ctrl, bool alt); + void NotifyHotSpotDoubleClicked(int position, bool shift, bool ctrl, bool alt); + void NotifyUpdateUI(); + void NotifyPainted(); + void NotifyIndicatorClick(bool click, int position, bool shift, bool ctrl, bool alt); + bool NotifyMarginClick(Point pt, bool shift, bool ctrl, bool alt); + void NotifyNeedShown(int pos, int len); + void NotifyDwelling(Point pt, bool state); + void NotifyZoom(); + + void NotifyModifyAttempt(Document *document, void *userData); + void NotifySavePoint(Document *document, void *userData, bool atSavePoint); + void CheckModificationForWrap(DocModification mh); + void NotifyModified(Document *document, DocModification mh, void *userData); + void NotifyDeleted(Document *document, void *userData); + void NotifyStyleNeeded(Document *doc, void *userData, int endPos); + void NotifyMacroRecord(unsigned int iMessage, uptr_t wParam, sptr_t lParam); + + void PageMove(int direction, Selection::selTypes sel=Selection::noSel, bool stuttered = false); + enum { cmSame, cmUpper, cmLower } caseMap; + virtual std::string CaseMapString(const std::string &s, int caseMapping); + void ChangeCaseOfSelection(int caseMapping); + void LineTranspose(); + void Duplicate(bool forLine); + virtual void CancelModes(); + void NewLine(); + void CursorUpOrDown(int direction, Selection::selTypes sel=Selection::noSel); + void ParaUpOrDown(int direction, Selection::selTypes sel=Selection::noSel); + int StartEndDisplayLine(int pos, bool start); + virtual int KeyCommand(unsigned int iMessage); + virtual int KeyDefault(int /* key */, int /*modifiers*/); + int KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed=0); + + int GetWhitespaceVisible(); + void SetWhitespaceVisible(int view); + + void Indent(bool forwards); + + virtual CaseFolder *CaseFolderForEncoding(); + long FindText(uptr_t wParam, sptr_t lParam); + void SearchAnchor(); + long SearchText(unsigned int iMessage, uptr_t wParam, sptr_t lParam); + long SearchInTarget(const char *text, int length); + void GoToLine(int lineNo); + + virtual void CopyToClipboard(const SelectionText &selectedText) = 0; + char *CopyRange(int start, int end); + void CopySelectionRange(SelectionText *ss, bool allowLineCopy=false); + void CopyRangeToClipboard(int start, int end); + void CopyText(int length, const char *text); + void SetDragPosition(SelectionPosition newPos); + virtual void DisplayCursor(Window::Cursor c); + virtual bool DragThreshold(Point ptStart, Point ptNow); + virtual void StartDrag(); + void DropAt(SelectionPosition position, const char *value, bool moving, bool rectangular); + /** PositionInSelection returns true if position in selection. */ + bool PositionInSelection(int pos); + bool PointInSelection(Point pt); + bool PointInSelMargin(Point pt); + void LineSelection(int lineCurrent_, int lineAnchor_); + void DwellEnd(bool mouseMoved); + void MouseLeave(); + virtual void ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt); + void ButtonMove(Point pt); + void ButtonUp(Point pt, unsigned int curTime, bool ctrl); + + void Tick(); + bool Idle(); + virtual void SetTicking(bool on) = 0; + virtual bool SetIdle(bool) { return false; } + virtual void SetMouseCapture(bool on) = 0; + virtual bool HaveMouseCapture() = 0; + void SetFocusState(bool focusState); + + int PositionAfterArea(PRectangle rcArea); + void StyleToPositionInView(Position pos); + void IdleStyling(); + virtual void QueueStyling(int upTo); + + virtual bool PaintContains(PRectangle rc); + bool PaintContainsMargin(); + void CheckForChangeOutsidePaint(Range r); + void SetBraceHighlight(Position pos0, Position pos1, int matchStyle); + + void SetAnnotationHeights(int start, int end); + void SetDocPointer(Document *document); + + void SetAnnotationVisible(int visible); + + void Expand(int &line, bool doExpand); + void ToggleContraction(int line); + void EnsureLineVisible(int lineDoc, bool enforcePolicy); + int GetTag(char *tagValue, int tagNumber); + int ReplaceTarget(bool replacePatterns, const char *text, int length=-1); + + bool PositionIsHotspot(int position); + bool PointIsHotspot(Point pt); + void SetHotSpotRange(Point *pt); + void GetHotSpotRange(int& hsStart, int& hsEnd); + + int CodePage() const; + virtual bool ValidCodePage(int /* codePage */) const { return true; } + int WrapCount(int line); + void AddStyledText(char *buffer, int appendLength); + + virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) = 0; + void StyleSetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam); + sptr_t StyleGetMessage(unsigned int iMessage, uptr_t wParam, sptr_t lParam); + + static const char *StringFromEOLMode(int eolMode); + + static sptr_t StringResult(sptr_t lParam, const char *val); + +public: + // Public so the COM thunks can access it. + bool IsUnicodeMode() const; + // Public so scintilla_send_message can use it. + virtual sptr_t WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam); + // Public so scintilla_set_id can use it. + int ctrlID; + // Public so COM methods for drag and drop can set it. + int errorStatus; + friend class AutoSurface; + friend class SelectionLineIterator; +}; + +/** + * A smart pointer class to ensure Surfaces are set up and deleted correctly. + */ +class AutoSurface { +private: + Surface *surf; +public: + AutoSurface(Editor *ed) : surf(0) { + if (ed->wMain.GetID()) { + surf = Surface::Allocate(); + if (surf) { + surf->Init(ed->wMain.GetID()); + surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage()); + surf->SetDBCSMode(ed->CodePage()); + } + } + } + AutoSurface(SurfaceID sid, Editor *ed) : surf(0) { + if (ed->wMain.GetID()) { + surf = Surface::Allocate(); + if (surf) { + surf->Init(sid, ed->wMain.GetID()); + surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage()); + surf->SetDBCSMode(ed->CodePage()); + } + } + } + ~AutoSurface() { + delete surf; + } + Surface *operator->() const { + return surf; + } + operator Surface *() const { + return surf; + } +}; + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/ExternalLexer.cxx b/sdk/wxscintilla/src/scintilla/src/ExternalLexer.cxx new file mode 100644 index 0000000..0f17afb --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/ExternalLexer.cxx @@ -0,0 +1,262 @@ +// Scintilla source code edit control +/** @file ExternalLexer.cxx + ** Support external lexers in DLLs. + **/ +// Copyright 2001 Simon Steele , portions copyright Neil Hodgson. +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include + +#include "Platform.h" + +#include "Scintilla.h" + +#include "SciLexer.h" +#include "PropSet.h" +#include "Accessor.h" +#include "DocumentAccessor.h" +#include "KeyWords.h" +#include "ExternalLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +LexerManager *LexerManager::theInstance = NULL; + +//------------------------------------------ +// +// ExternalLexerModule +// +//------------------------------------------ + +char **WordListsToStrings(WordList *val[]) { + int dim = 0; + while (val[dim]) + dim++; + char **wls = new char * [dim + 1]; + for (int i = 0;i < dim;i++) { + std::string words; + words = ""; + for (int n = 0; n < val[i]->len; n++) { + words += val[i]->words[n]; + if (n != val[i]->len - 1) + words += " "; + } + wls[i] = new char[words.length() + 1]; + strcpy(wls[i], words.c_str()); + } + wls[dim] = 0; + return wls; +} + +void DeleteWLStrings(char *strs[]) { + int dim = 0; + while (strs[dim]) { + delete strs[dim]; + dim++; + } + delete [] strs; +} + +void ExternalLexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const { + if (!fneLexer) + return ; + + char **kwds = WordListsToStrings(keywordlists); + char *ps = styler.GetProperties(); + + // The accessor passed in is always a DocumentAccessor so this cast and the subsequent + // access will work. Can not use the stricter dynamic_cast as that requires RTTI. + DocumentAccessor &da = static_cast(styler); + WindowID wID = da.GetWindow(); + + fneLexer(externalLanguage, startPos, lengthDoc, initStyle, kwds, wID, ps); + + delete ps; + DeleteWLStrings(kwds); +} + +void ExternalLexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const { + if (!fneFolder) + return ; + + char **kwds = WordListsToStrings(keywordlists); + char *ps = styler.GetProperties(); + + // The accessor passed in is always a DocumentAccessor so this cast and the subsequent + // access will work. Can not use the stricter dynamic_cast as that requires RTTI. + DocumentAccessor &da = static_cast(styler); + WindowID wID = da.GetWindow(); + + fneFolder(externalLanguage, startPos, lengthDoc, initStyle, kwds, wID, ps); + + delete ps; + DeleteWLStrings(kwds); +} + +void ExternalLexerModule::SetExternal(ExtLexerFunction fLexer, ExtFoldFunction fFolder, int index) { + fneLexer = fLexer; + fneFolder = fFolder; + externalLanguage = index; +} + +//------------------------------------------ +// +// LexerLibrary +// +//------------------------------------------ + +LexerLibrary::LexerLibrary(const char* ModuleName) { + // Initialise some members... + first = NULL; + last = NULL; + + // Load the DLL + lib = DynamicLibrary::Load(ModuleName); + if (lib->IsValid()) { + m_sModuleName = ModuleName; + //Cannot use reinterpret_cast because: ANSI C++ forbids casting between pointers to functions and objects + GetLexerCountFn GetLexerCount = (GetLexerCountFn)(sptr_t)lib->FindFunction("GetLexerCount"); + + if (GetLexerCount) { + ExternalLexerModule *lex; + LexerMinder *lm; + + // Find functions in the DLL + GetLexerNameFn GetLexerName = (GetLexerNameFn)(sptr_t)lib->FindFunction("GetLexerName"); + ExtLexerFunction Lexer = (ExtLexerFunction)(sptr_t)lib->FindFunction("Lex"); + ExtFoldFunction Folder = (ExtFoldFunction)(sptr_t)lib->FindFunction("Fold"); + + // Assign a buffer for the lexer name. + char lexname[100]; + strcpy(lexname, ""); + + int nl = GetLexerCount(); + + for (int i = 0; i < nl; i++) { + GetLexerName(i, lexname, 100); + lex = new ExternalLexerModule(SCLEX_AUTOMATIC, NULL, lexname, NULL); + + // Create a LexerMinder so we don't leak the ExternalLexerModule... + lm = new LexerMinder; + lm->self = lex; + lm->next = NULL; + if (first != NULL) { + last->next = lm; + last = lm; + } else { + first = lm; + last = lm; + } + + // The external lexer needs to know how to call into its DLL to + // do its lexing and folding, we tell it here. Folder may be null. + lex->SetExternal(Lexer, Folder, i); + } + } + } + next = NULL; +} + +LexerLibrary::~LexerLibrary() { + Release(); + delete lib; +} + +void LexerLibrary::Release() { + //TODO maintain a list of lexers created, and delete them! + LexerMinder *lm; + LexerMinder *lmNext; + lm = first; + while (NULL != lm) { + lmNext = lm->next; + delete lm->self; + delete lm; + lm = lmNext; + } + + first = NULL; + last = NULL; +} + +//------------------------------------------ +// +// LexerManager +// +//------------------------------------------ + +/// Return the single LexerManager instance... +LexerManager *LexerManager::GetInstance() { + if(!theInstance) + theInstance = new LexerManager; + return theInstance; +} + +/// Delete any LexerManager instance... +void LexerManager::DeleteInstance() { + delete theInstance; + theInstance = NULL; + } + +/// protected constructor - this is a singleton... +LexerManager::LexerManager() { + first = NULL; + last = NULL; +} + +LexerManager::~LexerManager() { + Clear(); +} + +void LexerManager::Load(const char *path) { + LoadLexerLibrary(path); +} + +void LexerManager::LoadLexerLibrary(const char *module) { + for (LexerLibrary *ll = first; ll; ll= ll->next) { + if (strcmp(ll->m_sModuleName.c_str(), module) == 0) + return; + } + LexerLibrary *lib = new LexerLibrary(module); + if (NULL != first) { + last->next = lib; + last = lib; + } else { + first = lib; + last = lib; + } +} + +void LexerManager::Clear() { + if (NULL != first) { + LexerLibrary *cur = first; + LexerLibrary *next; + while (cur) { + next = cur->next; + delete cur; + cur = next; + } + first = NULL; + last = NULL; + } +} + +//------------------------------------------ +// +// LexerManager +// +//------------------------------------------ + +LMMinder::~LMMinder() { + LexerManager::DeleteInstance(); +} + +LMMinder minder; diff --git a/sdk/wxscintilla/src/scintilla/src/ExternalLexer.h b/sdk/wxscintilla/src/scintilla/src/ExternalLexer.h new file mode 100644 index 0000000..c4bfbf4 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/ExternalLexer.h @@ -0,0 +1,104 @@ +// Scintilla source code edit control +/** @file ExternalLexer.h + ** Support external lexers in DLLs. + **/ +// Copyright 2001 Simon Steele , portions copyright Neil Hodgson. +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef EXTERNALLEXER_H +#define EXTERNALLEXER_H + +#if PLAT_WIN +#define EXT_LEXER_DECL __stdcall +#else +#define EXT_LEXER_DECL +#endif + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +// External Lexer function definitions... +typedef void (EXT_LEXER_DECL *ExtLexerFunction)(unsigned int lexer, unsigned int startPos, int length, int initStyle, + char *words[], WindowID window, char *props); +typedef void (EXT_LEXER_DECL *ExtFoldFunction)(unsigned int lexer, unsigned int startPos, int length, int initStyle, + char *words[], WindowID window, char *props); +typedef void* (EXT_LEXER_DECL *GetLexerFunction)(unsigned int Index); +typedef int (EXT_LEXER_DECL *GetLexerCountFn)(); +typedef void (EXT_LEXER_DECL *GetLexerNameFn)(unsigned int Index, char *name, int buflength); + +//class DynamicLibrary; + +/// Sub-class of LexerModule to use an external lexer. +class ExternalLexerModule : protected LexerModule { +protected: + ExtLexerFunction fneLexer; + ExtFoldFunction fneFolder; + int externalLanguage; + char name[100]; +public: + ExternalLexerModule(int language_, LexerFunction fnLexer_, + const char *languageName_=0, LexerFunction fnFolder_=0) : LexerModule(language_, fnLexer_, 0, fnFolder_){ + strncpy(name, languageName_, sizeof(name)); + name[sizeof(name)-1] = '\0'; + languageName = name; + } + virtual void Lex(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const; + virtual void Fold(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const; + virtual void SetExternal(ExtLexerFunction fLexer, ExtFoldFunction fFolder, int index); +}; + +/// LexerMinder points to an ExternalLexerModule - so we don't leak them. +class LexerMinder { +public: + ExternalLexerModule *self; + LexerMinder *next; +}; + +/// LexerLibrary exists for every External Lexer DLL, contains LexerMinders. +class LexerLibrary { + DynamicLibrary *lib; + LexerMinder *first; + LexerMinder *last; + +public: + LexerLibrary(const char* ModuleName); + ~LexerLibrary(); + void Release(); + + LexerLibrary *next; + std::string m_sModuleName; +}; + +/// LexerManager manages external lexers, contains LexerLibrarys. +class LexerManager { +public: + ~LexerManager(); + + static LexerManager *GetInstance(); + static void DeleteInstance(); + + void Load(const char* path); + void Clear(); + +private: + LexerManager(); + static LexerManager *theInstance; + + void LoadLexerLibrary(const char* module); + LexerLibrary *first; + LexerLibrary *last; +}; + +class LMMinder { +public: + ~LMMinder(); +}; + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/FontQuality.h b/sdk/wxscintilla/src/scintilla/src/FontQuality.h new file mode 100644 index 0000000..2c8d548 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/FontQuality.h @@ -0,0 +1,12 @@ +// Scintilla source code edit control +/** @file FontQuality.h + ** Definitions to control font anti-aliasing. + **/ +// Copyright 1998-2009 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#define SC_EFF_QUALITY_MASK 0xF +#define SC_EFF_QUALITY_DEFAULT 0 +#define SC_EFF_QUALITY_NON_ANTIALIASED 1 +#define SC_EFF_QUALITY_ANTIALIASED 2 +#define SC_EFF_QUALITY_LCD_OPTIMIZED 3 diff --git a/sdk/wxscintilla/src/scintilla/src/Indicator.cxx b/sdk/wxscintilla/src/scintilla/src/Indicator.cxx new file mode 100644 index 0000000..da95312 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/Indicator.cxx @@ -0,0 +1,81 @@ +// Scintilla source code edit control +/** @file Indicator.cxx + ** Defines the style of indicators which are text decorations such as underlining. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include "Platform.h" + +#include "Scintilla.h" +#include "Indicator.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +void Indicator::Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine) { + surface->PenColour(fore.allocated); + int ymid = (rc.bottom + rc.top) / 2; + if (style == INDIC_SQUIGGLE) { + surface->MoveTo(rc.left, rc.top); + int x = rc.left + 2; + int y = 2; + while (x < rc.right) { + surface->LineTo(x, rc.top + y); + x += 2; + y = 2 - y; + } + surface->LineTo(rc.right, rc.top + y); // Finish the line + } else if (style == INDIC_TT) { + surface->MoveTo(rc.left, ymid); + int x = rc.left + 5; + while (x < rc.right) { + surface->LineTo(x, ymid); + surface->MoveTo(x-3, ymid); + surface->LineTo(x-3, ymid+2); + x++; + surface->MoveTo(x, ymid); + x += 5; + } + surface->LineTo(rc.right, ymid); // Finish the line + if (x - 3 <= rc.right) { + surface->MoveTo(x-3, ymid); + surface->LineTo(x-3, ymid+2); + } + } else if (style == INDIC_DIAGONAL) { + int x = rc.left; + while (x < rc.right) { + surface->MoveTo(x, rc.top+2); + int endX = x+3; + int endY = rc.top - 1; + if (endX > rc.right) { + endY += endX - rc.right; + endX = rc.right; + } + surface->LineTo(endX, endY); + x += 4; + } + } else if (style == INDIC_STRIKE) { + surface->MoveTo(rc.left, rc.top - 4); + surface->LineTo(rc.right, rc.top - 4); + } else if (style == INDIC_HIDDEN) { + // Draw nothing + } else if (style == INDIC_BOX) { + surface->MoveTo(rc.left, ymid+1); + surface->LineTo(rc.right, ymid+1); + surface->LineTo(rc.right, rcLine.top+1); + surface->LineTo(rc.left, rcLine.top+1); + surface->LineTo(rc.left, ymid+1); + } else if (style == INDIC_ROUNDBOX) { + PRectangle rcBox = rcLine; + rcBox.top = rcLine.top + 1; + rcBox.left = rc.left; + rcBox.right = rc.right; + surface->AlphaRectangle(rcBox, 1, fore.allocated, fillAlpha, fore.allocated, 50, 0); + } else { // Either INDIC_PLAIN or unknown + surface->MoveTo(rc.left, ymid); + surface->LineTo(rc.right, ymid); + } +} + diff --git a/sdk/wxscintilla/src/scintilla/src/Indicator.h b/sdk/wxscintilla/src/scintilla/src/Indicator.h new file mode 100644 index 0000000..42b56f0 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/Indicator.h @@ -0,0 +1,32 @@ +// Scintilla source code edit control +/** @file Indicator.h + ** Defines the style of indicators which are text decorations such as underlining. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef INDICATOR_H +#define INDICATOR_H + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +/** + */ +class Indicator { +public: + int style; + bool under; + ColourPair fore; + int fillAlpha; + Indicator() : style(INDIC_PLAIN), under(false), fore(ColourDesired(0,0,0)), fillAlpha(30) { + } + void Draw(Surface *surface, const PRectangle &rc, const PRectangle &rcLine); +}; + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/KeyMap.cxx b/sdk/wxscintilla/src/scintilla/src/KeyMap.cxx new file mode 100644 index 0000000..bab5e27 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/KeyMap.cxx @@ -0,0 +1,152 @@ +// Scintilla source code edit control +/** @file KeyMap.cxx + ** Defines a mapping between keystrokes and commands. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include "Platform.h" + +#include "Scintilla.h" + +#include "KeyMap.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +KeyMap::KeyMap() : kmap(0), len(0), alloc(0) { + for (int i = 0; MapDefault[i].key; i++) { + AssignCmdKey(MapDefault[i].key, + MapDefault[i].modifiers, + MapDefault[i].msg); + } +} + +KeyMap::~KeyMap() { + Clear(); +} + +void KeyMap::Clear() { + delete []kmap; + kmap = 0; + len = 0; + alloc = 0; +} + +void KeyMap::AssignCmdKey(int key, int modifiers, unsigned int msg) { + if ((len+1) >= alloc) { + KeyToCommand *ktcNew = new KeyToCommand[alloc + 5]; + if (!ktcNew) + return; + for (int k = 0; k < len; k++) + ktcNew[k] = kmap[k]; + alloc += 5; + delete []kmap; + kmap = ktcNew; + } + for (int keyIndex = 0; keyIndex < len; keyIndex++) { + if ((key == kmap[keyIndex].key) && (modifiers == kmap[keyIndex].modifiers)) { + kmap[keyIndex].msg = msg; + return; + } + } + kmap[len].key = key; + kmap[len].modifiers = modifiers; + kmap[len].msg = msg; + len++; +} + +unsigned int KeyMap::Find(int key, int modifiers) { + for (int i = 0; i < len; i++) { + if ((key == kmap[i].key) && (modifiers == kmap[i].modifiers)) { + return kmap[i].msg; + } + } + return 0; +} + +const KeyToCommand KeyMap::MapDefault[] = { + {SCK_DOWN, SCI_NORM, SCI_LINEDOWN}, + {SCK_DOWN, SCI_SHIFT, SCI_LINEDOWNEXTEND}, + {SCK_DOWN, SCI_CTRL, SCI_LINESCROLLDOWN}, + {SCK_DOWN, SCI_ASHIFT, SCI_LINEDOWNRECTEXTEND}, + {SCK_UP, SCI_NORM, SCI_LINEUP}, + {SCK_UP, SCI_SHIFT, SCI_LINEUPEXTEND}, + {SCK_UP, SCI_CTRL, SCI_LINESCROLLUP}, + {SCK_UP, SCI_ASHIFT, SCI_LINEUPRECTEXTEND}, + {'[', SCI_CTRL, SCI_PARAUP}, + {'[', SCI_CSHIFT, SCI_PARAUPEXTEND}, + {']', SCI_CTRL, SCI_PARADOWN}, + {']', SCI_CSHIFT, SCI_PARADOWNEXTEND}, + {SCK_LEFT, SCI_NORM, SCI_CHARLEFT}, + {SCK_LEFT, SCI_SHIFT, SCI_CHARLEFTEXTEND}, + {SCK_LEFT, SCI_CTRL, SCI_WORDLEFT}, + {SCK_LEFT, SCI_CSHIFT, SCI_WORDLEFTEXTEND}, + {SCK_LEFT, SCI_ASHIFT, SCI_CHARLEFTRECTEXTEND}, + {SCK_RIGHT, SCI_NORM, SCI_CHARRIGHT}, + {SCK_RIGHT, SCI_SHIFT, SCI_CHARRIGHTEXTEND}, + {SCK_RIGHT, SCI_CTRL, SCI_WORDRIGHT}, + {SCK_RIGHT, SCI_CSHIFT, SCI_WORDRIGHTEXTEND}, + {SCK_RIGHT, SCI_ASHIFT, SCI_CHARRIGHTRECTEXTEND}, + {'/', SCI_CTRL, SCI_WORDPARTLEFT}, + {'/', SCI_CSHIFT, SCI_WORDPARTLEFTEXTEND}, + {'\\', SCI_CTRL, SCI_WORDPARTRIGHT}, + {'\\', SCI_CSHIFT, SCI_WORDPARTRIGHTEXTEND}, + {SCK_HOME, SCI_NORM, SCI_VCHOME}, + {SCK_HOME, SCI_SHIFT, SCI_VCHOMEEXTEND}, + {SCK_HOME, SCI_CTRL, SCI_DOCUMENTSTART}, + {SCK_HOME, SCI_CSHIFT, SCI_DOCUMENTSTARTEXTEND}, + {SCK_HOME, SCI_ALT, SCI_HOMEDISPLAY}, +// {SCK_HOME, SCI_ASHIFT, SCI_HOMEDISPLAYEXTEND}, + {SCK_HOME, SCI_ASHIFT, SCI_VCHOMERECTEXTEND}, + {SCK_END, SCI_NORM, SCI_LINEEND}, + {SCK_END, SCI_SHIFT, SCI_LINEENDEXTEND}, + {SCK_END, SCI_CTRL, SCI_DOCUMENTEND}, + {SCK_END, SCI_CSHIFT, SCI_DOCUMENTENDEXTEND}, + {SCK_END, SCI_ALT, SCI_LINEENDDISPLAY}, +// {SCK_END, SCI_ASHIFT, SCI_LINEENDDISPLAYEXTEND}, + {SCK_END, SCI_ASHIFT, SCI_LINEENDRECTEXTEND}, + {SCK_PRIOR, SCI_NORM, SCI_PAGEUP}, + {SCK_PRIOR, SCI_SHIFT, SCI_PAGEUPEXTEND}, + {SCK_PRIOR, SCI_ASHIFT, SCI_PAGEUPRECTEXTEND}, + {SCK_NEXT, SCI_NORM, SCI_PAGEDOWN}, + {SCK_NEXT, SCI_SHIFT, SCI_PAGEDOWNEXTEND}, + {SCK_NEXT, SCI_ASHIFT, SCI_PAGEDOWNRECTEXTEND}, + {SCK_DELETE, SCI_NORM, SCI_CLEAR}, + {SCK_DELETE, SCI_SHIFT, SCI_CUT}, + {SCK_DELETE, SCI_CTRL, SCI_DELWORDRIGHT}, + {SCK_DELETE, SCI_CSHIFT, SCI_DELLINERIGHT}, + {SCK_INSERT, SCI_NORM, SCI_EDITTOGGLEOVERTYPE}, + {SCK_INSERT, SCI_SHIFT, SCI_PASTE}, + {SCK_INSERT, SCI_CTRL, SCI_COPY}, + {SCK_ESCAPE, SCI_NORM, SCI_CANCEL}, + {SCK_BACK, SCI_NORM, SCI_DELETEBACK}, + {SCK_BACK, SCI_SHIFT, SCI_DELETEBACK}, + {SCK_BACK, SCI_CTRL, SCI_DELWORDLEFT}, + {SCK_BACK, SCI_ALT, SCI_UNDO}, + {SCK_BACK, SCI_CSHIFT, SCI_DELLINELEFT}, + {'Z', SCI_CTRL, SCI_UNDO}, + {'Y', SCI_CTRL, SCI_REDO}, + {'X', SCI_CTRL, SCI_CUT}, + {'C', SCI_CTRL, SCI_COPY}, + {'V', SCI_CTRL, SCI_PASTE}, + {'A', SCI_CTRL, SCI_SELECTALL}, + {SCK_TAB, SCI_NORM, SCI_TAB}, + {SCK_TAB, SCI_SHIFT, SCI_BACKTAB}, + {SCK_RETURN, SCI_NORM, SCI_NEWLINE}, + {SCK_RETURN, SCI_SHIFT, SCI_NEWLINE}, + {SCK_ADD, SCI_CTRL, SCI_ZOOMIN}, + {SCK_SUBTRACT, SCI_CTRL, SCI_ZOOMOUT}, + {SCK_DIVIDE, SCI_CTRL, SCI_SETZOOM}, + //'L', SCI_CTRL, SCI_FORMFEED, + {'L', SCI_CTRL, SCI_LINECUT}, + {'L', SCI_CSHIFT, SCI_LINEDELETE}, + {'T', SCI_CSHIFT, SCI_LINECOPY}, + {'T', SCI_CTRL, SCI_LINETRANSPOSE}, + {'D', SCI_CTRL, SCI_SELECTIONDUPLICATE}, + {'U', SCI_CTRL, SCI_LOWERCASE}, + {'U', SCI_CSHIFT, SCI_UPPERCASE}, + {0,0,0}, +}; + diff --git a/sdk/wxscintilla/src/scintilla/src/KeyMap.h b/sdk/wxscintilla/src/scintilla/src/KeyMap.h new file mode 100644 index 0000000..c1b1a10 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/KeyMap.h @@ -0,0 +1,51 @@ +// Scintilla source code edit control +/** @file KeyMap.h + ** Defines a mapping between keystrokes and commands. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef KEYTOCOMMAND_H +#define KEYTOCOMMAND_H + +#ifdef SCI_NAMESPACE +namespace Scintilla { +#endif + +#define SCI_NORM 0 +#define SCI_SHIFT SCMOD_SHIFT +#define SCI_CTRL SCMOD_CTRL +#define SCI_ALT SCMOD_ALT +#define SCI_CSHIFT (SCI_CTRL | SCI_SHIFT) +#define SCI_ASHIFT (SCI_ALT | SCI_SHIFT) + +/** + */ +class KeyToCommand { +public: + int key; + int modifiers; + unsigned int msg; +}; + +/** + */ +class KeyMap { + KeyToCommand *kmap; + int len; + int alloc; + static const KeyToCommand MapDefault[]; + +public: + KeyMap(); + ~KeyMap(); + void Clear(); + void AssignCmdKey(int key, int modifiers, unsigned int msg); + unsigned int Find(int key, int modifiers); // 0 returned on failure +}; + +#ifdef SCI_NAMESPACE +} +#endif + +#endif diff --git a/sdk/wxscintilla/src/scintilla/src/KeyWords.cxx b/sdk/wxscintilla/src/scintilla/src/KeyWords.cxx new file mode 100644 index 0000000..600ee55 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/KeyWords.cxx @@ -0,0 +1,441 @@ +// Scintilla source code edit control +/** @file KeyWords.cxx + ** Colourise for particular languages. + **/ +// Copyright 1998-2002 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +/** + * Creates an array that points into each word in the string and puts \0 terminators + * after each word. + */ +static char **ArrayFromWordList(char *wordlist, int *len, bool onlyLineEnds = false) { + int prev = '\n'; + int words = 0; + // For rapid determination of whether a character is a separator, build + // a look up table. + bool wordSeparator[256]; + for (int i=0;i<256; i++) { + wordSeparator[i] = false; + } + wordSeparator['\r'] = true; + wordSeparator['\n'] = true; + if (!onlyLineEnds) { + wordSeparator[' '] = true; + wordSeparator['\t'] = true; + } + for (int j = 0; wordlist[j]; j++) { + int curr = static_cast(wordlist[j]); + if (!wordSeparator[curr] && wordSeparator[prev]) + words++; + prev = curr; + } + char **keywords = new char *[words + 1]; + if (keywords) { + words = 0; + prev = '\0'; + size_t slen = strlen(wordlist); + for (size_t k = 0; k < slen; k++) { + if (!wordSeparator[static_cast(wordlist[k])]) { + if (!prev) { + keywords[words] = &wordlist[k]; + words++; + } + } else { + wordlist[k] = '\0'; + } + prev = wordlist[k]; + } + keywords[words] = &wordlist[slen]; + *len = words; + } else { + *len = 0; + } + return keywords; +} + +void WordList::Clear() { + if (words) { + delete []list; + delete []words; + } + words = 0; + list = 0; + len = 0; + sorted = false; +} + +void WordList::Set(const char *s) { + list = new char[strlen(s) + 1]; + strcpy(list, s); + sorted = false; + words = ArrayFromWordList(list, &len, onlyLineEnds); +} + +extern "C" int cmpString(const void *a1, const void *a2) { + // Can't work out the correct incantation to use modern casts here + return strcmp(*(char**)(a1), *(char**)(a2)); +} + +static void SortWordList(char **words, unsigned int len) { + qsort(reinterpret_cast(words), len, sizeof(*words), + cmpString); +} + +bool WordList::InList(const char *s) { + if (0 == words) + return false; + if (!sorted) { + sorted = true; + SortWordList(words, len); + for (unsigned int k = 0; k < (sizeof(starts) / sizeof(starts[0])); k++) + starts[k] = -1; + for (int l = len - 1; l >= 0; l--) { + unsigned char indexChar = words[l][0]; + starts[indexChar] = l; + } + } + unsigned char firstChar = s[0]; + int j = starts[firstChar]; + if (j >= 0) { + while ((unsigned char)words[j][0] == firstChar) { + if (s[1] == words[j][1]) { + const char *a = words[j] + 1; + const char *b = s + 1; + while (*a && *a == *b) { + a++; + b++; + } + if (!*a && !*b) + return true; + } + j++; + } + } + j = starts['^']; + if (j >= 0) { + while (words[j][0] == '^') { + const char *a = words[j] + 1; + const char *b = s; + while (*a && *a == *b) { + a++; + b++; + } + if (!*a) + return true; + j++; + } + } + return false; +} + +/** similar to InList, but word s can be a substring of keyword. + * eg. the keyword define is defined as def~ine. This means the word must start + * with def to be a keyword, but also defi, defin and define are valid. + * The marker is ~ in this case. + */ +bool WordList::InListAbbreviated(const char *s, const char marker) { + if (0 == words) + return false; + if (!sorted) { + sorted = true; + SortWordList(words, len); + for (unsigned int k = 0; k < (sizeof(starts) / sizeof(starts[0])); k++) + starts[k] = -1; + for (int l = len - 1; l >= 0; l--) { + unsigned char indexChar = words[l][0]; + starts[indexChar] = l; + } + } + unsigned char firstChar = s[0]; + int j = starts[firstChar]; + if (j >= 0) { + while (words[j][0] == firstChar) { + bool isSubword = false; + int start = 1; + if (words[j][1] == marker) { + isSubword = true; + start++; + } + if (s[1] == words[j][start]) { + const char *a = words[j] + start; + const char *b = s + 1; + while (*a && *a == *b) { + a++; + if (*a == marker) { + isSubword = true; + a++; + } + b++; + } + if ((!*a || isSubword) && !*b) + return true; + } + j++; + } + } + j = starts['^']; + if (j >= 0) { + while (words[j][0] == '^') { + const char *a = words[j] + 1; + const char *b = s; + while (*a && *a == *b) { + a++; + b++; + } + if (!*a) + return true; + j++; + } + } + return false; +} + +const LexerModule *LexerModule::base = 0; +int LexerModule::nextLanguage = SCLEX_AUTOMATIC+1; + +LexerModule::LexerModule(int language_, + LexerFunction fnLexer_, + const char *languageName_, + LexerFunction fnFolder_, + const char * const wordListDescriptions_[], + int styleBits_) : + language(language_), + fnLexer(fnLexer_), + fnFolder(fnFolder_), + wordListDescriptions(wordListDescriptions_), + styleBits(styleBits_), + languageName(languageName_) { + next = base; + base = this; + if (language == SCLEX_AUTOMATIC) { + language = nextLanguage; + nextLanguage++; + } +} + +int LexerModule::GetNumWordLists() const { + if (wordListDescriptions == NULL) { + return -1; + } else { + int numWordLists = 0; + + while (wordListDescriptions[numWordLists]) { + ++numWordLists; + } + + return numWordLists; + } +} + +const char *LexerModule::GetWordListDescription(int index) const { + static const char *emptyStr = ""; + + PLATFORM_ASSERT(index < GetNumWordLists()); + if (index >= GetNumWordLists()) { + return emptyStr; + } else { + return wordListDescriptions[index]; + } +} + +int LexerModule::GetStyleBitsNeeded() const { + return styleBits; +} + +const LexerModule *LexerModule::Find(int language) { + const LexerModule *lm = base; + while (lm) { + if (lm->language == language) { + return lm; + } + lm = lm->next; + } + return 0; +} + +const LexerModule *LexerModule::Find(const char *languageName) { + if (languageName) { + const LexerModule *lm = base; + while (lm) { + if (lm->languageName && 0 == strcmp(lm->languageName, languageName)) { + return lm; + } + lm = lm->next; + } + } + return 0; +} + +void LexerModule::Lex(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const { + if (fnLexer) + fnLexer(startPos, lengthDoc, initStyle, keywordlists, styler); +} + +void LexerModule::Fold(unsigned int startPos, int lengthDoc, int initStyle, + WordList *keywordlists[], Accessor &styler) const { + if (fnFolder) { + int lineCurrent = styler.GetLine(startPos); + // Move back one line in case deletion wrecked current line fold state + if (lineCurrent > 0) { + lineCurrent--; + int newStartPos = styler.LineStart(lineCurrent); + lengthDoc += startPos - newStartPos; + startPos = newStartPos; + initStyle = 0; + if (startPos > 0) { + initStyle = styler.StyleAt(startPos - 1); + } + } + fnFolder(startPos, lengthDoc, initStyle, keywordlists, styler); + } +} + +// Alternative historical name for Scintilla_LinkLexers +int wxForceScintillaLexers(void) { + return Scintilla_LinkLexers(); +} + +// To add or remove a lexer, add or remove its file and run LexGen.py. + +// Force a reference to all of the Scintilla lexers so that the linker will +// not remove the code of the lexers. +int Scintilla_LinkLexers() { + static int forcer = 0; + +// Shorten the code that declares a lexer and ensures it is linked in by calling a method. +#define LINK_LEXER(lexer) extern LexerModule lexer; forcer += lexer.GetLanguage(); + +//++Autogenerated -- run src/LexGen.py to regenerate +//**\(\tLINK_LEXER(\*);\n\) + LINK_LEXER(lmAbaqus); + LINK_LEXER(lmAda); + LINK_LEXER(lmAns1); + LINK_LEXER(lmAPDL); + LINK_LEXER(lmAsm); + LINK_LEXER(lmASY); + LINK_LEXER(lmAU3); + LINK_LEXER(lmAVE); + LINK_LEXER(lmBaan); + LINK_LEXER(lmBash); + LINK_LEXER(lmBatch); + LINK_LEXER(lmBlitzBasic); + LINK_LEXER(lmBullant); + LINK_LEXER(lmCaml); + LINK_LEXER(lmClw); + LINK_LEXER(lmClwNoCase); + LINK_LEXER(lmCmake); + LINK_LEXER(lmCOBOL); + LINK_LEXER(lmConf); + LINK_LEXER(lmCPP); + LINK_LEXER(lmCPPNoCase); + LINK_LEXER(lmCsound); + LINK_LEXER(lmCss); + LINK_LEXER(lmD); + LINK_LEXER(lmDiff); + LINK_LEXER(lmEiffel); + LINK_LEXER(lmEiffelkw); + LINK_LEXER(lmErlang); + LINK_LEXER(lmErrorList); + LINK_LEXER(lmESCRIPT); + LINK_LEXER(lmF77); + LINK_LEXER(lmFlagShip); + LINK_LEXER(lmForth); + LINK_LEXER(lmFortran); + LINK_LEXER(lmFreeBasic); + LINK_LEXER(lmGAP); + LINK_LEXER(lmGui4Cli); + LINK_LEXER(lmHaskell); + LINK_LEXER(lmHTML); + LINK_LEXER(lmInno); + LINK_LEXER(lmKix); + LINK_LEXER(lmLatex); + LINK_LEXER(lmLISP); + LINK_LEXER(lmLot); + LINK_LEXER(lmLout); + LINK_LEXER(lmLua); + LINK_LEXER(lmMagikSF); + LINK_LEXER(lmMake); + LINK_LEXER(lmMarkdown); + LINK_LEXER(lmMatlab); + LINK_LEXER(lmMETAPOST); + LINK_LEXER(lmMMIXAL); + LINK_LEXER(lmMSSQL); + LINK_LEXER(lmMySQL); + LINK_LEXER(lmNimrod); + LINK_LEXER(lmNncrontab); + LINK_LEXER(lmNsis); + LINK_LEXER(lmNull); + LINK_LEXER(lmOctave); + LINK_LEXER(lmOpal); + LINK_LEXER(lmPascal); + LINK_LEXER(lmPB); + LINK_LEXER(lmPerl); + LINK_LEXER(lmPHPSCRIPT); + LINK_LEXER(lmPLM); + LINK_LEXER(lmPo); + LINK_LEXER(lmPOV); + LINK_LEXER(lmPowerPro); + LINK_LEXER(lmPowerShell); + LINK_LEXER(lmProgress); + LINK_LEXER(lmProps); + LINK_LEXER(lmPS); + LINK_LEXER(lmPureBasic); + LINK_LEXER(lmPython); + LINK_LEXER(lmR); + LINK_LEXER(lmREBOL); + LINK_LEXER(lmRuby); + LINK_LEXER(lmScriptol); + LINK_LEXER(lmSmalltalk); + LINK_LEXER(lmSML); + LINK_LEXER(lmSorc); + LINK_LEXER(lmSpecman); + LINK_LEXER(lmSpice); + LINK_LEXER(lmSQL); + LINK_LEXER(lmTACL); + LINK_LEXER(lmTADS3); + LINK_LEXER(lmTAL); + LINK_LEXER(lmTCL); + LINK_LEXER(lmTeX); + LINK_LEXER(lmVB); + LINK_LEXER(lmVBScript); + LINK_LEXER(lmVerilog); + LINK_LEXER(lmVHDL); + LINK_LEXER(lmXML); + LINK_LEXER(lmYAML); + +//ERAN - START + LINK_LEXER(lmGcc); + LINK_LEXER(lmFif); + LINK_LEXER(lmSvn); + LINK_LEXER(lmCppCheck); +//ERAN - END + +// EPOCH - START + LINK_LEXER(lmAltaRica); + LINK_LEXER(lmPrism); +// EPOCH - END + +//--Autogenerated -- end of automatically generated section + + return 1; +} diff --git a/sdk/wxscintilla/src/scintilla/src/LexAPDL.cxx b/sdk/wxscintilla/src/scintilla/src/LexAPDL.cxx new file mode 100644 index 0000000..a9a6c54 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexAPDL.cxx @@ -0,0 +1,256 @@ +// Scintilla source code edit control +/** @file LexAPDL.cxx + ** Lexer for APDL. Based on the lexer for Assembler by The Black Horus. + ** By Hadar Raz. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80 && (isalnum(ch) || ch == '_')); +} + +static inline bool IsAnOperator(char ch) { + // '.' left out as it is used to make up numbers + if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || + ch == '(' || ch == ')' || ch == '=' || ch == '^' || + ch == '[' || ch == ']' || ch == '<' || ch == '&' || + ch == '>' || ch == ',' || ch == '|' || ch == '~' || + ch == '$' || ch == ':' || ch == '%') + return true; + return false; +} + +static void ColouriseAPDLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + + int stringStart = ' '; + + WordList &processors = *keywordlists[0]; + WordList &commands = *keywordlists[1]; + WordList &slashcommands = *keywordlists[2]; + WordList &starcommands = *keywordlists[3]; + WordList &arguments = *keywordlists[4]; + WordList &functions = *keywordlists[5]; + + // Do not leak onto next line + initStyle = SCE_APDL_DEFAULT; + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + // Determine if the current state should terminate. + if (sc.state == SCE_APDL_NUMBER) { + if (!(IsADigit(sc.ch) || sc.ch == '.' || (sc.ch == 'e' || sc.ch == 'E') || + ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')))) { + sc.SetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_COMMENT) { + if (sc.atLineEnd) { + sc.SetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_COMMENTBLOCK) { + if (sc.atLineEnd) { + if (sc.ch == '\r') { + sc.Forward(); + } + sc.ForwardSetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_STRING) { + if (sc.atLineEnd) { + sc.SetState(SCE_APDL_DEFAULT); + } else if ((sc.ch == '\'' && stringStart == '\'') || (sc.ch == '\"' && stringStart == '\"')) { + sc.ForwardSetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_WORD) { + if (!IsAWordChar(sc.ch)) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + if (processors.InList(s)) { + sc.ChangeState(SCE_APDL_PROCESSOR); + } else if (slashcommands.InList(s)) { + sc.ChangeState(SCE_APDL_SLASHCOMMAND); + } else if (starcommands.InList(s)) { + sc.ChangeState(SCE_APDL_STARCOMMAND); + } else if (commands.InList(s)) { + sc.ChangeState(SCE_APDL_COMMAND); + } else if (arguments.InList(s)) { + sc.ChangeState(SCE_APDL_ARGUMENT); + } else if (functions.InList(s)) { + sc.ChangeState(SCE_APDL_FUNCTION); + } + sc.SetState(SCE_APDL_DEFAULT); + } + } else if (sc.state == SCE_APDL_OPERATOR) { + if (!IsAnOperator(static_cast(sc.ch))) { + sc.SetState(SCE_APDL_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_APDL_DEFAULT) { + if (sc.ch == '!' && sc.chNext == '!') { + sc.SetState(SCE_APDL_COMMENTBLOCK); + } else if (sc.ch == '!') { + sc.SetState(SCE_APDL_COMMENT); + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_APDL_NUMBER); + } else if (sc.ch == '\'' || sc.ch == '\"') { + sc.SetState(SCE_APDL_STRING); + stringStart = sc.ch; + } else if (IsAWordChar(sc.ch) || ((sc.ch == '*' || sc.ch == '/') && !isgraph(sc.chPrev))) { + sc.SetState(SCE_APDL_WORD); + } else if (IsAnOperator(static_cast(sc.ch))) { + sc.SetState(SCE_APDL_OPERATOR); + } + } + } + sc.Complete(); +} + +//------------------------------------------------------------------------------ +// 06-27-07 Sergio Lucato +// - Included code folding for Ansys APDL lexer +// - Copyied from LexBasic.cxx and modified for APDL +//------------------------------------------------------------------------------ + +/* Bits: + * 1 - whitespace + * 2 - operator + * 4 - identifier + * 8 - decimal digit + * 16 - hex digit + * 32 - bin digit + */ +static int character_classification[128] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 0, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 10, 6, + 60, 60, 28, 28, 28, 28, 28, 28, 28, 28, 2, 2, 2, 2, 2, 2, + 2, 20, 20, 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 4, + 2, 20, 20, 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 0 +}; + +static bool IsSpace(int c) { + return c < 128 && (character_classification[c] & 1); +} + +static bool IsIdentifier(int c) { + return c < 128 && (character_classification[c] & 4); +} + +static int LowerCase(int c) +{ + if (c >= 'A' && c <= 'Z') + return 'a' + c - 'A'; + return c; +} + +static int CheckAPDLFoldPoint(char const *token, int &level) { + if (!strcmp(token, "*if") || + !strcmp(token, "*do") || + !strcmp(token, "*dowhile") ) { + level |= SC_FOLDLEVELHEADERFLAG; + return 1; + } + if (!strcmp(token, "*endif") || + !strcmp(token, "*enddo") ) { + return -1; + } + return 0; +} + +static void FoldAPDLDoc(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) { + + int line = styler.GetLine(startPos); + int level = styler.LevelAt(line); + int go = 0, done = 0; + int endPos = startPos + length; + char word[256]; + int wordlen = 0; + int i; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + // Scan for tokens at the start of the line (they may include + // whitespace, for tokens like "End Function" + for (i = startPos; i < endPos; i++) { + int c = styler.SafeGetCharAt(i); + if (!done && !go) { + if (wordlen) { // are we scanning a token already? + word[wordlen] = static_cast(LowerCase(c)); + if (!IsIdentifier(c)) { // done with token + word[wordlen] = '\0'; + go = CheckAPDLFoldPoint(word, level); + if (!go) { + // Treat any whitespace as single blank, for + // things like "End Function". + if (IsSpace(c) && IsIdentifier(word[wordlen - 1])) { + word[wordlen] = ' '; + if (wordlen < 255) + wordlen++; + } + else // done with this line + done = 1; + } + } else if (wordlen < 255) { + wordlen++; + } + } else { // start scanning at first non-whitespace character + if (!IsSpace(c)) { + if (IsIdentifier(c)) { + word[0] = static_cast(LowerCase(c)); + wordlen = 1; + } else // done with this line + done = 1; + } + } + } + if (c == '\n') { // line end + if (!done && wordlen == 0 && foldCompact) // line was only space + level |= SC_FOLDLEVELWHITEFLAG; + if (level != styler.LevelAt(line)) + styler.SetLevel(line, level); + level += go; + line++; + // reset state + wordlen = 0; + level &= ~SC_FOLDLEVELHEADERFLAG; + level &= ~SC_FOLDLEVELWHITEFLAG; + go = 0; + done = 0; + } + } +} + +static const char * const apdlWordListDesc[] = { + "processors", + "commands", + "slashommands", + "starcommands", + "arguments", + "functions", + 0 +}; + +LexerModule lmAPDL(SCLEX_APDL, ColouriseAPDLDoc, "apdl", FoldAPDLDoc, apdlWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexASY.cxx b/sdk/wxscintilla/src/scintilla/src/LexASY.cxx new file mode 100644 index 0000000..5bf979f --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexASY.cxx @@ -0,0 +1,270 @@ +// Scintilla source code edit control +//Author: instanton (email: soft_share126com) +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" +#include "CharacterSet.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static void ColouriseAsyDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + + CharacterSet setWordStart(CharacterSet::setAlpha, "_", 0x80, true); + CharacterSet setWord(CharacterSet::setAlphaNum, "._", 0x80, true); + + int visibleChars = 0; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + + if (sc.atLineStart) { + if (sc.state == SCE_ASY_STRING) { + sc.SetState(SCE_ASY_STRING); + } + visibleChars = 0; + } + + if (sc.ch == '\\') { + if (sc.chNext == '\n' || sc.chNext == '\r') { + sc.Forward(); + if (sc.ch == '\r' && sc.chNext == '\n') { + sc.Forward(); + } +// continuationLine = true; + continue; + } + } + + // Determine if the current state should terminate. + switch (sc.state) { + case SCE_ASY_OPERATOR: + sc.SetState(SCE_ASY_DEFAULT); + break; + case SCE_ASY_NUMBER: + if (!setWord.Contains(sc.ch)) { + sc.SetState(SCE_ASY_DEFAULT); + } + break; + case SCE_ASY_IDENTIFIER: + if (!setWord.Contains(sc.ch) || (sc.ch == '.')) { + char s[1000]; + sc.GetCurrentLowered(s, sizeof(s)); + if (keywords.InList(s)) { + sc.ChangeState(SCE_ASY_WORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_ASY_WORD2); + } + sc.SetState(SCE_ASY_DEFAULT); + } + break; + case SCE_ASY_COMMENT: + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_ASY_DEFAULT); + } + break; + case SCE_ASY_COMMENTLINE: + if (sc.atLineStart) { + sc.SetState(SCE_ASY_DEFAULT); + } + break; + case SCE_ASY_STRING: + if (sc.atLineEnd) { + sc.ChangeState(SCE_ASY_STRINGEOL); + } else if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\"') { + sc.ForwardSetState(SCE_ASY_DEFAULT); + } + break; + case SCE_ASY_CHARACTER: + if (sc.atLineEnd) { + sc.ChangeState(SCE_ASY_STRINGEOL); + } else if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\'') { + sc.ForwardSetState(SCE_ASY_DEFAULT); + } + break; + } + + // Determine if a new state should be entered. + if (sc.state == SCE_ASY_DEFAULT) { + if (setWordStart.Contains(sc.ch) || (sc.ch == '@')) { + sc.SetState(SCE_ASY_IDENTIFIER); + } else if (sc.Match('/', '*')) { + sc.SetState(SCE_ASY_COMMENT); + sc.Forward(); // + } else if (sc.Match('/', '/')) { + sc.SetState(SCE_ASY_COMMENTLINE); + } else if (sc.ch == '\"') { + sc.SetState(SCE_ASY_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_ASY_CHARACTER); + } else if (sc.ch == '#' && visibleChars == 0) { + do { + sc.Forward(); + } while ((sc.ch == ' ' || sc.ch == '\t') && sc.More()); + if (sc.atLineEnd) { + sc.SetState(SCE_ASY_DEFAULT); + } + } else if (isoperator(static_cast(sc.ch))) { + sc.SetState(SCE_ASY_OPERATOR); + } + } + + } + sc.Complete(); +} + +static bool IsAsyCommentStyle(int style) { + return style == SCE_ASY_COMMENT; +} + + +static inline bool isASYidentifier(int ch) { + return + ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) ; +} + +static int ParseASYWord(unsigned int pos, Accessor &styler, char *word) +{ + int length=0; + char ch=styler.SafeGetCharAt(pos); + *word=0; + + while(isASYidentifier(ch) && length<100){ + word[length]=ch; + length++; + ch=styler.SafeGetCharAt(pos+length); + } + word[length]=0; + return length; +} + +static bool IsASYDrawingLine(int line, Accessor &styler) { + int pos = styler.LineStart(line); + int eol_pos = styler.LineStart(line + 1) - 1; + + int startpos = pos; + char buffer[100]=""; + + while (startpos 0) + levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; + int levelMinCurrent = levelCurrent; + int levelNext = levelCurrent; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (foldComment && IsAsyCommentStyle(style)) { + if (!IsAsyCommentStyle(stylePrev) && (stylePrev != SCE_ASY_COMMENTLINEDOC)) { + levelNext++; + } else if (!IsAsyCommentStyle(styleNext) && (styleNext != SCE_ASY_COMMENTLINEDOC) && !atEOL) { + levelNext--; + } + } + if (style == SCE_ASY_OPERATOR) { + if (ch == '{') { + if (levelMinCurrent > levelNext) { + levelMinCurrent = levelNext; + } + levelNext++; + } else if (ch == '}') { + levelNext--; + } + } + + if (atEOL && IsASYDrawingLine(lineCurrent, styler)){ + if (lineCurrent==0 && IsASYDrawingLine(lineCurrent + 1, styler)) + levelNext++; + else if (lineCurrent!=0 && !IsASYDrawingLine(lineCurrent - 1, styler) + && IsASYDrawingLine(lineCurrent + 1, styler) + ) + levelNext++; + else if (lineCurrent!=0 && IsASYDrawingLine(lineCurrent - 1, styler) && + !IsASYDrawingLine(lineCurrent+1, styler)) + levelNext--; + } + + if (atEOL) { + int levelUse = levelCurrent; + if (foldAtElse) { + levelUse = levelMinCurrent; + } + int lev = levelUse | levelNext << 16; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if (levelUse < levelNext) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelCurrent = levelNext; + levelMinCurrent = levelCurrent; + visibleChars = 0; + } + if (!IsASpace(ch)) + visibleChars++; + } +} + +static const char * const asyWordLists[] = { + "Primary keywords and identifiers", + "Secondary keywords and identifiers", + 0, + }; + +LexerModule lmASY(SCLEX_ASYMPTOTE, ColouriseAsyDoc, "asy", FoldAsyDoc, asyWordLists); diff --git a/sdk/wxscintilla/src/scintilla/src/LexAU3.cxx b/sdk/wxscintilla/src/scintilla/src/LexAU3.cxx new file mode 100644 index 0000000..cfff927 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexAU3.cxx @@ -0,0 +1,907 @@ +// Scintilla source code edit control +// @file LexAU3.cxx +// Lexer for AutoIt3 http://www.hiddensoft.com/autoit3 +// by Jos van der Zande, jvdzande@yahoo.com +// +// Changes: +// March 28, 2004 - Added the standard Folding code +// April 21, 2004 - Added Preprosessor Table + Syntax Highlighting +// Fixed Number highlighting +// Changed default isoperator to IsAOperator to have a better match to AutoIt3 +// Fixed "#comments_start" -> "#comments-start" +// Fixed "#comments_end" -> "#comments-end" +// Fixed Sendkeys in Strings when not terminated with } +// Added support for Sendkey strings that have second parameter e.g. {UP 5} or {a down} +// April 26, 2004 - Fixed # pre-processor statement inside of comment block would invalidly change the color. +// Added logic for #include to treat the <> as string +// Added underscore to IsAOperator. +// May 17, 2004 - Changed the folding logic from indent to keyword folding. +// Added Folding logic for blocks of single-commentlines or commentblock. +// triggered by: fold.comment=1 +// Added Folding logic for preprocessor blocks triggered by fold.preprocessor=1 +// Added Special for #region - #endregion syntax highlight and folding. +// May 30, 2004 - Fixed issue with continuation lines on If statements. +// June 5, 2004 - Added comma to Operators for better readability. +// Added fold.compact support set with fold.compact=1 +// Changed folding inside of #cs-#ce. Default is no keyword folding inside comment blocks when fold.comment=1 +// it will now only happen when fold.comment=2. +// Sep 5, 2004 - Added logic to handle colourizing words on the last line. +// Typed Characters now show as "default" till they match any table. +// Oct 10, 2004 - Added logic to show Comments in "Special" directives. +// Nov 1, 2004 - Added better testing for Numbers supporting x and e notation. +// Nov 28, 2004 - Added logic to handle continuation lines for syntax highlighting. +// Jan 10, 2005 - Added Abbreviations Keyword used for expansion +// Mar 24, 2005 - Updated Abbreviations Keywords to fix when followed by Operator. +// Apr 18, 2005 - Updated #CE/#Comment-End logic to take a linecomment ";" into account +// - Added folding support for With...EndWith +// - Added support for a DOT in variable names +// - Fixed Underscore in CommentBlock +// May 23, 2005 - Fixed the SentKey lexing in case of a missing } +// Aug 11, 2005 - Fixed possible bug with s_save length > 100. +// Aug 23, 2005 - Added Switch/endswitch support to the folding logic. +// Sep 27, 2005 - Fixed the SentKey lexing logic in case of multiple sentkeys. +// Mar 12, 2006 - Fixed issue with <> coloring as String in stead of Operator in rare occasions. +// Apr 8, 2006 - Added support for AutoIt3 Standard UDF library (SCE_AU3_UDF) +// Mar 9, 2007 - Fixed bug with + following a String getting the wrong Color. +// Jun 20, 2007 - Fixed Commentblock issue when LF's are used as EOL. +// Jul 26, 2007 - Fixed #endregion undetected bug. +// +// Copyright for Scintilla: 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. +// Scintilla source code edit control + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static inline bool IsTypeCharacter(const int ch) +{ + return ch == '$'; +} +static inline bool IsAWordChar(const int ch) +{ + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + +static inline bool IsAWordStart(const int ch) +{ + return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '@' || ch == '#' || ch == '$' || ch == '.'); +} + +static inline bool IsAOperator(char ch) { + if (isascii(ch) && isalnum(ch)) + return false; + if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || + ch == '&' || ch == '^' || ch == '=' || ch == '<' || ch == '>' || + ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == ',' ) + return true; + return false; +} + +/////////////////////////////////////////////////////////////////////////////// +// GetSendKey() filters the portion before and after a/multiple space(s) +// and return the first portion to be looked-up in the table +// also check if the second portion is valid... (up,down.on.off,toggle or a number) +/////////////////////////////////////////////////////////////////////////////// + +static int GetSendKey(const char *szLine, char *szKey) +{ + int nFlag = 0; + int nStartFound = 0; + int nKeyPos = 0; + int nSpecPos= 0; + int nSpecNum= 1; + int nPos = 0; + char cTemp; + char szSpecial[100]; + + // split the portion of the sendkey in the part before and after the spaces + while ( ( (cTemp = szLine[nPos]) != '\0')) + { + // skip leading Ctrl/Shift/Alt state + if (cTemp == '{') { + nStartFound = 1; + } + // + if (nStartFound == 1) { + if ((cTemp == ' ') && (nFlag == 0) ) // get the stuff till first space + { + nFlag = 1; + // Add } to the end of the first bit for table lookup later. + szKey[nKeyPos++] = '}'; + } + else if (cTemp == ' ') + { + // skip other spaces + } + else if (nFlag == 0) + { + // save first portion into var till space or } is hit + szKey[nKeyPos++] = cTemp; + } + else if ((nFlag == 1) && (cTemp != '}')) + { + // Save second portion into var... + szSpecial[nSpecPos++] = cTemp; + // check if Second portion is all numbers for repeat fuction + if (isdigit(cTemp) == false) {nSpecNum = 0;} + } + } + nPos++; // skip to next char + + } // End While + + + // Check if the second portion is either a number or one of these keywords + szKey[nKeyPos] = '\0'; + szSpecial[nSpecPos] = '\0'; + if (strcmp(szSpecial,"down")== 0 || strcmp(szSpecial,"up")== 0 || + strcmp(szSpecial,"on")== 0 || strcmp(szSpecial,"off")== 0 || + strcmp(szSpecial,"toggle")== 0 || nSpecNum == 1 ) + { + nFlag = 0; + } + else + { + nFlag = 1; + } + return nFlag; // 1 is bad, 0 is good + +} // GetSendKey() + +// +// Routine to check the last "none comment" character on a line to see if its a continuation +// +static bool IsContinuationLine(unsigned int szLine, Accessor &styler) +{ + int nsPos = styler.LineStart(szLine); + int nePos = styler.LineStart(szLine+1) - 2; + //int stylech = styler.StyleAt(nsPos); + while (nsPos < nePos) + { + //stylech = styler.StyleAt(nePos); + int stylech = styler.StyleAt(nsPos); + if (!(stylech == SCE_AU3_COMMENT)) { + char ch = styler.SafeGetCharAt(nePos); + if (!isspacechar(ch)) { + if (ch == '_') + return true; + else + return false; + } + } + nePos--; // skip to next char + } // End While + return false; +} // IsContinuationLine() + +// +// syntax highlighting logic +static void ColouriseAU3Doc(unsigned int startPos, + int length, int initStyle, + WordList *keywordlists[], + Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + WordList &keywords4 = *keywordlists[3]; + WordList &keywords5 = *keywordlists[4]; + WordList &keywords6 = *keywordlists[5]; + WordList &keywords7 = *keywordlists[6]; + WordList &keywords8 = *keywordlists[7]; + // find the first previous line without continuation character at the end + int lineCurrent = styler.GetLine(startPos); + int s_startPos = startPos; + // When not inside a Block comment: find First line without _ + if (!(initStyle==SCE_AU3_COMMENTBLOCK)) { + while ((lineCurrent > 0 && IsContinuationLine(lineCurrent,styler)) || + (lineCurrent > 1 && IsContinuationLine(lineCurrent-1,styler))) { + lineCurrent--; + startPos = styler.LineStart(lineCurrent); // get start position + initStyle = 0; // reset the start style to 0 + } + } + // Set the new length to include it from the start and set the start position + length = length + s_startPos - startPos; // correct the total length to process + styler.StartAt(startPos); + + StyleContext sc(startPos, length, initStyle, styler); + char si; // string indicator "=1 '=2 + char ni; // Numeric indicator error=9 normal=0 normal+dec=1 hex=2 Enot=3 + char ci; // comment indicator 0=not linecomment(;) + char s_save[100]; + si=0; + ni=0; + ci=0; + //$$$ + for (; sc.More(); sc.Forward()) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + // ********************************************** + // save the total current word for eof processing + if (IsAWordChar(sc.ch) || sc.ch == '}') + { + strcpy(s_save,s); + int tp = strlen(s_save); + if (tp < 99) { + s_save[tp] = static_cast(tolower(sc.ch)); + s_save[tp+1] = '\0'; + } + } + // ********************************************** + // + switch (sc.state) + { + case SCE_AU3_COMMENTBLOCK: + { + //Reset at line end + if (sc.atLineEnd) { + ci=0; + if (strcmp(s, "#ce")== 0 || strcmp(s, "#comments-end")== 0) { + if (sc.atLineEnd) + sc.SetState(SCE_AU3_DEFAULT); + else + sc.SetState(SCE_AU3_COMMENTBLOCK); + } + break; + } + //skip rest of line when a ; is encountered + if (sc.chPrev == ';') { + ci=2; + sc.SetState(SCE_AU3_COMMENTBLOCK); + } + // skip rest of the line + if (ci==2) + break; + // check when first character is detected on the line + if (ci==0) { + if (IsAWordStart(static_cast(sc.ch)) || IsAOperator(static_cast(sc.ch))) { + ci=1; + sc.SetState(SCE_AU3_COMMENTBLOCK); + } + break; + } + if (!(IsAWordChar(sc.ch) || (sc.ch == '-' && strcmp(s, "#comments") == 0))) { + if ((strcmp(s, "#ce")== 0 || strcmp(s, "#comments-end")== 0)) + sc.SetState(SCE_AU3_COMMENT); // set to comment line for the rest of the line + else + ci=2; // line doesn't begin with #CE so skip the rest of the line + } + break; + } + case SCE_AU3_COMMENT: + { + if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} + break; + } + case SCE_AU3_OPERATOR: + { + // check if its a COMobject + if (sc.chPrev == '.' && IsAWordChar(sc.ch)) { + sc.SetState(SCE_AU3_COMOBJ); + } + else { + sc.SetState(SCE_AU3_DEFAULT); + } + break; + } + case SCE_AU3_SPECIAL: + { + if (sc.ch == ';') {sc.SetState(SCE_AU3_COMMENT);} + if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} + break; + } + case SCE_AU3_KEYWORD: + { + if (!(IsAWordChar(sc.ch) || (sc.ch == '-' && (strcmp(s, "#comments") == 0 || strcmp(s, "#include") == 0)))) + { + if (!IsTypeCharacter(sc.ch)) + { + if (strcmp(s, "#cs")== 0 || strcmp(s, "#comments-start")== 0 ) + { + sc.ChangeState(SCE_AU3_COMMENTBLOCK); + sc.SetState(SCE_AU3_COMMENTBLOCK); + break; + } + else if (keywords.InList(s)) { + sc.ChangeState(SCE_AU3_KEYWORD); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (keywords2.InList(s)) { + sc.ChangeState(SCE_AU3_FUNCTION); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (keywords3.InList(s)) { + sc.ChangeState(SCE_AU3_MACRO); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (keywords5.InList(s)) { + sc.ChangeState(SCE_AU3_PREPROCESSOR); + sc.SetState(SCE_AU3_DEFAULT); + if (strcmp(s, "#include")== 0) + { + si = 3; // use to determine string start for #inlude <> + } + } + else if (keywords6.InList(s)) { + sc.ChangeState(SCE_AU3_SPECIAL); + sc.SetState(SCE_AU3_SPECIAL); + } + else if ((keywords7.InList(s)) && (!IsAOperator(static_cast(sc.ch)))) { + sc.ChangeState(SCE_AU3_EXPAND); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (keywords8.InList(s)) { + sc.ChangeState(SCE_AU3_UDF); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (strcmp(s, "_") == 0) { + sc.ChangeState(SCE_AU3_OPERATOR); + sc.SetState(SCE_AU3_DEFAULT); + } + else if (!IsAWordChar(sc.ch)) { + sc.ChangeState(SCE_AU3_DEFAULT); + sc.SetState(SCE_AU3_DEFAULT); + } + } + } + if (sc.atLineEnd) { + sc.SetState(SCE_AU3_DEFAULT);} + break; + } + case SCE_AU3_NUMBER: + { + // Numeric indicator error=9 normal=0 normal+dec=1 hex=2 E-not=3 + // + // test for Hex notation + if (strcmp(s, "0") == 0 && (sc.ch == 'x' || sc.ch == 'X') && ni == 0) + { + ni = 2; + break; + } + // test for E notation + if (IsADigit(sc.chPrev) && (sc.ch == 'e' || sc.ch == 'E') && ni <= 1) + { + ni = 3; + break; + } + // Allow Hex characters inside hex numeric strings + if ((ni == 2) && + (sc.ch == 'a' || sc.ch == 'b' || sc.ch == 'c' || sc.ch == 'd' || sc.ch == 'e' || sc.ch == 'f' || + sc.ch == 'A' || sc.ch == 'B' || sc.ch == 'C' || sc.ch == 'D' || sc.ch == 'E' || sc.ch == 'F' )) + { + break; + } + // test for 1 dec point only + if (sc.ch == '.') + { + if (ni==0) + { + ni=1; + } + else + { + ni=9; + } + break; + } + // end of numeric string ? + if (!(IsADigit(sc.ch))) + { + if (ni==9) + { + sc.ChangeState(SCE_AU3_DEFAULT); + } + sc.SetState(SCE_AU3_DEFAULT); + } + break; + } + case SCE_AU3_VARIABLE: + { + // Check if its a COMObject + if (sc.ch == '.' && !IsADigit(sc.chNext)) { + sc.SetState(SCE_AU3_OPERATOR); + } + else if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_AU3_DEFAULT); + } + break; + } + case SCE_AU3_COMOBJ: + { + if (!(IsAWordChar(sc.ch))) { + sc.SetState(SCE_AU3_DEFAULT); + } + break; + } + case SCE_AU3_STRING: + { + // check for " to end a double qouted string or + // check for ' to end a single qouted string + if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\'') || (si == 3 && sc.ch == '>')) + { + sc.ForwardSetState(SCE_AU3_DEFAULT); + si=0; + break; + } + if (sc.atLineEnd) + { + si=0; + // at line end and not found a continuation char then reset to default + int lineCurrent = styler.GetLine(sc.currentPos); + if (!IsContinuationLine(lineCurrent,styler)) + { + sc.SetState(SCE_AU3_DEFAULT); + break; + } + } + // find Sendkeys in a STRING + if (sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' ) { + sc.SetState(SCE_AU3_SENT);} + break; + } + + case SCE_AU3_SENT: + { + // Send key string ended + if (sc.chPrev == '}' && sc.ch != '}') + { + // set color to SENDKEY when valid sendkey .. else set back to regular string + char sk[100]; + // split {111 222} and return {111} and check if 222 is valid. + // if return code = 1 then invalid 222 so must be string + if (GetSendKey(s,sk)) + { + sc.ChangeState(SCE_AU3_STRING); + } + // if single char between {?} then its ok as sendkey for a single character + else if (strlen(sk) == 3) + { + sc.ChangeState(SCE_AU3_SENT); + } + // if sendkey {111} is in table then ok as sendkey + else if (keywords4.InList(sk)) + { + sc.ChangeState(SCE_AU3_SENT); + } + else + { + sc.ChangeState(SCE_AU3_STRING); + } + sc.SetState(SCE_AU3_STRING); + } + else + { + // check if the start is a valid SendKey start + int nPos = 0; + int nState = 1; + char cTemp; + while (!(nState == 2) && ((cTemp = s[nPos]) != '\0')) + { + if (cTemp == '{' && nState == 1) + { + nState = 2; + } + if (nState == 1 && !(cTemp == '+' || cTemp == '!' || cTemp == '^' || cTemp == '#' )) + { + nState = 0; + } + nPos++; + } + //Verify characters infront of { ... if not assume regular string + if (nState == 1 && (!(sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' ))) { + sc.ChangeState(SCE_AU3_STRING); + sc.SetState(SCE_AU3_STRING); + } + // If invalid character found then assume its a regular string + if (nState == 0) { + sc.ChangeState(SCE_AU3_STRING); + sc.SetState(SCE_AU3_STRING); + } + } + // check if next portion is again a sendkey + if (sc.atLineEnd) + { + sc.ChangeState(SCE_AU3_STRING); + sc.SetState(SCE_AU3_DEFAULT); + si = 0; // reset string indicator + } + //* check in next characters following a sentkey are again a sent key + // Need this test incase of 2 sentkeys like {F1}{ENTER} but not detect {{} + if (sc.state == SCE_AU3_STRING && (sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' )) { + sc.SetState(SCE_AU3_SENT);} + // check to see if the string ended... + // Sendkey string isn't complete but the string ended.... + if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\'')) + { + sc.ChangeState(SCE_AU3_STRING); + sc.ForwardSetState(SCE_AU3_DEFAULT); + } + break; + } + } //switch (sc.state) + + // Determine if a new state should be entered: + + if (sc.state == SCE_AU3_DEFAULT) + { + if (sc.ch == ';') {sc.SetState(SCE_AU3_COMMENT);} + else if (sc.ch == '#') {sc.SetState(SCE_AU3_KEYWORD);} + else if (sc.ch == '$') {sc.SetState(SCE_AU3_VARIABLE);} + else if (sc.ch == '.' && !IsADigit(sc.chNext)) {sc.SetState(SCE_AU3_OPERATOR);} + else if (sc.ch == '@') {sc.SetState(SCE_AU3_KEYWORD);} + //else if (sc.ch == '_') {sc.SetState(SCE_AU3_KEYWORD);} + else if (sc.ch == '<' && si==3) {sc.SetState(SCE_AU3_STRING);} // string after #include + else if (sc.ch == '\"') { + sc.SetState(SCE_AU3_STRING); + si = 1; } + else if (sc.ch == '\'') { + sc.SetState(SCE_AU3_STRING); + si = 2; } + else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) + { + sc.SetState(SCE_AU3_NUMBER); + ni = 0; + } + else if (IsAWordStart(sc.ch)) {sc.SetState(SCE_AU3_KEYWORD);} + else if (IsAOperator(static_cast(sc.ch))) {sc.SetState(SCE_AU3_OPERATOR);} + else if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);} + } + } //for (; sc.More(); sc.Forward()) + + //************************************* + // Colourize the last word correctly + //************************************* + if (sc.state == SCE_AU3_KEYWORD) + { + if (strcmp(s_save, "#cs")== 0 || strcmp(s_save, "#comments-start")== 0 ) + { + sc.ChangeState(SCE_AU3_COMMENTBLOCK); + sc.SetState(SCE_AU3_COMMENTBLOCK); + } + else if (keywords.InList(s_save)) { + sc.ChangeState(SCE_AU3_KEYWORD); + sc.SetState(SCE_AU3_KEYWORD); + } + else if (keywords2.InList(s_save)) { + sc.ChangeState(SCE_AU3_FUNCTION); + sc.SetState(SCE_AU3_FUNCTION); + } + else if (keywords3.InList(s_save)) { + sc.ChangeState(SCE_AU3_MACRO); + sc.SetState(SCE_AU3_MACRO); + } + else if (keywords5.InList(s_save)) { + sc.ChangeState(SCE_AU3_PREPROCESSOR); + sc.SetState(SCE_AU3_PREPROCESSOR); + } + else if (keywords6.InList(s_save)) { + sc.ChangeState(SCE_AU3_SPECIAL); + sc.SetState(SCE_AU3_SPECIAL); + } + else if (keywords7.InList(s_save) && sc.atLineEnd) { + sc.ChangeState(SCE_AU3_EXPAND); + sc.SetState(SCE_AU3_EXPAND); + } + else if (keywords8.InList(s_save)) { + sc.ChangeState(SCE_AU3_UDF); + sc.SetState(SCE_AU3_UDF); + } + else { + sc.ChangeState(SCE_AU3_DEFAULT); + sc.SetState(SCE_AU3_DEFAULT); + } + } + if (sc.state == SCE_AU3_SENT) + { + // Send key string ended + if (sc.chPrev == '}' && sc.ch != '}') + { + // set color to SENDKEY when valid sendkey .. else set back to regular string + char sk[100]; + // split {111 222} and return {111} and check if 222 is valid. + // if return code = 1 then invalid 222 so must be string + if (GetSendKey(s_save,sk)) + { + sc.ChangeState(SCE_AU3_STRING); + } + // if single char between {?} then its ok as sendkey for a single character + else if (strlen(sk) == 3) + { + sc.ChangeState(SCE_AU3_SENT); + } + // if sendkey {111} is in table then ok as sendkey + else if (keywords4.InList(sk)) + { + sc.ChangeState(SCE_AU3_SENT); + } + else + { + sc.ChangeState(SCE_AU3_STRING); + } + sc.SetState(SCE_AU3_STRING); + } + // check if next portion is again a sendkey + if (sc.atLineEnd) + { + sc.ChangeState(SCE_AU3_STRING); + sc.SetState(SCE_AU3_DEFAULT); + } + } + //************************************* + sc.Complete(); +} + +// +static bool IsStreamCommentStyle(int style) { + return style == SCE_AU3_COMMENT || style == SCE_AU3_COMMENTBLOCK; +} + +// +// Routine to find first none space on the current line and return its Style +// needed for comment lines not starting on pos 1 +static int GetStyleFirstWord(unsigned int szLine, Accessor &styler) +{ + int nsPos = styler.LineStart(szLine); + int nePos = styler.LineStart(szLine+1) - 1; + while (isspacechar(styler.SafeGetCharAt(nsPos)) && nsPos < nePos) + { + nsPos++; // skip to next char + + } // End While + return styler.StyleAt(nsPos); + +} // GetStyleFirstWord() + + +// +static void FoldAU3Doc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) +{ + int endPos = startPos + length; + // get settings from the config files for folding comments and preprocessor lines + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + bool foldInComment = styler.GetPropertyInt("fold.comment") == 2; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + bool foldpreprocessor = styler.GetPropertyInt("fold.preprocessor") != 0; + // Backtrack to previous line in case need to fix its fold status + int lineCurrent = styler.GetLine(startPos); + if (startPos > 0) { + if (lineCurrent > 0) { + lineCurrent--; + startPos = styler.LineStart(lineCurrent); + } + } + // vars for style of previous/current/next lines + int style = GetStyleFirstWord(lineCurrent,styler); + int stylePrev = 0; + // find the first previous line without continuation character at the end + while ((lineCurrent > 0 && IsContinuationLine(lineCurrent,styler)) || + (lineCurrent > 1 && IsContinuationLine(lineCurrent-1,styler))) { + lineCurrent--; + startPos = styler.LineStart(lineCurrent); + } + if (lineCurrent > 0) { + stylePrev = GetStyleFirstWord(lineCurrent-1,styler); + } + // vars for getting first word to check for keywords + bool FirstWordStart = false; + bool FirstWordEnd = false; + char szKeyword[11]=""; + int szKeywordlen = 0; + char szThen[5]=""; + int szThenlen = 0; + bool ThenFoundLast = false; + // var for indentlevel + int levelCurrent = SC_FOLDLEVELBASE; + if (lineCurrent > 0) + levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; + int levelNext = levelCurrent; + // + int visibleChars = 0; + char chNext = styler.SafeGetCharAt(startPos); + char chPrev = ' '; + // + for (int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + if (IsAWordChar(ch)) { + visibleChars++; + } + // get the syle for the current character neede to check in comment + int stylech = styler.StyleAt(i); + // get first word for the line for indent check max 9 characters + if (FirstWordStart && (!(FirstWordEnd))) { + if (!IsAWordChar(ch)) { + FirstWordEnd = true; + szKeyword[szKeywordlen] = '\0'; + } + else { + if (szKeywordlen < 10) { + szKeyword[szKeywordlen++] = static_cast(tolower(ch)); + } + } + } + // start the capture of the first word + if (!(FirstWordStart)) { + if (IsAWordChar(ch) || IsAWordStart(ch) || ch == ';') { + FirstWordStart = true; + szKeyword[szKeywordlen++] = static_cast(tolower(ch)); + } + } + // only process this logic when not in comment section + if (!(stylech == SCE_AU3_COMMENT)) { + if (ThenFoundLast) { + if (IsAWordChar(ch)) { + ThenFoundLast = false; + } + } + // find out if the word "then" is the last on a "if" line + if (FirstWordEnd && strcmp(szKeyword,"if") == 0) { + if (szThenlen == 4) { + szThen[0] = szThen[1]; + szThen[1] = szThen[2]; + szThen[2] = szThen[3]; + szThen[3] = static_cast(tolower(ch)); + if (strcmp(szThen,"then") == 0 ) { + ThenFoundLast = true; + } + } + else { + szThen[szThenlen++] = static_cast(tolower(ch)); + if (szThenlen == 5) { + szThen[4] = '\0'; + } + } + } + } + // End of Line found so process the information + if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos)) { + // ************************** + // Folding logic for Keywords + // ************************** + // if a keyword is found on the current line and the line doesn't end with _ (continuation) + // and we are not inside a commentblock. + if (szKeywordlen > 0 && (!(chPrev == '_')) && + ((!(IsStreamCommentStyle(style)) || foldInComment)) ) { + szKeyword[szKeywordlen] = '\0'; + // only fold "if" last keyword is "then" (else its a one line if) + if (strcmp(szKeyword,"if") == 0 && ThenFoundLast) { + levelNext++; + } + // create new fold for these words + if (strcmp(szKeyword,"do") == 0 || strcmp(szKeyword,"for") == 0 || + strcmp(szKeyword,"func") == 0 || strcmp(szKeyword,"while") == 0|| + strcmp(szKeyword,"with") == 0 || strcmp(szKeyword,"#region") == 0 ) { + levelNext++; + } + // create double Fold for select&switch because Case will subtract one of the current level + if (strcmp(szKeyword,"select") == 0 || strcmp(szKeyword,"switch") == 0) { + levelNext++; + levelNext++; + } + // end the fold for these words before the current line + if (strcmp(szKeyword,"endfunc") == 0 || strcmp(szKeyword,"endif") == 0 || + strcmp(szKeyword,"next") == 0 || strcmp(szKeyword,"until") == 0 || + strcmp(szKeyword,"endwith") == 0 ||strcmp(szKeyword,"wend") == 0){ + levelNext--; + levelCurrent--; + } + // end the fold for these words before the current line and Start new fold + if (strcmp(szKeyword,"case") == 0 || strcmp(szKeyword,"else") == 0 || + strcmp(szKeyword,"elseif") == 0 ) { + levelCurrent--; + } + // end the double fold for this word before the current line + if (strcmp(szKeyword,"endselect") == 0 || strcmp(szKeyword,"endswitch") == 0 ) { + levelNext--; + levelNext--; + levelCurrent--; + levelCurrent--; + } + // end the fold for these words on the current line + if (strcmp(szKeyword,"#endregion") == 0 ) { + levelNext--; + } + } + // Preprocessor and Comment folding + int styleNext = GetStyleFirstWord(lineCurrent + 1,styler); + // ************************************* + // Folding logic for preprocessor blocks + // ************************************* + // process preprosessor line + if (foldpreprocessor && style == SCE_AU3_PREPROCESSOR) { + if (!(stylePrev == SCE_AU3_PREPROCESSOR) && (styleNext == SCE_AU3_PREPROCESSOR)) { + levelNext++; + } + // fold till the last line for normal comment lines + else if (stylePrev == SCE_AU3_PREPROCESSOR && !(styleNext == SCE_AU3_PREPROCESSOR)) { + levelNext--; + } + } + // ********************************* + // Folding logic for Comment blocks + // ********************************* + if (foldComment && IsStreamCommentStyle(style)) { + // Start of a comment block + if (!(stylePrev==style) && IsStreamCommentStyle(styleNext) && styleNext==style) { + levelNext++; + } + // fold till the last line for normal comment lines + else if (IsStreamCommentStyle(stylePrev) + && !(styleNext == SCE_AU3_COMMENT) + && stylePrev == SCE_AU3_COMMENT + && style == SCE_AU3_COMMENT) { + levelNext--; + } + // fold till the one but last line for Blockcomment lines + else if (IsStreamCommentStyle(stylePrev) + && !(styleNext == SCE_AU3_COMMENTBLOCK) + && style == SCE_AU3_COMMENTBLOCK) { + levelNext--; + levelCurrent--; + } + } + int levelUse = levelCurrent; + int lev = levelUse | levelNext << 16; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if (levelUse < levelNext) { + lev |= SC_FOLDLEVELHEADERFLAG; + } + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + // reset values for the next line + lineCurrent++; + stylePrev = style; + style = styleNext; + levelCurrent = levelNext; + visibleChars = 0; + // if the last character is an Underscore then don't reset since the line continues on the next line. + if (!(chPrev == '_')) { + szKeywordlen = 0; + szThenlen = 0; + FirstWordStart = false; + FirstWordEnd = false; + ThenFoundLast = false; + } + } + // save the last processed character + if (!isspacechar(ch)) { + chPrev = ch; + visibleChars++; + } + } +} + + +// + +static const char * const AU3WordLists[] = { + "#autoit keywords", + "#autoit functions", + "#autoit macros", + "#autoit Sent keys", + "#autoit Pre-processors", + "#autoit Special", + "#autoit Expand", + "#autoit UDF", + 0 +}; +LexerModule lmAU3(SCLEX_AU3, ColouriseAU3Doc, "au3", FoldAU3Doc , AU3WordLists); diff --git a/sdk/wxscintilla/src/scintilla/src/LexAVE.cxx b/sdk/wxscintilla/src/scintilla/src/LexAVE.cxx new file mode 100644 index 0000000..09b3933 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexAVE.cxx @@ -0,0 +1,228 @@ +// SciTE - Scintilla based Text Editor +/** @file LexAVE.cxx + ** Lexer for Avenue. + ** + ** Written by Alexey Yutkin . + **/ +// Copyright 1998-2002 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); +} +static inline bool IsEnumChar(const int ch) { + return (ch < 0x80) && (isalnum(ch)|| ch == '_'); +} +static inline bool IsANumberChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' ); +} + +inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + +inline bool isAveOperator(char ch) { + if (isascii(ch) && isalnum(ch)) + return false; + // '.' left out as it is used to make up numbers + if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || + ch == '(' || ch == ')' || ch == '=' || + ch == '{' || ch == '}' || + ch == '[' || ch == ']' || ch == ';' || + ch == '<' || ch == '>' || ch == ',' || + ch == '.' ) + return true; + return false; +} + +static void ColouriseAveDoc( + unsigned int startPos, + int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + WordList &keywords4 = *keywordlists[3]; + WordList &keywords5 = *keywordlists[4]; + WordList &keywords6 = *keywordlists[5]; + + // Do not leak onto next line + if (initStyle == SCE_AVE_STRINGEOL) { + initStyle = SCE_AVE_DEFAULT; + } + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + if (sc.atLineEnd) { + // Update the line state, so it can be seen by next line + int currentLine = styler.GetLine(sc.currentPos); + styler.SetLineState(currentLine, 0); + } + if (sc.atLineStart && (sc.state == SCE_AVE_STRING)) { + // Prevent SCE_AVE_STRINGEOL from leaking back to previous line + sc.SetState(SCE_AVE_STRING); + } + + + // Determine if the current state should terminate. + if (sc.state == SCE_AVE_OPERATOR) { + sc.SetState(SCE_AVE_DEFAULT); + } else if (sc.state == SCE_AVE_NUMBER) { + if (!IsANumberChar(sc.ch)) { + sc.SetState(SCE_AVE_DEFAULT); + } + } else if (sc.state == SCE_AVE_ENUM) { + if (!IsEnumChar(sc.ch)) { + sc.SetState(SCE_AVE_DEFAULT); + } + } else if (sc.state == SCE_AVE_IDENTIFIER) { + if (!IsAWordChar(sc.ch) || (sc.ch == '.')) { + char s[100]; + //sc.GetCurrent(s, sizeof(s)); + sc.GetCurrentLowered(s, sizeof(s)); + if (keywords.InList(s)) { + sc.ChangeState(SCE_AVE_WORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_AVE_WORD2); + } else if (keywords3.InList(s)) { + sc.ChangeState(SCE_AVE_WORD3); + } else if (keywords4.InList(s)) { + sc.ChangeState(SCE_AVE_WORD4); + } else if (keywords5.InList(s)) { + sc.ChangeState(SCE_AVE_WORD5); + } else if (keywords6.InList(s)) { + sc.ChangeState(SCE_AVE_WORD6); + } + sc.SetState(SCE_AVE_DEFAULT); + } + } else if (sc.state == SCE_AVE_COMMENT) { + if (sc.atLineEnd) { + sc.SetState(SCE_AVE_DEFAULT); + } + } else if (sc.state == SCE_AVE_STRING) { + if (sc.ch == '\"') { + sc.ForwardSetState(SCE_AVE_DEFAULT); + } else if (sc.atLineEnd) { + sc.ChangeState(SCE_AVE_STRINGEOL); + sc.ForwardSetState(SCE_AVE_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_AVE_DEFAULT) { + if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_AVE_NUMBER); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_AVE_IDENTIFIER); + } else if (sc.Match('\"')) { + sc.SetState(SCE_AVE_STRING); + } else if (sc.Match('\'')) { + sc.SetState(SCE_AVE_COMMENT); + sc.Forward(); + } else if (isAveOperator(static_cast(sc.ch))) { + sc.SetState(SCE_AVE_OPERATOR); + } else if (sc.Match('#')) { + sc.SetState(SCE_AVE_ENUM); + sc.Forward(); + } + } + } + sc.Complete(); +} + +static void FoldAveDoc(unsigned int startPos, int length, int /* initStyle */, WordList *[], + Accessor &styler) { + unsigned int lengthDoc = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = static_cast(tolower(styler[startPos])); + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + int styleNext = styler.StyleAt(startPos); + char s[10]; + + for (unsigned int i = startPos; i < lengthDoc; i++) { + char ch = static_cast(tolower(chNext)); + chNext = static_cast(tolower(styler.SafeGetCharAt(i + 1))); + int style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (style == SCE_AVE_WORD) { + if (ch == 't' || ch == 'f' || ch == 'w' || ch == 'e') { + for (unsigned int j = 0; j < 6; j++) { + if (!iswordchar(styler[i + j])) { + break; + } + s[j] = static_cast(tolower(styler[i + j])); + s[j + 1] = '\0'; + } + + if ((strcmp(s, "then") == 0) || (strcmp(s, "for") == 0) || (strcmp(s, "while") == 0)) { + levelCurrent++; + } + if ((strcmp(s, "end") == 0) || (strcmp(s, "elseif") == 0)) { + // Normally "elseif" and "then" will be on the same line and will cancel + // each other out. // As implemented, this does not support fold.at.else. + levelCurrent--; + } + } + } else if (style == SCE_AVE_OPERATOR) { + if (ch == '{' || ch == '(') { + levelCurrent++; + } else if (ch == '}' || ch == ')') { + levelCurrent--; + } + } + + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0 && foldCompact) { + lev |= SC_FOLDLEVELWHITEFLAG; + } + if ((levelCurrent > levelPrev) && (visibleChars > 0)) { + lev |= SC_FOLDLEVELHEADERFLAG; + } + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) { + visibleChars++; + } + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +LexerModule lmAVE(SCLEX_AVE, ColouriseAveDoc, "ave", FoldAveDoc); + diff --git a/sdk/wxscintilla/src/scintilla/src/LexAbaqus.cxx b/sdk/wxscintilla/src/scintilla/src/LexAbaqus.cxx new file mode 100644 index 0000000..10e8b76 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexAbaqus.cxx @@ -0,0 +1,617 @@ +// Scintilla source code edit control +/** @file LexABAQUS.cxx + ** Lexer for ABAQUS. Based on the lexer for APDL by Hadar Raz. + ** By Sergio Lucato. + ** Sort of completely rewritten by Gertjan Kloosterman + **/ +// The License.txt file describes the conditions under which this software may be distributed. + +// Code folding copyied and modified from LexBasic.cxx + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80 && (isalnum(ch) || (ch == '_'))); +} + +static inline bool IsAKeywordChar(const int ch) { + return (ch < 0x80 && (isalnum(ch) || (ch == '_') || (ch == ' '))); +} + +static inline bool IsASetChar(const int ch) { + return (ch < 0x80 && (isalnum(ch) || (ch == '_') || (ch == '.') || (ch == '-'))); +} + +static inline bool IsAnOperator(char ch) { + // '.' left out as it is used to make up numbers + if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || + ch == '(' || ch == ')' || ch == '=' || ch == '^' || + ch == '[' || ch == ']' || ch == '<' || ch == '&' || + ch == '>' || ch == ',' || ch == '|' || ch == '~' || + ch == '$' || ch == ':' || ch == '%') + return true; + return false; +} + +static void ColouriseABAQUSDoc(unsigned int startPos, int length, int initStyle, WordList*[] /* *keywordlists[] */, + Accessor &styler) { + enum localState { KW_LINE_KW, KW_LINE_COMMA, KW_LINE_PAR, KW_LINE_EQ, KW_LINE_VAL, \ + DAT_LINE_VAL, DAT_LINE_COMMA,\ + COMMENT_LINE,\ + ST_ERROR, LINE_END } state ; + + // Do not leak onto next line + state = LINE_END ; + initStyle = SCE_ABAQUS_DEFAULT; + StyleContext sc(startPos, length, initStyle, styler); + + // Things are actually quite simple + // we have commentlines + // keywordlines and datalines + // On a data line there will only be colouring of numbers + // a keyword line is constructed as + // *word,[ paramname[=paramvalue]]* + // if the line ends with a , the keyword line continues onto the new line + + for (; sc.More(); sc.Forward()) { + switch ( state ) { + case KW_LINE_KW : + if ( sc.atLineEnd ) { + // finished the line in keyword state, switch to LINE_END + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = LINE_END ; + } else if ( IsAKeywordChar(sc.ch) ) { + // nothing changes + state = KW_LINE_KW ; + } else if ( sc.ch == ',' ) { + // Well well we say a comma, arguments *MUST* follow + sc.SetState(SCE_ABAQUS_OPERATOR) ; + state = KW_LINE_COMMA ; + } else { + // Flag an error + sc.SetState(SCE_ABAQUS_PROCESSOR) ; + state = ST_ERROR ; + } + // Done with processing + break ; + case KW_LINE_COMMA : + // acomma on a keywordline was seen + if ( IsAKeywordChar(sc.ch)) { + sc.SetState(SCE_ABAQUS_ARGUMENT) ; + state = KW_LINE_PAR ; + } else if ( sc.atLineEnd || (sc.ch == ',') ) { + // we remain in keyword mode + state = KW_LINE_COMMA ; + } else if ( sc.ch == ' ' ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = KW_LINE_COMMA ; + } else { + // Anything else constitutes an error + sc.SetState(SCE_ABAQUS_PROCESSOR) ; + state = ST_ERROR ; + } + break ; + case KW_LINE_PAR : + if ( sc.atLineEnd ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = LINE_END ; + } else if ( IsAKeywordChar(sc.ch) || (sc.ch == '-') ) { + // remain in this state + state = KW_LINE_PAR ; + } else if ( sc.ch == ',' ) { + sc.SetState(SCE_ABAQUS_OPERATOR) ; + state = KW_LINE_COMMA ; + } else if ( sc.ch == '=' ) { + sc.SetState(SCE_ABAQUS_OPERATOR) ; + state = KW_LINE_EQ ; + } else { + // Anything else constitutes an error + sc.SetState(SCE_ABAQUS_PROCESSOR) ; + state = ST_ERROR ; + } + break ; + case KW_LINE_EQ : + if ( sc.ch == ' ' ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + // remain in this state + state = KW_LINE_EQ ; + } else if ( IsADigit(sc.ch) || (sc.ch == '-') || (sc.ch == '.' && IsADigit(sc.chNext)) ) { + sc.SetState(SCE_ABAQUS_NUMBER) ; + state = KW_LINE_VAL ; + } else if ( IsAKeywordChar(sc.ch) ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = KW_LINE_VAL ; + } else if ( (sc.ch == '\'') || (sc.ch == '\"') ) { + sc.SetState(SCE_ABAQUS_STRING) ; + state = KW_LINE_VAL ; + } else { + sc.SetState(SCE_ABAQUS_PROCESSOR) ; + state = ST_ERROR ; + } + break ; + case KW_LINE_VAL : + if ( sc.atLineEnd ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = LINE_END ; + } else if ( IsASetChar(sc.ch) && (sc.state == SCE_ABAQUS_DEFAULT) ) { + // nothing changes + state = KW_LINE_VAL ; + } else if (( (IsADigit(sc.ch) || sc.ch == '.' || (sc.ch == 'e' || sc.ch == 'E') || + ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')))) && + (sc.state == SCE_ABAQUS_NUMBER)) { + // remain in number mode + state = KW_LINE_VAL ; + } else if (sc.state == SCE_ABAQUS_STRING) { + // accept everything until a closing quote + if ( sc.ch == '\'' || sc.ch == '\"' ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = KW_LINE_VAL ; + } + } else if ( sc.ch == ',' ) { + sc.SetState(SCE_ABAQUS_OPERATOR) ; + state = KW_LINE_COMMA ; + } else { + // anything else is an error + sc.SetState(SCE_ABAQUS_PROCESSOR) ; + state = ST_ERROR ; + } + break ; + case DAT_LINE_VAL : + if ( sc.atLineEnd ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = LINE_END ; + } else if ( IsASetChar(sc.ch) && (sc.state == SCE_ABAQUS_DEFAULT) ) { + // nothing changes + state = DAT_LINE_VAL ; + } else if (( (IsADigit(sc.ch) || sc.ch == '.' || (sc.ch == 'e' || sc.ch == 'E') || + ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E')))) && + (sc.state == SCE_ABAQUS_NUMBER)) { + // remain in number mode + state = DAT_LINE_VAL ; + } else if (sc.state == SCE_ABAQUS_STRING) { + // accept everything until a closing quote + if ( sc.ch == '\'' || sc.ch == '\"' ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = DAT_LINE_VAL ; + } + } else if ( sc.ch == ',' ) { + sc.SetState(SCE_ABAQUS_OPERATOR) ; + state = DAT_LINE_COMMA ; + } else { + // anything else is an error + sc.SetState(SCE_ABAQUS_PROCESSOR) ; + state = ST_ERROR ; + } + break ; + case DAT_LINE_COMMA : + // a comma on a data line was seen + if ( sc.atLineEnd ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = LINE_END ; + } else if ( sc.ch == ' ' ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = DAT_LINE_COMMA ; + } else if (sc.ch == ',') { + sc.SetState(SCE_ABAQUS_OPERATOR) ; + state = DAT_LINE_COMMA ; + } else if ( IsADigit(sc.ch) || (sc.ch == '-')|| (sc.ch == '.' && IsADigit(sc.chNext)) ) { + sc.SetState(SCE_ABAQUS_NUMBER) ; + state = DAT_LINE_VAL ; + } else if ( IsAKeywordChar(sc.ch) ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = DAT_LINE_VAL ; + } else if ( (sc.ch == '\'') || (sc.ch == '\"') ) { + sc.SetState(SCE_ABAQUS_STRING) ; + state = DAT_LINE_VAL ; + } else { + sc.SetState(SCE_ABAQUS_PROCESSOR) ; + state = ST_ERROR ; + } + break ; + case COMMENT_LINE : + if ( sc.atLineEnd ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = LINE_END ; + } + break ; + case ST_ERROR : + if ( sc.atLineEnd ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = LINE_END ; + } + break ; + case LINE_END : + if ( sc.atLineEnd || sc.ch == ' ' ) { + // nothing changes + state = LINE_END ; + } else if ( sc.ch == '*' ) { + if ( sc.chNext == '*' ) { + state = COMMENT_LINE ; + sc.SetState(SCE_ABAQUS_COMMENT) ; + } else { + state = KW_LINE_KW ; + sc.SetState(SCE_ABAQUS_STARCOMMAND) ; + } + } else { + // it must be a data line, things are as if we are in DAT_LINE_COMMA + if ( sc.ch == ',' ) { + sc.SetState(SCE_ABAQUS_OPERATOR) ; + state = DAT_LINE_COMMA ; + } else if ( IsADigit(sc.ch) || (sc.ch == '-')|| (sc.ch == '.' && IsADigit(sc.chNext)) ) { + sc.SetState(SCE_ABAQUS_NUMBER) ; + state = DAT_LINE_VAL ; + } else if ( IsAKeywordChar(sc.ch) ) { + sc.SetState(SCE_ABAQUS_DEFAULT) ; + state = DAT_LINE_VAL ; + } else if ( (sc.ch == '\'') || (sc.ch == '\"') ) { + sc.SetState(SCE_ABAQUS_STRING) ; + state = DAT_LINE_VAL ; + } else { + sc.SetState(SCE_ABAQUS_PROCESSOR) ; + state = ST_ERROR ; + } + } + break ; + } + } + sc.Complete(); +} + +//------------------------------------------------------------------------------ +// This copyied and modified from LexBasic.cxx +//------------------------------------------------------------------------------ + +/* Bits: + * 1 - whitespace + * 2 - operator + * 4 - identifier + * 8 - decimal digit + * 16 - hex digit + * 32 - bin digit + */ +static int character_classification[128] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 0, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 10, 6, + 60, 60, 28, 28, 28, 28, 28, 28, 28, 28, 2, 2, 2, 2, 2, 2, + 2, 20, 20, 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 4, + 2, 20, 20, 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 0 +}; + +static bool IsSpace(int c) { + return c < 128 && (character_classification[c] & 1); +} + +static bool IsIdentifier(int c) { + return c < 128 && (character_classification[c] & 4); +} + +static int LowerCase(int c) +{ + if (c >= 'A' && c <= 'Z') + return 'a' + c - 'A'; + return c; +} + +static int LineEnd(int line, Accessor &styler) +{ + const int docLines = styler.GetLine(styler.Length() - 1); // Available last line + int eol_pos ; + // if the line is the last line, the eol_pos is styler.Length() + // eol will contain a new line, or a virtual new line + if ( docLines == line ) + eol_pos = styler.Length() ; + else + eol_pos = styler.LineStart(line + 1) - 1; + return eol_pos ; +} + +static int LineStart(int line, Accessor &styler) +{ + return styler.LineStart(line) ; +} + +// LineType +// +// bits determines the line type +// 1 : data line +// 2 : only whitespace +// 3 : data line with only whitespace +// 4 : keyword line +// 5 : block open keyword line +// 6 : block close keyword line +// 7 : keyword line in error +// 8 : comment line +static int LineType(int line, Accessor &styler) { + int pos = LineStart(line, styler) ; + int eol_pos = LineEnd(line, styler) ; + + int c ; + char ch = ' '; + + int i = pos ; + while ( i < eol_pos ) { + c = styler.SafeGetCharAt(i); + ch = static_cast(LowerCase(c)); + // We can say something as soon as no whitespace + // was encountered + if ( !IsSpace(c) ) + break ; + i++ ; + } + + if ( i >= eol_pos ) { + // This is a whitespace line, currently + // classifies as data line + return 3 ; + } + + if ( ch != '*' ) { + // This is a data line + return 1 ; + } + + if ( i == eol_pos - 1 ) { + // Only a single *, error but make keyword line + return 4+3 ; + } + + // This means we can have a second character + // if that is also a * this means a comment + // otherwise it is a keyword. + c = styler.SafeGetCharAt(i+1); + ch = static_cast(LowerCase(c)); + if ( ch == '*' ) { + return 8 ; + } + + // At this point we know this is a keyword line + // the character at position i is a * + // it is not a comment line + char word[256] ; + int wlen = 0; + + word[wlen] = '*' ; + wlen++ ; + + i++ ; + while ( (i < eol_pos) && (wlen < 255) ) { + c = styler.SafeGetCharAt(i); + ch = static_cast(LowerCase(c)); + + if ( (!IsSpace(c)) && (!IsIdentifier(c)) ) + break ; + + if ( IsIdentifier(c) ) { + word[wlen] = ch ; + wlen++ ; + } + + i++ ; + } + + word[wlen] = 0 ; + + // Make a comparison + if ( !strcmp(word, "*step") || + !strcmp(word, "*part") || + !strcmp(word, "*instance") || + !strcmp(word, "*assembly")) { + return 4+1 ; + } + + if ( !strcmp(word, "*endstep") || + !strcmp(word, "*endpart") || + !strcmp(word, "*endinstance") || + !strcmp(word, "*endassembly")) { + return 4+2 ; + } + + return 4 ; +} + +static void SafeSetLevel(int line, int level, Accessor &styler) +{ + if ( line < 0 ) + return ; + + int mask = ((~SC_FOLDLEVELHEADERFLAG) | (~SC_FOLDLEVELWHITEFLAG)); + + if ( (level & mask) < 0 ) + return ; + + if ( styler.LevelAt(line) != level ) + styler.SetLevel(line, level) ; +} + +static void FoldABAQUSDoc(unsigned int startPos, int length, int, +WordList *[], Accessor &styler) { + int startLine = styler.GetLine(startPos) ; + int endLine = styler.GetLine(startPos+length-1) ; + + // bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + // We want to deal with all the cases + // To know the correct indentlevel, we need to look back to the + // previous command line indentation level + // order of formatting keyline datalines commentlines + int beginData = -1 ; + int beginComment = -1 ; + int prvKeyLine = startLine ; + int prvKeyLineTp = 0 ; + + // Scan until we find the previous keyword line + // this will give us the level reference that we need + while ( prvKeyLine > 0 ) { + prvKeyLine-- ; + prvKeyLineTp = LineType(prvKeyLine, styler) ; + if ( prvKeyLineTp & 4 ) + break ; + } + + // Determine the base line level of all lines following + // the previous keyword + // new keyword lines are placed on this level + //if ( prvKeyLineTp & 4 ) { + int level = styler.LevelAt(prvKeyLine) & ~SC_FOLDLEVELHEADERFLAG ; + //} + + // uncomment line below if weird behaviour continues + prvKeyLine = -1 ; + + // Now start scanning over the lines. + for ( int line = startLine; line <= endLine; line++ ) { + int lineType = LineType(line, styler) ; + + // Check for comment line + if ( lineType == 8 ) { + if ( beginComment < 0 ) { + beginComment = line ; + } + } + + // Check for data line + if ( (lineType == 1) || (lineType == 3) ) { + if ( beginData < 0 ) { + if ( beginComment >= 0 ) { + beginData = beginComment ; + } else { + beginData = line ; + } + } + beginComment = -1 ; + } + + // Check for keywordline. + // As soon as a keyword line is encountered, we can set the + // levels of everything from the previous keyword line to this one + if ( lineType & 4 ) { + // this is a keyword, we can now place the previous keyword + // all its data lines and the remainder + + // Write comments and data line + if ( beginComment < 0 ) { + beginComment = line ; + } + + if ( beginData < 0 ) { + beginData = beginComment ; + if ( prvKeyLineTp != 5 ) + SafeSetLevel(prvKeyLine, level, styler) ; + else + SafeSetLevel(prvKeyLine, level | SC_FOLDLEVELHEADERFLAG, styler) ; + } else { + SafeSetLevel(prvKeyLine, level | SC_FOLDLEVELHEADERFLAG, styler) ; + } + + int datLevel = level + 1 ; + if ( !(prvKeyLineTp & 4) ) { + datLevel = level ; + } + + for ( int ll = beginData; ll < beginComment; ll++ ) + SafeSetLevel(ll, datLevel, styler) ; + + // The keyword we just found is going to be written at another level + // if we have a type 5 and type 6 + if ( prvKeyLineTp == 5 ) { + level += 1 ; + } + + if ( prvKeyLineTp == 6 ) { + level -= 1 ; + if ( level < 0 ) { + level = 0 ; + } + } + + for ( int lll = beginComment; lll < line; lll++ ) + SafeSetLevel(lll, level, styler) ; + + // wrap and reset + beginComment = -1 ; + beginData = -1 ; + prvKeyLine = line ; + prvKeyLineTp = lineType ; + } + + } + + if ( beginComment < 0 ) { + beginComment = endLine + 1 ; + } else { + // We need to find out whether this comment block is followed by + // a data line or a keyword line + const int docLines = styler.GetLine(styler.Length() - 1); + + for ( int line = endLine + 1; line <= docLines; line++ ) { + int lineType = LineType(line, styler) ; + + if ( lineType != 8 ) { + if ( !(lineType & 4) ) { + beginComment = endLine + 1 ; + } + break ; + } + } + } + + if ( beginData < 0 ) { + beginData = beginComment ; + if ( prvKeyLineTp != 5 ) + SafeSetLevel(prvKeyLine, level, styler) ; + else + SafeSetLevel(prvKeyLine, level | SC_FOLDLEVELHEADERFLAG, styler) ; + } else { + SafeSetLevel(prvKeyLine, level | SC_FOLDLEVELHEADERFLAG, styler) ; + } + + int datLevel = level + 1 ; + if ( !(prvKeyLineTp & 4) ) { + datLevel = level ; + } + + for ( int ll = beginData; ll < beginComment; ll++ ) + SafeSetLevel(ll, datLevel, styler) ; + + if ( prvKeyLineTp == 5 ) { + level += 1 ; + } + + if ( prvKeyLineTp == 6 ) { + level -= 1 ; + } + for ( int m = beginComment; m <= endLine; m++ ) + SafeSetLevel(m, level, styler) ; +} + +static const char * const abaqusWordListDesc[] = { + "processors", + "commands", + "slashommands", + "starcommands", + "arguments", + "functions", + 0 +}; + +LexerModule lmAbaqus(SCLEX_ABAQUS, ColouriseABAQUSDoc, "abaqus", FoldABAQUSDoc, abaqusWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexAda.cxx b/sdk/wxscintilla/src/scintilla/src/LexAda.cxx new file mode 100644 index 0000000..654bfbe --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexAda.cxx @@ -0,0 +1,525 @@ +// Scintilla source code edit control +/** @file LexAda.cxx + ** Lexer for Ada 95 + **/ +// Copyright 2002 by Sergey Koshcheyev +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include + +#include + +#include "Platform.h" + +#include "Accessor.h" +#include "StyleContext.h" +#include "PropSet.h" +#include "KeyWords.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +/* + * Interface + */ + +static void ColouriseDocument( + unsigned int startPos, + int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler); + +static const char * const adaWordListDesc[] = { + "Keywords", + 0 +}; + +LexerModule lmAda(SCLEX_ADA, ColouriseDocument, "ada", NULL, adaWordListDesc); + +/* + * Implementation + */ + +// Functions that have apostropheStartsAttribute as a parameter set it according to whether +// an apostrophe encountered after processing the current token will start an attribute or +// a character literal. +static void ColouriseCharacter(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseComment(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseContext(StyleContext& sc, char chEnd, int stateEOL); +static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseLabel(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute); +static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseString(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseWhiteSpace(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseWord(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute); + +static inline bool IsDelimiterCharacter(int ch); +static inline bool IsNumberStartCharacter(int ch); +static inline bool IsNumberCharacter(int ch); +static inline bool IsSeparatorOrDelimiterCharacter(int ch); +static bool IsValidIdentifier(const std::string& identifier); +static bool IsValidNumber(const std::string& number); +static inline bool IsWordStartCharacter(int ch); +static inline bool IsWordCharacter(int ch); + +static void ColouriseCharacter(StyleContext& sc, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = true; + + sc.SetState(SCE_ADA_CHARACTER); + + // Skip the apostrophe and one more character (so that '' is shown as non-terminated and ''' + // is handled correctly) + sc.Forward(); + sc.Forward(); + + ColouriseContext(sc, '\'', SCE_ADA_CHARACTEREOL); +} + +static void ColouriseContext(StyleContext& sc, char chEnd, int stateEOL) { + while (!sc.atLineEnd && !sc.Match(chEnd)) { + sc.Forward(); + } + + if (!sc.atLineEnd) { + sc.ForwardSetState(SCE_ADA_DEFAULT); + } else { + sc.ChangeState(stateEOL); + } +} + +static void ColouriseComment(StyleContext& sc, bool& /*apostropheStartsAttribute*/) { + // Apostrophe meaning is not changed, but the parameter is present for uniformity + + sc.SetState(SCE_ADA_COMMENTLINE); + + while (!sc.atLineEnd) { + sc.Forward(); + } +} + +static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = sc.Match (')'); + sc.SetState(SCE_ADA_DELIMITER); + sc.ForwardSetState(SCE_ADA_DEFAULT); +} + +static void ColouriseLabel(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = false; + + sc.SetState(SCE_ADA_LABEL); + + // Skip "<<" + sc.Forward(); + sc.Forward(); + + std::string identifier; + + while (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) { + identifier += static_cast(tolower(sc.ch)); + sc.Forward(); + } + + // Skip ">>" + if (sc.Match('>', '>')) { + sc.Forward(); + sc.Forward(); + } else { + sc.ChangeState(SCE_ADA_ILLEGAL); + } + + // If the name is an invalid identifier or a keyword, then make it invalid label + if (!IsValidIdentifier(identifier) || keywords.InList(identifier.c_str())) { + sc.ChangeState(SCE_ADA_ILLEGAL); + } + + sc.SetState(SCE_ADA_DEFAULT); + +} + +static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = true; + + std::string number; + sc.SetState(SCE_ADA_NUMBER); + + // Get all characters up to a delimiter or a separator, including points, but excluding + // double points (ranges). + while (!IsSeparatorOrDelimiterCharacter(sc.ch) || (sc.ch == '.' && sc.chNext != '.')) { + number += static_cast(sc.ch); + sc.Forward(); + } + + // Special case: exponent with sign + if ((sc.chPrev == 'e' || sc.chPrev == 'E') && + (sc.ch == '+' || sc.ch == '-')) { + number += static_cast(sc.ch); + sc.Forward (); + + while (!IsSeparatorOrDelimiterCharacter(sc.ch)) { + number += static_cast(sc.ch); + sc.Forward(); + } + } + + if (!IsValidNumber(number)) { + sc.ChangeState(SCE_ADA_ILLEGAL); + } + + sc.SetState(SCE_ADA_DEFAULT); +} + +static void ColouriseString(StyleContext& sc, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = true; + + sc.SetState(SCE_ADA_STRING); + sc.Forward(); + + ColouriseContext(sc, '"', SCE_ADA_STRINGEOL); +} + +static void ColouriseWhiteSpace(StyleContext& sc, bool& /*apostropheStartsAttribute*/) { + // Apostrophe meaning is not changed, but the parameter is present for uniformity + sc.SetState(SCE_ADA_DEFAULT); + sc.ForwardSetState(SCE_ADA_DEFAULT); +} + +static void ColouriseWord(StyleContext& sc, WordList& keywords, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = true; + sc.SetState(SCE_ADA_IDENTIFIER); + + std::string word; + + while (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) { + word += static_cast(tolower(sc.ch)); + sc.Forward(); + } + + if (!IsValidIdentifier(word)) { + sc.ChangeState(SCE_ADA_ILLEGAL); + + } else if (keywords.InList(word.c_str())) { + sc.ChangeState(SCE_ADA_WORD); + + if (word != "all") { + apostropheStartsAttribute = false; + } + } + + sc.SetState(SCE_ADA_DEFAULT); +} + +// +// ColouriseDocument +// + +static void ColouriseDocument( + unsigned int startPos, + int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler) { + WordList &keywords = *keywordlists[0]; + + StyleContext sc(startPos, length, initStyle, styler); + + int lineCurrent = styler.GetLine(startPos); + bool apostropheStartsAttribute = (styler.GetLineState(lineCurrent) & 1) != 0; + + while (sc.More()) { + if (sc.atLineEnd) { + // Go to the next line + sc.Forward(); + lineCurrent++; + + // Remember the line state for future incremental lexing + styler.SetLineState(lineCurrent, apostropheStartsAttribute); + + // Don't continue any styles on the next line + sc.SetState(SCE_ADA_DEFAULT); + } + + // Comments + if (sc.Match('-', '-')) { + ColouriseComment(sc, apostropheStartsAttribute); + + // Strings + } else if (sc.Match('"')) { + ColouriseString(sc, apostropheStartsAttribute); + + // Characters + } else if (sc.Match('\'') && !apostropheStartsAttribute) { + ColouriseCharacter(sc, apostropheStartsAttribute); + + // Labels + } else if (sc.Match('<', '<')) { + ColouriseLabel(sc, keywords, apostropheStartsAttribute); + + // Whitespace + } else if (IsASpace(sc.ch)) { + ColouriseWhiteSpace(sc, apostropheStartsAttribute); + + // Delimiters + } else if (IsDelimiterCharacter(sc.ch)) { + ColouriseDelimiter(sc, apostropheStartsAttribute); + + // Numbers + } else if (IsADigit(sc.ch) || sc.ch == '#') { + ColouriseNumber(sc, apostropheStartsAttribute); + + // Keywords or identifiers + } else { + ColouriseWord(sc, keywords, apostropheStartsAttribute); + } + } + + sc.Complete(); +} + +static inline bool IsDelimiterCharacter(int ch) { + switch (ch) { + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case ':': + case ';': + case '<': + case '=': + case '>': + case '|': + return true; + default: + return false; + } +} + +static inline bool IsNumberCharacter(int ch) { + return IsNumberStartCharacter(ch) || + ch == '_' || + ch == '.' || + ch == '#' || + (ch >= 'a' && ch <= 'f') || + (ch >= 'A' && ch <= 'F'); +} + +static inline bool IsNumberStartCharacter(int ch) { + return IsADigit(ch); +} + +static inline bool IsSeparatorOrDelimiterCharacter(int ch) { + return IsASpace(ch) || IsDelimiterCharacter(ch); +} + +static bool IsValidIdentifier(const std::string& identifier) { + // First character can't be '_', so initialize the flag to true + bool lastWasUnderscore = true; + + size_t length = identifier.length(); + + // Zero-length identifiers are not valid (these can occur inside labels) + if (length == 0) { + return false; + } + + // Check for valid character at the start + if (!IsWordStartCharacter(identifier[0])) { + return false; + } + + // Check for only valid characters and no double underscores + for (size_t i = 0; i < length; i++) { + if (!IsWordCharacter(identifier[i]) || + (identifier[i] == '_' && lastWasUnderscore)) { + return false; + } + lastWasUnderscore = identifier[i] == '_'; + } + + // Check for underscore at the end + if (lastWasUnderscore == true) { + return false; + } + + // All checks passed + return true; +} + +static bool IsValidNumber(const std::string& number) { + size_t hashPos = number.find("#"); + bool seenDot = false; + + size_t i = 0; + size_t length = number.length(); + + if (length == 0) + return false; // Just in case + + // Decimal number + if (hashPos == std::string::npos) { + bool canBeSpecial = false; + + for (; i < length; i++) { + if (number[i] == '_') { + if (!canBeSpecial) { + return false; + } + canBeSpecial = false; + } else if (number[i] == '.') { + if (!canBeSpecial || seenDot) { + return false; + } + canBeSpecial = false; + seenDot = true; + } else if (IsADigit(number[i])) { + canBeSpecial = true; + } else { + break; + } + } + + if (!canBeSpecial) + return false; + } else { + // Based number + bool canBeSpecial = false; + int base = 0; + + // Parse base + for (; i < length; i++) { + int ch = number[i]; + if (ch == '_') { + if (!canBeSpecial) + return false; + canBeSpecial = false; + } else if (IsADigit(ch)) { + base = base * 10 + (ch - '0'); + if (base > 16) + return false; + canBeSpecial = true; + } else if (ch == '#' && canBeSpecial) { + break; + } else { + return false; + } + } + + if (base < 2) + return false; + if (i == length) + return false; + + i++; // Skip over '#' + + // Parse number + canBeSpecial = false; + + for (; i < length; i++) { + int ch = tolower(number[i]); + + if (ch == '_') { + if (!canBeSpecial) { + return false; + } + canBeSpecial = false; + + } else if (ch == '.') { + if (!canBeSpecial || seenDot) { + return false; + } + canBeSpecial = false; + seenDot = true; + + } else if (IsADigit(ch)) { + if (ch - '0' >= base) { + return false; + } + canBeSpecial = true; + + } else if (ch >= 'a' && ch <= 'f') { + if (ch - 'a' + 10 >= base) { + return false; + } + canBeSpecial = true; + + } else if (ch == '#' && canBeSpecial) { + break; + + } else { + return false; + } + } + + if (i == length) { + return false; + } + + i++; + } + + // Exponent (optional) + if (i < length) { + if (number[i] != 'e' && number[i] != 'E') + return false; + + i++; // Move past 'E' + + if (i == length) { + return false; + } + + if (number[i] == '+') + i++; + else if (number[i] == '-') { + if (seenDot) { + i++; + } else { + return false; // Integer literals should not have negative exponents + } + } + + if (i == length) { + return false; + } + + bool canBeSpecial = false; + + for (; i < length; i++) { + if (number[i] == '_') { + if (!canBeSpecial) { + return false; + } + canBeSpecial = false; + } else if (IsADigit(number[i])) { + canBeSpecial = true; + } else { + return false; + } + } + + if (!canBeSpecial) + return false; + } + + // if i == length, number was parsed successfully. + return i == length; +} + +static inline bool IsWordCharacter(int ch) { + return IsWordStartCharacter(ch) || IsADigit(ch); +} + +static inline bool IsWordStartCharacter(int ch) { + return (isascii(ch) && isalpha(ch)) || ch == '_'; +} diff --git a/sdk/wxscintilla/src/scintilla/src/LexAltaRica.cxx b/sdk/wxscintilla/src/scintilla/src/LexAltaRica.cxx new file mode 100644 index 0000000..b77647e --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexAltaRica.cxx @@ -0,0 +1,412 @@ +// Scintilla source code edit control +/** @file LexAltaRica.cxx + ** Lexers for the AltaRica language. + **/ +// Copyright 2010 by Florent Teichteil-Königsbuch +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" +#include "CharacterSet.h" +#include "CharClassify.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static inline bool isAltaRicaOperator(char ch) { + if (isascii(ch) && isalnum(ch)) + return false; + + if ((ch == '?') || (ch == '{') || (ch == '}') || (ch == '<') || (ch == '>') || + (ch == '=') || (ch == '|') || (ch == '&') || (ch == ';') || (ch == ',') || + (ch == '.') || (ch == '(') || (ch == ')') || (ch == '[') || (ch == ']') || + (ch == '+') || (ch == '-') || (ch == '*') || (ch == '~') || (ch == '/') || + (ch == '!') || (ch == ':')) + return true; + + return false; +} + +static inline bool isAltaRicaForbidden(char ch) { + return !isascii(ch) || (ch == '\"') || (ch == '#') || (ch == '$') || (ch == '%') || + (ch == '\'') || (ch == '@') || (ch == '^') || (ch == '`'); +} + +static inline bool isAltaRicaWordStart(char ch) { + return isascii(ch) && !isspacechar(ch) && !isAltaRicaOperator(ch) && + !isAltaRicaForbidden(ch) && (ch != '\n') && (ch != '\r'); +} + +static void classifyWordAltaRica(unsigned int start, unsigned int end, WordList &keywords, + WordList &types, Accessor &styler) { + PLATFORM_ASSERT(end >= start); + char s[100]; + + for (unsigned int i = 0; (i < end - start + 1) && (i < 99); i++) { + s[i] = MakeUpperCase(styler[start + i]); + s[i + 1] = '\0'; + } + + if (keywords.InList(s)) + styler.ColourTo(end, SCE_ALTARICA_KEYWORD); + else if (types.InList(s)) + styler.ColourTo(end, SCE_ALTARICA_TYPE); + else + styler.ColourTo(end, SCE_ALTARICA_IDENTIFIER); +} + +static void ColouriseAltaRicaDoc( + unsigned int startPos, + int length, + int initStyle, + WordList* keywordlists[], + Accessor& styler) +{ + WordList &keywords = *keywordlists[0]; + WordList &types = *keywordlists[1]; + + styler.StartAt(startPos); + + int state = initStyle; + char chNext = styler[startPos]; + unsigned int lengthDoc = startPos + length; + styler.StartSegment(startPos); + + for (unsigned int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + + if (styler.IsLeadByte(ch)) { + chNext = styler.SafeGetCharAt(i + 2); + i += 1; + continue; + } + + if (state == SCE_ALTARICA_DEFAULT) { + if ((ch == '/') && (chNext == '/')) { + i++; + chNext = styler.SafeGetCharAt(i + 1); + styler.ColourTo(i - 2, state); + state = SCE_ALTARICA_COMMENTLINE; + } + else if ((ch == '/') && (chNext == '*')) { + i++; + chNext = styler.SafeGetCharAt(i + 1); + styler.ColourTo(i - 2, state); + state = SCE_ALTARICA_COMMENT; + } + else if (isAltaRicaOperator(ch)) { + styler.ColourTo(i - 1, state); + styler.ColourTo(i, SCE_ALTARICA_OPERATOR); + } + else if (isAltaRicaWordStart(ch) && !isdigit(ch)) { + styler.ColourTo(i - 1, state); + state = SCE_ALTARICA_IDENTIFIER; + } + else if (isdigit(ch)) { + styler.ColourTo(i - 1, state); + state = SCE_ALTARICA_NUMBER; + } + else if (isAltaRicaForbidden(ch)) { + styler.ColourTo(i - 1, state); + styler.ColourTo(i, SCE_ALTARICA_FORBIDDEN); + } + } + else if (state == SCE_ALTARICA_COMMENTLINE) { + if (atEOL) { + styler.ColourTo(i - 1, state); + state = SCE_ALTARICA_DEFAULT; + } + } + else if (state == SCE_ALTARICA_COMMENT) { + if ((ch == '*') && (chNext == '/')) { + i++; + chNext = styler.SafeGetCharAt(i + 1); + styler.ColourTo(i, state); + state = SCE_ALTARICA_DEFAULT; + } + } + else if (state == SCE_ALTARICA_IDENTIFIER) { + if (!isAltaRicaWordStart(ch)) { + classifyWordAltaRica(styler.GetStartSegment(), i - 1, keywords, types, styler); + + if ((ch == '/') && (chNext == '/')) { + i++; + chNext = styler.SafeGetCharAt(i + 1); + styler.ColourTo(i - 2, state); + state = SCE_ALTARICA_COMMENTLINE; + } + else if ((ch == '/') && (chNext == '*')) { + i++; + chNext = styler.SafeGetCharAt(i + 1); + styler.ColourTo(i - 2, state); + state = SCE_ALTARICA_COMMENT; + } + else if (isAltaRicaOperator(ch)) { + styler.ColourTo(i - 1, state); + styler.ColourTo(i, SCE_ALTARICA_OPERATOR); + state = SCE_ALTARICA_DEFAULT; + } + else if (isAltaRicaForbidden(ch)) { + styler.ColourTo(i - 1, state); + styler.ColourTo(i, SCE_ALTARICA_FORBIDDEN); + state = SCE_ALTARICA_DEFAULT; + } + else + state = SCE_ALTARICA_DEFAULT; + } + } + else if (state == SCE_ALTARICA_NUMBER) { + if (!isdigit(ch)) { + styler.ColourTo(i - 1, state); + + if ((ch == '/') && (chNext == '/')) { + i++; + chNext = styler.SafeGetCharAt(i + 1); + styler.ColourTo(i - 2, state); + state = SCE_ALTARICA_COMMENTLINE; + } + else if ((ch == '/') && (chNext == '*')) { + i++; + chNext = styler.SafeGetCharAt(i + 1); + styler.ColourTo(i - 2, state); + state = SCE_ALTARICA_COMMENT; + } + else if (isAltaRicaOperator(ch)) { + styler.ColourTo(i - 1, state); + styler.ColourTo(i, SCE_ALTARICA_OPERATOR); + state = SCE_ALTARICA_DEFAULT; + } + else if (isAltaRicaForbidden(ch)) { + styler.ColourTo(i, SCE_ALTARICA_FORBIDDEN); + state = SCE_ALTARICA_DEFAULT; + } + else + state = SCE_ALTARICA_DEFAULT; + } + } + } + + styler.ColourTo(lengthDoc - 1, state); +} + +static bool IsCommentLine(int line, Accessor& styler) { + unsigned int pos = styler.LineStart(line); + unsigned int eol_pos = styler.LineStart(line + 1) - 1; + if (pos == eol_pos) { + int style = styler.StyleAt(pos); + return (style == SCE_ALTARICA_COMMENT); + } + for (unsigned int i = pos; i < eol_pos; i++) { + int style = styler.StyleAt(i); + if (style == SCE_ALTARICA_COMMENTLINE) + return true; + else if (style == SCE_ALTARICA_COMMENT) { + if (i+1 == eol_pos) { + return true; + } + } else { + char ch = styler[i]; + if ((ch != ' ') && (ch != '\t')) { + return false; + } + } + } + return false; +} + +static bool PreviousFoldKeywordIsInsideNode(unsigned int endPos, Accessor& styler) { + unsigned int pos = endPos; + bool wordEnd = false; + unsigned int posWordEnd = 0; + char s[10]; // AltaRica keywords have atmost 9 characters + while (pos > 0) { + int style = styler.StyleAt(pos-1); + if (!wordEnd && (style == SCE_ALTARICA_KEYWORD)) { + posWordEnd = pos; + wordEnd = true; + } + else if (wordEnd && ((style != SCE_ALTARICA_KEYWORD) || (pos == 1))) { + if (style == SCE_ALTARICA_KEYWORD) { // keyword begins at position 0 + pos--; + } + for (unsigned int i = 0; i < posWordEnd - pos && i < 9; i++) { // AltaRica keywords have atmost 9 characters + s[i] = static_cast(styler[ pos + i ]); + s[i + 1] = '\0'; + } + if ((CompareCaseInsensitive(s, "node") == 0) || + (CompareCaseInsensitive(s, "edon") == 0) || + (CompareCaseInsensitive(s, "struct") == 0) || + (CompareCaseInsensitive(s, "tcurts") == 0) || + (CompareCaseInsensitive(s, "domain") == 0) || + (CompareCaseInsensitive(s, "const") == 0)) { + return false; + } + else if ((CompareCaseInsensitive(s, "sub") == 0) || + (CompareCaseInsensitive(s, "flow") == 0) || + (CompareCaseInsensitive(s, "state") == 0) || + (CompareCaseInsensitive(s, "event") == 0) || + (CompareCaseInsensitive(s, "trans") == 0) || + (CompareCaseInsensitive(s, "assert") == 0) || + (CompareCaseInsensitive(s, "init") == 0)) { + return true; + } else { // not a fold keyword so continue searching backward + wordEnd = false; + } + } + pos--; + } + return false; +} + +static bool NextLineIsFoldKeyword(int line, Accessor& styler) { + unsigned int pos = styler.LineStart(line + 1); + unsigned int eol_pos = styler.LineStart(line + 2) - 1; + bool wordStart = false; + unsigned int posWordStart = 0; + char s[10]; // AltaRica keywords have atmost 9 characters + for (unsigned int i = pos; i <= eol_pos; i++) { + int style = styler.StyleAt(i); + if (!wordStart && (style == SCE_ALTARICA_KEYWORD)) { + posWordStart = i; + wordStart = true; + } + else if (wordStart && ((style != SCE_ALTARICA_KEYWORD) || (i == eol_pos))) { + for (unsigned int j = 0; j < i - posWordStart && j < 9; j++) { // AltaRica keywords have atmost 9 characters + s[j] = static_cast(styler[ posWordStart + j ]); + s[j + 1] = '\0'; + } + if ((CompareCaseInsensitive(s, "node") == 0) || + (CompareCaseInsensitive(s, "edon") == 0) || + (CompareCaseInsensitive(s, "struct") == 0) || + (CompareCaseInsensitive(s, "tcurts") == 0) || + (CompareCaseInsensitive(s, "sub") == 0) || + (CompareCaseInsensitive(s, "flow") == 0) || + (CompareCaseInsensitive(s, "state") == 0) || + (CompareCaseInsensitive(s, "event") == 0) || + (CompareCaseInsensitive(s, "trans") == 0) || + (CompareCaseInsensitive(s, "assert") == 0) || + (CompareCaseInsensitive(s, "init") == 0) || + (CompareCaseInsensitive(s, "domain") == 0) || + (CompareCaseInsensitive(s, "const") == 0)) { + return true; + } + else + return false; + } + else if(!wordStart) { + char ch = styler[i]; + if ((ch != ' ') && (ch != '\t')) { + return false; + } + } + } + return false; +} + +static void FoldAltaRicaDoc(unsigned int startPos, int length, int initStyle, + WordList* keywordlists[], Accessor& styler) { + if (styler.GetPropertyInt("fold") == 0) return; + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + unsigned int endPos = startPos + length; + char chNext = styler[startPos]; + bool wordStart = false; + unsigned int posWordStart = 0; + char altaricaKeyword[10]; // AltaRica keywords have atmost 9 characters + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int style = styler.StyleAt(i); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (!wordStart && (style == SCE_ALTARICA_KEYWORD)) { + posWordStart = i; + wordStart = true; + } + else if (wordStart && (style != SCE_ALTARICA_KEYWORD)) { + for (unsigned int j = 0; j < i - posWordStart && j < 9; j++) { // AltaRica keywords have atmost 9 characters + altaricaKeyword[j] = static_cast(styler[ posWordStart + j ]); + altaricaKeyword[j + 1] = '\0'; + } + if (CompareCaseInsensitive(altaricaKeyword, "node") == 0) { + levelCurrent++; + } + else if (CompareCaseInsensitive(altaricaKeyword, "edon") == 0) { + levelCurrent--; + } + else if (CompareCaseInsensitive(altaricaKeyword, "struct") == 0) { + levelCurrent++; + } + else if (CompareCaseInsensitive(altaricaKeyword, "tcurts") == 0) { + levelCurrent--; + } + else if ((CompareCaseInsensitive(altaricaKeyword, "sub") == 0) || + (CompareCaseInsensitive(altaricaKeyword, "flow") == 0) || + (CompareCaseInsensitive(altaricaKeyword, "state") == 0) || + (CompareCaseInsensitive(altaricaKeyword, "event") == 0) || + (CompareCaseInsensitive(altaricaKeyword, "trans") == 0) || + (CompareCaseInsensitive(altaricaKeyword, "assert") == 0) || + (CompareCaseInsensitive(altaricaKeyword, "init") == 0)) { + levelCurrent++; + } + wordStart = false; + } + if (atEOL) { + // Comment folding + if (foldComment && IsCommentLine(lineCurrent, styler)) { + if (((lineCurrent == 0) || !IsCommentLine(lineCurrent - 1, styler)) + && IsCommentLine(lineCurrent + 1, styler)) + levelCurrent++; + else if ((lineCurrent > 0) && IsCommentLine(lineCurrent - 1, styler) + && !IsCommentLine(lineCurrent + 1, styler)) + levelCurrent--; + } + else if (NextLineIsFoldKeyword(lineCurrent, styler) && PreviousFoldKeywordIsInsideNode(i, styler)) { + levelCurrent--; + } + int lev = levelPrev; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) + visibleChars++; + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +static const char * const altaricaWordListDesc[] = { + "keywords", + "types", + 0, +}; + +LexerModule lmAltaRica(SCLEX_ALTARICA, ColouriseAltaRicaDoc, "altarica", FoldAltaRicaDoc, altaricaWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexAsm.cxx b/sdk/wxscintilla/src/scintilla/src/LexAsm.cxx new file mode 100644 index 0000000..17c9384 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexAsm.cxx @@ -0,0 +1,180 @@ +// Scintilla source code edit control +/** @file LexAsm.cxx + ** Lexer for Assembler, just for the MASM syntax + ** Written by The Black Horus + ** Enhancements and NASM stuff by Kein-Hong Man, 2003-10 + ** SCE_ASM_COMMENTBLOCK and SCE_ASM_CHARACTER are for future GNU as colouring + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || + ch == '_' || ch == '?'); +} + +static inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.' || + ch == '%' || ch == '@' || ch == '$' || ch == '?'); +} + +static inline bool IsAsmOperator(const int ch) { + if ((ch < 0x80) && (isalnum(ch))) + return false; + // '.' left out as it is used to make up numbers + if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || + ch == '(' || ch == ')' || ch == '=' || ch == '^' || + ch == '[' || ch == ']' || ch == '<' || ch == '&' || + ch == '>' || ch == ',' || ch == '|' || ch == '~' || + ch == '%' || ch == ':') + return true; + return false; +} + +static void ColouriseAsmDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + + WordList &cpuInstruction = *keywordlists[0]; + WordList &mathInstruction = *keywordlists[1]; + WordList ®isters = *keywordlists[2]; + WordList &directive = *keywordlists[3]; + WordList &directiveOperand = *keywordlists[4]; + WordList &extInstruction = *keywordlists[5]; + + // Do not leak onto next line + if (initStyle == SCE_ASM_STRINGEOL) + initStyle = SCE_ASM_DEFAULT; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) + { + + // Prevent SCE_ASM_STRINGEOL from leaking back to previous line + if (sc.atLineStart && (sc.state == SCE_ASM_STRING)) { + sc.SetState(SCE_ASM_STRING); + } else if (sc.atLineStart && (sc.state == SCE_ASM_CHARACTER)) { + sc.SetState(SCE_ASM_CHARACTER); + } + + // Handle line continuation generically. + if (sc.ch == '\\') { + if (sc.chNext == '\n' || sc.chNext == '\r') { + sc.Forward(); + if (sc.ch == '\r' && sc.chNext == '\n') { + sc.Forward(); + } + continue; + } + } + + // Determine if the current state should terminate. + if (sc.state == SCE_ASM_OPERATOR) { + if (!IsAsmOperator(sc.ch)) { + sc.SetState(SCE_ASM_DEFAULT); + } + }else if (sc.state == SCE_ASM_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_ASM_DEFAULT); + } + } else if (sc.state == SCE_ASM_IDENTIFIER) { + if (!IsAWordChar(sc.ch) ) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + + if (cpuInstruction.InList(s)) { + sc.ChangeState(SCE_ASM_CPUINSTRUCTION); + } else if (mathInstruction.InList(s)) { + sc.ChangeState(SCE_ASM_MATHINSTRUCTION); + } else if (registers.InList(s)) { + sc.ChangeState(SCE_ASM_REGISTER); + } else if (directive.InList(s)) { + sc.ChangeState(SCE_ASM_DIRECTIVE); + } else if (directiveOperand.InList(s)) { + sc.ChangeState(SCE_ASM_DIRECTIVEOPERAND); + } else if (extInstruction.InList(s)) { + sc.ChangeState(SCE_ASM_EXTINSTRUCTION); + } + sc.SetState(SCE_ASM_DEFAULT); + } + } + else if (sc.state == SCE_ASM_COMMENT ) { + if (sc.atLineEnd) { + sc.SetState(SCE_ASM_DEFAULT); + } + } else if (sc.state == SCE_ASM_STRING) { + if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\"') { + sc.ForwardSetState(SCE_ASM_DEFAULT); + } else if (sc.atLineEnd) { + sc.ChangeState(SCE_ASM_STRINGEOL); + sc.ForwardSetState(SCE_ASM_DEFAULT); + } + } else if (sc.state == SCE_ASM_CHARACTER) { + if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\'') { + sc.ForwardSetState(SCE_ASM_DEFAULT); + } else if (sc.atLineEnd) { + sc.ChangeState(SCE_ASM_STRINGEOL); + sc.ForwardSetState(SCE_ASM_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_ASM_DEFAULT) { + if (sc.ch == ';'){ + sc.SetState(SCE_ASM_COMMENT); + } else if (isascii(sc.ch) && (isdigit(sc.ch) || (sc.ch == '.' && isascii(sc.chNext) && isdigit(sc.chNext)))) { + sc.SetState(SCE_ASM_NUMBER); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_ASM_IDENTIFIER); + } else if (sc.ch == '\"') { + sc.SetState(SCE_ASM_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_ASM_CHARACTER); + } else if (IsAsmOperator(sc.ch)) { + sc.SetState(SCE_ASM_OPERATOR); + } + } + + } + sc.Complete(); +} + +static const char * const asmWordListDesc[] = { + "CPU instructions", + "FPU instructions", + "Registers", + "Directives", + "Directive operands", + "Extended instructions", + 0 +}; + +LexerModule lmAsm(SCLEX_ASM, ColouriseAsmDoc, "asm", 0, asmWordListDesc); + diff --git a/sdk/wxscintilla/src/scintilla/src/LexAsn1.cxx b/sdk/wxscintilla/src/scintilla/src/LexAsn1.cxx new file mode 100644 index 0000000..28bf6d9 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexAsn1.cxx @@ -0,0 +1,185 @@ +// Scintilla source code edit control +/** @file LexAsn1.cxx + ** Lexer for ASN.1 + **/ +// Copyright 2004 by Herr Pfarrer rpfarrer yahoo de +// Last Updated: 20/07/2004 +// The License.txt file describes the conditions under which this software may be distributed. +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +// Some char test functions +static bool isAsn1Number(int ch) +{ + return (ch >= '0' && ch <= '9'); +} + +static bool isAsn1Letter(int ch) +{ + return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'); +} + +static bool isAsn1Char(int ch) +{ + return (ch == '-' ) || isAsn1Number(ch) || isAsn1Letter (ch); +} + +// +// Function determining the color of a given code portion +// Based on a "state" +// +static void ColouriseAsn1Doc(unsigned int startPos, int length, int initStyle, WordList *keywordLists[], Accessor &styler) +{ + // The keywords + WordList &Keywords = *keywordLists[0]; + WordList &Attributes = *keywordLists[1]; + WordList &Descriptors = *keywordLists[2]; + WordList &Types = *keywordLists[3]; + + // Parse the whole buffer character by character using StyleContext + StyleContext sc(startPos, length, initStyle, styler); + for (; sc.More(); sc.Forward()) + { + // The state engine + switch (sc.state) + { + case SCE_ASN1_DEFAULT: // Plain characters +asn1_default: + if (sc.ch == '-' && sc.chNext == '-') + // A comment begins here + sc.SetState(SCE_ASN1_COMMENT); + else if (sc.ch == '"') + // A string begins here + sc.SetState(SCE_ASN1_STRING); + else if (isAsn1Number (sc.ch)) + // A number starts here (identifier should start with a letter in ASN.1) + sc.SetState(SCE_ASN1_SCALAR); + else if (isAsn1Char (sc.ch)) + // An identifier starts here (identifier always start with a letter) + sc.SetState(SCE_ASN1_IDENTIFIER); + else if (sc.ch == ':') + // A ::= operator starts here + sc.SetState(SCE_ASN1_OPERATOR); + break; + case SCE_ASN1_COMMENT: // A comment + if (sc.ch == '\r' || sc.ch == '\n') + // A comment ends here + sc.SetState(SCE_ASN1_DEFAULT); + break; + case SCE_ASN1_IDENTIFIER: // An identifier (keyword, attribute, descriptor or type) + if (!isAsn1Char (sc.ch)) + { + // The end of identifier is here: we can look for it in lists by now and change its state + char s[100]; + sc.GetCurrent(s, sizeof(s)); + if (Keywords.InList(s)) + // It's a keyword, change its state + sc.ChangeState(SCE_ASN1_KEYWORD); + else if (Attributes.InList(s)) + // It's an attribute, change its state + sc.ChangeState(SCE_ASN1_ATTRIBUTE); + else if (Descriptors.InList(s)) + // It's a descriptor, change its state + sc.ChangeState(SCE_ASN1_DESCRIPTOR); + else if (Types.InList(s)) + // It's a type, change its state + sc.ChangeState(SCE_ASN1_TYPE); + + // Set to default now + sc.SetState(SCE_ASN1_DEFAULT); + } + break; + case SCE_ASN1_STRING: // A string delimited by "" + if (sc.ch == '"') + { + // A string ends here + sc.ForwardSetState(SCE_ASN1_DEFAULT); + + // To correctly manage a char sticking to the string quote + goto asn1_default; + } + break; + case SCE_ASN1_SCALAR: // A plain number + if (!isAsn1Number (sc.ch)) + // A number ends here + sc.SetState(SCE_ASN1_DEFAULT); + break; + case SCE_ASN1_OPERATOR: // The affectation operator ::= and wath follows (eg: ::= { org 6 } OID or ::= 12 trap) + if (sc.ch == '{') + { + // An OID definition starts here: enter the sub loop + for (; sc.More(); sc.Forward()) + { + if (isAsn1Number (sc.ch) && (!isAsn1Char (sc.chPrev) || isAsn1Number (sc.chPrev))) + // The OID number is highlighted + sc.SetState(SCE_ASN1_OID); + else if (isAsn1Char (sc.ch)) + // The OID parent identifier is plain + sc.SetState(SCE_ASN1_IDENTIFIER); + else + sc.SetState(SCE_ASN1_DEFAULT); + + if (sc.ch == '}') + // Here ends the OID and the operator sub loop: go back to main loop + break; + } + } + else if (isAsn1Number (sc.ch)) + { + // A trap number definition starts here: enter the sub loop + for (; sc.More(); sc.Forward()) + { + if (isAsn1Number (sc.ch)) + // The trap number is highlighted + sc.SetState(SCE_ASN1_OID); + else + { + // The number ends here: go back to main loop + sc.SetState(SCE_ASN1_DEFAULT); + break; + } + } + } + else if (sc.ch != ':' && sc.ch != '=' && sc.ch != ' ') + // The operator doesn't imply an OID definition nor a trap, back to main loop + goto asn1_default; // To be sure to handle actually the state change + break; + } + } + sc.Complete(); +} + +static void FoldAsn1Doc(unsigned int, int, int, WordList *[], Accessor &styler) +{ + // No folding enabled, no reason to continue... + if( styler.GetPropertyInt("fold") == 0 ) + return; + + // No folding implemented: doesn't make sense for ASN.1 +} + +static const char * const asn1WordLists[] = { + "Keywords", + "Attributes", + "Descriptors", + "Types", + 0, }; + + +LexerModule lmAns1(SCLEX_ASN1, ColouriseAsn1Doc, "asn1", FoldAsn1Doc, asn1WordLists); diff --git a/sdk/wxscintilla/src/scintilla/src/LexBaan.cxx b/sdk/wxscintilla/src/scintilla/src/LexBaan.cxx new file mode 100644 index 0000000..97dd1f4 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexBaan.cxx @@ -0,0 +1,193 @@ +// Scintilla source code edit control +/** @file LexBaan.cxx + ** Lexer for Baan. + ** Based heavily on LexCPP.cxx + **/ +// Copyright 2001- by Vamsi Potluru & Praveen Ambekar +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' || ch == '$' || ch == ':'); +} + +static inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + +static void ColouriseBaanDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor") != 0; + + if (initStyle == SCE_BAAN_STRINGEOL) // Does not leak onto next line + initStyle = SCE_BAAN_DEFAULT; + + int visibleChars = 0; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + + if (sc.state == SCE_BAAN_OPERATOR) { + sc.SetState(SCE_BAAN_DEFAULT); + } else if (sc.state == SCE_BAAN_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_BAAN_DEFAULT); + } + } else if (sc.state == SCE_BAAN_IDENTIFIER) { + if (!IsAWordChar(sc.ch)) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + if (keywords.InList(s)) { + sc.ChangeState(SCE_BAAN_WORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_BAAN_WORD2); + } + sc.SetState(SCE_BAAN_DEFAULT); + } + } else if (sc.state == SCE_BAAN_PREPROCESSOR) { + if (stylingWithinPreprocessor) { + if (IsASpace(sc.ch)) { + sc.SetState(SCE_BAAN_DEFAULT); + } + } else { + if (sc.atLineEnd && (sc.chNext != '^')) { + sc.SetState(SCE_BAAN_DEFAULT); + } + } + } else if (sc.state == SCE_BAAN_COMMENT) { + if (sc.atLineEnd) { + sc.SetState(SCE_BAAN_DEFAULT); + } + } else if (sc.state == SCE_BAAN_COMMENTDOC) { + if (sc.MatchIgnoreCase("enddllusage")) { + for (unsigned int i = 0; i < 10; i++){ + sc.Forward(); + } + sc.ForwardSetState(SCE_BAAN_DEFAULT); + } + } else if (sc.state == SCE_BAAN_STRING) { + if (sc.ch == '\"') { + sc.ForwardSetState(SCE_BAAN_DEFAULT); + } else if ((sc.atLineEnd) && (sc.chNext != '^')) { + sc.ChangeState(SCE_BAAN_STRINGEOL); + sc.ForwardSetState(SCE_C_DEFAULT); + visibleChars = 0; + } + } + + if (sc.state == SCE_BAAN_DEFAULT) { + if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_BAAN_NUMBER); + } else if (sc.MatchIgnoreCase("dllusage")){ + sc.SetState(SCE_BAAN_COMMENTDOC); + do { + sc.Forward(); + } while ((!sc.atLineEnd) && sc.More()); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_BAAN_IDENTIFIER); + } else if (sc.Match('|')){ + sc.SetState(SCE_BAAN_COMMENT); + } else if (sc.ch == '\"') { + sc.SetState(SCE_BAAN_STRING); + } else if (sc.ch == '#' && visibleChars == 0) { + // Preprocessor commands are alone on their line + sc.SetState(SCE_BAAN_PREPROCESSOR); + // Skip whitespace between # and preprocessor word + do { + sc.Forward(); + } while (IsASpace(sc.ch) && sc.More()); + } else if (isoperator(static_cast(sc.ch))) { + sc.SetState(SCE_BAAN_OPERATOR); + } + } + if (sc.atLineEnd) { + // Reset states to begining of colourise so no surprises + // if different sets of lines lexed. + visibleChars = 0; + } + if (!IsASpace(sc.ch)) { + visibleChars++; + } + } + sc.Complete(); +} + +static void FoldBaanDoc(unsigned int startPos, int length, int initStyle, WordList *[], + Accessor &styler) { + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (foldComment && + (style == SCE_BAAN_COMMENT || style == SCE_BAAN_COMMENTDOC)) { + if (style != stylePrev) { + levelCurrent++; + } else if ((style != styleNext) && !atEOL) { + // Comments don't end at end of line and the next character may be unstyled. + levelCurrent--; + } + } + if (style == SCE_BAAN_OPERATOR) { + if (ch == '{') { + levelCurrent++; + } else if (ch == '}') { + levelCurrent--; + } + } + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) + visibleChars++; + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +LexerModule lmBaan(SCLEX_BAAN, ColouriseBaanDoc, "baan", FoldBaanDoc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexBash.cxx b/sdk/wxscintilla/src/scintilla/src/LexBash.cxx new file mode 100644 index 0000000..1f97e48 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexBash.cxx @@ -0,0 +1,521 @@ +// Scintilla source code edit control +/** @file LexBash.cxx + ** Lexer for Bash. + **/ +// Copyright 2004-2008 by Neil Hodgson +// Adapted from LexPerl by Kein-Hong Man 2004 +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" +#include "CharacterSet.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +#define HERE_DELIM_MAX 256 + +// define this if you want 'invalid octals' to be marked as errors +// usually, this is not a good idea, permissive lexing is better +#undef PEDANTIC_OCTAL + +#define BASH_BASE_ERROR 65 +#define BASH_BASE_DECIMAL 66 +#define BASH_BASE_HEX 67 +#ifdef PEDANTIC_OCTAL +#define BASH_BASE_OCTAL 68 +#define BASH_BASE_OCTAL_ERROR 69 +#endif + +static inline int translateBashDigit(int ch) { + if (ch >= '0' && ch <= '9') { + return ch - '0'; + } else if (ch >= 'a' && ch <= 'z') { + return ch - 'a' + 10; + } else if (ch >= 'A' && ch <= 'Z') { + return ch - 'A' + 36; + } else if (ch == '@') { + return 62; + } else if (ch == '_') { + return 63; + } + return BASH_BASE_ERROR; +} + +static inline int getBashNumberBase(char *s) { + int i = 0; + int base = 0; + while (*s) { + base = base * 10 + (*s++ - '0'); + i++; + } + if (base > 64 || i > 2) { + return BASH_BASE_ERROR; + } + return base; +} + +static int opposite(int ch) { + if (ch == '(') return ')'; + if (ch == '[') return ']'; + if (ch == '{') return '}'; + if (ch == '<') return '>'; + return ch; +} + +static void ColouriseBashDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + + CharacterSet setWordStart(CharacterSet::setAlpha, "_"); + // note that [+-] are often parts of identifiers in shell scripts + CharacterSet setWord(CharacterSet::setAlphaNum, "._+-"); + CharacterSet setBashOperator(CharacterSet::setNone, "^&\\%()-+=|{}[]:;>,*/(ch); + Delimiter[DelimiterLength] = '\0'; + } + ~HereDocCls() { + delete []Delimiter; + } + }; + HereDocCls HereDoc; + + class QuoteCls { // Class to manage quote pairs (simplified vs LexPerl) + public: + int Count; + int Up, Down; + QuoteCls() { + Count = 0; + Up = '\0'; + Down = '\0'; + } + void Open(int u) { + Count++; + Up = u; + Down = opposite(Up); + } + void Start(int u) { + Count = 0; + Open(u); + } + }; + QuoteCls Quote; + + int numBase = 0; + int digit; + unsigned int endPos = startPos + length; + + // Backtrack to beginning of style if required... + // If in a long distance lexical state, backtrack to find quote characters + if (initStyle == SCE_SH_HERE_Q) { + while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_SH_HERE_DELIM)) { + startPos--; + } + startPos = styler.LineStart(styler.GetLine(startPos)); + initStyle = styler.StyleAt(startPos - 1); + } + // Bash strings can be multi-line with embedded newlines, so backtrack. + // Bash numbers have additional state during lexing, so backtrack too. + if (initStyle == SCE_SH_STRING + || initStyle == SCE_SH_BACKTICKS + || initStyle == SCE_SH_CHARACTER + || initStyle == SCE_SH_NUMBER + || initStyle == SCE_SH_IDENTIFIER + || initStyle == SCE_SH_COMMENTLINE) { + while ((startPos > 1) && (styler.StyleAt(startPos - 1) == initStyle)) { + startPos--; + } + initStyle = SCE_SH_DEFAULT; + } + + StyleContext sc(startPos, endPos - startPos, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + + // Determine if the current state should terminate. + switch (sc.state) { + case SCE_SH_OPERATOR: + sc.SetState(SCE_SH_DEFAULT); + break; + case SCE_SH_WORD: + // "." never used in Bash variable names but used in file names + if (!setWord.Contains(sc.ch)) { + char s[1000]; + sc.GetCurrent(s, sizeof(s)); + if (s[0] != '-' && // for file operators + !keywords.InList(s)) { + sc.ChangeState(SCE_SH_IDENTIFIER); + } + sc.SetState(SCE_SH_DEFAULT); + } + break; + case SCE_SH_IDENTIFIER: + if (sc.chPrev == '\\') { // for escaped chars + sc.ForwardSetState(SCE_SH_DEFAULT); + } else if (!setWord.Contains(sc.ch)) { + sc.SetState(SCE_SH_DEFAULT); + } + break; + case SCE_SH_NUMBER: + digit = translateBashDigit(sc.ch); + if (numBase == BASH_BASE_DECIMAL) { + if (sc.ch == '#') { + char s[10]; + sc.GetCurrent(s, sizeof(s)); + numBase = getBashNumberBase(s); + if (numBase != BASH_BASE_ERROR) + break; + } else if (IsADigit(sc.ch)) + break; + } else if (numBase == BASH_BASE_HEX) { + if (IsADigit(sc.ch, 16)) + break; +#ifdef PEDANTIC_OCTAL + } else if (numBase == BASH_BASE_OCTAL || + numBase == BASH_BASE_OCTAL_ERROR) { + if (digit <= 7) + break; + if (digit <= 9) { + numBase = BASH_BASE_OCTAL_ERROR; + break; + } +#endif + } else if (numBase == BASH_BASE_ERROR) { + if (digit <= 9) + break; + } else { // DD#DDDD number style handling + if (digit != BASH_BASE_ERROR) { + if (numBase <= 36) { + // case-insensitive if base<=36 + if (digit >= 36) digit -= 26; + } + if (digit < numBase) + break; + if (digit <= 9) { + numBase = BASH_BASE_ERROR; + break; + } + } + } + // fallthrough when number is at an end or error + if (numBase == BASH_BASE_ERROR +#ifdef PEDANTIC_OCTAL + || numBase == BASH_BASE_OCTAL_ERROR +#endif + ) { + sc.ChangeState(SCE_SH_ERROR); + } + sc.SetState(SCE_SH_DEFAULT); + break; + case SCE_SH_COMMENTLINE: + if (sc.atLineEnd && sc.chPrev != '\\') { + sc.SetState(SCE_SH_DEFAULT); + } + break; + case SCE_SH_HERE_DELIM: + // From Bash info: + // --------------- + // Specifier format is: <<[-]WORD + // Optional '-' is for removal of leading tabs from here-doc. + // Whitespace acceptable after <<[-] operator + // + if (HereDoc.State == 0) { // '<<' encountered + HereDoc.Quote = sc.chNext; + HereDoc.Quoted = false; + HereDoc.DelimiterLength = 0; + HereDoc.Delimiter[HereDoc.DelimiterLength] = '\0'; + if (sc.chNext == '\'' || sc.chNext == '\"') { // a quoted here-doc delimiter (' or ") + sc.Forward(); + HereDoc.Quoted = true; + HereDoc.State = 1; + } else if (!HereDoc.Indent && sc.chNext == '-') { // <<- indent case + HereDoc.Indent = true; + } else if (setHereDoc.Contains(sc.chNext)) { + // an unquoted here-doc delimiter, no special handling + // TODO check what exactly bash considers part of the delim + HereDoc.State = 1; + } else if (sc.chNext == '<') { // HERE string <<< + sc.Forward(); + sc.ForwardSetState(SCE_SH_DEFAULT); + } else if (IsASpace(sc.chNext)) { + // eat whitespace + } else if (setLeftShift.Contains(sc.chNext)) { + // left shift << or <<= operator cases + sc.ChangeState(SCE_SH_OPERATOR); + sc.ForwardSetState(SCE_SH_DEFAULT); + } else { + // symbols terminates; deprecated zero-length delimiter + HereDoc.State = 1; + } + } else if (HereDoc.State == 1) { // collect the delimiter + if (setHereDoc2.Contains(sc.ch) || sc.chPrev == '\\') { + HereDoc.Append(sc.ch); + } else if (HereDoc.Quoted && sc.ch == HereDoc.Quote) { // closing quote => end of delimiter + sc.ForwardSetState(SCE_SH_DEFAULT); + } else if (sc.ch == '\\') { + // skip escape prefix + } else { + sc.SetState(SCE_SH_DEFAULT); + } + if (HereDoc.DelimiterLength >= HERE_DELIM_MAX - 1) { // force blowup + sc.SetState(SCE_SH_ERROR); + HereDoc.State = 0; + } + } + break; + case SCE_SH_HERE_Q: + // HereDoc.State == 2 + if (sc.atLineStart) { + sc.SetState(SCE_SH_HERE_Q); + int prefixws = 0; + while (IsASpace(sc.ch) && !sc.atLineEnd) { // whitespace prefix + sc.Forward(); + prefixws++; + } + if (prefixws > 0) + sc.SetState(SCE_SH_HERE_Q); + while (!sc.atLineEnd) { + sc.Forward(); + } + char s[HERE_DELIM_MAX]; + sc.GetCurrent(s, sizeof(s)); + if (sc.LengthCurrent() == 0) + break; + if (s[strlen(s) - 1] == '\r') + s[strlen(s) - 1] = '\0'; + if (strcmp(HereDoc.Delimiter, s) == 0) { + if ((prefixws > 0 && HereDoc.Indent) || // indentation rule + (prefixws == 0 && !HereDoc.Indent)) { + sc.SetState(SCE_SH_DEFAULT); + break; + } + } + } + break; + case SCE_SH_SCALAR: // variable names + if (!setParam.Contains(sc.ch)) { + if (sc.LengthCurrent() == 1) { + // Special variable: $(, $_ etc. + sc.ForwardSetState(SCE_SH_DEFAULT); + } else { + sc.SetState(SCE_SH_DEFAULT); + } + } + break; + case SCE_SH_STRING: // delimited styles + case SCE_SH_CHARACTER: + case SCE_SH_BACKTICKS: + case SCE_SH_PARAM: + if (sc.ch == '\\' && Quote.Up != '\\') { + sc.Forward(); + } else if (sc.ch == Quote.Down) { + Quote.Count--; + if (Quote.Count == 0) { + sc.ForwardSetState(SCE_SH_DEFAULT); + } + } else if (sc.ch == Quote.Up) { + Quote.Count++; + } + break; + } + + // Must check end of HereDoc state 1 before default state is handled + if (HereDoc.State == 1 && sc.atLineEnd) { + // Begin of here-doc (the line after the here-doc delimiter): + // Lexically, the here-doc starts from the next line after the >>, but the + // first line of here-doc seem to follow the style of the last EOL sequence + HereDoc.State = 2; + if (HereDoc.Quoted) { + if (sc.state == SCE_SH_HERE_DELIM) { + // Missing quote at end of string! We are stricter than bash. + // Colour here-doc anyway while marking this bit as an error. + sc.ChangeState(SCE_SH_ERROR); + } + // HereDoc.Quote always == '\'' + } + sc.SetState(SCE_SH_HERE_Q); + } + + // Determine if a new state should be entered. + if (sc.state == SCE_SH_DEFAULT) { + if (sc.ch == '\\') { // escaped character + sc.SetState(SCE_SH_IDENTIFIER); + } else if (IsADigit(sc.ch)) { + sc.SetState(SCE_SH_NUMBER); + numBase = BASH_BASE_DECIMAL; + if (sc.ch == '0') { // hex,octal + if (sc.chNext == 'x' || sc.chNext == 'X') { + numBase = BASH_BASE_HEX; + sc.Forward(); + } else if (IsADigit(sc.chNext)) { +#ifdef PEDANTIC_OCTAL + numBase = BASH_BASE_OCTAL; +#else + numBase = BASH_BASE_HEX; +#endif + } + } + } else if (setWordStart.Contains(sc.ch)) { + sc.SetState(SCE_SH_WORD); + } else if (sc.ch == '#') { + sc.SetState(SCE_SH_COMMENTLINE); + } else if (sc.ch == '\"') { + sc.SetState(SCE_SH_STRING); + Quote.Start(sc.ch); + } else if (sc.ch == '\'') { + sc.SetState(SCE_SH_CHARACTER); + Quote.Start(sc.ch); + } else if (sc.ch == '`') { + sc.SetState(SCE_SH_BACKTICKS); + Quote.Start(sc.ch); + } else if (sc.ch == '$') { + sc.SetState(SCE_SH_SCALAR); + sc.Forward(); + if (sc.ch == '{') { + sc.ChangeState(SCE_SH_PARAM); + } else if (sc.ch == '\'') { + sc.ChangeState(SCE_SH_CHARACTER); + } else if (sc.ch == '"') { + sc.ChangeState(SCE_SH_STRING); + } else if (sc.ch == '(' || sc.ch == '`') { + sc.ChangeState(SCE_SH_BACKTICKS); + if (sc.chNext == '(') { // $(( is lexed as operator + sc.ChangeState(SCE_SH_OPERATOR); + } + } else { + continue; // scalar has no delimiter pair + } + // fallthrough, open delim for $[{'"(`] + Quote.Start(sc.ch); + } else if (sc.Match('<', '<')) { + sc.SetState(SCE_SH_HERE_DELIM); + HereDoc.State = 0; + HereDoc.Indent = false; + } else if (sc.ch == '-' && // one-char file test operators + setSingleCharOp.Contains(sc.chNext) && + !setWord.Contains(sc.GetRelative(2)) && + IsASpace(sc.chPrev)) { + sc.SetState(SCE_SH_WORD); + sc.Forward(); + } else if (setBashOperator.Contains(sc.ch)) { + sc.SetState(SCE_SH_OPERATOR); + } + } + } + sc.Complete(); +} + +static bool IsCommentLine(int line, Accessor &styler) { + int pos = styler.LineStart(line); + int eol_pos = styler.LineStart(line + 1) - 1; + for (int i = pos; i < eol_pos; i++) { + char ch = styler[i]; + if (ch == '#') + return true; + else if (ch != ' ' && ch != '\t') + return false; + } + return false; +} + +static void FoldBashDoc(unsigned int startPos, int length, int, WordList *[], + Accessor &styler) { + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + // Comment folding + if (foldComment && atEOL && IsCommentLine(lineCurrent, styler)) + { + if (!IsCommentLine(lineCurrent - 1, styler) + && IsCommentLine(lineCurrent + 1, styler)) + levelCurrent++; + else if (IsCommentLine(lineCurrent - 1, styler) + && !IsCommentLine(lineCurrent + 1, styler)) + levelCurrent--; + } + if (style == SCE_SH_OPERATOR) { + if (ch == '{') { + levelCurrent++; + } else if (ch == '}') { + levelCurrent--; + } + } + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) + visibleChars++; + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +static const char * const bashWordListDesc[] = { + "Keywords", + 0 +}; + +LexerModule lmBash(SCLEX_BASH, ColouriseBashDoc, "bash", FoldBashDoc, bashWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexBasic.cxx b/sdk/wxscintilla/src/scintilla/src/LexBasic.cxx new file mode 100644 index 0000000..9a52186 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexBasic.cxx @@ -0,0 +1,373 @@ +// Scintilla source code edit control +/** @file LexBasic.cxx + ** Lexer for BlitzBasic and PureBasic. + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +// This tries to be a unified Lexer/Folder for all the BlitzBasic/BlitzMax/PurBasic basics +// and derivatives. Once they diverge enough, might want to split it into multiple +// lexers for more code clearity. +// +// Mail me (elias users sf net) for any bugs. + +// Folding only works for simple things like functions or types. + +// You may want to have a look at my ctags lexer as well, if you additionally to coloring +// and folding need to extract things like label tags in your editor. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +/* Bits: + * 1 - whitespace + * 2 - operator + * 4 - identifier + * 8 - decimal digit + * 16 - hex digit + * 32 - bin digit + */ +static int character_classification[128] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 2, + 60, 60, 28, 28, 28, 28, 28, 28, 28, 28, 2, 2, 2, 2, 2, 2, + 2, 20, 20, 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 4, + 2, 20, 20, 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 0 +}; + +static bool IsSpace(int c) { + return c < 128 && (character_classification[c] & 1); +} + +static bool IsOperator(int c) { + return c < 128 && (character_classification[c] & 2); +} + +static bool IsIdentifier(int c) { + return c < 128 && (character_classification[c] & 4); +} + +static bool IsDigit(int c) { + return c < 128 && (character_classification[c] & 8); +} + +static bool IsHexDigit(int c) { + return c < 128 && (character_classification[c] & 16); +} + +static bool IsBinDigit(int c) { + return c < 128 && (character_classification[c] & 32); +} + +static int LowerCase(int c) +{ + if (c >= 'A' && c <= 'Z') + return 'a' + c - 'A'; + return c; +} + +static void ColouriseBasicDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler, char comment_char) { + bool wasfirst = true, isfirst = true; // true if first token in a line + styler.StartAt(startPos); + + StyleContext sc(startPos, length, initStyle, styler); + + // Can't use sc.More() here else we miss the last character + for (; ; sc.Forward()) { + if (sc.state == SCE_B_IDENTIFIER) { + if (!IsIdentifier(sc.ch)) { + // Labels + if (wasfirst && sc.Match(':')) { + sc.ChangeState(SCE_B_LABEL); + sc.ForwardSetState(SCE_B_DEFAULT); + } else { + char s[100]; + int kstates[4] = { + SCE_B_KEYWORD, + SCE_B_KEYWORD2, + SCE_B_KEYWORD3, + SCE_B_KEYWORD4, + }; + sc.GetCurrentLowered(s, sizeof(s)); + for (int i = 0; i < 4; i++) { + if (keywordlists[i]->InList(s)) { + sc.ChangeState(kstates[i]); + } + } + // Types, must set them as operator else they will be + // matched as number/constant + if (sc.Match('.') || sc.Match('$') || sc.Match('%') || + sc.Match('#')) { + sc.SetState(SCE_B_OPERATOR); + } else { + sc.SetState(SCE_B_DEFAULT); + } + } + } + } else if (sc.state == SCE_B_OPERATOR) { + if (!IsOperator(sc.ch) || sc.Match('#')) + sc.SetState(SCE_B_DEFAULT); + } else if (sc.state == SCE_B_LABEL) { + if (!IsIdentifier(sc.ch)) + sc.SetState(SCE_B_DEFAULT); + } else if (sc.state == SCE_B_CONSTANT) { + if (!IsIdentifier(sc.ch)) + sc.SetState(SCE_B_DEFAULT); + } else if (sc.state == SCE_B_NUMBER) { + if (!IsDigit(sc.ch)) + sc.SetState(SCE_B_DEFAULT); + } else if (sc.state == SCE_B_HEXNUMBER) { + if (!IsHexDigit(sc.ch)) + sc.SetState(SCE_B_DEFAULT); + } else if (sc.state == SCE_B_BINNUMBER) { + if (!IsBinDigit(sc.ch)) + sc.SetState(SCE_B_DEFAULT); + } else if (sc.state == SCE_B_STRING) { + if (sc.ch == '"') { + sc.ForwardSetState(SCE_B_DEFAULT); + } + if (sc.atLineEnd) { + sc.ChangeState(SCE_B_ERROR); + sc.SetState(SCE_B_DEFAULT); + } + } else if (sc.state == SCE_B_COMMENT || sc.state == SCE_B_PREPROCESSOR) { + if (sc.atLineEnd) { + sc.SetState(SCE_B_DEFAULT); + } + } + + if (sc.atLineStart) + isfirst = true; + + if (sc.state == SCE_B_DEFAULT || sc.state == SCE_B_ERROR) { + if (isfirst && sc.Match('.')) { + sc.SetState(SCE_B_LABEL); + } else if (isfirst && sc.Match('#')) { + wasfirst = isfirst; + sc.SetState(SCE_B_IDENTIFIER); + } else if (sc.Match(comment_char)) { + // Hack to make deprecated QBASIC '$Include show + // up in freebasic with SCE_B_PREPROCESSOR. + if (comment_char == '\'' && sc.Match(comment_char, '$')) + sc.SetState(SCE_B_PREPROCESSOR); + else + sc.SetState(SCE_B_COMMENT); + } else if (sc.Match('"')) { + sc.SetState(SCE_B_STRING); + } else if (IsDigit(sc.ch)) { + sc.SetState(SCE_B_NUMBER); + } else if (sc.Match('$')) { + sc.SetState(SCE_B_HEXNUMBER); + } else if (sc.Match('%')) { + sc.SetState(SCE_B_BINNUMBER); + } else if (sc.Match('#')) { + sc.SetState(SCE_B_CONSTANT); + } else if (IsOperator(sc.ch)) { + sc.SetState(SCE_B_OPERATOR); + } else if (IsIdentifier(sc.ch)) { + wasfirst = isfirst; + sc.SetState(SCE_B_IDENTIFIER); + } else if (!IsSpace(sc.ch)) { + sc.SetState(SCE_B_ERROR); + } + } + + if (!IsSpace(sc.ch)) + isfirst = false; + + if (!sc.More()) + break; + } + sc.Complete(); +} + +static int CheckBlitzFoldPoint(char const *token, int &level) { + if (!strcmp(token, "function") || + !strcmp(token, "type")) { + level |= SC_FOLDLEVELHEADERFLAG; + return 1; + } + if (!strcmp(token, "end function") || + !strcmp(token, "end type")) { + return -1; + } + return 0; +} + +static int CheckPureFoldPoint(char const *token, int &level) { + if (!strcmp(token, "procedure") || + !strcmp(token, "enumeration") || + !strcmp(token, "interface") || + !strcmp(token, "structure")) { + level |= SC_FOLDLEVELHEADERFLAG; + return 1; + } + if (!strcmp(token, "endprocedure") || + !strcmp(token, "endenumeration") || + !strcmp(token, "endinterface") || + !strcmp(token, "endstructure")) { + return -1; + } + return 0; +} + +static int CheckFreeFoldPoint(char const *token, int &level) { + if (!strcmp(token, "function") || + !strcmp(token, "sub") || + !strcmp(token, "type")) { + level |= SC_FOLDLEVELHEADERFLAG; + return 1; + } + if (!strcmp(token, "end function") || + !strcmp(token, "end sub") || + !strcmp(token, "end type")) { + return -1; + } + return 0; +} + +static void FoldBasicDoc(unsigned int startPos, int length, + Accessor &styler, int (*CheckFoldPoint)(char const *, int &)) { + int line = styler.GetLine(startPos); + int level = styler.LevelAt(line); + int go = 0, done = 0; + int endPos = startPos + length; + char word[256]; + int wordlen = 0; + int i; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + // Scan for tokens at the start of the line (they may include + // whitespace, for tokens like "End Function" + for (i = startPos; i < endPos; i++) { + int c = styler.SafeGetCharAt(i); + if (!done && !go) { + if (wordlen) { // are we scanning a token already? + word[wordlen] = static_cast(LowerCase(c)); + if (!IsIdentifier(c)) { // done with token + word[wordlen] = '\0'; + go = CheckFoldPoint(word, level); + if (!go) { + // Treat any whitespace as single blank, for + // things like "End Function". + if (IsSpace(c) && IsIdentifier(word[wordlen - 1])) { + word[wordlen] = ' '; + if (wordlen < 255) + wordlen++; + } + else // done with this line + done = 1; + } + } else if (wordlen < 255) { + wordlen++; + } + } else { // start scanning at first non-whitespace character + if (!IsSpace(c)) { + if (IsIdentifier(c)) { + word[0] = static_cast(LowerCase(c)); + wordlen = 1; + } else // done with this line + done = 1; + } + } + } + if (c == '\n') { // line end + if (!done && wordlen == 0 && foldCompact) // line was only space + level |= SC_FOLDLEVELWHITEFLAG; + if (level != styler.LevelAt(line)) + styler.SetLevel(line, level); + level += go; + line++; + // reset state + wordlen = 0; + level &= ~SC_FOLDLEVELHEADERFLAG; + level &= ~SC_FOLDLEVELWHITEFLAG; + go = 0; + done = 0; + } + } +} + +static void ColouriseBlitzBasicDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + ColouriseBasicDoc(startPos, length, initStyle, keywordlists, styler, ';'); +} + +static void ColourisePureBasicDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + ColouriseBasicDoc(startPos, length, initStyle, keywordlists, styler, ';'); +} + +static void ColouriseFreeBasicDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + ColouriseBasicDoc(startPos, length, initStyle, keywordlists, styler, '\''); +} + +static void FoldBlitzBasicDoc(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) { + FoldBasicDoc(startPos, length, styler, CheckBlitzFoldPoint); +} + +static void FoldPureBasicDoc(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) { + FoldBasicDoc(startPos, length, styler, CheckPureFoldPoint); +} + +static void FoldFreeBasicDoc(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) { + FoldBasicDoc(startPos, length, styler, CheckFreeFoldPoint); +} + +static const char * const blitzbasicWordListDesc[] = { + "BlitzBasic Keywords", + "user1", + "user2", + "user3", + 0 +}; + +static const char * const purebasicWordListDesc[] = { + "PureBasic Keywords", + "PureBasic PreProcessor Keywords", + "user defined 1", + "user defined 2", + 0 +}; + +static const char * const freebasicWordListDesc[] = { + "FreeBasic Keywords", + "FreeBasic PreProcessor Keywords", + "user defined 1", + "user defined 2", + 0 +}; + +LexerModule lmBlitzBasic(SCLEX_BLITZBASIC, ColouriseBlitzBasicDoc, "blitzbasic", + FoldBlitzBasicDoc, blitzbasicWordListDesc); + +LexerModule lmPureBasic(SCLEX_PUREBASIC, ColourisePureBasicDoc, "purebasic", + FoldPureBasicDoc, purebasicWordListDesc); + +LexerModule lmFreeBasic(SCLEX_FREEBASIC, ColouriseFreeBasicDoc, "freebasic", + FoldFreeBasicDoc, freebasicWordListDesc); + diff --git a/sdk/wxscintilla/src/scintilla/src/LexBullant.cxx b/sdk/wxscintilla/src/scintilla/src/LexBullant.cxx new file mode 100644 index 0000000..28e2e75 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexBullant.cxx @@ -0,0 +1,229 @@ +// SciTE - Scintilla based Text Editor +// LexBullant.cxx - lexer for Bullant + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static int classifyWordBullant(unsigned int start, unsigned int end, WordList &keywords, Accessor &styler) { + char s[100]; + s[0] = '\0'; + for (unsigned int i = 0; i < end - start + 1 && i < 30; i++) { + s[i] = static_cast(tolower(styler[start + i])); + s[i + 1] = '\0'; + } + int lev= 0; + char chAttr = SCE_C_IDENTIFIER; + if (isdigit(s[0]) || (s[0] == '.')){ + chAttr = SCE_C_NUMBER; + } + else { + if (keywords.InList(s)) { + chAttr = SCE_C_WORD; + if (strcmp(s, "end") == 0) + lev = -1; + else if (strcmp(s, "method") == 0 || + strcmp(s, "case") == 0 || + strcmp(s, "class") == 0 || + strcmp(s, "debug") == 0 || + strcmp(s, "test") == 0 || + strcmp(s, "if") == 0 || + strcmp(s, "lock") == 0 || + strcmp(s, "transaction") == 0 || + strcmp(s, "trap") == 0 || + strcmp(s, "until") == 0 || + strcmp(s, "while") == 0) + lev = 1; + } + } + styler.ColourTo(end, chAttr); + return lev; +} + +static void ColouriseBullantDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + WordList &keywords = *keywordlists[0]; + + styler.StartAt(startPos); + + bool fold = styler.GetPropertyInt("fold") != 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + + int state = initStyle; + if (state == SCE_C_STRINGEOL) // Does not leak onto next line + state = SCE_C_DEFAULT; + char chPrev = ' '; + char chNext = styler[startPos]; + unsigned int lengthDoc = startPos + length; + int visibleChars = 0; + styler.StartSegment(startPos); + int endFoundThisLine = 0; + for (unsigned int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if ((ch == '\r' && chNext != '\n') || (ch == '\n')) { + // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix) + // Avoid triggering two times on Dos/Win + // End of line + endFoundThisLine = 0; + if (state == SCE_C_STRINGEOL) { + styler.ColourTo(i, state); + state = SCE_C_DEFAULT; + } + if (fold) { + int lev = levelPrev; + if (visibleChars == 0) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + styler.SetLevel(lineCurrent, lev); + lineCurrent++; + levelPrev = levelCurrent; + } + visibleChars = 0; + +/* int indentBlock = GetLineIndentation(lineCurrent); + if (blockChange==1){ + lineCurrent++; + int pos=SetLineIndentation(lineCurrent, indentBlock + indentSize); + } else if (blockChange==-1) { + indentBlock -= indentSize; + if (indentBlock < 0) + indentBlock = 0; + SetLineIndentation(lineCurrent, indentBlock); + lineCurrent++; + } + blockChange=0; +*/ } + if (!(isascii(ch) && isspace(ch))) + visibleChars++; + + if (styler.IsLeadByte(ch)) { + chNext = styler.SafeGetCharAt(i + 2); + chPrev = ' '; + i += 1; + continue; + } + + if (state == SCE_C_DEFAULT) { + if (iswordstart(ch)) { + styler.ColourTo(i-1, state); + state = SCE_C_IDENTIFIER; + } else if (ch == '@' && chNext == 'o') { + if ((styler.SafeGetCharAt(i+2) =='f') && (styler.SafeGetCharAt(i+3) == 'f')) { + styler.ColourTo(i-1, state); + state = SCE_C_COMMENT; + } + } else if (ch == '#') { + styler.ColourTo(i-1, state); + state = SCE_C_COMMENTLINE; + } else if (ch == '\"') { + styler.ColourTo(i-1, state); + state = SCE_C_STRING; + } else if (ch == '\'') { + styler.ColourTo(i-1, state); + state = SCE_C_CHARACTER; + } else if (isoperator(ch)) { + styler.ColourTo(i-1, state); + styler.ColourTo(i, SCE_C_OPERATOR); + } + } else if (state == SCE_C_IDENTIFIER) { + if (!iswordchar(ch)) { + int levelChange = classifyWordBullant(styler.GetStartSegment(), i - 1, keywords, styler); + state = SCE_C_DEFAULT; + chNext = styler.SafeGetCharAt(i + 1); + if (ch == '#') { + state = SCE_C_COMMENTLINE; + } else if (ch == '\"') { + state = SCE_C_STRING; + } else if (ch == '\'') { + state = SCE_C_CHARACTER; + } else if (isoperator(ch)) { + styler.ColourTo(i, SCE_C_OPERATOR); + } + if (endFoundThisLine == 0) + levelCurrent+=levelChange; + if (levelChange == -1) + endFoundThisLine=1; + } + } else if (state == SCE_C_COMMENT) { + if (ch == '@' && chNext == 'o') { + if (styler.SafeGetCharAt(i+2) == 'n') { + styler.ColourTo(i+2, state); + state = SCE_C_DEFAULT; + i+=2; + } + } + } else if (state == SCE_C_COMMENTLINE) { + if (ch == '\r' || ch == '\n') { + endFoundThisLine = 0; + styler.ColourTo(i-1, state); + state = SCE_C_DEFAULT; + } + } else if (state == SCE_C_STRING) { + if (ch == '\\') { + if (chNext == '\"' || chNext == '\'' || chNext == '\\') { + i++; + ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + } + } else if (ch == '\"') { + styler.ColourTo(i, state); + state = SCE_C_DEFAULT; + } else if (chNext == '\r' || chNext == '\n') { + endFoundThisLine = 0; + styler.ColourTo(i-1, SCE_C_STRINGEOL); + state = SCE_C_STRINGEOL; + } + } else if (state == SCE_C_CHARACTER) { + if ((ch == '\r' || ch == '\n') && (chPrev != '\\')) { + endFoundThisLine = 0; + styler.ColourTo(i-1, SCE_C_STRINGEOL); + state = SCE_C_STRINGEOL; + } else if (ch == '\\') { + if (chNext == '\"' || chNext == '\'' || chNext == '\\') { + i++; + ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + } + } else if (ch == '\'') { + styler.ColourTo(i, state); + state = SCE_C_DEFAULT; + } + } + chPrev = ch; + } + styler.ColourTo(lengthDoc - 1, state); + + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + if (fold) { + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + //styler.SetLevel(lineCurrent, levelCurrent | flagsNext); + styler.SetLevel(lineCurrent, levelPrev | flagsNext); + + } +} + +static const char * const bullantWordListDesc[] = { + "Keywords", + 0 +}; + +LexerModule lmBullant(SCLEX_BULLANT, ColouriseBullantDoc, "bullant", 0, bullantWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexCLW.cxx b/sdk/wxscintilla/src/scintilla/src/LexCLW.cxx new file mode 100644 index 0000000..3416bf2 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexCLW.cxx @@ -0,0 +1,679 @@ +// Scintilla source code edit control +/** @file LexClw.cxx + ** Lexer for Clarion. + ** 2004/12/17 Updated Lexer + **/ +// Copyright 2003-2004 by Ron Schofield +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +// Is an end of line character +inline bool IsEOL(const int ch) { + + return(ch == '\n'); +} + +// Convert character to uppercase +static char CharacterUpper(char chChar) { + + if (chChar < 'a' || chChar > 'z') { + return(chChar); + } + else { + return(static_cast(chChar - 'a' + 'A')); + } +} + +// Convert string to uppercase +static void StringUpper(char *szString) { + + while (*szString) { + *szString = CharacterUpper(*szString); + szString++; + } +} + +// Is a label start character +inline bool IsALabelStart(const int iChar) { + + return(isalpha(iChar) || iChar == '_'); +} + +// Is a label character +inline bool IsALabelCharacter(const int iChar) { + + return(isalnum(iChar) || iChar == '_' || iChar == ':'); +} + +// Is the character is a ! and the the next character is not a ! +inline bool IsACommentStart(const int iChar) { + + return(iChar == '!'); +} + +// Is the character a Clarion hex character (ABCDEF) +inline bool IsAHexCharacter(const int iChar, bool bCaseSensitive) { + + // Case insensitive. + if (!bCaseSensitive) { + if (strchr("ABCDEFabcdef", iChar) != NULL) { + return(true); + } + } + // Case sensitive + else { + if (strchr("ABCDEF", iChar) != NULL) { + return(true); + } + } + return(false); +} + +// Is the character a Clarion base character (B=Binary, O=Octal, H=Hex) +inline bool IsANumericBaseCharacter(const int iChar, bool bCaseSensitive) { + + // Case insensitive. + if (!bCaseSensitive) { + // If character is a numeric base character + if (strchr("BOHboh", iChar) != NULL) { + return(true); + } + } + // Case sensitive + else { + // If character is a numeric base character + if (strchr("BOH", iChar) != NULL) { + return(true); + } + } + return(false); +} + +// Set the correct numeric constant state +inline bool SetNumericConstantState(StyleContext &scDoc) { + + int iPoints = 0; // Point counter + char cNumericString[512]; // Numeric string buffer + + // Buffer the current numberic string + scDoc.GetCurrent(cNumericString, sizeof(cNumericString)); + // Loop through the string until end of string (NULL termination) + for (int iIndex = 0; cNumericString[iIndex] != '\0'; iIndex++) { + // Depending on the character + switch (cNumericString[iIndex]) { + // Is a . (point) + case '.' : + // Increment point counter + iPoints++; + break; + default : + break; + } + } + // If points found (can be more than one for improper formatted number + if (iPoints > 0) { + return(true); + } + // Else no points found + else { + return(false); + } +} + +// Get the next word in uppercase from the current position (keyword lookahead) +inline bool GetNextWordUpper(Accessor &styler, unsigned int uiStartPos, int iLength, char *cWord) { + + unsigned int iIndex = 0; // Buffer Index + + // Loop through the remaining string from the current position + for (int iOffset = uiStartPos; iOffset < iLength; iOffset++) { + // Get the character from the buffer using the offset + char cCharacter = styler[iOffset]; + if (IsEOL(cCharacter)) { + break; + } + // If the character is alphabet character + if (isalpha(cCharacter)) { + // Add UPPERCASE character to the word buffer + cWord[iIndex++] = CharacterUpper(cCharacter); + } + } + // Add null termination + cWord[iIndex] = '\0'; + // If no word was found + if (iIndex == 0) { + // Return failure + return(false); + } + // Else word was found + else { + // Return success + return(true); + } +} + +// Clarion Language Colouring Procedure +static void ColouriseClarionDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler, bool bCaseSensitive) { + + int iParenthesesLevel = 0; // Parenthese Level + int iColumn1Label = false; // Label starts in Column 1 + + WordList &wlClarionKeywords = *wlKeywords[0]; // Clarion Keywords + WordList &wlCompilerDirectives = *wlKeywords[1]; // Compiler Directives + WordList &wlRuntimeExpressions = *wlKeywords[2]; // Runtime Expressions + WordList &wlBuiltInProcsFuncs = *wlKeywords[3]; // Builtin Procedures and Functions + WordList &wlStructsDataTypes = *wlKeywords[4]; // Structures and Data Types + WordList &wlAttributes = *wlKeywords[5]; // Procedure Attributes + WordList &wlStandardEquates = *wlKeywords[6]; // Standard Equates + WordList &wlLabelReservedWords = *wlKeywords[7]; // Clarion Reserved Keywords (Labels) + WordList &wlProcLabelReservedWords = *wlKeywords[8]; // Clarion Reserved Keywords (Procedure Labels) + + const char wlProcReservedKeywordList[] = + "PROCEDURE FUNCTION"; + WordList wlProcReservedKeywords; + wlProcReservedKeywords.Set(wlProcReservedKeywordList); + + const char wlCompilerKeywordList[] = + "COMPILE OMIT"; + WordList wlCompilerKeywords; + wlCompilerKeywords.Set(wlCompilerKeywordList); + + const char wlLegacyStatementsList[] = + "BOF EOF FUNCTION POINTER SHARE"; + WordList wlLegacyStatements; + wlLegacyStatements.Set(wlLegacyStatementsList); + + StyleContext scDoc(uiStartPos, iLength, iInitStyle, accStyler); + + // lex source code + for (; scDoc.More(); scDoc.Forward()) + { + // + // Determine if the current state should terminate. + // + + // Label State Handling + if (scDoc.state == SCE_CLW_LABEL) { + // If the character is not a valid label + if (!IsALabelCharacter(scDoc.ch)) { + // If the character is a . (dot syntax) + if (scDoc.ch == '.') { + // Turn off column 1 label flag as label now cannot be reserved work + iColumn1Label = false; + // Uncolour the . (dot) to default state, move forward one character, + // and change back to the label state. + scDoc.SetState(SCE_CLW_DEFAULT); + scDoc.Forward(); + scDoc.SetState(SCE_CLW_LABEL); + } + // Else check label + else { + char cLabel[512]; // Label buffer + // Buffer the current label string + scDoc.GetCurrent(cLabel,sizeof(cLabel)); + // If case insensitive, convert string to UPPERCASE to match passed keywords. + if (!bCaseSensitive) { + StringUpper(cLabel); + } + // Else if UPPERCASE label string is in the Clarion compiler keyword list + if (wlCompilerKeywords.InList(cLabel) && iColumn1Label){ + // change the label to error state + scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE); + } + // Else if UPPERCASE label string is in the Clarion reserved keyword list + else if (wlLabelReservedWords.InList(cLabel) && iColumn1Label){ + // change the label to error state + scDoc.ChangeState(SCE_CLW_ERROR); + } + // Else if UPPERCASE label string is + else if (wlProcLabelReservedWords.InList(cLabel) && iColumn1Label) { + char cWord[512]; // Word buffer + // Get the next word from the current position + if (GetNextWordUpper(accStyler,scDoc.currentPos,uiStartPos+iLength,cWord)) { + // If the next word is a procedure reserved word + if (wlProcReservedKeywords.InList(cWord)) { + // Change the label to error state + scDoc.ChangeState(SCE_CLW_ERROR); + } + } + } + // Else if label string is in the compiler directive keyword list + else if (wlCompilerDirectives.InList(cLabel)) { + // change the state to compiler directive state + scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE); + } + // Terminate the label state and set to default state + scDoc.SetState(SCE_CLW_DEFAULT); + } + } + } + // Keyword State Handling + else if (scDoc.state == SCE_CLW_KEYWORD) { + // If character is : (colon) + if (scDoc.ch == ':') { + char cEquate[512]; // Equate buffer + // Move forward to include : (colon) in buffer + scDoc.Forward(); + // Buffer the equate string + scDoc.GetCurrent(cEquate,sizeof(cEquate)); + // If case insensitive, convert string to UPPERCASE to match passed keywords. + if (!bCaseSensitive) { + StringUpper(cEquate); + } + // If statement string is in the equate list + if (wlStandardEquates.InList(cEquate)) { + // Change to equate state + scDoc.ChangeState(SCE_CLW_STANDARD_EQUATE); + } + } + // If the character is not a valid label character + else if (!IsALabelCharacter(scDoc.ch)) { + char cStatement[512]; // Statement buffer + // Buffer the statement string + scDoc.GetCurrent(cStatement,sizeof(cStatement)); + // If case insensitive, convert string to UPPERCASE to match passed keywords. + if (!bCaseSensitive) { + StringUpper(cStatement); + } + // If statement string is in the Clarion keyword list + if (wlClarionKeywords.InList(cStatement)) { + // Change the statement string to the Clarion keyword state + scDoc.ChangeState(SCE_CLW_KEYWORD); + } + // Else if statement string is in the compiler directive keyword list + else if (wlCompilerDirectives.InList(cStatement)) { + // Change the statement string to the compiler directive state + scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE); + } + // Else if statement string is in the runtime expressions keyword list + else if (wlRuntimeExpressions.InList(cStatement)) { + // Change the statement string to the runtime expressions state + scDoc.ChangeState(SCE_CLW_RUNTIME_EXPRESSIONS); + } + // Else if statement string is in the builtin procedures and functions keyword list + else if (wlBuiltInProcsFuncs.InList(cStatement)) { + // Change the statement string to the builtin procedures and functions state + scDoc.ChangeState(SCE_CLW_BUILTIN_PROCEDURES_FUNCTION); + } + // Else if statement string is in the tructures and data types keyword list + else if (wlStructsDataTypes.InList(cStatement)) { + // Change the statement string to the structures and data types state + scDoc.ChangeState(SCE_CLW_STRUCTURE_DATA_TYPE); + } + // Else if statement string is in the procedure attribute keyword list + else if (wlAttributes.InList(cStatement)) { + // Change the statement string to the procedure attribute state + scDoc.ChangeState(SCE_CLW_ATTRIBUTE); + } + // Else if statement string is in the standard equate keyword list + else if (wlStandardEquates.InList(cStatement)) { + // Change the statement string to the standard equate state + scDoc.ChangeState(SCE_CLW_STANDARD_EQUATE); + } + // Else if statement string is in the deprecated or legacy keyword list + else if (wlLegacyStatements.InList(cStatement)) { + // Change the statement string to the standard equate state + scDoc.ChangeState(SCE_CLW_DEPRECATED); + } + // Else the statement string doesn't match any work list + else { + // Change the statement string to the default state + scDoc.ChangeState(SCE_CLW_DEFAULT); + } + // Terminate the keyword state and set to default state + scDoc.SetState(SCE_CLW_DEFAULT); + } + } + // String State Handling + else if (scDoc.state == SCE_CLW_STRING) { + // If the character is an ' (single quote) + if (scDoc.ch == '\'') { + // Set the state to default and move forward colouring + // the ' (single quote) as default state + // terminating the string state + scDoc.SetState(SCE_CLW_DEFAULT); + scDoc.Forward(); + } + // If the next character is an ' (single quote) + if (scDoc.chNext == '\'') { + // Move forward one character and set to default state + // colouring the next ' (single quote) as default state + // terminating the string state + scDoc.ForwardSetState(SCE_CLW_DEFAULT); + scDoc.Forward(); + } + } + // Picture String State Handling + else if (scDoc.state == SCE_CLW_PICTURE_STRING) { + // If the character is an ( (open parenthese) + if (scDoc.ch == '(') { + // Increment the parenthese level + iParenthesesLevel++; + } + // Else if the character is a ) (close parenthese) + else if (scDoc.ch == ')') { + // If the parenthese level is set to zero + // parentheses matched + if (!iParenthesesLevel) { + scDoc.SetState(SCE_CLW_DEFAULT); + } + // Else parenthese level is greater than zero + // still looking for matching parentheses + else { + // Decrement the parenthese level + iParenthesesLevel--; + } + } + } + // Standard Equate State Handling + else if (scDoc.state == SCE_CLW_STANDARD_EQUATE) { + if (!isalnum(scDoc.ch)) { + scDoc.SetState(SCE_CLW_DEFAULT); + } + } + // Integer Constant State Handling + else if (scDoc.state == SCE_CLW_INTEGER_CONSTANT) { + // If the character is not a digit (0-9) + // or character is not a hexidecimal character (A-F) + // or character is not a . (point) + // or character is not a numberic base character (B,O,H) + if (!(isdigit(scDoc.ch) + || IsAHexCharacter(scDoc.ch, bCaseSensitive) + || scDoc.ch == '.' + || IsANumericBaseCharacter(scDoc.ch, bCaseSensitive))) { + // If the number was a real + if (SetNumericConstantState(scDoc)) { + // Colour the matched string to the real constant state + scDoc.ChangeState(SCE_CLW_REAL_CONSTANT); + } + // Else the number was an integer + else { + // Colour the matched string to an integer constant state + scDoc.ChangeState(SCE_CLW_INTEGER_CONSTANT); + } + // Terminate the integer constant state and set to default state + scDoc.SetState(SCE_CLW_DEFAULT); + } + } + + // + // Determine if a new state should be entered. + // + + // Beginning of Line Handling + if (scDoc.atLineStart) { + // Reset the column 1 label flag + iColumn1Label = false; + // If column 1 character is a label start character + if (IsALabelStart(scDoc.ch)) { + // Label character is found in column 1 + // so set column 1 label flag and clear last column 1 label + iColumn1Label = true; + // Set the state to label + scDoc.SetState(SCE_CLW_LABEL); + } + // else if character is a space or tab + else if (IsASpace(scDoc.ch)){ + // Set to default state + scDoc.SetState(SCE_CLW_DEFAULT); + } + // else if comment start (!) or is an * (asterisk) + else if (IsACommentStart(scDoc.ch) || scDoc.ch == '*' ) { + // then set the state to comment. + scDoc.SetState(SCE_CLW_COMMENT); + } + // else the character is a ? (question mark) + else if (scDoc.ch == '?') { + // Change to the compiler directive state, move forward, + // colouring the ? (question mark), change back to default state. + scDoc.ChangeState(SCE_CLW_COMPILER_DIRECTIVE); + scDoc.Forward(); + scDoc.SetState(SCE_CLW_DEFAULT); + } + // else an invalid character in column 1 + else { + // Set to error state + scDoc.SetState(SCE_CLW_ERROR); + } + } + // End of Line Handling + else if (scDoc.atLineEnd) { + // Reset to the default state at the end of each line. + scDoc.SetState(SCE_CLW_DEFAULT); + } + // Default Handling + else { + // If in default state + if (scDoc.state == SCE_CLW_DEFAULT) { + // If is a letter could be a possible statement + if (isalpha(scDoc.ch)) { + // Set the state to Clarion Keyword and verify later + scDoc.SetState(SCE_CLW_KEYWORD); + } + // else is a number + else if (isdigit(scDoc.ch)) { + // Set the state to Integer Constant and verify later + scDoc.SetState(SCE_CLW_INTEGER_CONSTANT); + } + // else if the start of a comment or a | (line continuation) + else if (IsACommentStart(scDoc.ch) || scDoc.ch == '|') { + // then set the state to comment. + scDoc.SetState(SCE_CLW_COMMENT); + } + // else if the character is a ' (single quote) + else if (scDoc.ch == '\'') { + // If the character is also a ' (single quote) + // Embedded Apostrophe + if (scDoc.chNext == '\'') { + // Move forward colouring it as default state + scDoc.ForwardSetState(SCE_CLW_DEFAULT); + } + else { + // move to the next character and then set the state to comment. + scDoc.ForwardSetState(SCE_CLW_STRING); + } + } + // else the character is an @ (ampersand) + else if (scDoc.ch == '@') { + // Case insensitive. + if (!bCaseSensitive) { + // If character is a valid picture token character + if (strchr("DEKNPSTdeknpst", scDoc.chNext) != NULL) { + // Set to the picture string state + scDoc.SetState(SCE_CLW_PICTURE_STRING); + } + } + // Case sensitive + else { + // If character is a valid picture token character + if (strchr("DEKNPST", scDoc.chNext) != NULL) { + // Set the picture string state + scDoc.SetState(SCE_CLW_PICTURE_STRING); + } + } + } + } + } + } + // lexing complete + scDoc.Complete(); +} + +// Clarion Language Case Sensitive Colouring Procedure +static void ColouriseClarionDocSensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) { + + ColouriseClarionDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, true); +} + +// Clarion Language Case Insensitive Colouring Procedure +static void ColouriseClarionDocInsensitive(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *wlKeywords[], Accessor &accStyler) { + + ColouriseClarionDoc(uiStartPos, iLength, iInitStyle, wlKeywords, accStyler, false); +} + +// Fill Buffer + +static void FillBuffer(unsigned int uiStart, unsigned int uiEnd, Accessor &accStyler, char *szBuffer, unsigned int uiLength) { + + unsigned int uiPos = 0; + + while ((uiPos < uiEnd - uiStart + 1) && (uiPos < uiLength-1)) { + szBuffer[uiPos] = static_cast(toupper(accStyler[uiStart + uiPos])); + uiPos++; + } + szBuffer[uiPos] = '\0'; +} + +// Classify Clarion Fold Point + +static int ClassifyClarionFoldPoint(int iLevel, const char* szString) { + + if (!(isdigit(szString[0]) || (szString[0] == '.'))) { + if (strcmp(szString, "PROCEDURE") == 0) { + // iLevel = SC_FOLDLEVELBASE + 1; + } + else if (strcmp(szString, "MAP") == 0 || + strcmp(szString,"ACCEPT") == 0 || + strcmp(szString,"BEGIN") == 0 || + strcmp(szString,"CASE") == 0 || + strcmp(szString,"EXECUTE") == 0 || + strcmp(szString,"IF") == 0 || + strcmp(szString,"ITEMIZE") == 0 || + strcmp(szString,"INTERFACE") == 0 || + strcmp(szString,"JOIN") == 0 || + strcmp(szString,"LOOP") == 0 || + strcmp(szString,"MODULE") == 0 || + strcmp(szString,"RECORD") == 0) { + iLevel++; + } + else if (strcmp(szString, "APPLICATION") == 0 || + strcmp(szString, "CLASS") == 0 || + strcmp(szString, "DETAIL") == 0 || + strcmp(szString, "FILE") == 0 || + strcmp(szString, "FOOTER") == 0 || + strcmp(szString, "FORM") == 0 || + strcmp(szString, "GROUP") == 0 || + strcmp(szString, "HEADER") == 0 || + strcmp(szString, "INTERFACE") == 0 || + strcmp(szString, "MENU") == 0 || + strcmp(szString, "MENUBAR") == 0 || + strcmp(szString, "OLE") == 0 || + strcmp(szString, "OPTION") == 0 || + strcmp(szString, "QUEUE") == 0 || + strcmp(szString, "REPORT") == 0 || + strcmp(szString, "SHEET") == 0 || + strcmp(szString, "TAB") == 0 || + strcmp(szString, "TOOLBAR") == 0 || + strcmp(szString, "VIEW") == 0 || + strcmp(szString, "WINDOW") == 0) { + iLevel++; + } + else if (strcmp(szString, "END") == 0 || + strcmp(szString, "UNTIL") == 0 || + strcmp(szString, "WHILE") == 0) { + iLevel--; + } + } + return(iLevel); +} + +// Clarion Language Folding Procedure +static void FoldClarionDoc(unsigned int uiStartPos, int iLength, int iInitStyle, WordList *[], Accessor &accStyler) { + + unsigned int uiEndPos = uiStartPos + iLength; + int iLineCurrent = accStyler.GetLine(uiStartPos); + int iLevelPrev = accStyler.LevelAt(iLineCurrent) & SC_FOLDLEVELNUMBERMASK; + int iLevelCurrent = iLevelPrev; + char chNext = accStyler[uiStartPos]; + int iStyle = iInitStyle; + int iStyleNext = accStyler.StyleAt(uiStartPos); + int iVisibleChars = 0; + int iLastStart = 0; + + for (unsigned int uiPos = uiStartPos; uiPos < uiEndPos; uiPos++) { + + char chChar = chNext; + chNext = accStyler.SafeGetCharAt(uiPos + 1); + int iStylePrev = iStyle; + iStyle = iStyleNext; + iStyleNext = accStyler.StyleAt(uiPos + 1); + bool bEOL = (chChar == '\r' && chNext != '\n') || (chChar == '\n'); + + if (iStylePrev == SCE_CLW_DEFAULT) { + if (iStyle == SCE_CLW_KEYWORD || iStyle == SCE_CLW_STRUCTURE_DATA_TYPE) { + // Store last word start point. + iLastStart = uiPos; + } + } + + if (iStylePrev == SCE_CLW_KEYWORD || iStylePrev == SCE_CLW_STRUCTURE_DATA_TYPE) { + if(iswordchar(chChar) && !iswordchar(chNext)) { + char chBuffer[100]; + FillBuffer(iLastStart, uiPos, accStyler, chBuffer, sizeof(chBuffer)); + iLevelCurrent = ClassifyClarionFoldPoint(iLevelCurrent,chBuffer); + // if ((iLevelCurrent == SC_FOLDLEVELBASE + 1) && iLineCurrent > 1) { + // accStyler.SetLevel(iLineCurrent-1,SC_FOLDLEVELBASE); + // iLevelPrev = SC_FOLDLEVELBASE; + // } + } + } + + if (bEOL) { + int iLevel = iLevelPrev; + if ((iLevelCurrent > iLevelPrev) && (iVisibleChars > 0)) + iLevel |= SC_FOLDLEVELHEADERFLAG; + if (iLevel != accStyler.LevelAt(iLineCurrent)) { + accStyler.SetLevel(iLineCurrent,iLevel); + } + iLineCurrent++; + iLevelPrev = iLevelCurrent; + iVisibleChars = 0; + } + + if (!isspacechar(chChar)) + iVisibleChars++; + } + + // Fill in the real level of the next line, keeping the current flags + // as they will be filled in later. + int iFlagsNext = accStyler.LevelAt(iLineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + accStyler.SetLevel(iLineCurrent, iLevelPrev | iFlagsNext); +} + +// Word List Descriptions +static const char * const rgWordListDescriptions[] = { + "Clarion Keywords", + "Compiler Directives", + "Built-in Procedures and Functions", + "Runtime Expressions", + "Structure and Data Types", + "Attributes", + "Standard Equates", + "Reserved Words (Labels)", + "Reserved Words (Procedure Labels)", + 0, +}; + +// Case Sensitive Clarion Language Lexer +LexerModule lmClw(SCLEX_CLW, ColouriseClarionDocSensitive, "clarion", FoldClarionDoc, rgWordListDescriptions); + +// Case Insensitive Clarion Language Lexer +LexerModule lmClwNoCase(SCLEX_CLWNOCASE, ColouriseClarionDocInsensitive, "clarionnocase", FoldClarionDoc, rgWordListDescriptions); diff --git a/sdk/wxscintilla/src/scintilla/src/LexCOBOL.cxx b/sdk/wxscintilla/src/scintilla/src/LexCOBOL.cxx new file mode 100644 index 0000000..cd42e3e --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexCOBOL.cxx @@ -0,0 +1,368 @@ +// Scintilla source code edit control +/** @file LexCOBOL.cxx + ** Lexer for COBOL + ** Based on LexPascal.cxx + ** Written by Laurent le Tynevez + ** Updated by Simon Steele September 2002 + ** Updated by Mathias Rauen May 2003 (Delphi adjustments) + ** Updated by Rod Falck, Aug 2006 Converted to COBOL + **/ + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" +#include "StyleContext.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +#define IN_DIVISION 0x01 +#define IN_DECLARATIVES 0x02 +#define IN_SECTION 0x04 +#define IN_PARAGRAPH 0x08 +#define IN_FLAGS 0xF +#define NOT_HEADER 0x10 + +inline bool isCOBOLoperator(char ch) + { + return isoperator(ch); + } + +inline bool isCOBOLwordchar(char ch) + { + return isascii(ch) && (isalnum(ch) || ch == '-'); + + } + +inline bool isCOBOLwordstart(char ch) + { + return isascii(ch) && isalnum(ch); + } + +static int CountBits(int nBits) + { + int count = 0; + for (int i = 0; i < 32; ++i) + { + count += nBits & 1; + nBits >>= 1; + } + return count; + } + +static void getRange(unsigned int start, + unsigned int end, + Accessor &styler, + char *s, + unsigned int len) { + unsigned int i = 0; + while ((i < end - start + 1) && (i < len-1)) { + s[i] = static_cast(tolower(styler[start + i])); + i++; + } + s[i] = '\0'; +} + +static void ColourTo(Accessor &styler, unsigned int end, unsigned int attr) { + styler.ColourTo(end, attr); +} + + +static int classifyWordCOBOL(unsigned int start, unsigned int end, /*WordList &keywords*/WordList *keywordlists[], Accessor &styler, int nContainment, bool *bAarea) { + int ret = 0; + + WordList& a_keywords = *keywordlists[0]; + WordList& b_keywords = *keywordlists[1]; + WordList& c_keywords = *keywordlists[2]; + + char s[100]; + getRange(start, end, styler, s, sizeof(s)); + + char chAttr = SCE_C_IDENTIFIER; + if (isdigit(s[0]) || (s[0] == '.')) { + chAttr = SCE_C_NUMBER; + char *p = s + 1; + while (*p) { + if (!isdigit(*p) && isCOBOLwordchar(*p)) { + chAttr = SCE_C_IDENTIFIER; + break; + } + ++p; + } + } + else { + if (a_keywords.InList(s)) { + chAttr = SCE_C_WORD; + } + else if (b_keywords.InList(s)) { + chAttr = SCE_C_WORD2; + } + else if (c_keywords.InList(s)) { + chAttr = SCE_C_UUID; + } + } + if (*bAarea) { + if (strcmp(s, "division") == 0) { + ret = IN_DIVISION; + // we've determined the containment, anything else is just ignored for those purposes + *bAarea = false; + } else if (strcmp(s, "declaratives") == 0) { + ret = IN_DIVISION | IN_DECLARATIVES; + if (nContainment & IN_DECLARATIVES) + ret |= NOT_HEADER | IN_SECTION; + // we've determined the containment, anything else is just ignored for those purposes + *bAarea = false; + } else if (strcmp(s, "section") == 0) { + ret = (nContainment &~ IN_PARAGRAPH) | IN_SECTION; + // we've determined the containment, anything else is just ignored for those purposes + *bAarea = false; + } else if (strcmp(s, "end") == 0 && (nContainment & IN_DECLARATIVES)) { + ret = IN_DIVISION | IN_DECLARATIVES | IN_SECTION | NOT_HEADER; + } else { + ret = nContainment | IN_PARAGRAPH; + } + } + ColourTo(styler, end, chAttr); + return ret; +} + +static void ColouriseCOBOLDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + + styler.StartAt(startPos); + + int state = initStyle; + if (state == SCE_C_CHARACTER) // Does not leak onto next line + state = SCE_C_DEFAULT; + char chPrev = ' '; + char chNext = styler[startPos]; + unsigned int lengthDoc = startPos + length; + + int nContainment; + + int currentLine = styler.GetLine(startPos); + if (currentLine > 0) { + styler.SetLineState(currentLine, styler.GetLineState(currentLine-1)); + nContainment = styler.GetLineState(currentLine); + nContainment &= ~NOT_HEADER; + } else { + styler.SetLineState(currentLine, 0); + nContainment = 0; + } + + styler.StartSegment(startPos); + bool bNewLine = true; + bool bAarea = !isspacechar(chNext); + int column = 0; + for (unsigned int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + + chNext = styler.SafeGetCharAt(i + 1); + + ++column; + + if (bNewLine) { + column = 0; + } + if (column <= 1 && !bAarea) { + bAarea = !isspacechar(ch); + } + bool bSetNewLine = false; + if ((ch == '\r' && chNext != '\n') || (ch == '\n')) { + // Trigger on CR only (Mac style) or either on LF from CR+LF (Dos/Win) or on LF alone (Unix) + // Avoid triggering two times on Dos/Win + // End of line + if (state == SCE_C_CHARACTER) { + ColourTo(styler, i, state); + state = SCE_C_DEFAULT; + } + styler.SetLineState(currentLine, nContainment); + currentLine++; + bSetNewLine = true; + if (nContainment & NOT_HEADER) + nContainment &= ~(NOT_HEADER | IN_DECLARATIVES | IN_SECTION); + } + + if (styler.IsLeadByte(ch)) { + chNext = styler.SafeGetCharAt(i + 2); + chPrev = ' '; + i += 1; + continue; + } + + if (state == SCE_C_DEFAULT) { + if (isCOBOLwordstart(ch) || (ch == '$' && isascii(chNext) && isalpha(chNext))) { + ColourTo(styler, i-1, state); + state = SCE_C_IDENTIFIER; + } else if (column == 0 && ch == '*' && chNext != '*') { + ColourTo(styler, i-1, state); + state = SCE_C_COMMENTLINE; + } else if (column == 0 && ch == '/' && chNext != '*') { + ColourTo(styler, i-1, state); + state = SCE_C_COMMENTLINE; + } else if (column == 0 && ch == '*' && chNext == '*') { + ColourTo(styler, i-1, state); + state = SCE_C_COMMENTDOC; + } else if (column == 0 && ch == '/' && chNext == '*') { + ColourTo(styler, i-1, state); + state = SCE_C_COMMENTDOC; + } else if (ch == '"') { + ColourTo(styler, i-1, state); + state = SCE_C_STRING; + } else if (ch == '\'') { + ColourTo(styler, i-1, state); + state = SCE_C_CHARACTER; + } else if (ch == '?' && column == 0) { + ColourTo(styler, i-1, state); + state = SCE_C_PREPROCESSOR; + } else if (isCOBOLoperator(ch)) { + ColourTo(styler, i-1, state); + ColourTo(styler, i, SCE_C_OPERATOR); + } + } else if (state == SCE_C_IDENTIFIER) { + if (!isCOBOLwordchar(ch)) { + int lStateChange = classifyWordCOBOL(styler.GetStartSegment(), i - 1, keywordlists, styler, nContainment, &bAarea); + + if(lStateChange != 0) { + styler.SetLineState(currentLine, lStateChange); + nContainment = lStateChange; + } + + state = SCE_C_DEFAULT; + chNext = styler.SafeGetCharAt(i + 1); + if (ch == '"') { + state = SCE_C_STRING; + } else if (ch == '\'') { + state = SCE_C_CHARACTER; + } else if (isCOBOLoperator(ch)) { + ColourTo(styler, i, SCE_C_OPERATOR); + } + } + } else { + if (state == SCE_C_PREPROCESSOR) { + if ((ch == '\r' || ch == '\n') && !(chPrev == '\\' || chPrev == '\r')) { + ColourTo(styler, i-1, state); + state = SCE_C_DEFAULT; + } + } else if (state == SCE_C_COMMENT) { + if (ch == '\r' || ch == '\n') { + ColourTo(styler, i, state); + state = SCE_C_DEFAULT; + } + } else if (state == SCE_C_COMMENTDOC) { + if (ch == '\r' || ch == '\n') { + if (((i > styler.GetStartSegment() + 2) || ( + (initStyle == SCE_C_COMMENTDOC) && + (styler.GetStartSegment() == static_cast(startPos))))) { + ColourTo(styler, i, state); + state = SCE_C_DEFAULT; + } + } + } else if (state == SCE_C_COMMENTLINE) { + if (ch == '\r' || ch == '\n') { + ColourTo(styler, i-1, state); + state = SCE_C_DEFAULT; + } + } else if (state == SCE_C_STRING) { + if (ch == '"') { + ColourTo(styler, i, state); + state = SCE_C_DEFAULT; + } + } else if (state == SCE_C_CHARACTER) { + if (ch == '\'') { + ColourTo(styler, i, state); + state = SCE_C_DEFAULT; + } + } + } + chPrev = ch; + bNewLine = bSetNewLine; + if (bNewLine) + { + bAarea = false; + } + } + ColourTo(styler, lengthDoc - 1, state); +} + +static void FoldCOBOLDoc(unsigned int startPos, int length, int, WordList *[], + Accessor &styler) { + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = lineCurrent > 0 ? styler.LevelAt(lineCurrent - 1) & SC_FOLDLEVELNUMBERMASK : 0xFFF; + char chNext = styler[startPos]; + + bool bNewLine = true; + bool bAarea = !isspacechar(chNext); + int column = 0; + bool bComment = false; + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + ++column; + + if (bNewLine) { + column = 0; + bComment = (ch == '*' || ch == '/' || ch == '?'); + } + if (column <= 1 && !bAarea) { + bAarea = !isspacechar(ch); + } + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (atEOL) { + int nContainment = styler.GetLineState(lineCurrent); + int lev = CountBits(nContainment & IN_FLAGS) | SC_FOLDLEVELBASE; + if (bAarea && !bComment) + --lev; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((bAarea) && (visibleChars > 0) && !(nContainment & NOT_HEADER) && !bComment) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + if ((lev & SC_FOLDLEVELNUMBERMASK) <= (levelPrev & SC_FOLDLEVELNUMBERMASK)) { + // this level is at the same level or less than the previous line + // therefore these is nothing for the previous header to collapse, so remove the header + styler.SetLevel(lineCurrent - 1, levelPrev & ~SC_FOLDLEVELHEADERFLAG); + } + levelPrev = lev; + visibleChars = 0; + bAarea = false; + bNewLine = true; + lineCurrent++; + } else { + bNewLine = false; + } + + + if (!isspacechar(ch)) + visibleChars++; + } + + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +static const char * const COBOLWordListDesc[] = { + "A Keywords", + "B Keywords", + "Extended Keywords", + 0 +}; + +LexerModule lmCOBOL(SCLEX_COBOL, ColouriseCOBOLDoc, "COBOL", FoldCOBOLDoc, COBOLWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexCPP.cxx b/sdk/wxscintilla/src/scintilla/src/LexCPP.cxx new file mode 100644 index 0000000..7f816fa --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexCPP.cxx @@ -0,0 +1,519 @@ +// Scintilla source code edit control +/** @file LexCPP.cxx + ** Lexer for C++, C, Java, and JavaScript. + **/ +// Copyright 1998-2005 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" +#include "CharacterSet.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static bool IsSpaceEquiv(int state) { + return (state <= SCE_C_COMMENTDOC) || + // including SCE_C_DEFAULT, SCE_C_COMMENT, SCE_C_COMMENTLINE + (state == SCE_C_COMMENTLINEDOC) || (state == SCE_C_COMMENTDOCKEYWORD) || + (state == SCE_C_COMMENTDOCKEYWORDERROR); +} + +// Preconditions: sc.currentPos points to a character after '+' or '-'. +// The test for pos reaching 0 should be redundant, +// and is in only for safety measures. +// Limitation: this code will give the incorrect answer for code like +// a = b+++/ptn/... +// Putting a space between the '++' post-inc operator and the '+' binary op +// fixes this, and is highly recommended for readability anyway. +static bool FollowsPostfixOperator(StyleContext &sc, Accessor &styler) { + int pos = (int) sc.currentPos; + while (--pos > 0) { + char ch = styler[pos]; + if (ch == '+' || ch == '-') { + return styler[pos - 1] == ch; + } + } + return false; +} + +static void ColouriseCppDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler, bool caseSensitive) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + WordList &keywords4 = *keywordlists[3]; + + // property styling.within.preprocessor + // For C++ code, determines whether all preprocessor code is styled in the preprocessor style (0, the default) + // or only from the initial # to the end of the command word(1). + bool stylingWithinPreprocessor = styler.GetPropertyInt("styling.within.preprocessor") != 0; + + CharacterSet setOKBeforeRE(CharacterSet::setNone, "([{=,:;!%^&*|?~+-"); + CharacterSet setCouldBePostOp(CharacterSet::setNone, "+-"); + + CharacterSet setDoxygen(CharacterSet::setAlpha, "$@\\&<>#{}[]"); + + CharacterSet setWordStart(CharacterSet::setAlpha, "_", 0x80, true); + CharacterSet setWord(CharacterSet::setAlphaNum, "._", 0x80, true); + + // property lexer.cpp.allow.dollars + // Set to 0 to disallow the '$' character in identifiers with the cpp lexer. + if (styler.GetPropertyInt("lexer.cpp.allow.dollars", 1) != 0) { + setWordStart.Add('$'); + setWord.Add('$'); + } + + int chPrevNonWhite = ' '; + int visibleChars = 0; + bool lastWordWasUUID = false; + bool lastOpSetScope = false; + int styleBeforeDCKeyword = SCE_C_DEFAULT; + bool continuationLine = false; + bool isIncludePreprocessor = false; + + if (initStyle == SCE_C_PREPROCESSOR) { + // Set continuationLine if last character of previous line is '\' + int lineCurrent = styler.GetLine(startPos); + if (lineCurrent > 0) { + int chBack = styler.SafeGetCharAt(startPos-1, 0); + int chBack2 = styler.SafeGetCharAt(startPos-2, 0); + int lineEndChar = '!'; + if (chBack2 == '\r' && chBack == '\n') { + lineEndChar = styler.SafeGetCharAt(startPos-3, 0); + } else if (chBack == '\n' || chBack == '\r') { + lineEndChar = chBack2; + } + continuationLine = lineEndChar == '\\'; + } + } + + // look back to set chPrevNonWhite properly for better regex colouring + if (startPos > 0) { + int back = startPos; + while (--back && IsSpaceEquiv(styler.StyleAt(back))) + ; + if (styler.StyleAt(back) == SCE_C_OPERATOR) { + chPrevNonWhite = styler.SafeGetCharAt(back); + } + } + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + + if (sc.atLineStart) { + if (sc.state == SCE_C_STRING) { + // Prevent SCE_C_STRINGEOL from leaking back to previous line which + // ends with a line continuation by locking in the state upto this position. + sc.SetState(SCE_C_STRING); + } + // Reset states to begining of colourise so no surprises + // if different sets of lines lexed. + visibleChars = 0; + lastWordWasUUID = false; + isIncludePreprocessor = false; + } + + // Handle line continuation generically. + if (sc.ch == '\\') { + if (sc.chNext == '\n' || sc.chNext == '\r') { + sc.Forward(); + if (sc.ch == '\r' && sc.chNext == '\n') { + sc.Forward(); + } + continuationLine = true; + continue; + } + } + + // Determine if the current state should terminate. + switch (sc.state) { + case SCE_C_OPERATOR: + sc.SetState(SCE_C_DEFAULT); + break; + case SCE_C_NUMBER: + // We accept almost anything because of hex. and number suffixes + if (!setWord.Contains(sc.ch)) { + sc.SetState(SCE_C_DEFAULT); + } + break; + case SCE_C_IDENTIFIER: + if (!setWord.Contains(sc.ch) || (sc.ch == '.')) { + char s[1000]; + if (caseSensitive) { + sc.GetCurrent(s, sizeof(s)); + } else { + sc.GetCurrentLowered(s, sizeof(s)); + } + if (keywords.InList(s)) { + lastWordWasUUID = strcmp(s, "uuid") == 0; + sc.ChangeState(SCE_C_WORD); + } else if (!lastOpSetScope && keywords4.InList(s)) { + sc.ChangeState(SCE_C_GLOBALCLASS); + } else if (!lastOpSetScope && keywords2.InList(s)) { + sc.ChangeState(SCE_C_WORD2); + } else { + lastOpSetScope = false; + } + sc.SetState(SCE_C_DEFAULT); + } + break; + case SCE_C_PREPROCESSOR: + if (sc.atLineStart && !continuationLine) { + sc.SetState(SCE_C_DEFAULT); + } else if (stylingWithinPreprocessor) { + if (IsASpace(sc.ch)) { + sc.SetState(SCE_C_DEFAULT); + } + } else { + if (sc.Match('/', '*') || sc.Match('/', '/')) { + sc.SetState(SCE_C_DEFAULT); + } + } + break; + case SCE_C_COMMENT: + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_C_DEFAULT); + } + break; + case SCE_C_COMMENTDOC: + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_C_DEFAULT); + } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support + // Verify that we have the conditions to mark a comment-doc-keyword + if ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) { + styleBeforeDCKeyword = SCE_C_COMMENTDOC; + sc.SetState(SCE_C_COMMENTDOCKEYWORD); + } + } + break; + case SCE_C_COMMENTLINE: + if (sc.atLineStart) { + sc.SetState(SCE_C_DEFAULT); + } + break; + case SCE_C_COMMENTLINEDOC: + if (sc.atLineStart) { + sc.SetState(SCE_C_DEFAULT); + } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support + // Verify that we have the conditions to mark a comment-doc-keyword + if ((IsASpace(sc.chPrev) || sc.chPrev == '/' || sc.chPrev == '!') && (!IsASpace(sc.chNext))) { + styleBeforeDCKeyword = SCE_C_COMMENTLINEDOC; + sc.SetState(SCE_C_COMMENTDOCKEYWORD); + } + } + break; + case SCE_C_COMMENTDOCKEYWORD: + if ((styleBeforeDCKeyword == SCE_C_COMMENTDOC) && sc.Match('*', '/')) { + sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR); + sc.Forward(); + sc.ForwardSetState(SCE_C_DEFAULT); + } else if (!setDoxygen.Contains(sc.ch)) { + char s[100]; + if (caseSensitive) { + sc.GetCurrent(s, sizeof(s)); + } else { + sc.GetCurrentLowered(s, sizeof(s)); + } + if (!IsASpace(sc.ch) || !keywords3.InList(s + 1)) { + sc.ChangeState(SCE_C_COMMENTDOCKEYWORDERROR); + } + sc.SetState(styleBeforeDCKeyword); + } + break; + case SCE_C_STRING: + if (sc.atLineEnd) { + sc.ChangeState(SCE_C_STRINGEOL); + } else if (isIncludePreprocessor) { + if (sc.ch == '>') { + sc.ForwardSetState(SCE_C_DEFAULT); + isIncludePreprocessor = false; + } + } else if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\"') { + sc.ForwardSetState(SCE_C_DEFAULT); + } + break; + case SCE_C_CHARACTER: + if (sc.atLineEnd) { + sc.ChangeState(SCE_C_STRINGEOL); + } else if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\'') { + sc.ForwardSetState(SCE_C_DEFAULT); + } + break; + case SCE_C_REGEX: + if (sc.atLineStart) { + sc.SetState(SCE_C_DEFAULT); + } else if (sc.ch == '/') { + sc.Forward(); + while ((sc.ch < 0x80) && islower(sc.ch)) + sc.Forward(); // gobble regex flags + sc.SetState(SCE_C_DEFAULT); + } else if (sc.ch == '\\') { + // Gobble up the quoted character + if (sc.chNext == '\\' || sc.chNext == '/') { + sc.Forward(); + } + } + break; + case SCE_C_STRINGEOL: + if (sc.atLineStart) { + sc.SetState(SCE_C_DEFAULT); + } + break; + case SCE_C_VERBATIM: + if (sc.ch == '\"') { + if (sc.chNext == '\"') { + sc.Forward(); + } else { + sc.ForwardSetState(SCE_C_DEFAULT); + } + } + break; + case SCE_C_UUID: + if (sc.ch == '\r' || sc.ch == '\n' || sc.ch == ')') { + sc.SetState(SCE_C_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_C_DEFAULT) { + if (sc.Match('@', '\"')) { + sc.SetState(SCE_C_VERBATIM); + sc.Forward(); + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + if (lastWordWasUUID) { + sc.SetState(SCE_C_UUID); + lastWordWasUUID = false; + } else { + sc.SetState(SCE_C_NUMBER); + } + } else if (setWordStart.Contains(sc.ch) || (sc.ch == '@')) { + if (lastWordWasUUID) { + sc.SetState(SCE_C_UUID); + lastWordWasUUID = false; + } else { + sc.SetState(SCE_C_IDENTIFIER); + } + } else if (sc.Match('/', '*')) { + if (sc.Match("/**") || sc.Match("/*!")) { // Support of Qt/Doxygen doc. style + sc.SetState(SCE_C_COMMENTDOC); + } else { + sc.SetState(SCE_C_COMMENT); + } + sc.Forward(); // Eat the * so it isn't used for the end of the comment + } else if (sc.Match('/', '/')) { + if ((sc.Match("///") && !sc.Match("////")) || sc.Match("//!")) + // Support of Qt/Doxygen doc. style + sc.SetState(SCE_C_COMMENTLINEDOC); + else + sc.SetState(SCE_C_COMMENTLINE); + } else if (sc.ch == '/' && setOKBeforeRE.Contains(chPrevNonWhite) && + (!setCouldBePostOp.Contains(chPrevNonWhite) || !FollowsPostfixOperator(sc, styler))) { + sc.SetState(SCE_C_REGEX); // JavaScript's RegEx + } else if (sc.ch == '\"') { + sc.SetState(SCE_C_STRING); + isIncludePreprocessor = false; // ensure that '>' won't end the string + } else if (isIncludePreprocessor && sc.ch == '<') { + sc.SetState(SCE_C_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_C_CHARACTER); + } else if (sc.ch == '#' && visibleChars == 0) { + // Preprocessor commands are alone on their line + sc.SetState(SCE_C_PREPROCESSOR); + // Skip whitespace between # and preprocessor word + do { + sc.Forward(); + } while ((sc.ch == ' ' || sc.ch == '\t') && sc.More()); + if (sc.atLineEnd) { + sc.SetState(SCE_C_DEFAULT); + } else if (sc.Match("include")) { + isIncludePreprocessor = true; + } + } else if (isoperator(static_cast(sc.ch))) { + sc.SetState(SCE_C_OPERATOR); + lastOpSetScope = false; + if (sc.Match('.') || sc.Match(':', ':') || sc.Match('-', '>') || sc.Match(':', '~')) { + // check for operators '.', '::', and '->' (but not '.*', '::*', or '->*') + if (sc.ch != '.') sc.Forward(); + if (sc.chNext != '*') + lastOpSetScope = true; + else + sc.Forward(); + } + } + } + + if (sc.state != SCE_C_OPERATOR && sc.state != SCE_C_IDENTIFIER) lastOpSetScope = false; + if (!IsASpace(sc.ch) && !IsSpaceEquiv(sc.state)) { + chPrevNonWhite = sc.ch; + visibleChars++; + } + continuationLine = false; + } + sc.Complete(); +} + +static bool IsStreamCommentStyle(int style) { + return style == SCE_C_COMMENT || + style == SCE_C_COMMENTDOC || + style == SCE_C_COMMENTDOCKEYWORD || + style == SCE_C_COMMENTDOCKEYWORDERROR; +} + +// Store both the current line's fold level and the next lines in the +// level store to make it easy to pick up with each increment +// and to make it possible to fiddle the current level for "} else {". +static void FoldCppDoc(unsigned int startPos, int length, int initStyle, + WordList *[], Accessor &styler) { + + // property fold.comment + // This option enables folding multi-line comments and explicit fold points when using the C++ lexer. + // Explicit fold points allows adding extra folding by placing a //{ comment at the start and a //} + // at the end of a section that should fold. + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + + // property fold.preprocessor + // This option enables folding preprocessor directives when using the C++ lexer. + // Includes C#'s explicit #region and #endregion folding directives. + bool foldPreprocessor = styler.GetPropertyInt("fold.preprocessor") != 0; + + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + + // property fold.at.else + // This option enables C++ folding on a "} else {" line of an if statement. + bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) != 0; + + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelCurrent = SC_FOLDLEVELBASE; + if (lineCurrent > 0) + levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; + int levelMinCurrent = levelCurrent; + int levelNext = levelCurrent; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (foldComment && IsStreamCommentStyle(style)) { + if (!IsStreamCommentStyle(stylePrev) && (stylePrev != SCE_C_COMMENTLINEDOC)) { + levelNext++; + } else if (!IsStreamCommentStyle(styleNext) && (styleNext != SCE_C_COMMENTLINEDOC) && !atEOL) { + // Comments don't end at end of line and the next character may be unstyled. + levelNext--; + } + } + if (foldComment && (style == SCE_C_COMMENTLINE)) { + if ((ch == '/') && (chNext == '/')) { + char chNext2 = styler.SafeGetCharAt(i + 2); + if (chNext2 == '{') { + levelNext++; + } else if (chNext2 == '}') { + levelNext--; + } + } + } + if (foldPreprocessor && (style == SCE_C_PREPROCESSOR)) { + if (ch == '#') { + unsigned int j = i + 1; + while ((j < endPos) && IsASpaceOrTab(styler.SafeGetCharAt(j))) { + j++; + } + if (styler.Match(j, "region") || styler.Match(j, "if")) { + levelNext++; + } else if (styler.Match(j, "end")) { + levelNext--; + } + } + } + if (style == SCE_C_OPERATOR) { + if (ch == '{') { + // Measure the minimum before a '{' to allow + // folding on "} else {" + if (levelMinCurrent > levelNext) { + levelMinCurrent = levelNext; + } + levelNext++; + } else if (ch == '}') { + levelNext--; + } + } + if (!IsASpace(ch)) + visibleChars++; + if (atEOL || (i == endPos-1)) { + int levelUse = levelCurrent; + if (foldAtElse) { + levelUse = levelMinCurrent; + } + int lev = levelUse | levelNext << 16; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if (levelUse < levelNext) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelCurrent = levelNext; + levelMinCurrent = levelCurrent; + if (atEOL && (i == static_cast(styler.Length()-1))) { + // There is an empty line at end of file so give it same level and empty + styler.SetLevel(lineCurrent, (levelCurrent | levelCurrent << 16) | SC_FOLDLEVELWHITEFLAG); + } + visibleChars = 0; + } + } +} + +static const char * const cppWordLists[] = { + "Primary keywords and identifiers", + "Secondary keywords and identifiers", + "Documentation comment keywords", + "Unused", + "Global classes and typedefs", + 0, + }; + +static void ColouriseCppDocSensitive(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + ColouriseCppDoc(startPos, length, initStyle, keywordlists, styler, true); +} + +static void ColouriseCppDocInsensitive(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + ColouriseCppDoc(startPos, length, initStyle, keywordlists, styler, false); +} + +LexerModule lmCPP(SCLEX_CPP, ColouriseCppDocSensitive, "cpp", FoldCppDoc, cppWordLists); +LexerModule lmCPPNoCase(SCLEX_CPPNOCASE, ColouriseCppDocInsensitive, "cppnocase", FoldCppDoc, cppWordLists); diff --git a/sdk/wxscintilla/src/scintilla/src/LexCSS.cxx b/sdk/wxscintilla/src/scintilla/src/LexCSS.cxx new file mode 100644 index 0000000..f63103d --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexCSS.cxx @@ -0,0 +1,371 @@ +// Scintilla source code edit control +/** @file LexCSS.cxx + ** Lexer for Cascading Style Sheets + ** Written by Jakub Vrna + ** Improved by Philippe Lhoste (CSS2) + **/ +// Copyright 1998-2002 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + + +static inline bool IsAWordChar(const unsigned int ch) { + /* FIXME: + * The CSS spec allows "ISO 10646 characters U+00A1 and higher" to be treated as word chars. + * Unfortunately, we are only getting string bytes here, and not full unicode characters. We cannot guarantee + * that our byte is between U+0080 - U+00A0 (to return false), so we have to allow all characters U+0080 and higher + */ + return ch >= 0x80 || isalnum(ch) || ch == '-' || ch == '_'; +} + +inline bool IsCssOperator(const int ch) { + if (!((ch < 0x80) && isalnum(ch)) && + (ch == '{' || ch == '}' || ch == ':' || ch == ',' || ch == ';' || + ch == '.' || ch == '#' || ch == '!' || ch == '@' || + /* CSS2 */ + ch == '*' || ch == '>' || ch == '+' || ch == '=' || ch == '~' || ch == '|' || + ch == '[' || ch == ']' || ch == '(' || ch == ')')) { + return true; + } + return false; +} + +static void ColouriseCssDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { + WordList &css1Props = *keywordlists[0]; + WordList &pseudoClasses = *keywordlists[1]; + WordList &css2Props = *keywordlists[2]; + WordList &css3Props = *keywordlists[3]; + WordList &pseudoElements = *keywordlists[4]; + WordList &exProps = *keywordlists[5]; + WordList &exPseudoClasses = *keywordlists[6]; + WordList &exPseudoElements = *keywordlists[7]; + + StyleContext sc(startPos, length, initStyle, styler); + + int lastState = -1; // before operator + int lastStateC = -1; // before comment + int lastStateS = -1; // before single-quoted/double-quoted string + int op = ' '; // last operator + int opPrev = ' '; // last operator + + for (; sc.More(); sc.Forward()) { + if (sc.state == SCE_CSS_COMMENT && sc.Match('*', '/')) { + if (lastStateC == -1) { + // backtrack to get last state: + // comments are like whitespace, so we must return to the previous state + unsigned int i = startPos; + for (; i > 0; i--) { + if ((lastStateC = styler.StyleAt(i-1)) != SCE_CSS_COMMENT) { + if (lastStateC == SCE_CSS_OPERATOR) { + op = styler.SafeGetCharAt(i-1); + opPrev = styler.SafeGetCharAt(i-2); + while (--i) { + lastState = styler.StyleAt(i-1); + if (lastState != SCE_CSS_OPERATOR && lastState != SCE_CSS_COMMENT) + break; + } + if (i == 0) + lastState = SCE_CSS_DEFAULT; + } + break; + } + } + if (i == 0) + lastStateC = SCE_CSS_DEFAULT; + } + sc.Forward(); + sc.ForwardSetState(lastStateC); + } + + if (sc.state == SCE_CSS_COMMENT) + continue; + + if (sc.state == SCE_CSS_DOUBLESTRING || sc.state == SCE_CSS_SINGLESTRING) { + if (sc.ch != (sc.state == SCE_CSS_DOUBLESTRING ? '\"' : '\'')) + continue; + unsigned int i = sc.currentPos; + while (i && styler[i-1] == '\\') + i--; + if ((sc.currentPos - i) % 2 == 1) + continue; + sc.ForwardSetState(lastStateS); + } + + if (sc.state == SCE_CSS_OPERATOR) { + if (op == ' ') { + unsigned int i = startPos; + op = styler.SafeGetCharAt(i-1); + opPrev = styler.SafeGetCharAt(i-2); + while (--i) { + lastState = styler.StyleAt(i-1); + if (lastState != SCE_CSS_OPERATOR && lastState != SCE_CSS_COMMENT) + break; + } + } + switch (op) { + case '@': + if (lastState == SCE_CSS_DEFAULT) + sc.SetState(SCE_CSS_DIRECTIVE); + break; + case '>': + case '+': + if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || + lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS) + sc.SetState(SCE_CSS_DEFAULT); + break; + case '[': + if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || + lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS) + sc.SetState(SCE_CSS_ATTRIBUTE); + break; + case ']': + if (lastState == SCE_CSS_ATTRIBUTE) + sc.SetState(SCE_CSS_TAG); + break; + case '{': + if (lastState == SCE_CSS_MEDIA) + sc.SetState(SCE_CSS_DEFAULT); + else if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DIRECTIVE) + sc.SetState(SCE_CSS_IDENTIFIER); + break; + case '}': + if (lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_VALUE || lastState == SCE_CSS_IMPORTANT || + lastState == SCE_CSS_IDENTIFIER || lastState == SCE_CSS_IDENTIFIER2 || lastState == SCE_CSS_IDENTIFIER3) + sc.SetState(SCE_CSS_DEFAULT); + break; + case '(': + if (lastState == SCE_CSS_PSEUDOCLASS) + sc.SetState(SCE_CSS_TAG); + else if (lastState == SCE_CSS_EXTENDED_PSEUDOCLASS) + sc.SetState(SCE_CSS_EXTENDED_PSEUDOCLASS); + break; + case ')': + if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || + lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS || + lastState == SCE_CSS_PSEUDOELEMENT || lastState == SCE_CSS_EXTENDED_PSEUDOELEMENT) + sc.SetState(SCE_CSS_TAG); + break; + case ':': + if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || + lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS || + lastState == SCE_CSS_PSEUDOELEMENT || lastState == SCE_CSS_EXTENDED_PSEUDOELEMENT) + sc.SetState(SCE_CSS_PSEUDOCLASS); + else if (lastState == SCE_CSS_IDENTIFIER || lastState == SCE_CSS_IDENTIFIER2 || + lastState == SCE_CSS_IDENTIFIER3 || lastState == SCE_CSS_EXTENDED_IDENTIFIER || + lastState == SCE_CSS_UNKNOWN_IDENTIFIER) + sc.SetState(SCE_CSS_VALUE); + break; + case '.': + if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || + lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS) + sc.SetState(SCE_CSS_CLASS); + break; + case '#': + if (lastState == SCE_CSS_TAG || lastState == SCE_CSS_DEFAULT || lastState == SCE_CSS_CLASS || lastState == SCE_CSS_ID || + lastState == SCE_CSS_PSEUDOCLASS || lastState == SCE_CSS_EXTENDED_PSEUDOCLASS || lastState == SCE_CSS_UNKNOWN_PSEUDOCLASS) + sc.SetState(SCE_CSS_ID); + break; + case ',': + case '|': + case '~': + if (lastState == SCE_CSS_TAG) + sc.SetState(SCE_CSS_DEFAULT); + break; + case ';': + if (lastState == SCE_CSS_DIRECTIVE) + sc.SetState(SCE_CSS_DEFAULT); + else if (lastState == SCE_CSS_VALUE || lastState == SCE_CSS_IMPORTANT) + sc.SetState(SCE_CSS_IDENTIFIER); + break; + case '!': + if (lastState == SCE_CSS_VALUE) + sc.SetState(SCE_CSS_IMPORTANT); + break; + } + } + + if (IsAWordChar(sc.ch)) { + if (sc.state == SCE_CSS_DEFAULT) + sc.SetState(SCE_CSS_TAG); + continue; + } + + if (sc.ch == '*' && sc.state == SCE_CSS_DEFAULT) { + sc.SetState(SCE_CSS_TAG); + continue; + } + + if (IsAWordChar(sc.chPrev) && ( + sc.state == SCE_CSS_IDENTIFIER || sc.state == SCE_CSS_IDENTIFIER2 || + sc.state == SCE_CSS_IDENTIFIER3 || sc.state == SCE_CSS_EXTENDED_IDENTIFIER || + sc.state == SCE_CSS_UNKNOWN_IDENTIFIER || + sc.state == SCE_CSS_PSEUDOCLASS || sc.state == SCE_CSS_PSEUDOELEMENT || + sc.state == SCE_CSS_EXTENDED_PSEUDOCLASS || sc.state == SCE_CSS_EXTENDED_PSEUDOELEMENT || + sc.state == SCE_CSS_UNKNOWN_PSEUDOCLASS || + sc.state == SCE_CSS_IMPORTANT || + sc.state == SCE_CSS_DIRECTIVE + )) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + char *s2 = s; + while (*s2 && !IsAWordChar(*s2)) + s2++; + switch (sc.state) { + case SCE_CSS_IDENTIFIER: + case SCE_CSS_IDENTIFIER2: + case SCE_CSS_IDENTIFIER3: + case SCE_CSS_EXTENDED_IDENTIFIER: + case SCE_CSS_UNKNOWN_IDENTIFIER: + if (css1Props.InList(s2)) + sc.ChangeState(SCE_CSS_IDENTIFIER); + else if (css2Props.InList(s2)) + sc.ChangeState(SCE_CSS_IDENTIFIER2); + else if (css3Props.InList(s2)) + sc.ChangeState(SCE_CSS_IDENTIFIER3); + else if (exProps.InList(s2)) + sc.ChangeState(SCE_CSS_EXTENDED_IDENTIFIER); + else + sc.ChangeState(SCE_CSS_UNKNOWN_IDENTIFIER); + break; + case SCE_CSS_PSEUDOCLASS: + case SCE_CSS_PSEUDOELEMENT: + case SCE_CSS_EXTENDED_PSEUDOCLASS: + case SCE_CSS_EXTENDED_PSEUDOELEMENT: + case SCE_CSS_UNKNOWN_PSEUDOCLASS: + if (op == ':' && opPrev != ':' && pseudoClasses.InList(s2)) + sc.ChangeState(SCE_CSS_PSEUDOCLASS); + else if (opPrev == ':' && pseudoElements.InList(s2)) + sc.ChangeState(SCE_CSS_PSEUDOELEMENT); + else if ((op == ':' || (op == '(' && lastState == SCE_CSS_EXTENDED_PSEUDOCLASS)) && opPrev != ':' && exPseudoClasses.InList(s2)) + sc.ChangeState(SCE_CSS_EXTENDED_PSEUDOCLASS); + else if (opPrev == ':' && exPseudoElements.InList(s2)) + sc.ChangeState(SCE_CSS_EXTENDED_PSEUDOELEMENT); + else + sc.ChangeState(SCE_CSS_UNKNOWN_PSEUDOCLASS); + break; + case SCE_CSS_IMPORTANT: + if (strcmp(s2, "important") != 0) + sc.ChangeState(SCE_CSS_VALUE); + break; + case SCE_CSS_DIRECTIVE: + if (op == '@' && strcmp(s2, "media") == 0) + sc.ChangeState(SCE_CSS_MEDIA); + break; + } + } + + if (sc.ch != '.' && sc.ch != ':' && sc.ch != '#' && ( + sc.state == SCE_CSS_CLASS || sc.state == SCE_CSS_ID || + (sc.ch != '(' && sc.ch != ')' && ( /* This line of the condition makes it possible to extend pseudo-classes with parentheses */ + sc.state == SCE_CSS_PSEUDOCLASS || sc.state == SCE_CSS_PSEUDOELEMENT || + sc.state == SCE_CSS_EXTENDED_PSEUDOCLASS || sc.state == SCE_CSS_EXTENDED_PSEUDOELEMENT || + sc.state == SCE_CSS_UNKNOWN_PSEUDOCLASS + )) + )) + sc.SetState(SCE_CSS_TAG); + + if (sc.Match('/', '*')) { + lastStateC = sc.state; + sc.SetState(SCE_CSS_COMMENT); + sc.Forward(); + } else if ((sc.state == SCE_CSS_VALUE || sc.state == SCE_CSS_ATTRIBUTE) + && (sc.ch == '\"' || sc.ch == '\'')) { + lastStateS = sc.state; + sc.SetState((sc.ch == '\"' ? SCE_CSS_DOUBLESTRING : SCE_CSS_SINGLESTRING)); + } else if (IsCssOperator(sc.ch) + && (sc.state != SCE_CSS_ATTRIBUTE || sc.ch == ']') + && (sc.state != SCE_CSS_VALUE || sc.ch == ';' || sc.ch == '}' || sc.ch == '!') + && ((sc.state != SCE_CSS_DIRECTIVE && sc.state != SCE_CSS_MEDIA) || sc.ch == ';' || sc.ch == '{') + ) { + if (sc.state != SCE_CSS_OPERATOR) + lastState = sc.state; + sc.SetState(SCE_CSS_OPERATOR); + op = sc.ch; + opPrev = sc.chPrev; + } + } + + sc.Complete(); +} + +static void FoldCSSDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) { + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + bool inComment = (styler.StyleAt(startPos-1) == SCE_CSS_COMMENT); + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int style = styler.StyleAt(i); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (foldComment) { + if (!inComment && (style == SCE_CSS_COMMENT)) + levelCurrent++; + else if (inComment && (style != SCE_CSS_COMMENT)) + levelCurrent--; + inComment = (style == SCE_CSS_COMMENT); + } + if (style == SCE_CSS_OPERATOR) { + if (ch == '{') { + levelCurrent++; + } else if (ch == '}') { + levelCurrent--; + } + } + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) + visibleChars++; + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +static const char * const cssWordListDesc[] = { + "CSS1 Properties", + "Pseudo-classes", + "CSS2 Properties", + "CSS3 Properties", + "Pseudo-elements", + "Browser-Specific CSS Properties", + "Browser-Specific Pseudo-classes", + "Browser-Specific Pseudo-elements", + 0 +}; + +LexerModule lmCss(SCLEX_CSS, ColouriseCssDoc, "css", FoldCSSDoc, cssWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexCaml.cxx b/sdk/wxscintilla/src/scintilla/src/LexCaml.cxx new file mode 100644 index 0000000..ca1b65f --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexCaml.cxx @@ -0,0 +1,449 @@ +// Scintilla source code edit control +/** @file LexCaml.cxx + ** Lexer for Objective Caml. + **/ +// Copyright 2005-2009 by Robert Roessler +// The License.txt file describes the conditions under which this software may be distributed. +/* Release History + 20050204 Initial release. + 20050205 Quick compiler standards/"cleanliness" adjustment. + 20050206 Added cast for IsLeadByte(). + 20050209 Changes to "external" build support. + 20050306 Fix for 1st-char-in-doc "corner" case. + 20050502 Fix for [harmless] one-past-the-end coloring. + 20050515 Refined numeric token recognition logic. + 20051125 Added 2nd "optional" keywords class. + 20051129 Support "magic" (read-only) comments for RCaml. + 20051204 Swtich to using StyleContext infrastructure. + 20090629 Add full Standard ML '97 support. +*/ + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "PropSetSimple.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +// Since the Microsoft __iscsym[f] funcs are not ANSI... +inline int iscaml(int c) {return isalnum(c) || c == '_';} +inline int iscamlf(int c) {return isalpha(c) || c == '_';} + +static const int baseT[24] = { + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* A - L */ + 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,16 /* M - X */ +}; + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +#ifdef BUILD_AS_EXTERNAL_LEXER +/* + (actually seems to work!) +*/ +#include "WindowAccessor.h" +#include "ExternalLexer.h" + +#if PLAT_WIN +#include +#endif + +static void ColouriseCamlDoc( + unsigned int startPos, int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler); + +static void FoldCamlDoc( + unsigned int startPos, int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler); + +static void InternalLexOrFold(int lexOrFold, unsigned int startPos, int length, + int initStyle, char *words[], WindowID window, char *props); + +static const char* LexerName = "caml"; + +#ifdef TRACE +void Platform::DebugPrintf(const char *format, ...) { + char buffer[2000]; + va_list pArguments; + va_start(pArguments, format); + vsprintf(buffer,format,pArguments); + va_end(pArguments); + Platform::DebugDisplay(buffer); +} +#else +void Platform::DebugPrintf(const char *, ...) { +} +#endif + +bool Platform::IsDBCSLeadByte(int codePage, char ch) { + return ::IsDBCSLeadByteEx(codePage, ch) != 0; +} + +long Platform::SendScintilla(WindowID w, unsigned int msg, unsigned long wParam, long lParam) { + return ::SendMessage(reinterpret_cast(w), msg, wParam, lParam); +} + +long Platform::SendScintillaPointer(WindowID w, unsigned int msg, unsigned long wParam, void *lParam) { + return ::SendMessage(reinterpret_cast(w), msg, wParam, + reinterpret_cast(lParam)); +} + +void EXT_LEXER_DECL Fold(unsigned int lexer, unsigned int startPos, int length, + int initStyle, char *words[], WindowID window, char *props) +{ + // below useless evaluation(s) to supress "not used" warnings + lexer; + // build expected data structures and do the Fold + InternalLexOrFold(1, startPos, length, initStyle, words, window, props); + +} + +int EXT_LEXER_DECL GetLexerCount() +{ + return 1; // just us [Objective] Caml lexers here! +} + +void EXT_LEXER_DECL GetLexerName(unsigned int Index, char *name, int buflength) +{ + // below useless evaluation(s) to supress "not used" warnings + Index; + // return as much of our lexer name as will fit (what's up with Index?) + if (buflength > 0) { + buflength--; + int n = strlen(LexerName); + if (n > buflength) + n = buflength; + memcpy(name, LexerName, n), name[n] = '\0'; + } +} + +void EXT_LEXER_DECL Lex(unsigned int lexer, unsigned int startPos, int length, + int initStyle, char *words[], WindowID window, char *props) +{ + // below useless evaluation(s) to supress "not used" warnings + lexer; + // build expected data structures and do the Lex + InternalLexOrFold(0, startPos, length, initStyle, words, window, props); +} + +static void InternalLexOrFold(int foldOrLex, unsigned int startPos, int length, + int initStyle, char *words[], WindowID window, char *props) +{ + // create and initialize a WindowAccessor (including contained PropSet) + PropSetSimple ps; + ps.SetMultiple(props); + WindowAccessor wa(window, ps); + // create and initialize WordList(s) + int nWL = 0; + for (; words[nWL]; nWL++) ; // count # of WordList PTRs needed + WordList** wl = new WordList* [nWL + 1];// alloc WordList PTRs + int i = 0; + for (; i < nWL; i++) { + wl[i] = new WordList(); // (works or THROWS bad_alloc EXCEPTION) + wl[i]->Set(words[i]); + } + wl[i] = 0; + // call our "internal" folder/lexer (... then do Flush!) + if (foldOrLex) + FoldCamlDoc(startPos, length, initStyle, wl, wa); + else + ColouriseCamlDoc(startPos, length, initStyle, wl, wa); + wa.Flush(); + // clean up before leaving + for (i = nWL - 1; i >= 0; i--) + delete wl[i]; + delete [] wl; +} + +static +#endif /* BUILD_AS_EXTERNAL_LEXER */ + +void ColouriseCamlDoc( + unsigned int startPos, int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler) +{ + // initialize styler + StyleContext sc(startPos, length, initStyle, styler); + + int chBase = 0, chToken = 0, chLit = 0; + WordList& keywords = *keywordlists[0]; + WordList& keywords2 = *keywordlists[1]; + WordList& keywords3 = *keywordlists[2]; + const bool isSML = keywords.InList("andalso"); + const int useMagic = styler.GetPropertyInt("lexer.caml.magic", 0); + + // set up [initial] state info (terminating states that shouldn't "bleed") + const int state_ = sc.state & 0x0f; + if (state_ <= SCE_CAML_CHAR + || (isSML && state_ == SCE_CAML_STRING)) + sc.state = SCE_CAML_DEFAULT; + int nesting = (state_ >= SCE_CAML_COMMENT)? (state_ - SCE_CAML_COMMENT): 0; + + // foreach char in range... + while (sc.More()) { + // set up [per-char] state info + int state2 = -1; // (ASSUME no state change) + int chColor = sc.currentPos - 1;// (ASSUME standard coloring range) + bool advance = true; // (ASSUME scanner "eats" 1 char) + + // step state machine + switch (sc.state & 0x0f) { + case SCE_CAML_DEFAULT: + chToken = sc.currentPos; // save [possible] token start (JIC) + // it's wide open; what do we have? + if (iscamlf(sc.ch)) + state2 = SCE_CAML_IDENTIFIER; + else if (!isSML && sc.Match('`') && iscamlf(sc.chNext)) + state2 = SCE_CAML_TAGNAME; + else if (!isSML && sc.Match('#') && isdigit(sc.chNext)) + state2 = SCE_CAML_LINENUM; + else if (isdigit(sc.ch)) { + // it's a number, assume base 10 + state2 = SCE_CAML_NUMBER, chBase = 10; + if (sc.Match('0')) { + // there MAY be a base specified... + const char* baseC = "bBoOxX"; + if (isSML) { + if (sc.chNext == 'w') + sc.Forward(); // (consume SML "word" indicator) + baseC = "x"; + } + // ... change to specified base AS REQUIRED + if (strchr(baseC, sc.chNext)) + chBase = baseT[tolower(sc.chNext) - 'a'], sc.Forward(); + } + } else if (!isSML && sc.Match('\'')) // (Caml char literal?) + state2 = SCE_CAML_CHAR, chLit = 0; + else if (isSML && sc.Match('#', '"')) // (SML char literal?) + state2 = SCE_CAML_CHAR, sc.Forward(); + else if (sc.Match('"')) + state2 = SCE_CAML_STRING; + else if (sc.Match('(', '*')) + state2 = SCE_CAML_COMMENT, sc.Forward(), sc.ch = ' '; // (*)... + else if (strchr("!?~" /* Caml "prefix-symbol" */ + "=<>@^|&+-*/$%" /* Caml "infix-symbol" */ + "()[]{};,:.#", sc.ch) // Caml "bracket" or ;,:.# + // SML "extra" ident chars + || (isSML && (sc.Match('\\') || sc.Match('`')))) + state2 = SCE_CAML_OPERATOR; + break; + + case SCE_CAML_IDENTIFIER: + // [try to] interpret as [additional] identifier char + if (!(iscaml(sc.ch) || sc.Match('\''))) { + const int n = sc.currentPos - chToken; + if (n < 24) { + // length is believable as keyword, [re-]construct token + char t[24]; + for (int i = -n; i < 0; i++) + t[n + i] = static_cast(sc.GetRelative(i)); + t[n] = '\0'; + // special-case "_" token as KEYWORD + if ((n == 1 && sc.chPrev == '_') || keywords.InList(t)) + sc.ChangeState(SCE_CAML_KEYWORD); + else if (keywords2.InList(t)) + sc.ChangeState(SCE_CAML_KEYWORD2); + else if (keywords3.InList(t)) + sc.ChangeState(SCE_CAML_KEYWORD3); + } + state2 = SCE_CAML_DEFAULT, advance = false; + } + break; + + case SCE_CAML_TAGNAME: + // [try to] interpret as [additional] tagname char + if (!(iscaml(sc.ch) || sc.Match('\''))) + state2 = SCE_CAML_DEFAULT, advance = false; + break; + + /*case SCE_CAML_KEYWORD: + case SCE_CAML_KEYWORD2: + case SCE_CAML_KEYWORD3: + // [try to] interpret as [additional] keyword char + if (!iscaml(ch)) + state2 = SCE_CAML_DEFAULT, advance = false; + break;*/ + + case SCE_CAML_LINENUM: + // [try to] interpret as [additional] linenum directive char + if (!isdigit(sc.ch)) + state2 = SCE_CAML_DEFAULT, advance = false; + break; + + case SCE_CAML_OPERATOR: { + // [try to] interpret as [additional] operator char + const char* o = 0; + if (iscaml(sc.ch) || isspace(sc.ch) // ident or whitespace + || (o = strchr(")]};,\'\"#", sc.ch),o) // "termination" chars + || (!isSML && sc.Match('`')) // Caml extra term char + || (!strchr("!$%&*+-./:<=>?@^|~", sc.ch)// "operator" chars + // SML extra ident chars + && !(isSML && (sc.Match('\\') || sc.Match('`'))))) { + // check for INCLUSIVE termination + if (o && strchr(")]};,", sc.ch)) { + if ((sc.Match(')') && sc.chPrev == '(') + || (sc.Match(']') && sc.chPrev == '[')) + // special-case "()" and "[]" tokens as KEYWORDS + sc.ChangeState(SCE_CAML_KEYWORD); + chColor++; + } else + advance = false; + state2 = SCE_CAML_DEFAULT; + } + break; + } + + case SCE_CAML_NUMBER: + // [try to] interpret as [additional] numeric literal char + if ((!isSML && sc.Match('_')) || IsADigit(sc.ch, chBase)) + break; + // how about an integer suffix? + if (!isSML && (sc.Match('l') || sc.Match('L') || sc.Match('n')) + && (sc.chPrev == '_' || IsADigit(sc.chPrev, chBase))) + break; + // or a floating-point literal? + if (chBase == 10) { + // with a decimal point? + if (sc.Match('.') + && ((!isSML && sc.chPrev == '_') + || IsADigit(sc.chPrev, chBase))) + break; + // with an exponent? (I) + if ((sc.Match('e') || sc.Match('E')) + && ((!isSML && (sc.chPrev == '.' || sc.chPrev == '_')) + || IsADigit(sc.chPrev, chBase))) + break; + // with an exponent? (II) + if (((!isSML && (sc.Match('+') || sc.Match('-'))) + || (isSML && sc.Match('~'))) + && (sc.chPrev == 'e' || sc.chPrev == 'E')) + break; + } + // it looks like we have run out of number + state2 = SCE_CAML_DEFAULT, advance = false; + break; + + case SCE_CAML_CHAR: + if (!isSML) { + // [try to] interpret as [additional] char literal char + if (sc.Match('\\')) { + chLit = 1; // (definitely IS a char literal) + if (sc.chPrev == '\\') + sc.ch = ' '; // (...\\') + // should we be terminating - one way or another? + } else if ((sc.Match('\'') && sc.chPrev != '\\') + || sc.atLineEnd) { + state2 = SCE_CAML_DEFAULT; + if (sc.Match('\'')) + chColor++; + else + sc.ChangeState(SCE_CAML_IDENTIFIER); + // ... maybe a char literal, maybe not + } else if (chLit < 1 && sc.currentPos - chToken >= 2) + sc.ChangeState(SCE_CAML_IDENTIFIER), advance = false; + break; + }/* else + // fall through for SML char literal (handle like string) */ + + case SCE_CAML_STRING: + // [try to] interpret as [additional] [SML char/] string literal char + if (isSML && sc.Match('\\') && sc.chPrev != '\\' && isspace(sc.chNext)) + state2 = SCE_CAML_WHITE; + else if (sc.Match('\\') && sc.chPrev == '\\') + sc.ch = ' '; // (...\\") + // should we be terminating - one way or another? + else if ((sc.Match('"') && sc.chPrev != '\\') + || (isSML && sc.atLineEnd)) { + state2 = SCE_CAML_DEFAULT; + if (sc.Match('"')) + chColor++; + } + break; + + case SCE_CAML_WHITE: + // [try to] interpret as [additional] SML embedded whitespace char + if (sc.Match('\\')) { + // style this puppy NOW... + state2 = SCE_CAML_STRING, sc.ch = ' ' /* (...\") */, chColor++, + styler.ColourTo(chColor, SCE_CAML_WHITE), styler.Flush(); + // ... then backtrack to determine original SML literal type + int p = chColor - 2; + for (; p >= 0 && styler.StyleAt(p) == SCE_CAML_WHITE; p--) ; + if (p >= 0) + state2 = static_cast(styler.StyleAt(p)); + // take care of state change NOW + sc.ChangeState(state2), state2 = -1; + } + break; + + case SCE_CAML_COMMENT: + case SCE_CAML_COMMENT1: + case SCE_CAML_COMMENT2: + case SCE_CAML_COMMENT3: + // we're IN a comment - does this start a NESTED comment? + if (sc.Match('(', '*')) + state2 = sc.state + 1, chToken = sc.currentPos, + sc.Forward(), sc.ch = ' ' /* (*)... */, nesting++; + // [try to] interpret as [additional] comment char + else if (sc.Match(')') && sc.chPrev == '*') { + if (nesting) + state2 = (sc.state & 0x0f) - 1, chToken = 0, nesting--; + else + state2 = SCE_CAML_DEFAULT; + chColor++; + // enable "magic" (read-only) comment AS REQUIRED + } else if (useMagic && sc.currentPos - chToken == 4 + && sc.Match('c') && sc.chPrev == 'r' && sc.GetRelative(-2) == '@') + sc.state |= 0x10; // (switch to read-only comment style) + break; + } + + // handle state change and char coloring AS REQUIRED + if (state2 >= 0) + styler.ColourTo(chColor, sc.state), sc.ChangeState(state2); + // move to next char UNLESS re-scanning current char + if (advance) + sc.Forward(); + } + + // do any required terminal char coloring (JIC) + sc.Complete(); +} + +#ifdef BUILD_AS_EXTERNAL_LEXER +static +#endif /* BUILD_AS_EXTERNAL_LEXER */ +void FoldCamlDoc( + unsigned int, int, + int, + WordList *[], + Accessor &) +{ +} + +static const char * const camlWordListDesc[] = { + "Keywords", // primary Objective Caml keywords + "Keywords2", // "optional" keywords (typically from Pervasives) + "Keywords3", // "optional" keywords (typically typenames) + 0 +}; + +#ifndef BUILD_AS_EXTERNAL_LEXER +LexerModule lmCaml(SCLEX_CAML, ColouriseCamlDoc, "caml", FoldCamlDoc, camlWordListDesc); +#endif /* BUILD_AS_EXTERNAL_LEXER */ diff --git a/sdk/wxscintilla/src/scintilla/src/LexCmake.cxx b/sdk/wxscintilla/src/scintilla/src/LexCmake.cxx new file mode 100644 index 0000000..1f51f47 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexCmake.cxx @@ -0,0 +1,457 @@ +// Scintilla source code edit control +/** @file LexCmake.cxx + ** Lexer for Cmake + **/ +// Copyright 2007 by Cristian Adam +// based on the NSIS lexer +// The License.txt file describes the conditions under which this software may be distributed. +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "CharClassify.h" +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static bool isCmakeNumber(char ch) +{ + return(ch >= '0' && ch <= '9'); +} + +static bool isCmakeChar(char ch) +{ + return(ch == '.' ) || (ch == '_' ) || isCmakeNumber(ch) || (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'); +} + +static bool isCmakeLetter(char ch) +{ + return(ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'); +} + +static bool CmakeNextLineHasElse(unsigned int start, unsigned int end, Accessor &styler) +{ + int nNextLine = -1; + for ( unsigned int i = start; i < end; i++ ) { + char cNext = styler.SafeGetCharAt( i ); + if ( cNext == '\n' ) { + nNextLine = i+1; + break; + } + } + + if ( nNextLine == -1 ) // We never foudn the next line... + return false; + + for ( unsigned int firstChar = nNextLine; firstChar < end; firstChar++ ) { + char cNext = styler.SafeGetCharAt( firstChar ); + if ( cNext == ' ' ) + continue; + if ( cNext == '\t' ) + continue; + if ( styler.Match(firstChar, "ELSE") || styler.Match(firstChar, "else")) + return true; + break; + } + + return false; +} + +static int calculateFoldCmake(unsigned int start, unsigned int end, int foldlevel, Accessor &styler, bool bElse) +{ + // If the word is too long, it is not what we are looking for + if ( end - start > 20 ) + return foldlevel; + + int newFoldlevel = foldlevel; + + char s[20]; // The key word we are looking for has atmost 13 characters + for (unsigned int i = 0; i < end - start + 1 && i < 19; i++) { + s[i] = static_cast( styler[ start + i ] ); + s[i + 1] = '\0'; + } + + if ( CompareCaseInsensitive(s, "IF") == 0 || CompareCaseInsensitive(s, "WHILE") == 0 + || CompareCaseInsensitive(s, "MACRO") == 0 || CompareCaseInsensitive(s, "FOREACH") == 0 + || CompareCaseInsensitive(s, "ELSEIF") == 0 ) + newFoldlevel++; + else if ( CompareCaseInsensitive(s, "ENDIF") == 0 || CompareCaseInsensitive(s, "ENDWHILE") == 0 + || CompareCaseInsensitive(s, "ENDMACRO") == 0 || CompareCaseInsensitive(s, "ENDFOREACH") == 0) + newFoldlevel--; + else if ( bElse && CompareCaseInsensitive(s, "ELSEIF") == 0 ) + newFoldlevel++; + else if ( bElse && CompareCaseInsensitive(s, "ELSE") == 0 ) + newFoldlevel++; + + return newFoldlevel; +} + +static int classifyWordCmake(unsigned int start, unsigned int end, WordList *keywordLists[], Accessor &styler ) +{ + char word[100] = {0}; + char lowercaseWord[100] = {0}; + + WordList &Commands = *keywordLists[0]; + WordList &Parameters = *keywordLists[1]; + WordList &UserDefined = *keywordLists[2]; + + for (unsigned int i = 0; i < end - start + 1 && i < 99; i++) { + word[i] = static_cast( styler[ start + i ] ); + lowercaseWord[i] = static_cast(tolower(word[i])); + } + + // Check for special words... + if ( CompareCaseInsensitive(word, "MACRO") == 0 || CompareCaseInsensitive(word, "ENDMACRO") == 0 ) + return SCE_CMAKE_MACRODEF; + + if ( CompareCaseInsensitive(word, "IF") == 0 || CompareCaseInsensitive(word, "ENDIF") == 0 ) + return SCE_CMAKE_IFDEFINEDEF; + + if ( CompareCaseInsensitive(word, "ELSEIF") == 0 || CompareCaseInsensitive(word, "ELSE") == 0 ) + return SCE_CMAKE_IFDEFINEDEF; + + if ( CompareCaseInsensitive(word, "WHILE") == 0 || CompareCaseInsensitive(word, "ENDWHILE") == 0) + return SCE_CMAKE_WHILEDEF; + + if ( CompareCaseInsensitive(word, "FOREACH") == 0 || CompareCaseInsensitive(word, "ENDFOREACH") == 0) + return SCE_CMAKE_FOREACHDEF; + + if ( Commands.InList(lowercaseWord) ) + return SCE_CMAKE_COMMANDS; + + if ( Parameters.InList(word) ) + return SCE_CMAKE_PARAMETERS; + + + if ( UserDefined.InList(word) ) + return SCE_CMAKE_USERDEFINED; + + if ( strlen(word) > 3 ) { + if ( word[1] == '{' && word[strlen(word)-1] == '}' ) + return SCE_CMAKE_VARIABLE; + } + + // To check for numbers + if ( isCmakeNumber( word[0] ) ) { + bool bHasSimpleCmakeNumber = true; + for (unsigned int j = 1; j < end - start + 1 && j < 99; j++) { + if ( !isCmakeNumber( word[j] ) ) { + bHasSimpleCmakeNumber = false; + break; + } + } + + if ( bHasSimpleCmakeNumber ) + return SCE_CMAKE_NUMBER; + } + + return SCE_CMAKE_DEFAULT; +} + +static void ColouriseCmakeDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) +{ + int state = SCE_CMAKE_DEFAULT; + if ( startPos > 0 ) + state = styler.StyleAt(startPos-1); // Use the style from the previous line, usually default, but could be commentbox + + styler.StartAt( startPos ); + styler.GetLine( startPos ); + + unsigned int nLengthDoc = startPos + length; + styler.StartSegment( startPos ); + + char cCurrChar; + bool bVarInString = false; + bool bClassicVarInString = false; + + unsigned int i; + for ( i = startPos; i < nLengthDoc; i++ ) { + cCurrChar = styler.SafeGetCharAt( i ); + char cNextChar = styler.SafeGetCharAt(i+1); + + switch (state) { + case SCE_CMAKE_DEFAULT: + if ( cCurrChar == '#' ) { // we have a comment line + styler.ColourTo(i-1, state ); + state = SCE_CMAKE_COMMENT; + break; + } + if ( cCurrChar == '"' ) { + styler.ColourTo(i-1, state ); + state = SCE_CMAKE_STRINGDQ; + bVarInString = false; + bClassicVarInString = false; + break; + } + if ( cCurrChar == '\'' ) { + styler.ColourTo(i-1, state ); + state = SCE_CMAKE_STRINGRQ; + bVarInString = false; + bClassicVarInString = false; + break; + } + if ( cCurrChar == '`' ) { + styler.ColourTo(i-1, state ); + state = SCE_CMAKE_STRINGLQ; + bVarInString = false; + bClassicVarInString = false; + break; + } + + // CMake Variable + if ( cCurrChar == '$' || isCmakeChar(cCurrChar)) { + styler.ColourTo(i-1,state); + state = SCE_CMAKE_VARIABLE; + + // If it is a number, we must check and set style here first... + if ( isCmakeNumber(cCurrChar) && (cNextChar == '\t' || cNextChar == ' ' || cNextChar == '\r' || cNextChar == '\n' ) ) + styler.ColourTo( i, SCE_CMAKE_NUMBER); + + break; + } + + break; + case SCE_CMAKE_COMMENT: + if ( cNextChar == '\n' || cNextChar == '\r' ) { + // Special case: + if ( cCurrChar == '\\' ) { + styler.ColourTo(i-2,state); + styler.ColourTo(i,SCE_CMAKE_DEFAULT); + } + else { + styler.ColourTo(i,state); + state = SCE_CMAKE_DEFAULT; + } + } + break; + case SCE_CMAKE_STRINGDQ: + case SCE_CMAKE_STRINGLQ: + case SCE_CMAKE_STRINGRQ: + + if ( styler.SafeGetCharAt(i-1) == '\\' && styler.SafeGetCharAt(i-2) == '$' ) + break; // Ignore the next character, even if it is a quote of some sort + + if ( cCurrChar == '"' && state == SCE_CMAKE_STRINGDQ ) { + styler.ColourTo(i,state); + state = SCE_CMAKE_DEFAULT; + break; + } + + if ( cCurrChar == '`' && state == SCE_CMAKE_STRINGLQ ) { + styler.ColourTo(i,state); + state = SCE_CMAKE_DEFAULT; + break; + } + + if ( cCurrChar == '\'' && state == SCE_CMAKE_STRINGRQ ) { + styler.ColourTo(i,state); + state = SCE_CMAKE_DEFAULT; + break; + } + + if ( cNextChar == '\r' || cNextChar == '\n' ) { + int nCurLine = styler.GetLine(i+1); + int nBack = i; + // We need to check if the previous line has a \ in it... + bool bNextLine = false; + + while ( nBack > 0 ) { + if ( styler.GetLine(nBack) != nCurLine ) + break; + + char cTemp = styler.SafeGetCharAt(nBack, 'a'); // Letter 'a' is safe here + + if ( cTemp == '\\' ) { + bNextLine = true; + break; + } + if ( cTemp != '\r' && cTemp != '\n' && cTemp != '\t' && cTemp != ' ' ) + break; + + nBack--; + } + + if ( bNextLine ) { + styler.ColourTo(i+1,state); + } + if ( bNextLine == false ) { + styler.ColourTo(i,state); + state = SCE_CMAKE_DEFAULT; + } + } + break; + + case SCE_CMAKE_VARIABLE: + + // CMake Variable: + if ( cCurrChar == '$' ) + state = SCE_CMAKE_DEFAULT; + else if ( cCurrChar == '\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' ) ) + state = SCE_CMAKE_DEFAULT; + else if ( (isCmakeChar(cCurrChar) && !isCmakeChar( cNextChar) && cNextChar != '}') || cCurrChar == '}' ) { + state = classifyWordCmake( styler.GetStartSegment(), i, keywordLists, styler ); + styler.ColourTo( i, state); + state = SCE_CMAKE_DEFAULT; + } + else if ( !isCmakeChar( cCurrChar ) && cCurrChar != '{' && cCurrChar != '}' ) { + if ( classifyWordCmake( styler.GetStartSegment(), i-1, keywordLists, styler) == SCE_CMAKE_NUMBER ) + styler.ColourTo( i-1, SCE_CMAKE_NUMBER ); + + state = SCE_CMAKE_DEFAULT; + + if ( cCurrChar == '"' ) { + state = SCE_CMAKE_STRINGDQ; + bVarInString = false; + bClassicVarInString = false; + } + else if ( cCurrChar == '`' ) { + state = SCE_CMAKE_STRINGLQ; + bVarInString = false; + bClassicVarInString = false; + } + else if ( cCurrChar == '\'' ) { + state = SCE_CMAKE_STRINGRQ; + bVarInString = false; + bClassicVarInString = false; + } + else if ( cCurrChar == '#' ) { + state = SCE_CMAKE_COMMENT; + } + } + break; + } + + if ( state == SCE_CMAKE_COMMENT) { + styler.ColourTo(i,state); + } + else if ( state == SCE_CMAKE_STRINGDQ || state == SCE_CMAKE_STRINGLQ || state == SCE_CMAKE_STRINGRQ ) { + bool bIngoreNextDollarSign = false; + + if ( bVarInString && cCurrChar == '$' ) { + bVarInString = false; + bIngoreNextDollarSign = true; + } + else if ( bVarInString && cCurrChar == '\\' && (cNextChar == 'n' || cNextChar == 'r' || cNextChar == 't' || cNextChar == '"' || cNextChar == '`' || cNextChar == '\'' ) ) { + styler.ColourTo( i+1, SCE_CMAKE_STRINGVAR); + bVarInString = false; + bIngoreNextDollarSign = false; + } + + else if ( bVarInString && !isCmakeChar(cNextChar) ) { + int nWordState = classifyWordCmake( styler.GetStartSegment(), i, keywordLists, styler); + if ( nWordState == SCE_CMAKE_VARIABLE ) + styler.ColourTo( i, SCE_CMAKE_STRINGVAR); + bVarInString = false; + } + // Covers "${TEST}..." + else if ( bClassicVarInString && cNextChar == '}' ) { + styler.ColourTo( i+1, SCE_CMAKE_STRINGVAR); + bClassicVarInString = false; + } + + // Start of var in string + if ( !bIngoreNextDollarSign && cCurrChar == '$' && cNextChar == '{' ) { + styler.ColourTo( i-1, state); + bClassicVarInString = true; + bVarInString = false; + } + else if ( !bIngoreNextDollarSign && cCurrChar == '$' ) { + styler.ColourTo( i-1, state); + bVarInString = true; + bClassicVarInString = false; + } + } + } + + // Colourise remaining document + styler.ColourTo(nLengthDoc-1,state); +} + +static void FoldCmakeDoc(unsigned int startPos, int length, int, WordList *[], Accessor &styler) +{ + // No folding enabled, no reason to continue... + if ( styler.GetPropertyInt("fold") == 0 ) + return; + + bool foldAtElse = styler.GetPropertyInt("fold.at.else", 0) == 1; + + int lineCurrent = styler.GetLine(startPos); + unsigned int safeStartPos = styler.LineStart( lineCurrent ); + + bool bArg1 = true; + int nWordStart = -1; + + int levelCurrent = SC_FOLDLEVELBASE; + if (lineCurrent > 0) + levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; + int levelNext = levelCurrent; + + for (unsigned int i = safeStartPos; i < startPos + length; i++) { + char chCurr = styler.SafeGetCharAt(i); + + if ( bArg1 ) { + if ( nWordStart == -1 && (isCmakeLetter(chCurr)) ) { + nWordStart = i; + } + else if ( isCmakeLetter(chCurr) == false && nWordStart > -1 ) { + int newLevel = calculateFoldCmake( nWordStart, i-1, levelNext, styler, foldAtElse); + + if ( newLevel == levelNext ) { + if ( foldAtElse ) { + if ( CmakeNextLineHasElse(i, startPos + length, styler) ) + levelNext--; + } + } + else + levelNext = newLevel; + bArg1 = false; + } + } + + if ( chCurr == '\n' ) { + if ( bArg1 && foldAtElse) { + if ( CmakeNextLineHasElse(i, startPos + length, styler) ) + levelNext--; + } + + // If we are on a new line... + int levelUse = levelCurrent; + int lev = levelUse | levelNext << 16; + if (levelUse < levelNext ) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) + styler.SetLevel(lineCurrent, lev); + + lineCurrent++; + levelCurrent = levelNext; + bArg1 = true; // New line, lets look at first argument again + nWordStart = -1; + } + } + + int levelUse = levelCurrent; + int lev = levelUse | levelNext << 16; + if (levelUse < levelNext) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) + styler.SetLevel(lineCurrent, lev); +} + +static const char * const cmakeWordLists[] = { + "Commands", + "Parameters", + "UserDefined", + 0, + 0,}; + +LexerModule lmCmake(SCLEX_CMAKE, ColouriseCmakeDoc, "cmake", FoldCmakeDoc, cmakeWordLists); diff --git a/sdk/wxscintilla/src/scintilla/src/LexConf.cxx b/sdk/wxscintilla/src/scintilla/src/LexConf.cxx new file mode 100644 index 0000000..7b066af --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexConf.cxx @@ -0,0 +1,188 @@ +// Scintilla source code edit control +/** @file LexConf.cxx + ** Lexer for Apache Configuration Files. + ** + ** First working version contributed by Ahmad Zawawi on October 28, 2000. + ** i created this lexer because i needed something pretty when dealing + ** when Apache Configuration files... + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static void ColouriseConfDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) +{ + int state = SCE_CONF_DEFAULT; + char chNext = styler[startPos]; + int lengthDoc = startPos + length; + // create a buffer large enough to take the largest chunk... + char *buffer = new char[length]; + int bufferCount = 0; + + // this assumes that we have 2 keyword list in conf.properties + WordList &directives = *keywordLists[0]; + WordList ¶ms = *keywordLists[1]; + + // go through all provided text segment + // using the hand-written state machine shown below + styler.StartAt(startPos); + styler.StartSegment(startPos); + for (int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if (styler.IsLeadByte(ch)) { + chNext = styler.SafeGetCharAt(i + 2); + i++; + continue; + } + switch(state) { + case SCE_CONF_DEFAULT: + if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') { + // whitespace is simply ignored here... + styler.ColourTo(i,SCE_CONF_DEFAULT); + break; + } else if( ch == '#' ) { + // signals the start of a comment... + state = SCE_CONF_COMMENT; + styler.ColourTo(i,SCE_CONF_COMMENT); + } else if( ch == '.' /*|| ch == '/'*/) { + // signals the start of a file... + state = SCE_CONF_EXTENSION; + styler.ColourTo(i,SCE_CONF_EXTENSION); + } else if( ch == '"') { + state = SCE_CONF_STRING; + styler.ColourTo(i,SCE_CONF_STRING); + } else if( isascii(ch) && ispunct(ch) ) { + // signals an operator... + // no state jump necessary for this + // simple case... + styler.ColourTo(i,SCE_CONF_OPERATOR); + } else if( isascii(ch) && isalpha(ch) ) { + // signals the start of an identifier + bufferCount = 0; + buffer[bufferCount++] = static_cast(tolower(ch)); + state = SCE_CONF_IDENTIFIER; + } else if( isascii(ch) && isdigit(ch) ) { + // signals the start of a number + bufferCount = 0; + buffer[bufferCount++] = ch; + //styler.ColourTo(i,SCE_CONF_NUMBER); + state = SCE_CONF_NUMBER; + } else { + // style it the default style.. + styler.ColourTo(i,SCE_CONF_DEFAULT); + } + break; + + case SCE_CONF_COMMENT: + // if we find a newline here, + // we simply go to default state + // else continue to work on it... + if( ch == '\n' || ch == '\r' ) { + state = SCE_CONF_DEFAULT; + } else { + styler.ColourTo(i,SCE_CONF_COMMENT); + } + break; + + case SCE_CONF_EXTENSION: + // if we find a non-alphanumeric char, + // we simply go to default state + // else we're still dealing with an extension... + if( (isascii(ch) && isalnum(ch)) || (ch == '_') || + (ch == '-') || (ch == '$') || + (ch == '/') || (ch == '.') || (ch == '*') ) + { + styler.ColourTo(i,SCE_CONF_EXTENSION); + } else { + state = SCE_CONF_DEFAULT; + chNext = styler[i--]; + } + break; + + case SCE_CONF_STRING: + // if we find the end of a string char, we simply go to default state + // else we're still dealing with an string... + if( (ch == '"' && styler.SafeGetCharAt(i-1)!='\\') || (ch == '\n') || (ch == '\r') ) { + state = SCE_CONF_DEFAULT; + } + styler.ColourTo(i,SCE_CONF_STRING); + break; + + case SCE_CONF_IDENTIFIER: + // stay in CONF_IDENTIFIER state until we find a non-alphanumeric + if( (isascii(ch) && isalnum(ch)) || (ch == '_') || (ch == '-') || (ch == '/') || (ch == '$') || (ch == '.') || (ch == '*')) { + buffer[bufferCount++] = static_cast(tolower(ch)); + } else { + state = SCE_CONF_DEFAULT; + buffer[bufferCount] = '\0'; + + // check if the buffer contains a keyword, and highlight it if it is a keyword... + if(directives.InList(buffer)) { + styler.ColourTo(i-1,SCE_CONF_DIRECTIVE ); + } else if(params.InList(buffer)) { + styler.ColourTo(i-1,SCE_CONF_PARAMETER ); + } else if(strchr(buffer,'/') || strchr(buffer,'.')) { + styler.ColourTo(i-1,SCE_CONF_EXTENSION); + } else { + styler.ColourTo(i-1,SCE_CONF_DEFAULT); + } + + // push back the faulty character + chNext = styler[i--]; + + } + break; + + case SCE_CONF_NUMBER: + // stay in CONF_NUMBER state until we find a non-numeric + if( (isascii(ch) && isdigit(ch)) || ch == '.') { + buffer[bufferCount++] = ch; + } else { + state = SCE_CONF_DEFAULT; + buffer[bufferCount] = '\0'; + + // Colourize here... + if( strchr(buffer,'.') ) { + // it is an IP address... + styler.ColourTo(i-1,SCE_CONF_IP); + } else { + // normal number + styler.ColourTo(i-1,SCE_CONF_NUMBER); + } + + // push back a character + chNext = styler[i--]; + } + break; + + } + } + delete []buffer; +} + +static const char * const confWordListDesc[] = { + "Directives", + "Parameters", + 0 +}; + +LexerModule lmConf(SCLEX_CONF, ColouriseConfDoc, "conf", 0, confWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexCppCheck.cxx b/sdk/wxscintilla/src/scintilla/src/LexCppCheck.cxx new file mode 100644 index 0000000..40ee781 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexCppCheck.cxx @@ -0,0 +1,119 @@ +// Scintilla source code edit control +/** @file LexOthers.cxx + ** Lexers for batch files, diff results, properties files, make files and error lists. + ** Also lexer for LaTeX documents. + **/ +// Copyright 1998-2001 by Eran Ifrah +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" +#include "StyleContext.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +typedef int (*CPPCHECK_COLOUR_FUNC_PTR)(int, const char*, size_t&, size_t&); + +static CPPCHECK_COLOUR_FUNC_PTR s_cppcheckColourFunc = NULL; + +void SetCppCheckColourFunction(CPPCHECK_COLOUR_FUNC_PTR func) +{ + s_cppcheckColourFunc = func; +} + +static inline bool AtEOL(Accessor &styler, unsigned int i) +{ + return (styler[i] == '\n') || + ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')); +} + +static void ColouriseCppCheckDoc( + unsigned int pos, + int length, + int /*initStyle*/, + WordList * /*keywordlists*/[], + Accessor &styler) +{ + std::string line; + line.reserve(2048); + + styler.StartAt(pos); + styler.StartSegment(pos); + + for (; length > 0; pos++, length--) { + line += styler[pos]; + if (AtEOL(styler, pos)) { + // End of line met, colourise it + int style = SCLEX_GCC_OUTPUT; + if (s_cppcheckColourFunc) { + size_t start(0); + size_t len(0); + int startLine = pos-line.size()+1; + style = s_cppcheckColourFunc(startLine, line.c_str(), start, len); + if(len != 0) { + styler.ColourTo(startLine + start - 1, style); + styler.ColourTo(startLine + start + len - 1, SCLEX_GCC_FILE_LINK); + } + } + styler.ColourTo(pos, style); + line.clear(); + } + } +} + +static void FoldCppCheckDoc(unsigned int pos, int length, int, + WordList*[], Accessor &styler) +{ + int curLine = styler.GetLine(pos); + int prevLevel = curLine > 0 ? styler.LevelAt(curLine-1) : SC_FOLDLEVELBASE; + + unsigned int end = pos+length; + pos = styler.LineStart(curLine); + + do { + int nextLevel; + switch (styler.StyleAt(pos)) { + case SCLEX_GCC_BUILDING: + nextLevel = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG; + break; + default: + nextLevel = prevLevel & SC_FOLDLEVELHEADERFLAG ? (prevLevel & SC_FOLDLEVELNUMBERMASK) + 1 : prevLevel; + break; + } + if ((nextLevel & SC_FOLDLEVELHEADERFLAG) && nextLevel == prevLevel) { + styler.SetLevel(curLine-1, prevLevel & ~SC_FOLDLEVELHEADERFLAG); + } + styler.SetLevel(curLine, nextLevel); + + curLine++; + prevLevel = nextLevel; + pos = styler.LineStart(curLine); + } while (pos < end); +} + +static const char * const cppcheckWordListDesc[] = { + "Internal Commands", + "External Commands", + 0 +}; + +static const char * const emptyWordListDesc[] = { + 0 +}; + +LexerModule lmCppCheck(SCLEX_CPPCHECK, ColouriseCppCheckDoc, "cppcheck", FoldCppCheckDoc, cppcheckWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexCrontab.cxx b/sdk/wxscintilla/src/scintilla/src/LexCrontab.cxx new file mode 100644 index 0000000..f6c4d42 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexCrontab.cxx @@ -0,0 +1,222 @@ +// Scintilla source code edit control +/** @file LexCrontab.cxx + ** Lexer to use with extended crontab files used by a powerful + ** Windows scheduler/event monitor/automation manager nnCron. + ** (http://nemtsev.eserv.ru/) + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static void ColouriseNncrontabDoc(unsigned int startPos, int length, int, WordList +*keywordLists[], Accessor &styler) +{ + int state = SCE_NNCRONTAB_DEFAULT; + char chNext = styler[startPos]; + int lengthDoc = startPos + length; + // create a buffer large enough to take the largest chunk... + char *buffer = new char[length]; + int bufferCount = 0; + // used when highliting environment variables inside quoted string: + bool insideString = false; + + // this assumes that we have 3 keyword list in conf.properties + WordList §ion = *keywordLists[0]; + WordList &keyword = *keywordLists[1]; + WordList &modifier = *keywordLists[2]; + + // go through all provided text segment + // using the hand-written state machine shown below + styler.StartAt(startPos); + styler.StartSegment(startPos); + for (int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if (styler.IsLeadByte(ch)) { + chNext = styler.SafeGetCharAt(i + 2); + i++; + continue; + } + switch(state) { + case SCE_NNCRONTAB_DEFAULT: + if( ch == '\n' || ch == '\r' || ch == '\t' || ch == ' ') { + // whitespace is simply ignored here... + styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT); + break; + } else if( ch == '#' && styler.SafeGetCharAt(i+1) == '(') { + // signals the start of a task... + state = SCE_NNCRONTAB_TASK; + styler.ColourTo(i,SCE_NNCRONTAB_TASK); + } + else if( ch == '\\' && (styler.SafeGetCharAt(i+1) == ' ' || + styler.SafeGetCharAt(i+1) == '\t')) { + // signals the start of an extended comment... + state = SCE_NNCRONTAB_COMMENT; + styler.ColourTo(i,SCE_NNCRONTAB_COMMENT); + } else if( ch == '#' ) { + // signals the start of a plain comment... + state = SCE_NNCRONTAB_COMMENT; + styler.ColourTo(i,SCE_NNCRONTAB_COMMENT); + } else if( ch == ')' && styler.SafeGetCharAt(i+1) == '#') { + // signals the end of a task... + state = SCE_NNCRONTAB_TASK; + styler.ColourTo(i,SCE_NNCRONTAB_TASK); + } else if( ch == '"') { + state = SCE_NNCRONTAB_STRING; + styler.ColourTo(i,SCE_NNCRONTAB_STRING); + } else if( ch == '%') { + // signals environment variables + state = SCE_NNCRONTAB_ENVIRONMENT; + styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT); + } else if( ch == '<' && styler.SafeGetCharAt(i+1) == '%') { + // signals environment variables + state = SCE_NNCRONTAB_ENVIRONMENT; + styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT); + } else if( ch == '*' ) { + // signals an asterisk + // no state jump necessary for this simple case... + styler.ColourTo(i,SCE_NNCRONTAB_ASTERISK); + } else if( (isascii(ch) && isalpha(ch)) || ch == '<' ) { + // signals the start of an identifier + bufferCount = 0; + buffer[bufferCount++] = ch; + state = SCE_NNCRONTAB_IDENTIFIER; + } else if( isascii(ch) && isdigit(ch) ) { + // signals the start of a number + bufferCount = 0; + buffer[bufferCount++] = ch; + state = SCE_NNCRONTAB_NUMBER; + } else { + // style it the default style.. + styler.ColourTo(i,SCE_NNCRONTAB_DEFAULT); + } + break; + + case SCE_NNCRONTAB_COMMENT: + // if we find a newline here, + // we simply go to default state + // else continue to work on it... + if( ch == '\n' || ch == '\r' ) { + state = SCE_NNCRONTAB_DEFAULT; + } else { + styler.ColourTo(i,SCE_NNCRONTAB_COMMENT); + } + break; + + case SCE_NNCRONTAB_TASK: + // if we find a newline here, + // we simply go to default state + // else continue to work on it... + if( ch == '\n' || ch == '\r' ) { + state = SCE_NNCRONTAB_DEFAULT; + } else { + styler.ColourTo(i,SCE_NNCRONTAB_TASK); + } + break; + + case SCE_NNCRONTAB_STRING: + if( ch == '%' ) { + state = SCE_NNCRONTAB_ENVIRONMENT; + insideString = true; + styler.ColourTo(i-1,SCE_NNCRONTAB_STRING); + break; + } + // if we find the end of a string char, we simply go to default state + // else we're still dealing with an string... + if( (ch == '"' && styler.SafeGetCharAt(i-1)!='\\') || + (ch == '\n') || (ch == '\r') ) { + state = SCE_NNCRONTAB_DEFAULT; + } + styler.ColourTo(i,SCE_NNCRONTAB_STRING); + break; + + case SCE_NNCRONTAB_ENVIRONMENT: + // if we find the end of a string char, we simply go to default state + // else we're still dealing with an string... + if( ch == '%' && insideString ) { + state = SCE_NNCRONTAB_STRING; + insideString = false; + break; + } + if( (ch == '%' && styler.SafeGetCharAt(i-1)!='\\') + || (ch == '\n') || (ch == '\r') || (ch == '>') ) { + state = SCE_NNCRONTAB_DEFAULT; + styler.ColourTo(i,SCE_NNCRONTAB_ENVIRONMENT); + break; + } + styler.ColourTo(i+1,SCE_NNCRONTAB_ENVIRONMENT); + break; + + case SCE_NNCRONTAB_IDENTIFIER: + // stay in CONF_IDENTIFIER state until we find a non-alphanumeric + if( (isascii(ch) && isalnum(ch)) || (ch == '_') || (ch == '-') || (ch == '/') || + (ch == '$') || (ch == '.') || (ch == '<') || (ch == '>') || + (ch == '@') ) { + buffer[bufferCount++] = ch; + } else { + state = SCE_NNCRONTAB_DEFAULT; + buffer[bufferCount] = '\0'; + + // check if the buffer contains a keyword, + // and highlight it if it is a keyword... + if(section.InList(buffer)) { + styler.ColourTo(i,SCE_NNCRONTAB_SECTION ); + } else if(keyword.InList(buffer)) { + styler.ColourTo(i-1,SCE_NNCRONTAB_KEYWORD ); + } // else if(strchr(buffer,'/') || strchr(buffer,'.')) { + // styler.ColourTo(i-1,SCE_NNCRONTAB_EXTENSION); + // } + else if(modifier.InList(buffer)) { + styler.ColourTo(i-1,SCE_NNCRONTAB_MODIFIER ); + } else { + styler.ColourTo(i-1,SCE_NNCRONTAB_DEFAULT); + } + // push back the faulty character + chNext = styler[i--]; + } + break; + + case SCE_NNCRONTAB_NUMBER: + // stay in CONF_NUMBER state until we find a non-numeric + if( isascii(ch) && isdigit(ch) /* || ch == '.' */ ) { + buffer[bufferCount++] = ch; + } else { + state = SCE_NNCRONTAB_DEFAULT; + buffer[bufferCount] = '\0'; + // Colourize here... (normal number) + styler.ColourTo(i-1,SCE_NNCRONTAB_NUMBER); + // push back a character + chNext = styler[i--]; + } + break; + } + } + delete []buffer; +} + +static const char * const cronWordListDesc[] = { + "Section keywords and Forth words", + "nnCrontab keywords", + "Modifiers", + 0 +}; + +LexerModule lmNncrontab(SCLEX_NNCRONTAB, ColouriseNncrontabDoc, "nncrontab", 0, cronWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexCsound.cxx b/sdk/wxscintilla/src/scintilla/src/LexCsound.cxx new file mode 100644 index 0000000..3aa2eb8 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexCsound.cxx @@ -0,0 +1,210 @@ +// Scintilla source code edit control +/** @file LexCsound.cxx + ** Lexer for Csound (Orchestra & Score) + ** Written by Georg Ritter - + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || + ch == '_' || ch == '?'); +} + +static inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.' || + ch == '%' || ch == '@' || ch == '$' || ch == '?'); +} + +static inline bool IsCsoundOperator(char ch) { + if (isascii(ch) && isalnum(ch)) + return false; + // '.' left out as it is used to make up numbers + if (ch == '*' || ch == '/' || ch == '-' || ch == '+' || + ch == '(' || ch == ')' || ch == '=' || ch == '^' || + ch == '[' || ch == ']' || ch == '<' || ch == '&' || + ch == '>' || ch == ',' || ch == '|' || ch == '~' || + ch == '%' || ch == ':') + return true; + return false; +} + +static void ColouriseCsoundDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + + WordList &opcode = *keywordlists[0]; + WordList &headerStmt = *keywordlists[1]; + WordList &otherKeyword = *keywordlists[2]; + + // Do not leak onto next line + if (initStyle == SCE_CSOUND_STRINGEOL) + initStyle = SCE_CSOUND_DEFAULT; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) + { + // Handle line continuation generically. + if (sc.ch == '\\') { + if (sc.chNext == '\n' || sc.chNext == '\r') { + sc.Forward(); + if (sc.ch == '\r' && sc.chNext == '\n') { + sc.Forward(); + } + continue; + } + } + + // Determine if the current state should terminate. + if (sc.state == SCE_CSOUND_OPERATOR) { + if (!IsCsoundOperator(static_cast(sc.ch))) { + sc.SetState(SCE_CSOUND_DEFAULT); + } + }else if (sc.state == SCE_CSOUND_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_CSOUND_DEFAULT); + } + } else if (sc.state == SCE_CSOUND_IDENTIFIER) { + if (!IsAWordChar(sc.ch) ) { + char s[100]; + sc.GetCurrent(s, sizeof(s)); + + if (opcode.InList(s)) { + sc.ChangeState(SCE_CSOUND_OPCODE); + } else if (headerStmt.InList(s)) { + sc.ChangeState(SCE_CSOUND_HEADERSTMT); + } else if (otherKeyword.InList(s)) { + sc.ChangeState(SCE_CSOUND_USERKEYWORD); + } else if (s[0] == 'p') { + sc.ChangeState(SCE_CSOUND_PARAM); + } else if (s[0] == 'a') { + sc.ChangeState(SCE_CSOUND_ARATE_VAR); + } else if (s[0] == 'k') { + sc.ChangeState(SCE_CSOUND_KRATE_VAR); + } else if (s[0] == 'i') { // covers both i-rate variables and i-statements + sc.ChangeState(SCE_CSOUND_IRATE_VAR); + } else if (s[0] == 'g') { + sc.ChangeState(SCE_CSOUND_GLOBAL_VAR); + } + sc.SetState(SCE_CSOUND_DEFAULT); + } + } + else if (sc.state == SCE_CSOUND_COMMENT ) { + if (sc.atLineEnd) { + sc.SetState(SCE_CSOUND_DEFAULT); + } + } + else if ((sc.state == SCE_CSOUND_ARATE_VAR) || + (sc.state == SCE_CSOUND_KRATE_VAR) || + (sc.state == SCE_CSOUND_IRATE_VAR)) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_CSOUND_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_CSOUND_DEFAULT) { + if (sc.ch == ';'){ + sc.SetState(SCE_CSOUND_COMMENT); + } else if (isdigit(sc.ch) || (sc.ch == '.' && isdigit(sc.chNext))) { + sc.SetState(SCE_CSOUND_NUMBER); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_CSOUND_IDENTIFIER); + } else if (IsCsoundOperator(static_cast(sc.ch))) { + sc.SetState(SCE_CSOUND_OPERATOR); + } else if (sc.ch == 'p') { + sc.SetState(SCE_CSOUND_PARAM); + } else if (sc.ch == 'a') { + sc.SetState(SCE_CSOUND_ARATE_VAR); + } else if (sc.ch == 'k') { + sc.SetState(SCE_CSOUND_KRATE_VAR); + } else if (sc.ch == 'i') { // covers both i-rate variables and i-statements + sc.SetState(SCE_CSOUND_IRATE_VAR); + } else if (sc.ch == 'g') { + sc.SetState(SCE_CSOUND_GLOBAL_VAR); + } + } + } + sc.Complete(); +} + +static void FoldCsoundInstruments(unsigned int startPos, int length, int /* initStyle */, WordList *[], + Accessor &styler) { + unsigned int lengthDoc = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + int stylePrev = 0; + int styleNext = styler.StyleAt(startPos); + for (unsigned int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if ((stylePrev != SCE_CSOUND_OPCODE) && (style == SCE_CSOUND_OPCODE)) { + char s[20]; + unsigned int j = 0; + while ((j < (sizeof(s) - 1)) && (iswordchar(styler[i + j]))) { + s[j] = styler[i + j]; + j++; + } + s[j] = '\0'; + + if (strcmp(s, "instr") == 0) + levelCurrent++; + if (strcmp(s, "endin") == 0) + levelCurrent--; + } + + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) + visibleChars++; + stylePrev = style; + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + + +static const char * const csoundWordListDesc[] = { + "Opcodes", + "Header Statements", + "User keywords", + 0 +}; + +LexerModule lmCsound(SCLEX_CSOUND, ColouriseCsoundDoc, "csound", FoldCsoundInstruments, csoundWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexD.cxx b/sdk/wxscintilla/src/scintilla/src/LexD.cxx new file mode 100644 index 0000000..4c4bcb3 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexD.cxx @@ -0,0 +1,399 @@ +/** @file LexD.cxx + ** Lexer for D. + ** + ** Copyright (c) 2006 by Waldemar Augustyn + **/ +// Copyright 1998-2005 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +/* Nested comments require keeping the value of the nesting level for every + position in the document. But since scintilla always styles line by line, + we only need to store one value per line. The non-negative number indicates + nesting level at the end of the line. +*/ + +// Underscore, letter, digit and universal alphas from C99 Appendix D. + +static bool IsWordStart(int ch) { + return (isascii(ch) && (isalpha(ch) || ch == '_')) || !isascii(ch); +} + +static bool IsWord(int ch) { + return (isascii(ch) && (isalnum(ch) || ch == '_')) || !isascii(ch); +} + +static bool IsDoxygen(int ch) { + if (isascii(ch) && islower(ch)) + return true; + if (ch == '$' || ch == '@' || ch == '\\' || + ch == '&' || ch == '#' || ch == '<' || ch == '>' || + ch == '{' || ch == '}' || ch == '[' || ch == ']') + return true; + return false; +} + +static bool IsStringSuffix(int ch) { + return ch == 'c' || ch == 'w' || ch == 'd'; +} + + +static void ColouriseDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler, bool caseSensitive) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; //doxygen + WordList &keywords4 = *keywordlists[3]; + WordList &keywords5 = *keywordlists[4]; + WordList &keywords6 = *keywordlists[5]; + WordList &keywords7 = *keywordlists[6]; + + int styleBeforeDCKeyword = SCE_D_DEFAULT; + + StyleContext sc(startPos, length, initStyle, styler); + + int curLine = styler.GetLine(startPos); + int curNcLevel = curLine > 0? styler.GetLineState(curLine-1): 0; + bool numFloat = false; // Float literals have '+' and '-' signs + bool numHex = false; + + for (; sc.More(); sc.Forward()) { + + if (sc.atLineStart) { + curLine = styler.GetLine(sc.currentPos); + styler.SetLineState(curLine, curNcLevel); + } + + // Determine if the current state should terminate. + switch (sc.state) { + case SCE_D_OPERATOR: + sc.SetState(SCE_D_DEFAULT); + break; + case SCE_D_NUMBER: + // We accept almost anything because of hex. and number suffixes + if (isascii(sc.ch) && (isalnum(sc.ch) || sc.ch == '_')) { + continue; + } else if (sc.ch == '.' && sc.chNext != '.' && !numFloat) { + // Don't parse 0..2 as number. + numFloat=true; + continue; + } else if ( ( sc.ch == '-' || sc.ch == '+' ) && ( /*sign and*/ + ( !numHex && ( sc.chPrev == 'e' || sc.chPrev == 'E' ) ) || /*decimal or*/ + ( sc.chPrev == 'p' || sc.chPrev == 'P' ) ) ) { /*hex*/ + // Parse exponent sign in float literals: 2e+10 0x2e+10 + continue; + } else { + sc.SetState(SCE_D_DEFAULT); + } + break; + case SCE_D_IDENTIFIER: + if (!IsWord(sc.ch)) { + char s[1000]; + if (caseSensitive) { + sc.GetCurrent(s, sizeof(s)); + } else { + sc.GetCurrentLowered(s, sizeof(s)); + } + if (keywords.InList(s)) { + sc.ChangeState(SCE_D_WORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_D_WORD2); + } else if (keywords4.InList(s)) { + sc.ChangeState(SCE_D_TYPEDEF); + } else if (keywords5.InList(s)) { + sc.ChangeState(SCE_D_WORD5); + } else if (keywords6.InList(s)) { + sc.ChangeState(SCE_D_WORD6); + } else if (keywords7.InList(s)) { + sc.ChangeState(SCE_D_WORD7); + } + sc.SetState(SCE_D_DEFAULT); + } + break; + case SCE_D_COMMENT: + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_D_DEFAULT); + } + break; + case SCE_D_COMMENTDOC: + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_D_DEFAULT); + } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support + // Verify that we have the conditions to mark a comment-doc-keyword + if ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) { + styleBeforeDCKeyword = SCE_D_COMMENTDOC; + sc.SetState(SCE_D_COMMENTDOCKEYWORD); + } + } + break; + case SCE_D_COMMENTLINE: + if (sc.atLineStart) { + sc.SetState(SCE_D_DEFAULT); + } + break; + case SCE_D_COMMENTLINEDOC: + if (sc.atLineStart) { + sc.SetState(SCE_D_DEFAULT); + } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support + // Verify that we have the conditions to mark a comment-doc-keyword + if ((IsASpace(sc.chPrev) || sc.chPrev == '/' || sc.chPrev == '!') && (!IsASpace(sc.chNext))) { + styleBeforeDCKeyword = SCE_D_COMMENTLINEDOC; + sc.SetState(SCE_D_COMMENTDOCKEYWORD); + } + } + break; + case SCE_D_COMMENTDOCKEYWORD: + if ((styleBeforeDCKeyword == SCE_D_COMMENTDOC) && sc.Match('*', '/')) { + sc.ChangeState(SCE_D_COMMENTDOCKEYWORDERROR); + sc.Forward(); + sc.ForwardSetState(SCE_D_DEFAULT); + } else if (!IsDoxygen(sc.ch)) { + char s[100]; + if (caseSensitive) { + sc.GetCurrent(s, sizeof(s)); + } else { + sc.GetCurrentLowered(s, sizeof(s)); + } + if (!IsASpace(sc.ch) || !keywords3.InList(s + 1)) { + sc.ChangeState(SCE_D_COMMENTDOCKEYWORDERROR); + } + sc.SetState(styleBeforeDCKeyword); + } + break; + case SCE_D_COMMENTNESTED: + if (sc.Match('+', '/')) { + if (curNcLevel > 0) + curNcLevel -= 1; + curLine = styler.GetLine(sc.currentPos); + styler.SetLineState(curLine, curNcLevel); + sc.Forward(); + if (curNcLevel == 0) { + sc.ForwardSetState(SCE_D_DEFAULT); + } + } else if (sc.Match('/','+')) { + curNcLevel += 1; + curLine = styler.GetLine(sc.currentPos); + styler.SetLineState(curLine, curNcLevel); + sc.Forward(); + } + break; + case SCE_D_STRING: + if (sc.ch == '\\') { + if (sc.chNext == '"' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '"') { + if(IsStringSuffix(sc.chNext)) + sc.Forward(); + sc.ForwardSetState(SCE_D_DEFAULT); + } + break; + case SCE_D_CHARACTER: + if (sc.atLineEnd) { + sc.ChangeState(SCE_D_STRINGEOL); + } else if (sc.ch == '\\') { + if (sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\'') { + // Char has no suffixes + sc.ForwardSetState(SCE_D_DEFAULT); + } + break; + case SCE_D_STRINGEOL: + if (sc.atLineStart) { + sc.SetState(SCE_D_DEFAULT); + } + break; + case SCE_D_STRINGB: + if (sc.ch == '`') { + if(IsStringSuffix(sc.chNext)) + sc.Forward(); + sc.ForwardSetState(SCE_D_DEFAULT); + } + break; + case SCE_D_STRINGR: + if (sc.ch == '"') { + if(IsStringSuffix(sc.chNext)) + sc.Forward(); + sc.ForwardSetState(SCE_D_DEFAULT); + } + break; + } + + // Determine if a new state should be entered. + if (sc.state == SCE_D_DEFAULT) { + if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_D_NUMBER); + numFloat = sc.ch == '.'; + // Remember hex literal + numHex = sc.ch == '0' && ( sc.chNext == 'x' || sc.chNext == 'X' ); + } else if ( (sc.ch == 'r' || sc.ch == 'x' || sc.ch == 'q') + && sc.chNext == '"' ) { + // Limited support for hex and delimited strings: parse as r"" + sc.SetState(SCE_D_STRINGR); + sc.Forward(); + } else if (IsWordStart(sc.ch) || sc.ch == '$') { + sc.SetState(SCE_D_IDENTIFIER); + } else if (sc.Match('/','+')) { + curNcLevel += 1; + curLine = styler.GetLine(sc.currentPos); + styler.SetLineState(curLine, curNcLevel); + sc.SetState(SCE_D_COMMENTNESTED); + sc.Forward(); + } else if (sc.Match('/', '*')) { + if (sc.Match("/**") || sc.Match("/*!")) { // Support of Qt/Doxygen doc. style + sc.SetState(SCE_D_COMMENTDOC); + } else { + sc.SetState(SCE_D_COMMENT); + } + sc.Forward(); // Eat the * so it isn't used for the end of the comment + } else if (sc.Match('/', '/')) { + if ((sc.Match("///") && !sc.Match("////")) || sc.Match("//!")) + // Support of Qt/Doxygen doc. style + sc.SetState(SCE_D_COMMENTLINEDOC); + else + sc.SetState(SCE_D_COMMENTLINE); + } else if (sc.ch == '"') { + sc.SetState(SCE_D_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_D_CHARACTER); + } else if (sc.ch == '`') { + sc.SetState(SCE_D_STRINGB); + } else if (isoperator(static_cast(sc.ch))) { + sc.SetState(SCE_D_OPERATOR); + if (sc.ch == '.' && sc.chNext == '.') sc.Forward(); // Range operator + } + } + } + sc.Complete(); +} + +static bool IsStreamCommentStyle(int style) { + return style == SCE_D_COMMENT || + style == SCE_D_COMMENTDOC || + style == SCE_D_COMMENTDOCKEYWORD || + style == SCE_D_COMMENTDOCKEYWORDERROR; +} + +// Store both the current line's fold level and the next lines in the +// level store to make it easy to pick up with each increment +// and to make it possible to fiddle the current level for "} else {". +static void FoldDoc(unsigned int startPos, int length, int initStyle, Accessor &styler) { + bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + + // property lexer.d.fold.at.else + // This option enables D folding on a "} else {" line of an if statement. + bool foldAtElse = styler.GetPropertyInt("lexer.d.fold.at.else", + styler.GetPropertyInt("fold.at.else", 0)) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelCurrent = SC_FOLDLEVELBASE; + if (lineCurrent > 0) + levelCurrent = styler.LevelAt(lineCurrent-1) >> 16; + int levelMinCurrent = levelCurrent; + int levelNext = levelCurrent; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (foldComment && IsStreamCommentStyle(style)) { + if (!IsStreamCommentStyle(stylePrev)) { + levelNext++; + } else if (!IsStreamCommentStyle(styleNext) && !atEOL) { + // Comments don't end at end of line and the next character may be unstyled. + levelNext--; + } + } + if (style == SCE_D_OPERATOR) { + if (ch == '{') { + // Measure the minimum before a '{' to allow + // folding on "} else {" + if (levelMinCurrent > levelNext) { + levelMinCurrent = levelNext; + } + levelNext++; + } else if (ch == '}') { + levelNext--; + } + } + if (atEOL) { + if (foldComment) { // Handle nested comments + int nc; + nc = styler.GetLineState(lineCurrent); + nc -= lineCurrent>0? styler.GetLineState(lineCurrent-1): 0; + levelNext += nc; + } + int levelUse = levelCurrent; + if (foldAtElse) { + levelUse = levelMinCurrent; + } + int lev = levelUse | levelNext << 16; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if (levelUse < levelNext) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelCurrent = levelNext; + levelMinCurrent = levelCurrent; + visibleChars = 0; + } + if (!IsASpace(ch)) + visibleChars++; + } +} + +static void FoldDDoc(unsigned int startPos, int length, int initStyle, + WordList *[], Accessor &styler) { + FoldDoc(startPos, length, initStyle, styler); +} + +static const char * const dWordLists[] = { + "Primary keywords and identifiers", + "Secondary keywords and identifiers", + "Documentation comment keywords", + "Type definitions and aliases", + "Keywords 5", + "Keywords 6", + "Keywords 7", + 0, + }; + +static void ColouriseDDoc(unsigned int startPos, int length, + int initStyle, WordList *keywordlists[], Accessor &styler) { + ColouriseDoc(startPos, length, initStyle, keywordlists, styler, true); +} + +LexerModule lmD(SCLEX_D, ColouriseDDoc, "d", FoldDDoc, dWordLists); diff --git a/sdk/wxscintilla/src/scintilla/src/LexEScript.cxx b/sdk/wxscintilla/src/scintilla/src/LexEScript.cxx new file mode 100644 index 0000000..295aaec --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexEScript.cxx @@ -0,0 +1,273 @@ +// Scintilla source code edit control +/** @file LexESCRIPT.cxx + ** Lexer for ESCRIPT + **/ +// Copyright 2003 by Patrizio Bekerle (patrizio@bekerle.com) + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_'); +} + +static inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + + + +static void ColouriseESCRIPTDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + + // Do not leak onto next line + /*if (initStyle == SCE_ESCRIPT_STRINGEOL) + initStyle = SCE_ESCRIPT_DEFAULT;*/ + + StyleContext sc(startPos, length, initStyle, styler); + + bool caseSensitive = styler.GetPropertyInt("escript.case.sensitive", 0) != 0; + + for (; sc.More(); sc.Forward()) { + + /*if (sc.atLineStart && (sc.state == SCE_ESCRIPT_STRING)) { + // Prevent SCE_ESCRIPT_STRINGEOL from leaking back to previous line + sc.SetState(SCE_ESCRIPT_STRING); + }*/ + + // Handle line continuation generically. + if (sc.ch == '\\') { + if (sc.chNext == '\n' || sc.chNext == '\r') { + sc.Forward(); + if (sc.ch == '\r' && sc.chNext == '\n') { + sc.Forward(); + } + continue; + } + } + + // Determine if the current state should terminate. + if (sc.state == SCE_ESCRIPT_OPERATOR || sc.state == SCE_ESCRIPT_BRACE) { + sc.SetState(SCE_ESCRIPT_DEFAULT); + } else if (sc.state == SCE_ESCRIPT_NUMBER) { + if (!IsADigit(sc.ch) || sc.ch != '.') { + sc.SetState(SCE_ESCRIPT_DEFAULT); + } + } else if (sc.state == SCE_ESCRIPT_IDENTIFIER) { + if (!IsAWordChar(sc.ch) || (sc.ch == '.')) { + char s[100]; + if (caseSensitive) { + sc.GetCurrent(s, sizeof(s)); + } else { + sc.GetCurrentLowered(s, sizeof(s)); + } + +// sc.GetCurrentLowered(s, sizeof(s)); + + if (keywords.InList(s)) { + sc.ChangeState(SCE_ESCRIPT_WORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_ESCRIPT_WORD2); + } else if (keywords3.InList(s)) { + sc.ChangeState(SCE_ESCRIPT_WORD3); + // sc.state = SCE_ESCRIPT_IDENTIFIER; + } + sc.SetState(SCE_ESCRIPT_DEFAULT); + } + } else if (sc.state == SCE_ESCRIPT_COMMENT) { + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_ESCRIPT_DEFAULT); + } + } else if (sc.state == SCE_ESCRIPT_COMMENTDOC) { + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(SCE_ESCRIPT_DEFAULT); + } + } else if (sc.state == SCE_ESCRIPT_COMMENTLINE) { + if (sc.atLineEnd) { + sc.SetState(SCE_ESCRIPT_DEFAULT); + } + } else if (sc.state == SCE_ESCRIPT_STRING) { + if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\"') { + sc.ForwardSetState(SCE_ESCRIPT_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_ESCRIPT_DEFAULT) { + if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_ESCRIPT_NUMBER); + } else if (IsAWordStart(sc.ch) || (sc.ch == '#')) { + sc.SetState(SCE_ESCRIPT_IDENTIFIER); + } else if (sc.Match('/', '*')) { + sc.SetState(SCE_ESCRIPT_COMMENT); + sc.Forward(); // Eat the * so it isn't used for the end of the comment + } else if (sc.Match('/', '/')) { + sc.SetState(SCE_ESCRIPT_COMMENTLINE); + } else if (sc.ch == '\"') { + sc.SetState(SCE_ESCRIPT_STRING); + //} else if (isoperator(static_cast(sc.ch))) { + } else if (sc.ch == '+' || sc.ch == '-' || sc.ch == '*' || sc.ch == '/' || sc.ch == '=' || sc.ch == '<' || sc.ch == '>' || sc.ch == '&' || sc.ch == '|' || sc.ch == '!' || sc.ch == '?' || sc.ch == ':') { + sc.SetState(SCE_ESCRIPT_OPERATOR); + } else if (sc.ch == '{' || sc.ch == '}') { + sc.SetState(SCE_ESCRIPT_BRACE); + } + } + + } + sc.Complete(); +} + + +static int classifyFoldPointESCRIPT(const char* s, const char* prevWord) { + int lev = 0; + if (strcmp(prevWord, "end") == 0) return lev; + if ((strcmp(prevWord, "else") == 0 && strcmp(s, "if") == 0) || strcmp(s, "elseif") == 0) + return -1; + + if (strcmp(s, "for") == 0 || strcmp(s, "foreach") == 0 + || strcmp(s, "program") == 0 || strcmp(s, "function") == 0 + || strcmp(s, "while") == 0 || strcmp(s, "case") == 0 + || strcmp(s, "if") == 0 ) { + lev = 1; + } else if ( strcmp(s, "endfor") == 0 || strcmp(s, "endforeach") == 0 + || strcmp(s, "endprogram") == 0 || strcmp(s, "endfunction") == 0 + || strcmp(s, "endwhile") == 0 || strcmp(s, "endcase") == 0 + || strcmp(s, "endif") == 0 ) { + lev = -1; + } + + return lev; +} + + +static bool IsStreamCommentStyle(int style) { + return style == SCE_ESCRIPT_COMMENT || + style == SCE_ESCRIPT_COMMENTDOC || + style == SCE_ESCRIPT_COMMENTLINE; +} + +static void FoldESCRIPTDoc(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) { + //~ bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + // Do not know how to fold the comment at the moment. + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + bool foldComment = true; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + + int lastStart = 0; + char prevWord[32] = ""; + + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + + + if (foldComment && IsStreamCommentStyle(style)) { + if (!IsStreamCommentStyle(stylePrev)) { + levelCurrent++; + } else if (!IsStreamCommentStyle(styleNext) && !atEOL) { + // Comments don't end at end of line and the next character may be unstyled. + levelCurrent--; + } + } + + if (foldComment && (style == SCE_ESCRIPT_COMMENTLINE)) { + if ((ch == '/') && (chNext == '/')) { + char chNext2 = styler.SafeGetCharAt(i + 2); + if (chNext2 == '{') { + levelCurrent++; + } else if (chNext2 == '}') { + levelCurrent--; + } + } + } + + if (stylePrev == SCE_ESCRIPT_DEFAULT && style == SCE_ESCRIPT_WORD3) + { + // Store last word start point. + lastStart = i; + } + + if (style == SCE_ESCRIPT_WORD3) { + if(iswordchar(ch) && !iswordchar(chNext)) { + char s[32]; + unsigned int j; + for(j = 0; ( j < 31 ) && ( j < i-lastStart+1 ); j++) { + s[j] = static_cast(tolower(styler[lastStart + j])); + } + s[j] = '\0'; + levelCurrent += classifyFoldPointESCRIPT(s, prevWord); + strcpy(prevWord, s); + } + } + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + strcpy(prevWord, ""); + } + + if (!isspacechar(ch)) + visibleChars++; + } + + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + + + +static const char * const ESCRIPTWordLists[] = { + "Primary keywords and identifiers", + "Intrinsic functions", + "Extended and user defined functions", + 0, +}; + +LexerModule lmESCRIPT(SCLEX_ESCRIPT, ColouriseESCRIPTDoc, "escript", FoldESCRIPTDoc, ESCRIPTWordLists); diff --git a/sdk/wxscintilla/src/scintilla/src/LexEiffel.cxx b/sdk/wxscintilla/src/scintilla/src/LexEiffel.cxx new file mode 100644 index 0000000..03dea5e --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexEiffel.cxx @@ -0,0 +1,238 @@ +// Scintilla source code edit control +/** @file LexEiffel.cxx + ** Lexer for Eiffel. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static inline bool isEiffelOperator(unsigned int ch) { + // '.' left out as it is used to make up numbers + return ch == '*' || ch == '/' || ch == '\\' || ch == '-' || ch == '+' || + ch == '(' || ch == ')' || ch == '=' || + ch == '{' || ch == '}' || ch == '~' || + ch == '[' || ch == ']' || ch == ';' || + ch == '<' || ch == '>' || ch == ',' || + ch == '.' || ch == '^' || ch == '%' || ch == ':' || + ch == '!' || ch == '@' || ch == '?'; +} + +static inline bool IsAWordChar(unsigned int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + +static inline bool IsAWordStart(unsigned int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_'); +} + +static void ColouriseEiffelDoc(unsigned int startPos, + int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + + if (sc.state == SCE_EIFFEL_STRINGEOL) { + if (sc.ch != '\r' && sc.ch != '\n') { + sc.SetState(SCE_EIFFEL_DEFAULT); + } + } else if (sc.state == SCE_EIFFEL_OPERATOR) { + sc.SetState(SCE_EIFFEL_DEFAULT); + } else if (sc.state == SCE_EIFFEL_WORD) { + if (!IsAWordChar(sc.ch)) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + if (!keywords.InList(s)) { + sc.ChangeState(SCE_EIFFEL_IDENTIFIER); + } + sc.SetState(SCE_EIFFEL_DEFAULT); + } + } else if (sc.state == SCE_EIFFEL_NUMBER) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_EIFFEL_DEFAULT); + } + } else if (sc.state == SCE_EIFFEL_COMMENTLINE) { + if (sc.ch == '\r' || sc.ch == '\n') { + sc.SetState(SCE_EIFFEL_DEFAULT); + } + } else if (sc.state == SCE_EIFFEL_STRING) { + if (sc.ch == '%') { + sc.Forward(); + } else if (sc.ch == '\"') { + sc.Forward(); + sc.SetState(SCE_EIFFEL_DEFAULT); + } + } else if (sc.state == SCE_EIFFEL_CHARACTER) { + if (sc.ch == '\r' || sc.ch == '\n') { + sc.SetState(SCE_EIFFEL_STRINGEOL); + } else if (sc.ch == '%') { + sc.Forward(); + } else if (sc.ch == '\'') { + sc.Forward(); + sc.SetState(SCE_EIFFEL_DEFAULT); + } + } + + if (sc.state == SCE_EIFFEL_DEFAULT) { + if (sc.ch == '-' && sc.chNext == '-') { + sc.SetState(SCE_EIFFEL_COMMENTLINE); + } else if (sc.ch == '\"') { + sc.SetState(SCE_EIFFEL_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_EIFFEL_CHARACTER); + } else if (IsADigit(sc.ch) || (sc.ch == '.')) { + sc.SetState(SCE_EIFFEL_NUMBER); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_EIFFEL_WORD); + } else if (isEiffelOperator(sc.ch)) { + sc.SetState(SCE_EIFFEL_OPERATOR); + } + } + } + sc.Complete(); +} + +static bool IsEiffelComment(Accessor &styler, int pos, int len) { + return len>1 && styler[pos]=='-' && styler[pos+1]=='-'; +} + +static void FoldEiffelDocIndent(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) { + int lengthDoc = startPos + length; + + // Backtrack to previous line in case need to fix its fold status + int lineCurrent = styler.GetLine(startPos); + if (startPos > 0) { + if (lineCurrent > 0) { + lineCurrent--; + startPos = styler.LineStart(lineCurrent); + } + } + int spaceFlags = 0; + int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, IsEiffelComment); + char chNext = styler[startPos]; + for (int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == lengthDoc)) { + int lev = indentCurrent; + int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags, IsEiffelComment); + if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) { + // Only non whitespace lines can be headers + if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) { + lev |= SC_FOLDLEVELHEADERFLAG; + } else if (indentNext & SC_FOLDLEVELWHITEFLAG) { + // Line after is blank so check the next - maybe should continue further? + int spaceFlags2 = 0; + int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2, IsEiffelComment); + if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) { + lev |= SC_FOLDLEVELHEADERFLAG; + } + } + } + indentCurrent = indentNext; + styler.SetLevel(lineCurrent, lev); + lineCurrent++; + } + } +} + +static void FoldEiffelDocKeyWords(unsigned int startPos, int length, int /* initStyle */, WordList *[], + Accessor &styler) { + unsigned int lengthDoc = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + int stylePrev = 0; + int styleNext = styler.StyleAt(startPos); + // lastDeferred should be determined by looking back to last keyword in case + // the "deferred" is on a line before "class" + bool lastDeferred = false; + for (unsigned int i = startPos; i < lengthDoc; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if ((stylePrev != SCE_EIFFEL_WORD) && (style == SCE_EIFFEL_WORD)) { + char s[20]; + unsigned int j = 0; + while ((j < (sizeof(s) - 1)) && (iswordchar(styler[i + j]))) { + s[j] = styler[i + j]; + j++; + } + s[j] = '\0'; + + if ( + (strcmp(s, "check") == 0) || + (strcmp(s, "debug") == 0) || + (strcmp(s, "deferred") == 0) || + (strcmp(s, "do") == 0) || + (strcmp(s, "from") == 0) || + (strcmp(s, "if") == 0) || + (strcmp(s, "inspect") == 0) || + (strcmp(s, "once") == 0) + ) + levelCurrent++; + if (!lastDeferred && (strcmp(s, "class") == 0)) + levelCurrent++; + if (strcmp(s, "end") == 0) + levelCurrent--; + lastDeferred = strcmp(s, "deferred") == 0; + } + + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) + visibleChars++; + stylePrev = style; + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +static const char * const eiffelWordListDesc[] = { + "Keywords", + 0 +}; + +LexerModule lmEiffel(SCLEX_EIFFEL, ColouriseEiffelDoc, "eiffel", FoldEiffelDocIndent, eiffelWordListDesc); +LexerModule lmEiffelkw(SCLEX_EIFFELKW, ColouriseEiffelDoc, "eiffelkw", FoldEiffelDocKeyWords, eiffelWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexErlang.cxx b/sdk/wxscintilla/src/scintilla/src/LexErlang.cxx new file mode 100644 index 0000000..45577bd --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexErlang.cxx @@ -0,0 +1,619 @@ +// Scintilla source code edit control +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. +/** @file LexErlang.cxx + ** Lexer for Erlang. + ** Enhanced by Etienne 'Lenain' Girondel (lenaing@gmail.com) + ** Originally wrote by Peter-Henry Mander, + ** based on Matlab lexer by Jos Fonseca. + **/ + +#include +#include +#include +#include +#include + +#include "Platform.h" +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static int is_radix(int radix, int ch) { + int digit; + + if (36 < radix || 2 > radix) + return 0; + + if (isdigit(ch)) { + digit = ch - '0'; + } else if (isalnum(ch)) { + digit = toupper(ch) - 'A' + 10; + } else { + return 0; + } + + return (digit < radix); +} + +typedef enum { + STATE_NULL, + COMMENT, + COMMENT_FUNCTION, + COMMENT_MODULE, + COMMENT_DOC, + COMMENT_DOC_MACRO, + ATOM_UNQUOTED, + ATOM_QUOTED, + NODE_NAME_UNQUOTED, + NODE_NAME_QUOTED, + MACRO_START, + MACRO_UNQUOTED, + MACRO_QUOTED, + RECORD_START, + RECORD_UNQUOTED, + RECORD_QUOTED, + NUMERAL_START, + NUMERAL_BASE_VALUE, + NUMERAL_FLOAT, + NUMERAL_EXPONENT, + PREPROCESSOR +} atom_parse_state_t; + +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (ch != ' ') && (isalnum(ch) || ch == '_'); +} + +static void ColouriseErlangDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + + StyleContext sc(startPos, length, initStyle, styler); + WordList &reservedWords = *keywordlists[0]; + WordList &erlangBIFs = *keywordlists[1]; + WordList &erlangPreproc = *keywordlists[2]; + WordList &erlangModulesAtt = *keywordlists[3]; + WordList &erlangDoc = *keywordlists[4]; + WordList &erlangDocMacro = *keywordlists[5]; + int radix_digits = 0; + int exponent_digits = 0; + atom_parse_state_t parse_state = STATE_NULL; + atom_parse_state_t old_parse_state = STATE_NULL; + bool to_late_to_comment = false; + char cur[100]; + int old_style = SCE_ERLANG_DEFAULT; + + styler.StartAt(startPos); + + for (; sc.More(); sc.Forward()) { + int style = SCE_ERLANG_DEFAULT; + if (STATE_NULL != parse_state) { + + switch (parse_state) { + + case STATE_NULL : sc.SetState(SCE_ERLANG_DEFAULT); break; + + /* COMMENTS ------------------------------------------------------*/ + case COMMENT : { + if (sc.ch != '%') { + to_late_to_comment = true; + } else if (!to_late_to_comment && sc.ch == '%') { + // Switch to comment level 2 (Function) + sc.ChangeState(SCE_ERLANG_COMMENT_FUNCTION); + old_style = SCE_ERLANG_COMMENT_FUNCTION; + parse_state = COMMENT_FUNCTION; + sc.Forward(); + } + } + // V--- Falling through! + case COMMENT_FUNCTION : { + if (sc.ch != '%') { + to_late_to_comment = true; + } else if (!to_late_to_comment && sc.ch == '%') { + // Switch to comment level 3 (Module) + sc.ChangeState(SCE_ERLANG_COMMENT_MODULE); + old_style = SCE_ERLANG_COMMENT_MODULE; + parse_state = COMMENT_MODULE; + sc.Forward(); + } + } + // V--- Falling through! + case COMMENT_MODULE : { + if (parse_state != COMMENT) { + // Search for comment documentation + if (sc.chNext == '@') { + old_parse_state = parse_state; + parse_state = ('{' == sc.ch) + ? COMMENT_DOC_MACRO + : COMMENT_DOC; + sc.ForwardSetState(sc.state); + } + } + + // All comments types fall here. + if (sc.atLineEnd) { + to_late_to_comment = false; + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + case COMMENT_DOC : + // V--- Falling through! + case COMMENT_DOC_MACRO : { + + if (!isalnum(sc.ch)) { + // Try to match documentation comment + sc.GetCurrent(cur, sizeof(cur)); + + if (parse_state == COMMENT_DOC_MACRO + && erlangDocMacro.InList(cur)) { + sc.ChangeState(SCE_ERLANG_COMMENT_DOC_MACRO); + while (sc.ch != '}' && !sc.atLineEnd) + sc.Forward(); + } else if (erlangDoc.InList(cur)) { + sc.ChangeState(SCE_ERLANG_COMMENT_DOC); + } else { + sc.ChangeState(old_style); + } + + // Switch back to old state + sc.SetState(old_style); + parse_state = old_parse_state; + } + + if (sc.atLineEnd) { + to_late_to_comment = false; + sc.ChangeState(old_style); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + /* -------------------------------------------------------------- */ + /* Atoms ---------------------------------------------------------*/ + case ATOM_UNQUOTED : { + if ('@' == sc.ch){ + parse_state = NODE_NAME_UNQUOTED; + } else if (sc.ch == ':') { + // Searching for module name + if (sc.chNext == ' ') { + // error + sc.ChangeState(SCE_ERLANG_UNKNOWN); + parse_state = STATE_NULL; + } else { + sc.Forward(); + if (isalnum(sc.ch)) { + sc.GetCurrent(cur, sizeof(cur)); + sc.ChangeState(SCE_ERLANG_MODULES); + sc.SetState(SCE_ERLANG_MODULES); + } + } + } else if (!IsAWordChar(sc.ch)) { + + sc.GetCurrent(cur, sizeof(cur)); + if (reservedWords.InList(cur)) { + style = SCE_ERLANG_KEYWORD; + } else if (erlangBIFs.InList(cur) + && strcmp(cur,"erlang:")){ + style = SCE_ERLANG_BIFS; + } else if (sc.ch == '(' || '/' == sc.ch){ + style = SCE_ERLANG_FUNCTION_NAME; + } else { + style = SCE_ERLANG_ATOM; + } + + sc.ChangeState(style); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + + } break; + + case ATOM_QUOTED : { + if ( '@' == sc.ch ){ + parse_state = NODE_NAME_QUOTED; + } else if ('\'' == sc.ch && '\\' != sc.chPrev) { + sc.ChangeState(SCE_ERLANG_ATOM); + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + /* -------------------------------------------------------------- */ + /* Node names ----------------------------------------------------*/ + case NODE_NAME_UNQUOTED : { + if ('@' == sc.ch) { + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } else if (!IsAWordChar(sc.ch)) { + sc.ChangeState(SCE_ERLANG_NODE_NAME); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + case NODE_NAME_QUOTED : { + if ('@' == sc.ch) { + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } else if ('\'' == sc.ch && '\\' != sc.chPrev) { + sc.ChangeState(SCE_ERLANG_NODE_NAME_QUOTED); + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + /* -------------------------------------------------------------- */ + /* Records -------------------------------------------------------*/ + case RECORD_START : { + if ('\'' == sc.ch) { + parse_state = RECORD_QUOTED; + } else if (isalpha(sc.ch) && islower(sc.ch)) { + parse_state = RECORD_UNQUOTED; + } else { // error + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + case RECORD_UNQUOTED : { + if (!IsAWordChar(sc.ch)) { + sc.ChangeState(SCE_ERLANG_RECORD); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + case RECORD_QUOTED : { + if ('\'' == sc.ch && '\\' != sc.chPrev) { + sc.ChangeState(SCE_ERLANG_RECORD_QUOTED); + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + /* -------------------------------------------------------------- */ + /* Macros --------------------------------------------------------*/ + case MACRO_START : { + if ('\'' == sc.ch) { + parse_state = MACRO_QUOTED; + } else if (isalpha(sc.ch)) { + parse_state = MACRO_UNQUOTED; + } else { // error + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + case MACRO_UNQUOTED : { + if (!IsAWordChar(sc.ch)) { + sc.ChangeState(SCE_ERLANG_MACRO); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + case MACRO_QUOTED : { + if ('\'' == sc.ch && '\\' != sc.chPrev) { + sc.ChangeState(SCE_ERLANG_MACRO_QUOTED); + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + /* -------------------------------------------------------------- */ + /* Numerics ------------------------------------------------------*/ + /* Simple integer */ + case NUMERAL_START : { + if (isdigit(sc.ch)) { + radix_digits *= 10; + radix_digits += sc.ch - '0'; // Assuming ASCII here! + } else if ('#' == sc.ch) { + if (2 > radix_digits || 36 < radix_digits) { + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } else { + parse_state = NUMERAL_BASE_VALUE; + } + } else if ('.' == sc.ch && isdigit(sc.chNext)) { + radix_digits = 0; + parse_state = NUMERAL_FLOAT; + } else if ('e' == sc.ch || 'E' == sc.ch) { + exponent_digits = 0; + parse_state = NUMERAL_EXPONENT; + } else { + radix_digits = 0; + sc.ChangeState(SCE_ERLANG_NUMBER); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + /* Integer in other base than 10 (x#yyy) */ + case NUMERAL_BASE_VALUE : { + if (!is_radix(radix_digits,sc.ch)) { + radix_digits = 0; + + if (!isalnum(sc.ch)) + sc.ChangeState(SCE_ERLANG_NUMBER); + + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + /* Float (x.yyy) */ + case NUMERAL_FLOAT : { + if ('e' == sc.ch || 'E' == sc.ch) { + exponent_digits = 0; + parse_state = NUMERAL_EXPONENT; + } else if (!isdigit(sc.ch)) { + sc.ChangeState(SCE_ERLANG_NUMBER); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + /* Exponent, either integer or float (xEyy, x.yyEzzz) */ + case NUMERAL_EXPONENT : { + if (('-' == sc.ch || '+' == sc.ch) + && (isdigit(sc.chNext))) { + sc.Forward(); + } else if (!isdigit(sc.ch)) { + if (0 < exponent_digits) + sc.ChangeState(SCE_ERLANG_NUMBER); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } else { + ++exponent_digits; + } + } break; + + /* -------------------------------------------------------------- */ + /* Preprocessor --------------------------------------------------*/ + case PREPROCESSOR : { + if (!IsAWordChar(sc.ch)) { + + sc.GetCurrent(cur, sizeof(cur)); + if (erlangPreproc.InList(cur)) { + style = SCE_ERLANG_PREPROC; + } else if (erlangModulesAtt.InList(cur)) { + style = SCE_ERLANG_MODULES_ATT; + } + + sc.ChangeState(style); + sc.SetState(SCE_ERLANG_DEFAULT); + parse_state = STATE_NULL; + } + } break; + + } + + } /* End of : STATE_NULL != parse_state */ + else + { + switch (sc.state) { + case SCE_ERLANG_VARIABLE : { + if (!IsAWordChar(sc.ch)) + sc.SetState(SCE_ERLANG_DEFAULT); + } break; + case SCE_ERLANG_STRING : { + if (sc.ch == '\"' && sc.chPrev != '\\') + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + } break; + case SCE_ERLANG_COMMENT : { + if (sc.atLineEnd) + sc.SetState(SCE_ERLANG_DEFAULT); + } break; + case SCE_ERLANG_CHARACTER : { + if (sc.chPrev == '\\') { + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + } else if (sc.ch != '\\') { + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + } + } break; + case SCE_ERLANG_OPERATOR : { + if (sc.chPrev == '.') { + if (sc.ch == '*' || sc.ch == '/' || sc.ch == '\\' + || sc.ch == '^') { + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + } else if (sc.ch == '\'') { + sc.ForwardSetState(SCE_ERLANG_DEFAULT); + } else { + sc.SetState(SCE_ERLANG_DEFAULT); + } + } else { + sc.SetState(SCE_ERLANG_DEFAULT); + } + } break; + } + } + + if (sc.state == SCE_ERLANG_DEFAULT) { + bool no_new_state = false; + + switch (sc.ch) { + case '\"' : sc.SetState(SCE_ERLANG_STRING); break; + case '$' : sc.SetState(SCE_ERLANG_CHARACTER); break; + case '%' : { + parse_state = COMMENT; + sc.SetState(SCE_ERLANG_COMMENT); + } break; + case '#' : { + parse_state = RECORD_START; + sc.SetState(SCE_ERLANG_UNKNOWN); + } break; + case '?' : { + parse_state = MACRO_START; + sc.SetState(SCE_ERLANG_UNKNOWN); + } break; + case '\'' : { + parse_state = ATOM_QUOTED; + sc.SetState(SCE_ERLANG_UNKNOWN); + } break; + case '+' : + case '-' : { + if (IsADigit(sc.chNext)) { + parse_state = NUMERAL_START; + radix_digits = 0; + sc.SetState(SCE_ERLANG_UNKNOWN); + } else if (sc.ch != '+') { + parse_state = PREPROCESSOR; + sc.SetState(SCE_ERLANG_UNKNOWN); + } + } break; + default : no_new_state = true; + } + + if (no_new_state) { + if (isdigit(sc.ch)) { + parse_state = NUMERAL_START; + radix_digits = sc.ch - '0'; + sc.SetState(SCE_ERLANG_UNKNOWN); + } else if (isupper(sc.ch) || '_' == sc.ch) { + sc.SetState(SCE_ERLANG_VARIABLE); + } else if (isalpha(sc.ch)) { + parse_state = ATOM_UNQUOTED; + sc.SetState(SCE_ERLANG_UNKNOWN); + } else if (isoperator(static_cast(sc.ch)) + || sc.ch == '\\') { + sc.SetState(SCE_ERLANG_OPERATOR); + } + } + } + + } + sc.Complete(); +} + +static int ClassifyErlangFoldPoint( + Accessor &styler, + int styleNext, + int keyword_start +) { + int lev = 0; + if (styler.Match(keyword_start,"case") + || ( + styler.Match(keyword_start,"fun") + && (SCE_ERLANG_FUNCTION_NAME != styleNext) + ) + || styler.Match(keyword_start,"if") + || styler.Match(keyword_start,"query") + || styler.Match(keyword_start,"receive") + ) { + ++lev; + } else if (styler.Match(keyword_start,"end")) { + --lev; + } + + return lev; +} + +static void FoldErlangDoc( + unsigned int startPos, int length, int initStyle, + WordList** /*keywordlists*/, Accessor &styler +) { + unsigned int endPos = startPos + length; + int currentLine = styler.GetLine(startPos); + int lev; + int previousLevel = styler.LevelAt(currentLine) & SC_FOLDLEVELNUMBERMASK; + int currentLevel = previousLevel; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + int stylePrev; + int keyword_start = 0; + char ch; + char chNext = styler.SafeGetCharAt(startPos); + bool atEOL; + + for (unsigned int i = startPos; i < endPos; i++) { + ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + // Get styles + stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + atEOL = ((ch == '\r') && (chNext != '\n')) || (ch == '\n'); + + if (stylePrev != SCE_ERLANG_KEYWORD + && style == SCE_ERLANG_KEYWORD) { + keyword_start = i; + } + + // Fold on keywords + if (stylePrev == SCE_ERLANG_KEYWORD + && style != SCE_ERLANG_KEYWORD + && style != SCE_ERLANG_ATOM + ) { + currentLevel += ClassifyErlangFoldPoint(styler, + styleNext, + keyword_start); + } + + // Fold on comments + if (style == SCE_ERLANG_COMMENT + || style == SCE_ERLANG_COMMENT_MODULE + || style == SCE_ERLANG_COMMENT_FUNCTION) { + + if (ch == '%' && chNext == '{') { + currentLevel++; + } else if (ch == '%' && chNext == '}') { + currentLevel--; + } + } + + // Fold on braces + if (style == SCE_ERLANG_OPERATOR) { + if (ch == '{' || ch == '(' || ch == '[') { + currentLevel++; + } else if (ch == '}' || ch == ')' || ch == ']') { + currentLevel--; + } + } + + + if (atEOL) { + lev = previousLevel; + + if (currentLevel > previousLevel) + lev |= SC_FOLDLEVELHEADERFLAG; + + if (lev != styler.LevelAt(currentLine)) + styler.SetLevel(currentLine, lev); + + currentLine++; + previousLevel = currentLevel; + } + + } + + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + styler.SetLevel(currentLine, + previousLevel + | (styler.LevelAt(currentLine) & ~SC_FOLDLEVELNUMBERMASK)); +} + +static const char * const erlangWordListDesc[] = { + "Erlang Reserved words", + "Erlang BIFs", + "Erlang Preprocessor", + "Erlang Module Attributes", + "Erlang Documentation", + "Erlang Documentation Macro", + 0 +}; + +LexerModule lmErlang( + SCLEX_ERLANG, + ColouriseErlangDoc, + "erlang", + FoldErlangDoc, + erlangWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexFIF.cxx b/sdk/wxscintilla/src/scintilla/src/LexFIF.cxx new file mode 100644 index 0000000..1d2a516 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexFIF.cxx @@ -0,0 +1,130 @@ +// Scintilla source code edit control +/** @file LexFIF.cxx + ** Lexers for Find In Files output format + **/ +// Copyright 1998-2001 by Eran Ifrah +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" +#include + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static inline bool AtEOL(Accessor &styler, unsigned int i) +{ + return (styler[i] == '\n') || + ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')); +} + +static void ColouriseFifDoc(unsigned int pos, int length, int /*initStyle*/, + WordList *[], Accessor &styler) +{ + styler.StartAt(pos); + styler.StartSegment(pos); + for (int firstchar = -1; length > 0; pos++, length--) { + if (firstchar == -1) { + firstchar = styler[pos]; // first char of each line + } + if (styler[pos] == ':' && firstchar == ' ') { + if (length > 1 && styler[pos+1] == ' ') { + // include the following space + pos++; + length--; + } + styler.ColourTo(pos, SCLEX_FIF_FILE_SHORT); + firstchar = ':'; // first colon only + if (length > 1 && styler[pos+1] == '[') { + firstchar = '['; + } + } else if (styler[pos] == ']' && firstchar == '['){ + if (length > 1 && styler[pos+1] == ' ') { + // include the following space + pos++; + length--; + } + styler.ColourTo(pos, SCLEX_FIF_SCOPE); + firstchar = ']'; // first ']' only + } else if (AtEOL(styler, pos)) { + switch (firstchar) { + case ' ': + case ':': + case '[': + case ']': + styler.ColourTo(pos, SCLEX_FIF_MATCH); + break; + case '=': + styler.ColourTo(pos, SCLEX_FIF_DEFAULT); + break; + case '-': + styler.ColourTo(pos, SCLEX_FIF_PROJECT); + break; + default: + styler.ColourTo(pos, SCLEX_FIF_FILE); + break; + } + firstchar = -1; + } + } +} + +static void FoldFifDoc(unsigned int pos, int length, int, + WordList*[], Accessor &styler) +{ + int curLine = styler.GetLine(pos); + int prevLevel = curLine > 0 ? styler.LevelAt(curLine-1) : SC_FOLDLEVELBASE; + + unsigned int end = pos+length; + pos = styler.LineStart(curLine); + + do { + int nextLevel; + switch (styler.StyleAt(pos)) { + case SCLEX_FIF_DEFAULT: + nextLevel = SC_FOLDLEVELBASE; + break; + case SCLEX_FIF_PROJECT: + nextLevel = (SC_FOLDLEVELBASE + 1) | SC_FOLDLEVELHEADERFLAG; + break; + case SCLEX_FIF_FILE: + nextLevel = (SC_FOLDLEVELBASE + 2) | SC_FOLDLEVELHEADERFLAG; + break; + default: + nextLevel = prevLevel & SC_FOLDLEVELHEADERFLAG ? (prevLevel & SC_FOLDLEVELNUMBERMASK) + 1 : prevLevel; + break; + } + if ((nextLevel & SC_FOLDLEVELHEADERFLAG) && nextLevel == prevLevel) { + styler.SetLevel(curLine-1, prevLevel & ~SC_FOLDLEVELHEADERFLAG); + } + styler.SetLevel(curLine, nextLevel); + + curLine++; + prevLevel = nextLevel; + pos = styler.LineStart(curLine); + } while (pos < end); +} + +static const char * const fifWordListDesc[] = { + "Internal Commands", + "External Commands", + 0 +}; + +static const char * const emptyWordListDesc[] = { + 0 +}; + +LexerModule lmFif(SCLEX_FIF, ColouriseFifDoc, "fif", FoldFifDoc, fifWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexFlagship.cxx b/sdk/wxscintilla/src/scintilla/src/LexFlagship.cxx new file mode 100644 index 0000000..e3a8b9f --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexFlagship.cxx @@ -0,0 +1,352 @@ +// Scintilla source code edit control +/** @file LexFlagShip.cxx + ** Lexer for Harbour and FlagShip. + ** (Syntactically compatible to other xBase dialects, like Clipper, dBase, Clip, FoxPro etc.) + **/ +// Copyright 2005 by Randy Butler +// Copyright 2010 by Xavi (Harbour) +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" +#include "CharacterSet.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +// Extended to accept accented characters +static inline bool IsAWordChar(int ch) +{ + return ch >= 0x80 || + (isalnum(ch) || ch == '_'); +} + +static void ColouriseFlagShipDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) +{ + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + WordList &keywords4 = *keywordlists[3]; + WordList &keywords5 = *keywordlists[4]; + + // property lexer.flagship.styling.within.preprocessor + // For Harbour code, determines whether all preprocessor code is styled in the preprocessor style (0) or only from the + // initial # to the end of the command word(1, the default). It also determines how to present text, dump, and disabled code. + bool stylingWithinPreprocessor = styler.GetPropertyInt("lexer.flagship.styling.within.preprocessor", 1) != 0; + + CharacterSet setDoxygen(CharacterSet::setAlpha, "$@\\&<>#{}[]"); + + int visibleChars = 0; + int closeStringChar = 0; + int styleBeforeDCKeyword = SCE_FS_DEFAULT; + bool bEnableCode = initStyle < SCE_FS_DISABLEDCODE; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + + // Determine if the current state should terminate. + switch (sc.state) { + case SCE_FS_OPERATOR: + case SCE_FS_OPERATOR_C: + case SCE_FS_WORDOPERATOR: + sc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C); + break; + case SCE_FS_IDENTIFIER: + case SCE_FS_IDENTIFIER_C: + if (!IsAWordChar(sc.ch)) { + char s[64]; + sc.GetCurrentLowered(s, sizeof(s)); + if (keywords.InList(s)) { + sc.ChangeState(bEnableCode ? SCE_FS_KEYWORD : SCE_FS_KEYWORD_C); + } else if (keywords2.InList(s)) { + sc.ChangeState(bEnableCode ? SCE_FS_KEYWORD2 : SCE_FS_KEYWORD2_C); + } else if (bEnableCode && keywords3.InList(s)) { + sc.ChangeState(SCE_FS_KEYWORD3); + } else if (bEnableCode && keywords4.InList(s)) { + sc.ChangeState(SCE_FS_KEYWORD4); + }// Else, it is really an identifier... + sc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C); + } + break; + case SCE_FS_NUMBER: + if (!IsAWordChar(sc.ch) && !(sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_FS_DEFAULT); + } + break; + case SCE_FS_NUMBER_C: + if (!IsAWordChar(sc.ch) && sc.ch != '.') { + sc.SetState(SCE_FS_DEFAULT_C); + } + break; + case SCE_FS_CONSTANT: + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_FS_DEFAULT); + } + break; + case SCE_FS_STRING: + case SCE_FS_STRING_C: + if (sc.ch == closeStringChar) { + sc.ForwardSetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C); + } else if (sc.atLineEnd) { + sc.ChangeState(bEnableCode ? SCE_FS_STRINGEOL : SCE_FS_STRINGEOL_C); + } + break; + case SCE_FS_STRINGEOL: + case SCE_FS_STRINGEOL_C: + if (sc.atLineStart) { + sc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C); + } + break; + case SCE_FS_COMMENTDOC: + case SCE_FS_COMMENTDOC_C: + if (sc.Match('*', '/')) { + sc.Forward(); + sc.ForwardSetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C); + } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support + // Verify that we have the conditions to mark a comment-doc-keyword + if ((IsASpace(sc.chPrev) || sc.chPrev == '*') && (!IsASpace(sc.chNext))) { + styleBeforeDCKeyword = bEnableCode ? SCE_FS_COMMENTDOC : SCE_FS_COMMENTDOC_C; + sc.SetState(SCE_FS_COMMENTDOCKEYWORD); + } + } + break; + case SCE_FS_COMMENT: + case SCE_FS_COMMENTLINE: + if (sc.atLineStart) { + sc.SetState(SCE_FS_DEFAULT); + } + break; + case SCE_FS_COMMENTLINEDOC: + case SCE_FS_COMMENTLINEDOC_C: + if (sc.atLineStart) { + sc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C); + } else if (sc.ch == '@' || sc.ch == '\\') { // JavaDoc and Doxygen support + // Verify that we have the conditions to mark a comment-doc-keyword + if ((IsASpace(sc.chPrev) || sc.chPrev == '/' || sc.chPrev == '!') && (!IsASpace(sc.chNext))) { + styleBeforeDCKeyword = bEnableCode ? SCE_FS_COMMENTLINEDOC : SCE_FS_COMMENTLINEDOC_C; + sc.SetState(SCE_FS_COMMENTDOCKEYWORD); + } + } + break; + case SCE_FS_COMMENTDOCKEYWORD: + if ((styleBeforeDCKeyword == SCE_FS_COMMENTDOC || styleBeforeDCKeyword == SCE_FS_COMMENTDOC_C) && + sc.Match('*', '/')) { + sc.ChangeState(SCE_FS_COMMENTDOCKEYWORDERROR); + sc.Forward(); + sc.ForwardSetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C); + } else if (!setDoxygen.Contains(sc.ch)) { + char s[64]; + sc.GetCurrentLowered(s, sizeof(s)); + if (!IsASpace(sc.ch) || !keywords5.InList(s + 1)) { + sc.ChangeState(SCE_FS_COMMENTDOCKEYWORDERROR); + } + sc.SetState(styleBeforeDCKeyword); + } + break; + case SCE_FS_PREPROCESSOR: + case SCE_FS_PREPROCESSOR_C: + if (sc.atLineEnd) { + if (!(sc.chPrev == ';' || sc.GetRelative(-2) == ';')) { + sc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C); + } + } else if (stylingWithinPreprocessor) { + if (IsASpaceOrTab(sc.ch)) { + sc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C); + } + } else if (sc.Match('/', '*') || sc.Match('/', '/') || sc.Match('&', '&')) { + sc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C); + } + break; + case SCE_FS_DISABLEDCODE: + if (sc.ch == '#' && visibleChars == 0) { + sc.SetState(bEnableCode ? SCE_FS_PREPROCESSOR : SCE_FS_PREPROCESSOR_C); + do { // Skip whitespace between # and preprocessor word + sc.Forward(); + } while (IsASpaceOrTab(sc.ch) && sc.More()); + if (sc.MatchIgnoreCase("pragma")) { + sc.Forward(6); + do { // Skip more whitespace until keyword + sc.Forward(); + } while (IsASpaceOrTab(sc.ch) && sc.More()); + if (sc.MatchIgnoreCase("enddump") || sc.MatchIgnoreCase("__endtext")) { + bEnableCode = true; + sc.SetState(SCE_FS_DISABLEDCODE); + sc.Forward(sc.ch == '_' ? 8 : 6); + sc.ForwardSetState(SCE_FS_DEFAULT); + } else { + sc.ChangeState(SCE_FS_DISABLEDCODE); + } + } else { + sc.ChangeState(SCE_FS_DISABLEDCODE); + } + } + break; + case SCE_FS_DATE: + if (sc.ch == '}') { + sc.ForwardSetState(SCE_FS_DEFAULT); + } else if (sc.atLineEnd) { + sc.ChangeState(SCE_FS_STRINGEOL); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_FS_DEFAULT || sc.state == SCE_FS_DEFAULT_C) { + if (bEnableCode && + (sc.MatchIgnoreCase(".and.") || sc.MatchIgnoreCase(".not."))) { + sc.SetState(SCE_FS_WORDOPERATOR); + sc.Forward(4); + } else if (bEnableCode && sc.MatchIgnoreCase(".or.")) { + sc.SetState(SCE_FS_WORDOPERATOR); + sc.Forward(3); + } else if (bEnableCode && + (sc.MatchIgnoreCase(".t.") || sc.MatchIgnoreCase(".f.") || + (!IsAWordChar(sc.GetRelative(3)) && sc.MatchIgnoreCase("nil")))) { + sc.SetState(SCE_FS_CONSTANT); + sc.Forward(2); + } else if (sc.Match('/', '*')) { + sc.SetState(bEnableCode ? SCE_FS_COMMENTDOC : SCE_FS_COMMENTDOC_C); + sc.Forward(); + } else if (bEnableCode && sc.Match('&', '&')) { + sc.SetState(SCE_FS_COMMENTLINE); + sc.Forward(); + } else if (sc.Match('/', '/')) { + sc.SetState(bEnableCode ? SCE_FS_COMMENTLINEDOC : SCE_FS_COMMENTLINEDOC_C); + sc.Forward(); + } else if (bEnableCode && sc.ch == '*' && visibleChars == 0) { + sc.SetState(SCE_FS_COMMENT); + } else if (sc.ch == '\"' || sc.ch == '\'') { + sc.SetState(bEnableCode ? SCE_FS_STRING : SCE_FS_STRING_C); + closeStringChar = sc.ch; + } else if (closeStringChar == '>' && sc.ch == '<') { + sc.SetState(bEnableCode ? SCE_FS_STRING : SCE_FS_STRING_C); + } else if (sc.ch == '#' && visibleChars == 0) { + sc.SetState(bEnableCode ? SCE_FS_PREPROCESSOR : SCE_FS_PREPROCESSOR_C); + do { // Skip whitespace between # and preprocessor word + sc.Forward(); + } while (IsASpaceOrTab(sc.ch) && sc.More()); + if (sc.atLineEnd) { + sc.SetState(bEnableCode ? SCE_FS_DEFAULT : SCE_FS_DEFAULT_C); + } else if (sc.MatchIgnoreCase("include")) { + if (stylingWithinPreprocessor) { + closeStringChar = '>'; + } + } else if (sc.MatchIgnoreCase("pragma")) { + sc.Forward(6); + do { // Skip more whitespace until keyword + sc.Forward(); + } while (IsASpaceOrTab(sc.ch) && sc.More()); + if (sc.MatchIgnoreCase("begindump") || sc.MatchIgnoreCase("__cstream")) { + bEnableCode = false; + if (stylingWithinPreprocessor) { + sc.SetState(SCE_FS_DISABLEDCODE); + sc.Forward(8); + sc.ForwardSetState(SCE_FS_DEFAULT_C); + } else { + sc.SetState(SCE_FS_DISABLEDCODE); + } + } else if (sc.MatchIgnoreCase("enddump") || sc.MatchIgnoreCase("__endtext")) { + bEnableCode = true; + sc.SetState(SCE_FS_DISABLEDCODE); + sc.Forward(sc.ch == '_' ? 8 : 6); + sc.ForwardSetState(SCE_FS_DEFAULT); + } + } + } else if (bEnableCode && sc.ch == '{') { + int p = 0; + int chSeek; + unsigned int endPos(startPos + length); + do { // Skip whitespace + chSeek = sc.GetRelative(++p); + } while (IsASpaceOrTab(chSeek) && (sc.currentPos + p < endPos)); + if (chSeek == '^') { + sc.SetState(SCE_FS_DATE); + } else { + sc.SetState(SCE_FS_OPERATOR); + } + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(bEnableCode ? SCE_FS_NUMBER : SCE_FS_NUMBER_C); + } else if (IsAWordChar(sc.ch)) { + sc.SetState(bEnableCode ? SCE_FS_IDENTIFIER : SCE_FS_IDENTIFIER_C); + } else if (isoperator(static_cast(sc.ch)) || (bEnableCode && sc.ch == '@')) { + sc.SetState(bEnableCode ? SCE_FS_OPERATOR : SCE_FS_OPERATOR_C); + } + } + + if (sc.atLineEnd) { + visibleChars = 0; + closeStringChar = 0; + } + if (!IsASpace(sc.ch)) { + visibleChars++; + } + } + sc.Complete(); +} + +static void FoldFlagShipDoc(unsigned int startPos, int length, int, + WordList *[], Accessor &styler) +{ + + int endPos = startPos + length; + + // Backtrack to previous line in case need to fix its fold status + int lineCurrent = styler.GetLine(startPos); + if (startPos > 0 && lineCurrent > 0) { + lineCurrent--; + startPos = styler.LineStart(lineCurrent); + } + int spaceFlags = 0; + int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags); + char chNext = styler[startPos]; + for (int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + + if ((ch == '\r' && chNext != '\n') || (ch == '\n') || (i == endPos-1)) { + int lev = indentCurrent; + int indentNext = styler.IndentAmount(lineCurrent + 1, &spaceFlags); + if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG)) { + if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) { + lev |= SC_FOLDLEVELHEADERFLAG; + } else if (indentNext & SC_FOLDLEVELWHITEFLAG) { + int spaceFlags2 = 0; + int indentNext2 = styler.IndentAmount(lineCurrent + 2, &spaceFlags2); + if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext2 & SC_FOLDLEVELNUMBERMASK)) { + lev |= SC_FOLDLEVELHEADERFLAG; + } + } + } + indentCurrent = indentNext; + styler.SetLevel(lineCurrent, lev); + lineCurrent++; + } + } +} + +static const char * const FSWordListDesc[] = { + "Keywords Commands", + "Std Library Functions", + "Procedure, return, exit", + "Class (oop)", + "Doxygen keywords", + 0 +}; + +LexerModule lmFlagShip(SCLEX_FLAGSHIP, ColouriseFlagShipDoc, "flagship", FoldFlagShipDoc, FSWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexForth.cxx b/sdk/wxscintilla/src/scintilla/src/LexForth.cxx new file mode 100644 index 0000000..e52543f --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexForth.cxx @@ -0,0 +1,176 @@ +// Scintilla source code edit control +/** @file LexForth.cxx + ** Lexer for FORTH + **/ +// Copyright 1998-2003 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static inline bool IsAWordChar(int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '.' || + ch == '_' || ch == '?' || ch == '"' || ch == '@' || + ch == '!' || ch == '[' || ch == ']' || ch == '/' || + ch == '+' || ch == '-' || ch == '*' || ch == '<' || + ch == '>' || ch == '=' || ch == ';' || ch == '(' || + ch == ')' ); +} + +static inline bool IsAWordStart(int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '.'); +} + +static inline bool IsANumChar(int ch) { + return (ch < 0x80) && (isxdigit(ch) || ch == '.' || ch == 'e' || ch == 'E' ); +} + +static inline bool IsASpaceChar(int ch) { + return (ch < 0x80) && isspace(ch); +} + +static void ColouriseForthDoc(unsigned int startPos, int length, int initStyle, WordList *keywordLists[], + Accessor &styler) { + + WordList &control = *keywordLists[0]; + WordList &keyword = *keywordLists[1]; + WordList &defword = *keywordLists[2]; + WordList &preword1 = *keywordLists[3]; + WordList &preword2 = *keywordLists[4]; + WordList &strings = *keywordLists[5]; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) + { + // Determine if the current state should terminate. + if (sc.state == SCE_FORTH_COMMENT) { + if (sc.atLineEnd) { + sc.SetState(SCE_FORTH_DEFAULT); + } + }else if (sc.state == SCE_FORTH_COMMENT_ML) { + if (sc.ch == ')') { + sc.ForwardSetState(SCE_FORTH_DEFAULT); + } + }else if (sc.state == SCE_FORTH_IDENTIFIER || sc.state == SCE_FORTH_NUMBER) { + // handle numbers here too, because what we thought was a number might + // turn out to be a keyword e.g. 2DUP + if (IsASpaceChar(sc.ch) ) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + int newState = sc.state == SCE_FORTH_NUMBER ? SCE_FORTH_NUMBER : SCE_FORTH_DEFAULT; + if (control.InList(s)) { + sc.ChangeState(SCE_FORTH_CONTROL); + } else if (keyword.InList(s)) { + sc.ChangeState(SCE_FORTH_KEYWORD); + } else if (defword.InList(s)) { + sc.ChangeState(SCE_FORTH_DEFWORD); + } else if (preword1.InList(s)) { + sc.ChangeState(SCE_FORTH_PREWORD1); + } else if (preword2.InList(s)) { + sc.ChangeState(SCE_FORTH_PREWORD2); + } else if (strings.InList(s)) { + sc.ChangeState(SCE_FORTH_STRING); + newState = SCE_FORTH_STRING; + } + sc.SetState(newState); + } + if (sc.state == SCE_FORTH_NUMBER) { + if (IsASpaceChar(sc.ch)) { + sc.SetState(SCE_FORTH_DEFAULT); + } else if (!IsANumChar(sc.ch)) { + sc.ChangeState(SCE_FORTH_IDENTIFIER); + } + } + }else if (sc.state == SCE_FORTH_STRING) { + if (sc.ch == '\"') { + sc.ForwardSetState(SCE_FORTH_DEFAULT); + } + }else if (sc.state == SCE_FORTH_LOCALE) { + if (sc.ch == '}') { + sc.ForwardSetState(SCE_FORTH_DEFAULT); + } + }else if (sc.state == SCE_FORTH_DEFWORD) { + if (IsASpaceChar(sc.ch)) { + sc.SetState(SCE_FORTH_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_FORTH_DEFAULT) { + if (sc.ch == '\\'){ + sc.SetState(SCE_FORTH_COMMENT); + } else if (sc.ch == '(' && + (sc.atLineStart || IsASpaceChar(sc.chPrev)) && + (sc.atLineEnd || IsASpaceChar(sc.chNext))) { + sc.SetState(SCE_FORTH_COMMENT_ML); + } else if ( (sc.ch == '$' && (isascii(sc.chNext) && isxdigit(sc.chNext))) ) { + // number starting with $ is a hex number + sc.SetState(SCE_FORTH_NUMBER); + while(sc.More() && isascii(sc.chNext) && isxdigit(sc.chNext)) + sc.Forward(); + } else if ( (sc.ch == '%' && (isascii(sc.chNext) && (sc.chNext == '0' || sc.chNext == '1'))) ) { + // number starting with % is binary + sc.SetState(SCE_FORTH_NUMBER); + while(sc.More() && isascii(sc.chNext) && (sc.chNext == '0' || sc.chNext == '1')) + sc.Forward(); + } else if ( isascii(sc.ch) && + (isxdigit(sc.ch) || ((sc.ch == '.' || sc.ch == '-') && isascii(sc.chNext) && isxdigit(sc.chNext)) ) + ){ + sc.SetState(SCE_FORTH_NUMBER); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_FORTH_IDENTIFIER); + } else if (sc.ch == '{') { + sc.SetState(SCE_FORTH_LOCALE); + } else if (sc.ch == ':' && isascii(sc.chNext) && isspace(sc.chNext)) { + // highlight word definitions e.g. : GCD ( n n -- n ) ..... ; + // ^ ^^^ + sc.SetState(SCE_FORTH_DEFWORD); + while(sc.More() && isascii(sc.chNext) && isspace(sc.chNext)) + sc.Forward(); + } else if (sc.ch == ';' && + (sc.atLineStart || IsASpaceChar(sc.chPrev)) && + (sc.atLineEnd || IsASpaceChar(sc.chNext)) ) { + // mark the ';' that ends a word + sc.SetState(SCE_FORTH_DEFWORD); + sc.ForwardSetState(SCE_FORTH_DEFAULT); + } + } + + } + sc.Complete(); +} + +static void FoldForthDoc(unsigned int, int, int, WordList *[], + Accessor &) { +} + +static const char * const forthWordLists[] = { + "control keywords", + "keywords", + "definition words", + "prewords with one argument", + "prewords with two arguments", + "string definition keywords", + 0, + }; + +LexerModule lmForth(SCLEX_FORTH, ColouriseForthDoc, "forth", FoldForthDoc, forthWordLists); + + diff --git a/sdk/wxscintilla/src/scintilla/src/LexFortran.cxx b/sdk/wxscintilla/src/scintilla/src/LexFortran.cxx new file mode 100644 index 0000000..0b3f277 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexFortran.cxx @@ -0,0 +1,466 @@ +// Scintilla source code edit control +/** @file LexFortran.cxx + ** Lexer for Fortran. + ** Writen by Chuan-jian Shen, Last changed Sep. 2003 + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. +/***************************************/ +#include +#include +#include +#include +#include +/***************************************/ +#include "Platform.h" +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +/***********************************************/ +static inline bool IsAWordChar(const int ch) { + return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '%'); +} +/**********************************************/ +static inline bool IsAWordStart(const int ch) { + return (ch < 0x80) && (isalnum(ch)); +} +/***************************************/ +inline bool IsABlank(unsigned int ch) { + return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ; +} +/***************************************/ +inline bool IsALineEnd(char ch) { + return ((ch == '\n') || (ch == '\r')) ; +} +/***************************************/ +unsigned int GetContinuedPos(unsigned int pos, Accessor &styler) { + while (!IsALineEnd(styler.SafeGetCharAt(pos++))) continue; + if (styler.SafeGetCharAt(pos) == '\n') pos++; + while (IsABlank(styler.SafeGetCharAt(pos++))) continue; + char chCur = styler.SafeGetCharAt(pos); + if (chCur == '&') { + while (IsABlank(styler.SafeGetCharAt(++pos))) continue; + return pos; + } else { + return pos; + } +} +/***************************************/ +static void ColouriseFortranDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler, bool isFixFormat) { + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + /***************************************/ + int posLineStart = 0, numNonBlank = 0, prevState = 0; + int endPos = startPos + length; + /***************************************/ + // backtrack to the nearest keyword + while ((startPos > 1) && (styler.StyleAt(startPos) != SCE_F_WORD)) { + startPos--; + } + startPos = styler.LineStart(styler.GetLine(startPos)); + initStyle = styler.StyleAt(startPos - 1); + StyleContext sc(startPos, endPos-startPos, initStyle, styler); + /***************************************/ + for (; sc.More(); sc.Forward()) { + // remember the start position of the line + if (sc.atLineStart) { + posLineStart = sc.currentPos; + numNonBlank = 0; + sc.SetState(SCE_F_DEFAULT); + } + if (!IsASpaceOrTab(sc.ch)) numNonBlank ++; + /***********************************************/ + // Handle the fix format generically + int toLineStart = sc.currentPos - posLineStart; + if (isFixFormat && (toLineStart < 6 || toLineStart > 72)) { + if ((toLineStart == 0 && (tolower(sc.ch) == 'c' || sc.ch == '*')) || sc.ch == '!') { + if (sc.MatchIgnoreCase("cdec$") || sc.MatchIgnoreCase("*dec$") || sc.MatchIgnoreCase("!dec$") || + sc.MatchIgnoreCase("cdir$") || sc.MatchIgnoreCase("*dir$") || sc.MatchIgnoreCase("!dir$") || + sc.MatchIgnoreCase("cms$") || sc.MatchIgnoreCase("*ms$") || sc.MatchIgnoreCase("!ms$") || + sc.chNext == '$') { + sc.SetState(SCE_F_PREPROCESSOR); + } else { + sc.SetState(SCE_F_COMMENT); + } + + while (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end + } else if (toLineStart > 72) { + sc.SetState(SCE_F_COMMENT); + while (!sc.atLineEnd && sc.More()) sc.Forward(); // Until line end + } else if (toLineStart < 5) { + if (IsADigit(sc.ch)) + sc.SetState(SCE_F_LABEL); + else + sc.SetState(SCE_F_DEFAULT); + } else if (toLineStart == 5) { + if (!IsASpace(sc.ch) && sc.ch != '0') { + sc.SetState(SCE_F_CONTINUATION); + sc.ForwardSetState(prevState); + } else + sc.SetState(SCE_F_DEFAULT); + } + continue; + } + /***************************************/ + // Handle line continuation generically. + if (!isFixFormat && sc.ch == '&') { + char chTemp = ' '; + int j = 1; + while (IsABlank(chTemp) && j<132) { + chTemp = static_cast(sc.GetRelative(j)); + j++; + } + if (chTemp == '!') { + sc.SetState(SCE_F_CONTINUATION); + if (sc.chNext == '!') sc.ForwardSetState(SCE_F_COMMENT); + } else if (chTemp == '\r' || chTemp == '\n') { + int currentState = sc.state; + sc.SetState(SCE_F_CONTINUATION); + sc.ForwardSetState(SCE_F_DEFAULT); + while (IsASpace(sc.ch) && sc.More()) sc.Forward(); + if (sc.ch == '&') { + sc.SetState(SCE_F_CONTINUATION); + sc.Forward(); + } + sc.SetState(currentState); + } + } + /***************************************/ + // Determine if the current state should terminate. + if (sc.state == SCE_F_OPERATOR) { + sc.SetState(SCE_F_DEFAULT); + } else if (sc.state == SCE_F_NUMBER) { + if (!(IsAWordChar(sc.ch) || sc.ch=='\'' || sc.ch=='\"' || sc.ch=='.')) { + sc.SetState(SCE_F_DEFAULT); + } + } else if (sc.state == SCE_F_IDENTIFIER) { + if (!IsAWordChar(sc.ch) || (sc.ch == '%')) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + if (keywords.InList(s)) { + sc.ChangeState(SCE_F_WORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_F_WORD2); + } else if (keywords3.InList(s)) { + sc.ChangeState(SCE_F_WORD3); + } + sc.SetState(SCE_F_DEFAULT); + } + } else if (sc.state == SCE_F_COMMENT || sc.state == SCE_F_PREPROCESSOR) { + if (sc.ch == '\r' || sc.ch == '\n') { + sc.SetState(SCE_F_DEFAULT); + } + } else if (sc.state == SCE_F_STRING1) { + prevState = sc.state; + if (sc.ch == '\'') { + if (sc.chNext == '\'') { + sc.Forward(); + } else { + sc.ForwardSetState(SCE_F_DEFAULT); + prevState = SCE_F_DEFAULT; + } + } else if (sc.atLineEnd) { + sc.ChangeState(SCE_F_STRINGEOL); + sc.ForwardSetState(SCE_F_DEFAULT); + } + } else if (sc.state == SCE_F_STRING2) { + prevState = sc.state; + if (sc.atLineEnd) { + sc.ChangeState(SCE_F_STRINGEOL); + sc.ForwardSetState(SCE_F_DEFAULT); + } else if (sc.ch == '\"') { + if (sc.chNext == '\"') { + sc.Forward(); + } else { + sc.ForwardSetState(SCE_F_DEFAULT); + prevState = SCE_F_DEFAULT; + } + } + } else if (sc.state == SCE_F_OPERATOR2) { + if (sc.ch == '.') { + sc.ForwardSetState(SCE_F_DEFAULT); + } + } else if (sc.state == SCE_F_CONTINUATION) { + sc.SetState(SCE_F_DEFAULT); + } else if (sc.state == SCE_F_LABEL) { + if (!IsADigit(sc.ch)) { + sc.SetState(SCE_F_DEFAULT); + } else { + if (isFixFormat && sc.currentPos-posLineStart > 4) + sc.SetState(SCE_F_DEFAULT); + else if (numNonBlank > 5) + sc.SetState(SCE_F_DEFAULT); + } + } + /***************************************/ + // Determine if a new state should be entered. + if (sc.state == SCE_F_DEFAULT) { + if (sc.ch == '!') { + if (sc.MatchIgnoreCase("!dec$") || sc.MatchIgnoreCase("!dir$") || + sc.MatchIgnoreCase("!ms$") || sc.chNext == '$') { + sc.SetState(SCE_F_PREPROCESSOR); + } else { + sc.SetState(SCE_F_COMMENT); + } + } else if ((!isFixFormat) && IsADigit(sc.ch) && numNonBlank == 1) { + sc.SetState(SCE_F_LABEL); + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_F_NUMBER); + } else if ((tolower(sc.ch) == 'b' || tolower(sc.ch) == 'o' || + tolower(sc.ch) == 'z') && (sc.chNext == '\"' || sc.chNext == '\'')) { + sc.SetState(SCE_F_NUMBER); + sc.Forward(); + } else if (sc.ch == '.' && isalpha(sc.chNext)) { + sc.SetState(SCE_F_OPERATOR2); + } else if (IsAWordStart(sc.ch)) { + sc.SetState(SCE_F_IDENTIFIER); + } else if (sc.ch == '\"') { + sc.SetState(SCE_F_STRING2); + } else if (sc.ch == '\'') { + sc.SetState(SCE_F_STRING1); + } else if (isoperator(static_cast(sc.ch))) { + sc.SetState(SCE_F_OPERATOR); + } + } + } + sc.Complete(); +} +/***************************************/ +// To determine the folding level depending on keywords +static int classifyFoldPointFortran(const char* s, const char* prevWord, const char chNextNonBlank) { + int lev = 0; + if ((strcmp(prevWord, "else") == 0 && strcmp(s, "if") == 0) || strcmp(s, "elseif") == 0) + return -1; + if (strcmp(s, "associate") == 0 || strcmp(s, "block") == 0 + || strcmp(s, "blockdata") == 0 || strcmp(s, "select") == 0 + || strcmp(s, "do") == 0 || strcmp(s, "enum") ==0 + || strcmp(s, "function") == 0 || strcmp(s, "interface") == 0 + || strcmp(s, "module") == 0 || strcmp(s, "program") == 0 + || strcmp(s, "subroutine") == 0 || strcmp(s, "then") == 0 + || (strcmp(s, "type") == 0 && chNextNonBlank != '(') ){ + if (strcmp(prevWord, "end") == 0) + lev = 0; + else + lev = 1; + } else if ((strcmp(s, "end") == 0 && chNextNonBlank != '=') + || strcmp(s, "endassociate") == 0 || strcmp(s, "endblock") == 0 + || strcmp(s, "endblockdata") == 0 || strcmp(s, "endselect") == 0 + || strcmp(s, "enddo") == 0 || strcmp(s, "endenum") ==0 + || strcmp(s, "endif") == 0 || strcmp(s, "endforall") == 0 + || strcmp(s, "endfunction") == 0 || strcmp(s, "endinterface") == 0 + || strcmp(s, "endmodule") == 0 || strcmp(s, "endprogram") == 0 + || strcmp(s, "endsubroutine") == 0 || strcmp(s, "endtype") == 0 + || strcmp(s, "endwhere") == 0 + || strcmp(s, "procedure") == 0 ) { // Take care of the module procedure statement + lev = -1; + } else if (strcmp(prevWord, "end") == 0 && strcmp(s, "if") == 0){ // end if + lev = 0; + } + return lev; +} +// Folding the code +static void FoldFortranDoc(unsigned int startPos, int length, int initStyle, + Accessor &styler, bool isFixFormat) { + // + // bool foldComment = styler.GetPropertyInt("fold.comment") != 0; + // Do not know how to fold the comment at the moment. + // + bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0; + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + char chNextNonBlank; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + /***************************************/ + int lastStart = 0; + char prevWord[32] = ""; + char Label[6] = ""; + // Variables for do label folding. + static int doLabels[100]; + static int posLabel=-1; + /***************************************/ + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + chNextNonBlank = chNext; + unsigned int j=i+1; + while(IsABlank(chNextNonBlank) && j(tolower(styler[lastStart+k])); + } + s[k] = '\0'; + // Handle the forall and where statement and structure. + if (strcmp(s, "forall") == 0 || strcmp(s, "where") == 0) { + if (strcmp(prevWord, "end") != 0) { + j = i + 1; + char chBrace = '(', chSeek = ')', ch1 = styler.SafeGetCharAt(j); + // Find the position of the first ( + while (ch1 != chBrace && j -1) { + levelCurrent--; + posLabel--; + } + } + } + if (atEOL) { + int lev = levelPrev; + if (visibleChars == 0 && foldCompact) + lev |= SC_FOLDLEVELWHITEFLAG; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + strcpy(prevWord, ""); + } + /***************************************/ + if (!isspacechar(ch)) visibleChars++; + } + /***************************************/ + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} +/***************************************/ +static const char * const FortranWordLists[] = { + "Primary keywords and identifiers", + "Intrinsic functions", + "Extended and user defined functions", + 0, +}; +/***************************************/ +static void ColouriseFortranDocFreeFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, false); +} +/***************************************/ +static void ColouriseFortranDocFixFormat(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], + Accessor &styler) { + ColouriseFortranDoc(startPos, length, initStyle, keywordlists, styler, true); +} +/***************************************/ +static void FoldFortranDocFreeFormat(unsigned int startPos, int length, int initStyle, + WordList *[], Accessor &styler) { + FoldFortranDoc(startPos, length, initStyle,styler, false); +} +/***************************************/ +static void FoldFortranDocFixFormat(unsigned int startPos, int length, int initStyle, + WordList *[], Accessor &styler) { + FoldFortranDoc(startPos, length, initStyle,styler, true); +} +/***************************************/ +LexerModule lmFortran(SCLEX_FORTRAN, ColouriseFortranDocFreeFormat, "fortran", FoldFortranDocFreeFormat, FortranWordLists); +LexerModule lmF77(SCLEX_F77, ColouriseFortranDocFixFormat, "f77", FoldFortranDocFixFormat, FortranWordLists); diff --git a/sdk/wxscintilla/src/scintilla/src/LexGAP.cxx b/sdk/wxscintilla/src/scintilla/src/LexGAP.cxx new file mode 100644 index 0000000..fb6e739 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexGAP.cxx @@ -0,0 +1,263 @@ +// Scintilla source code edit control +/** @file LexGAP.cxx + ** Lexer for the GAP language. (The GAP System for Computational Discrete Algebra) + ** http://www.gap-system.org + **/ +// Copyright 2007 by Istvan Szollosi ( szteven gmail com ) +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "StyleContext.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +static inline bool IsGAPOperator(char ch) { + if (isascii(ch) && isalnum(ch)) return false; + if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || + ch == '^' || ch == ',' || ch == '!' || ch == '.' || + ch == '=' || ch == '<' || ch == '>' || ch == '(' || + ch == ')' || ch == ';' || ch == '[' || ch == ']' || + ch == '{' || ch == '}' || ch == ':' ) + return true; + return false; +} + +static void GetRange(unsigned int start, unsigned int end, Accessor &styler, char *s, unsigned int len) { + unsigned int i = 0; + while ((i < end - start + 1) && (i < len-1)) { + s[i] = static_cast(styler[start + i]); + i++; + } + s[i] = '\0'; +} + +static void ColouriseGAPDoc(unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler) { + + WordList &keywords1 = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + WordList &keywords4 = *keywordlists[3]; + + // Do not leak onto next line + if (initStyle == SCE_GAP_STRINGEOL) initStyle = SCE_GAP_DEFAULT; + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + + // Prevent SCE_GAP_STRINGEOL from leaking back to previous line + if ( sc.atLineStart ) { + if (sc.state == SCE_GAP_STRING) sc.SetState(SCE_GAP_STRING); + if (sc.state == SCE_GAP_CHAR) sc.SetState(SCE_GAP_CHAR); + } + + // Handle line continuation generically + if (sc.ch == '\\' ) { + if (sc.chNext == '\n' || sc.chNext == '\r') { + sc.Forward(); + if (sc.ch == '\r' && sc.chNext == '\n') { + sc.Forward(); + } + continue; + } + } + + // Determine if the current state should terminate + switch (sc.state) { + case SCE_GAP_OPERATOR : + sc.SetState(SCE_GAP_DEFAULT); + break; + + case SCE_GAP_NUMBER : + if (!IsADigit(sc.ch)) { + if (sc.ch == '\\') { + if (!sc.atLineEnd) { + if (!IsADigit(sc.chNext)) { + sc.Forward(); + sc.ChangeState(SCE_GAP_IDENTIFIER); + } + } + } else if (isalpha(sc.ch) || sc.ch == '_') { + sc.ChangeState(SCE_GAP_IDENTIFIER); + } + else sc.SetState(SCE_GAP_DEFAULT); + } + break; + + case SCE_GAP_IDENTIFIER : + if (!(iswordstart(static_cast(sc.ch)) || sc.ch == '$')) { + if (sc.ch == '\\') sc.Forward(); + else { + char s[1000]; + sc.GetCurrent(s, sizeof(s)); + if (keywords1.InList(s)) { + sc.ChangeState(SCE_GAP_KEYWORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_GAP_KEYWORD2); + } else if (keywords3.InList(s)) { + sc.ChangeState(SCE_GAP_KEYWORD3); + } else if (keywords4.InList(s)) { + sc.ChangeState(SCE_GAP_KEYWORD4); + } + sc.SetState(SCE_GAP_DEFAULT); + } + } + break; + + case SCE_GAP_COMMENT : + if (sc.atLineEnd) { + sc.SetState(SCE_GAP_DEFAULT); + } + break; + + case SCE_GAP_STRING: + if (sc.atLineEnd) { + sc.ChangeState(SCE_GAP_STRINGEOL); + } else if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\"') { + sc.ForwardSetState(SCE_GAP_DEFAULT); + } + break; + + case SCE_GAP_CHAR: + if (sc.atLineEnd) { + sc.ChangeState(SCE_GAP_STRINGEOL); + } else if (sc.ch == '\\') { + if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + sc.Forward(); + } + } else if (sc.ch == '\'') { + sc.ForwardSetState(SCE_GAP_DEFAULT); + } + break; + + case SCE_GAP_STRINGEOL: + if (sc.atLineStart) { + sc.SetState(SCE_GAP_DEFAULT); + } + break; + } + + // Determine if a new state should be entered + if (sc.state == SCE_GAP_DEFAULT) { + if (IsGAPOperator(static_cast(sc.ch))) { + sc.SetState(SCE_GAP_OPERATOR); + } + else if (IsADigit(sc.ch)) { + sc.SetState(SCE_GAP_NUMBER); + } else if (isalpha(sc.ch) || sc.ch == '_' || sc.ch == '\\' || sc.ch == '$' || sc.ch == '~') { + sc.SetState(SCE_GAP_IDENTIFIER); + if (sc.ch == '\\') sc.Forward(); + } else if (sc.ch == '#') { + sc.SetState(SCE_GAP_COMMENT); + } else if (sc.ch == '\"') { + sc.SetState(SCE_GAP_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_GAP_CHAR); + } + } + + } + sc.Complete(); +} + +static int ClassifyFoldPointGAP(const char* s) { + int level = 0; + if (strcmp(s, "function") == 0 || + strcmp(s, "do") == 0 || + strcmp(s, "if") == 0 || + strcmp(s, "repeat") == 0 ) { + level = 1; + } else if (strcmp(s, "end") == 0 || + strcmp(s, "od") == 0 || + strcmp(s, "fi") == 0 || + strcmp(s, "until") == 0 ) { + level = -1; + } + return level; +} + +static void FoldGAPDoc( unsigned int startPos, int length, int initStyle, WordList** , Accessor &styler) { + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + + int lastStart = 0; + + for (unsigned int i = startPos; i < endPos; i++) { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + + if (stylePrev != SCE_GAP_KEYWORD && style == SCE_GAP_KEYWORD) { + // Store last word start point. + lastStart = i; + } + + if (stylePrev == SCE_GAP_KEYWORD) { + if(iswordchar(ch) && !iswordchar(chNext)) { + char s[100]; + GetRange(lastStart, i, styler, s, sizeof(s)); + levelCurrent += ClassifyFoldPointGAP(s); + } + } + + if (atEOL) { + int lev = levelPrev; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + lev |= SC_FOLDLEVELHEADERFLAG; + if (lev != styler.LevelAt(lineCurrent)) { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + + if (!isspacechar(ch)) + visibleChars++; + } + + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); +} + +static const char * const GAPWordListDesc[] = { + "Keywords 1", + "Keywords 2", + "Keywords 3 (unused)", + "Keywords 4 (unused)", + 0 +}; + +LexerModule lmGAP( + SCLEX_GAP, + ColouriseGAPDoc, + "gap", + FoldGAPDoc, + GAPWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexGCC.cxx b/sdk/wxscintilla/src/scintilla/src/LexGCC.cxx new file mode 100644 index 0000000..3a96b4d --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexGCC.cxx @@ -0,0 +1,119 @@ +// Scintilla source code edit control +/** @file LexOthers.cxx + ** Lexers for batch files, diff results, properties files, make files and error lists. + ** Also lexer for LaTeX documents. + **/ +// Copyright 1998-2001 by Eran Ifrah +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include +#include +#include +#include +#include + +#include "Platform.h" + +#include "PropSet.h" +#include "Accessor.h" +#include "KeyWords.h" +#include "Scintilla.h" +#include "SciLexer.h" +#include "StyleContext.h" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +typedef int (*GCC_COLOUR_FUNC_PTR)(int, const char*, size_t&, size_t&); + +static GCC_COLOUR_FUNC_PTR s_gccColourFunc = NULL; + +void SetGccColourFunction(GCC_COLOUR_FUNC_PTR func) +{ + s_gccColourFunc = func; +} + +static inline bool AtEOL(Accessor &styler, unsigned int i) +{ + return (styler[i] == '\n') || + ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')); +} + +static void ColouriseGccDoc( + unsigned int pos, + int length, + int /*initStyle*/, + WordList * /*keywordlists*/[], + Accessor &styler) +{ + std::string line; + line.reserve(2048); + + styler.StartAt(pos); + styler.StartSegment(pos); + + for (; length > 0; pos++, length--) { + line += styler[pos]; + if (AtEOL(styler, pos)) { + // End of line met, colourise it + int style = SCLEX_GCC_OUTPUT; + if (s_gccColourFunc) { + size_t start(0); + size_t len(0); + int startLine = pos-line.size()+1; + style = s_gccColourFunc(startLine, line.c_str(), start, len); + if(len != 0) { + styler.ColourTo(startLine + start - 1, style); + styler.ColourTo(startLine + start + len - 1, SCLEX_GCC_FILE_LINK); + } + } + styler.ColourTo(pos, style); + line.clear(); + } + } +} + +static void FoldGccDoc(unsigned int pos, int length, int, + WordList*[], Accessor &styler) +{ + int curLine = styler.GetLine(pos); + int prevLevel = curLine > 0 ? styler.LevelAt(curLine-1) : SC_FOLDLEVELBASE; + + unsigned int end = pos+length; + pos = styler.LineStart(curLine); + + do { + int nextLevel; + switch (styler.StyleAt(pos)) { + case SCLEX_GCC_BUILDING: + nextLevel = SC_FOLDLEVELBASE | SC_FOLDLEVELHEADERFLAG; + break; + default: + nextLevel = prevLevel & SC_FOLDLEVELHEADERFLAG ? (prevLevel & SC_FOLDLEVELNUMBERMASK) + 1 : prevLevel; + break; + } + if ((nextLevel & SC_FOLDLEVELHEADERFLAG) && nextLevel == prevLevel) { + styler.SetLevel(curLine-1, prevLevel & ~SC_FOLDLEVELHEADERFLAG); + } + styler.SetLevel(curLine, nextLevel); + + curLine++; + prevLevel = nextLevel; + pos = styler.LineStart(curLine); + } while (pos < end); +} + +static const char * const gccWordListDesc[] = { + "Internal Commands", + "External Commands", + 0 +}; + +static const char * const emptyWordListDesc[] = { + 0 +}; + +LexerModule lmGcc(SCLEX_GCC, ColouriseGccDoc, "gcc", FoldGccDoc, gccWordListDesc); diff --git a/sdk/wxscintilla/src/scintilla/src/LexGen.py b/sdk/wxscintilla/src/scintilla/src/LexGen.py new file mode 100644 index 0000000..c5ea800 --- /dev/null +++ b/sdk/wxscintilla/src/scintilla/src/LexGen.py @@ -0,0 +1,287 @@ +# LexGen.py - implemented 2002 by Neil Hodgson neilh@scintilla.org +# Released to the public domain. + +# Regenerate the Scintilla and SciTE source files that list +# all the lexers and all the properties files. +# Should be run whenever a new lexer is added or removed. +# Requires Python 2.4 or later +# Most files are regenerated in place with templates stored in comments. +# The VS .NET project file is generated into a different file as the +# VS .NET environment will not retain comments when modifying the file. +# The files are copied to a string apart from sections between a +# ++Autogenerated comment and a --Autogenerated comment which is +# generated by the CopyWithInsertion function. After the whole +# string is instantiated, it is compared with the target file and +# if different the file is rewritten. +# Does not regenerate the Visual C++ 6 project files but does the VS .NET +# project file. + +import string +import sys +import os +import glob + +# EOL constants +CR = "\r" +LF = "\n" +CRLF = "\r\n" +if sys.platform == "win32": + NATIVE = CRLF +else: + # Yes, LF is the native EOL even on Mac OS X. CR is just for + # Mac OS <=9 (a.k.a. "Mac Classic") + NATIVE = LF + +# Automatically generated sections contain start and end comments, +# a definition line and the results. +# The results are replaced by regenerating based on the definition line. +# The definition line is a comment prefix followed by "**". +# If there is a digit after the ** then this indicates which list to use +# and the digit and next character are not part of the definition +# Backslash is used as an escape within the definition line. +# The part between \( and \) is repeated for each item in the list. +# \* is replaced by each list item. \t, and \n are tab and newline. +def CopyWithInsertion(input, commentPrefix, retainDefs, eolType, *lists): + copying = 1 + listid = 0 + output = [] + for line in input.splitlines(0): + isStartGenerated = line.startswith(commentPrefix + "++Autogenerated") + if copying and not isStartGenerated: + output.append(line) + if isStartGenerated: + if retainDefs: + output.append(line) + copying = 0 + definition = "" + elif not copying and line.startswith(commentPrefix + "**"): + if retainDefs: + output.append(line) + definition = line[len(commentPrefix + "**"):] + if (commentPrefix == "" in definition): + definition = definition.replace(" -->", "") + listid = 0 + if definition[0] in string.digits: + listid = int(definition[:1]) + definition = definition[2:] + # Hide double slashes as a control character + definition = definition.replace("\\\\", "\001") + # Do some normal C style transforms + definition = definition.replace("\\n", "\n") + definition = definition.replace("\\t", "\t") + # Get the doubled backslashes back as single backslashes + definition = definition.replace("\001", "\\") + startRepeat = definition.find("\\(") + endRepeat = definition.find("\\)") + intro = definition[:startRepeat] + out = "" + if intro.endswith("\n"): + pos = 0 + else: + pos = len(intro) + out += intro + middle = definition[startRepeat+2:endRepeat] + for i in lists[listid]: + item = middle.replace("\\*", i) + if pos and (pos + len(item) >= 80): + out += "\\\n" + pos = 0 + out += item + pos += len(item) + if item.endswith("\n"): + pos = 0 + outro = definition[endRepeat+2:] + out += outro + out = out.replace("\n", eolType) # correct EOLs in generated content + output.append(out) + elif line.startswith(commentPrefix + "--Autogenerated"): + copying = 1 + if retainDefs: + output.append(line) + output = [line.rstrip(" \t") for line in output] # trim trailing whitespace + return eolType.join(output) + eolType + +def UpdateFile(filename, updated): + """ If the file is different to updated then copy updated + into the file else leave alone so CVS and make don't treat + it as modified. """ + try: + infile = open(filename, "rb") + except IOError: # File is not there yet + out = open(filename, "wb") + out.write(updated.encode('utf-8')) + out.close() + print("New %s" % filename) + return + original = infile.read() + infile.close() + original = original.decode('utf-8') + if updated != original: + os.unlink(filename) + out = open(filename, "wb") + out.write(updated.encode('utf-8')) + out.close() + print("Changed %s " % filename) + #~ else: + #~ print "Unchanged", filename + +def Generate(inpath, outpath, commentPrefix, eolType, *lists): + """Generate 'outpath' from 'inpath'. + + "eolType" indicates the type of EOLs to use in the generated + file. It should be one of following constants: LF, CRLF, + CR, or NATIVE. + """ + #print "generate '%s' -> '%s' (comment prefix: %r, eols: %r)"\ + # % (inpath, outpath, commentPrefix, eolType) + try: + infile = open(inpath, "rb") + except IOError: + print("Can not open %s" % inpath) + return + original = infile.read() + infile.close() + original = original.decode('utf-8') + updated = CopyWithInsertion(original, commentPrefix, + inpath == outpath, eolType, *lists) + UpdateFile(outpath, updated) + +def Regenerate(filename, commentPrefix, eolType, *lists): + """Regenerate the given file. + + "eolType" indicates the type of EOLs to use in the generated + file. It should be one of following constants: LF, CRLF, + CR, or NATIVE. + """ + Generate(filename, filename, commentPrefix, eolType, *lists) + +def FindModules(lexFile): + modules = [] + f = open(lexFile) + for l in f.readlines(): + if l.startswith("LexerModule"): + l = l.replace("(", " ") + modules.append(l.split()[1]) + return modules + +knownIrregularProperties = [ + "fold", + "styling.within.preprocessor", + "tab.timmy.whinge.level", + "asp.default.language", + "html.tags.case.sensitive", + "ps.level", + "ps.tokenize", + "sql.backslash.escapes", + "nsis.uservars", + "nsis.ignorecase" +] + +def FindProperties(lexFile): + properties = {} + f = open(lexFile) + for l in f.readlines(): + if "GetProperty" in l and '"' in l: + l = l.strip() + if not l.startswith("//"): # Drop comments + propertyName = l.split("\"")[1] + if propertyName.lower() == propertyName: + # Only allow lower case property names + if propertyName in knownIrregularProperties or \ + propertyName.startswith("fold.") or \ + propertyName.startswith("lexer."): + properties[propertyName] = 1 + return properties + +def FindPropertyDocumentation(lexFile): + documents = {} + f = open(lexFile) + name = "" + for l in f.readlines(): + l = l.strip() + if "// property " in l: + propertyName = l.split()[2] + if propertyName.lower() == propertyName: + # Only allow lower case property names + name = propertyName + documents[name] = "" + elif name: + if l.startswith("//"): + if documents[name]: + documents[name] += " " + documents[name] += l[2:].strip() + else: + name = "" + return documents + +def ciCompare(a,b): + return cmp(a.lower(), b.lower()) + +def ciKey(a): + return a.lower() + +def sortListInsensitive(l): + try: # Try key function + l.sort(key=ciKey) + except TypeError: # Earlier version of Python, so use comparison function + l.sort(ciCompare) + +def RegenerateAll(): + root="../../" + + # Find all the lexer source code files + lexFilePaths = glob.glob(root + "scintilla/src/Lex*.cxx") + sortListInsensitive(lexFilePaths) + lexFiles = [os.path.basename(f)[:-4] for f in lexFilePaths] + print(lexFiles) + lexerModules = [] + lexerProperties = {} + propertyDocuments = {} + for lexFile in lexFilePaths: + lexerModules.extend(FindModules(lexFile)) + for k in FindProperties(lexFile).keys(): + lexerProperties[k] = 1 + documents = FindPropertyDocumentation(lexFile) + for k in documents.keys(): + propertyDocuments[k] = documents[k] + sortListInsensitive(lexerModules) + del lexerProperties["fold.comment.python"] + lexerProperties = list(lexerProperties.keys()) + sortListInsensitive(lexerProperties) + + # Generate HTML to document each property + # This is done because tags can not be safely put inside comments in HTML + documentProperties = list(propertyDocuments.keys()) + sortListInsensitive(documentProperties) + propertiesHTML = [] + for k in documentProperties: + propertiesHTML.append("\t\n\t%s\n\t%s\n\t" % + (k, propertyDocuments[k])) + + # Find all the SciTE properties files + otherProps = ["abbrev.properties", "Embedded.properties", "SciTEGlobal.properties", "SciTE.properties"] + if os.path.exists(root + "scite"): + propFilePaths = glob.glob(root + "scite/src/*.properties") + sortListInsensitive(propFilePaths) + propFiles = [os.path.basename(f) for f in propFilePaths if os.path.basename(f) not in otherProps] + sortListInsensitive(propFiles) + print(propFiles) + + Regenerate(root + "scintilla/src/KeyWords.cxx", "//", NATIVE, lexerModules) + Regenerate(root + "scintilla/win32/makefile", "#", NATIVE, lexFiles) + Regenerate(root + "scintilla/win32/scintilla.mak", "#", NATIVE, lexFiles) + Regenerate(root + "scintilla/win32/scintilla_vc6.mak", "#", NATIVE, lexFiles) + # Use Unix EOLs for gtk Makefiles so they work for Linux users when + # extracted from the Scintilla source ZIP (typically created on + # Windows). + Regenerate(root + "scintilla/gtk/makefile", "#", LF, lexFiles) + Regenerate(root + "scintilla/macosx/makefile", "#", LF, lexFiles) + if os.path.exists(root + "scite"): + Regenerate(root + "scite/win32/makefile", "#", NATIVE, lexFiles, propFiles) + Regenerate(root + "scite/win32/scite.mak", "#", NATIVE, lexFiles, propFiles) + Regenerate(root + "scite/src/SciTEProps.cxx", "//", NATIVE, lexerProperties) + Regenerate(root + "scite/doc/SciTEDoc.html", "
  • p`+buUA`MV3WC?8m4v?c0 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�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�i6(N#N>np{U2 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�zpzMV5pJzz^f>cor)WeO?9C6sI6!c$La)dv= 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�=OW8m-a%p4iwa@}9Q5EF5D)^kMy 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 literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/2-7 Collision Avoidance Mode.png b/doc/Rapport post-doc/figures/2-7 Collision Avoidance Mode.png new file mode 100644 index 0000000000000000000000000000000000000000..2b6e06d335b51fce21eb2765e8004986a772a670 GIT binary patch literal 16288 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 FzX12vj~4&{ literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/2-8 OCM automaton.png b/doc/Rapport post-doc/figures/2-8 OCM automaton.png new file mode 100644 index 0000000000000000000000000000000000000000..d240c1b55f6da73b8dafbe81ccb15f11f9073fa5 GIT binary patch literal 18207 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 C^FTiU literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/AOCS mode.png b/doc/Rapport post-doc/figures/AOCS mode.png new file mode 100644 index 0000000000000000000000000000000000000000..a5cf7821ba78b25badea7941dcc78c25798361c0 GIT binary patch literal 94752 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 S_n7XG!Tjtz`Tif1^#221@u1%T literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/AOCSmode_schema.png b/doc/Rapport post-doc/figures/AOCSmode_schema.png new file mode 100644 index 0000000000000000000000000000000000000000..9a5276becdb4b8b972d56e86ba16bbb8843783a2 GIT binary patch literal 76954 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�J7q=a-OkP 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 literal 0 HcmV?d00001 diff --git a/doc/Rapport post-doc/figures/AirSpeed_Computation.jpg b/doc/Rapport post-doc/figures/AirSpeed_Computation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5756bbc46aa81045c7437ca3db2e7e9a929cf845 GIT binary patch literal 170707 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⪚Zusys^Q>HP>pX#_SK8)cqlsEklJ~Q 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