ruby-cbc 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +4 -0
  6. data/README.md +203 -0
  7. data/Rakefile +40 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +7 -0
  10. data/ext/ruby-cbc/cbc.i +15 -0
  11. data/ext/ruby-cbc/cbc_wrap.c +4618 -0
  12. data/ext/ruby-cbc/extconf.rb +60 -0
  13. data/ext/ruby-cbc/install/bin/cbc +0 -0
  14. data/ext/ruby-cbc/install/bin/clp +0 -0
  15. data/ext/ruby-cbc/install/include/coin/CbcBranchActual.hpp +24 -0
  16. data/ext/ruby-cbc/install/include/coin/CbcBranchAllDifferent.hpp +62 -0
  17. data/ext/ruby-cbc/install/include/coin/CbcBranchBase.hpp +78 -0
  18. data/ext/ruby-cbc/install/include/coin/CbcBranchCut.hpp +183 -0
  19. data/ext/ruby-cbc/install/include/coin/CbcBranchDecision.hpp +129 -0
  20. data/ext/ruby-cbc/install/include/coin/CbcBranchDefaultDecision.hpp +100 -0
  21. data/ext/ruby-cbc/install/include/coin/CbcBranchDynamic.hpp +206 -0
  22. data/ext/ruby-cbc/install/include/coin/CbcBranchLotsize.hpp +242 -0
  23. data/ext/ruby-cbc/install/include/coin/CbcBranchToFixLots.hpp +94 -0
  24. data/ext/ruby-cbc/install/include/coin/CbcBranchingObject.hpp +236 -0
  25. data/ext/ruby-cbc/install/include/coin/CbcClique.hpp +303 -0
  26. data/ext/ruby-cbc/install/include/coin/CbcCompare.hpp +39 -0
  27. data/ext/ruby-cbc/install/include/coin/CbcCompareActual.hpp +14 -0
  28. data/ext/ruby-cbc/install/include/coin/CbcCompareBase.hpp +142 -0
  29. data/ext/ruby-cbc/install/include/coin/CbcCompareDefault.hpp +120 -0
  30. data/ext/ruby-cbc/install/include/coin/CbcCompareDepth.hpp +47 -0
  31. data/ext/ruby-cbc/install/include/coin/CbcCompareEstimate.hpp +48 -0
  32. data/ext/ruby-cbc/install/include/coin/CbcCompareObjective.hpp +49 -0
  33. data/ext/ruby-cbc/install/include/coin/CbcConfig.h +14 -0
  34. data/ext/ruby-cbc/install/include/coin/CbcConsequence.hpp +49 -0
  35. data/ext/ruby-cbc/install/include/coin/CbcCountRowCut.hpp +168 -0
  36. data/ext/ruby-cbc/install/include/coin/CbcCutGenerator.hpp +482 -0
  37. data/ext/ruby-cbc/install/include/coin/CbcCutModifier.hpp +57 -0
  38. data/ext/ruby-cbc/install/include/coin/CbcCutSubsetModifier.hpp +66 -0
  39. data/ext/ruby-cbc/install/include/coin/CbcDummyBranchingObject.hpp +83 -0
  40. data/ext/ruby-cbc/install/include/coin/CbcEventHandler.hpp +245 -0
  41. data/ext/ruby-cbc/install/include/coin/CbcFathom.hpp +137 -0
  42. data/ext/ruby-cbc/install/include/coin/CbcFathomDynamicProgramming.hpp +169 -0
  43. data/ext/ruby-cbc/install/include/coin/CbcFeasibilityBase.hpp +56 -0
  44. data/ext/ruby-cbc/install/include/coin/CbcFixVariable.hpp +67 -0
  45. data/ext/ruby-cbc/install/include/coin/CbcFollowOn.hpp +207 -0
  46. data/ext/ruby-cbc/install/include/coin/CbcFullNodeInfo.hpp +161 -0
  47. data/ext/ruby-cbc/install/include/coin/CbcGeneral.hpp +60 -0
  48. data/ext/ruby-cbc/install/include/coin/CbcGeneralDepth.hpp +279 -0
  49. data/ext/ruby-cbc/install/include/coin/CbcHeuristic.hpp +682 -0
  50. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDINS.hpp +96 -0
  51. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDW.hpp +309 -0
  52. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDive.hpp +192 -0
  53. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveCoefficient.hpp +52 -0
  54. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveFractional.hpp +52 -0
  55. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveGuided.hpp +55 -0
  56. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveLineSearch.hpp +52 -0
  57. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDivePseudoCost.hpp +60 -0
  58. data/ext/ruby-cbc/install/include/coin/CbcHeuristicDiveVectorLength.hpp +52 -0
  59. data/ext/ruby-cbc/install/include/coin/CbcHeuristicFPump.hpp +340 -0
  60. data/ext/ruby-cbc/install/include/coin/CbcHeuristicGreedy.hpp +280 -0
  61. data/ext/ruby-cbc/install/include/coin/CbcHeuristicLocal.hpp +271 -0
  62. data/ext/ruby-cbc/install/include/coin/CbcHeuristicPivotAndFix.hpp +58 -0
  63. data/ext/ruby-cbc/install/include/coin/CbcHeuristicRENS.hpp +77 -0
  64. data/ext/ruby-cbc/install/include/coin/CbcHeuristicRINS.hpp +102 -0
  65. data/ext/ruby-cbc/install/include/coin/CbcHeuristicRandRound.hpp +58 -0
  66. data/ext/ruby-cbc/install/include/coin/CbcHeuristicVND.hpp +94 -0
  67. data/ext/ruby-cbc/install/include/coin/CbcLinked.hpp +1406 -0
  68. data/ext/ruby-cbc/install/include/coin/CbcMessage.hpp +94 -0
  69. data/ext/ruby-cbc/install/include/coin/CbcMipStartIO.hpp +26 -0
  70. data/ext/ruby-cbc/install/include/coin/CbcModel.hpp +2952 -0
  71. data/ext/ruby-cbc/install/include/coin/CbcNWay.hpp +166 -0
  72. data/ext/ruby-cbc/install/include/coin/CbcNode.hpp +351 -0
  73. data/ext/ruby-cbc/install/include/coin/CbcNodeInfo.hpp +349 -0
  74. data/ext/ruby-cbc/install/include/coin/CbcObject.hpp +272 -0
  75. data/ext/ruby-cbc/install/include/coin/CbcObjectUpdateData.hpp +64 -0
  76. data/ext/ruby-cbc/install/include/coin/CbcOrClpParam.cpp +4134 -0
  77. data/ext/ruby-cbc/install/include/coin/CbcOrClpParam.hpp +532 -0
  78. data/ext/ruby-cbc/install/include/coin/CbcParam.hpp +324 -0
  79. data/ext/ruby-cbc/install/include/coin/CbcPartialNodeInfo.hpp +110 -0
  80. data/ext/ruby-cbc/install/include/coin/CbcSOS.hpp +279 -0
  81. data/ext/ruby-cbc/install/include/coin/CbcSimpleInteger.hpp +286 -0
  82. data/ext/ruby-cbc/install/include/coin/CbcSimpleIntegerDynamicPseudoCost.hpp +564 -0
  83. data/ext/ruby-cbc/install/include/coin/CbcSimpleIntegerPseudoCost.hpp +114 -0
  84. data/ext/ruby-cbc/install/include/coin/CbcSolver.hpp +447 -0
  85. data/ext/ruby-cbc/install/include/coin/CbcStrategy.hpp +258 -0
  86. data/ext/ruby-cbc/install/include/coin/CbcSubProblem.hpp +83 -0
  87. data/ext/ruby-cbc/install/include/coin/CbcTree.hpp +490 -0
  88. data/ext/ruby-cbc/install/include/coin/CbcTreeLocal.hpp +372 -0
  89. data/ext/ruby-cbc/install/include/coin/Cbc_C_Interface.h +381 -0
  90. data/ext/ruby-cbc/install/include/coin/Cgl012cut.hpp +464 -0
  91. data/ext/ruby-cbc/install/include/coin/CglAllDifferent.hpp +115 -0
  92. data/ext/ruby-cbc/install/include/coin/CglClique.hpp +308 -0
  93. data/ext/ruby-cbc/install/include/coin/CglConfig.h +19 -0
  94. data/ext/ruby-cbc/install/include/coin/CglCutGenerator.hpp +121 -0
  95. data/ext/ruby-cbc/install/include/coin/CglDuplicateRow.hpp +189 -0
  96. data/ext/ruby-cbc/install/include/coin/CglFlowCover.hpp +371 -0
  97. data/ext/ruby-cbc/install/include/coin/CglGMI.hpp +364 -0
  98. data/ext/ruby-cbc/install/include/coin/CglGMIParam.hpp +313 -0
  99. data/ext/ruby-cbc/install/include/coin/CglGomory.hpp +204 -0
  100. data/ext/ruby-cbc/install/include/coin/CglKnapsackCover.hpp +310 -0
  101. data/ext/ruby-cbc/install/include/coin/CglLandP.hpp +306 -0
  102. data/ext/ruby-cbc/install/include/coin/CglLandPValidator.hpp +130 -0
  103. data/ext/ruby-cbc/install/include/coin/CglLiftAndProject.hpp +104 -0
  104. data/ext/ruby-cbc/install/include/coin/CglMessage.hpp +50 -0
  105. data/ext/ruby-cbc/install/include/coin/CglMixedIntegerRounding.hpp +429 -0
  106. data/ext/ruby-cbc/install/include/coin/CglMixedIntegerRounding2.hpp +427 -0
  107. data/ext/ruby-cbc/install/include/coin/CglOddHole.hpp +160 -0
  108. data/ext/ruby-cbc/install/include/coin/CglParam.hpp +93 -0
  109. data/ext/ruby-cbc/install/include/coin/CglPreProcess.hpp +492 -0
  110. data/ext/ruby-cbc/install/include/coin/CglProbing.hpp +543 -0
  111. data/ext/ruby-cbc/install/include/coin/CglRedSplit.hpp +448 -0
  112. data/ext/ruby-cbc/install/include/coin/CglRedSplit2.hpp +494 -0
  113. data/ext/ruby-cbc/install/include/coin/CglRedSplit2Param.hpp +495 -0
  114. data/ext/ruby-cbc/install/include/coin/CglRedSplitParam.hpp +272 -0
  115. data/ext/ruby-cbc/install/include/coin/CglResidualCapacity.hpp +240 -0
  116. data/ext/ruby-cbc/install/include/coin/CglSimpleRounding.hpp +174 -0
  117. data/ext/ruby-cbc/install/include/coin/CglStored.hpp +125 -0
  118. data/ext/ruby-cbc/install/include/coin/CglTreeInfo.hpp +180 -0
  119. data/ext/ruby-cbc/install/include/coin/CglTwomir.hpp +565 -0
  120. data/ext/ruby-cbc/install/include/coin/CglZeroHalf.hpp +133 -0
  121. data/ext/ruby-cbc/install/include/coin/ClpAmplObjective.hpp +113 -0
  122. data/ext/ruby-cbc/install/include/coin/ClpCholeskyBase.hpp +294 -0
  123. data/ext/ruby-cbc/install/include/coin/ClpCholeskyDense.hpp +162 -0
  124. data/ext/ruby-cbc/install/include/coin/ClpConfig.h +17 -0
  125. data/ext/ruby-cbc/install/include/coin/ClpConstraint.hpp +125 -0
  126. data/ext/ruby-cbc/install/include/coin/ClpConstraintAmpl.hpp +108 -0
  127. data/ext/ruby-cbc/install/include/coin/ClpConstraintLinear.hpp +110 -0
  128. data/ext/ruby-cbc/install/include/coin/ClpConstraintQuadratic.hpp +119 -0
  129. data/ext/ruby-cbc/install/include/coin/ClpDualRowDantzig.hpp +71 -0
  130. data/ext/ruby-cbc/install/include/coin/ClpDualRowPivot.hpp +129 -0
  131. data/ext/ruby-cbc/install/include/coin/ClpDualRowSteepest.hpp +153 -0
  132. data/ext/ruby-cbc/install/include/coin/ClpDummyMatrix.hpp +183 -0
  133. data/ext/ruby-cbc/install/include/coin/ClpDynamicExampleMatrix.hpp +186 -0
  134. data/ext/ruby-cbc/install/include/coin/ClpDynamicMatrix.hpp +381 -0
  135. data/ext/ruby-cbc/install/include/coin/ClpEventHandler.hpp +187 -0
  136. data/ext/ruby-cbc/install/include/coin/ClpFactorization.hpp +432 -0
  137. data/ext/ruby-cbc/install/include/coin/ClpGubDynamicMatrix.hpp +247 -0
  138. data/ext/ruby-cbc/install/include/coin/ClpGubMatrix.hpp +358 -0
  139. data/ext/ruby-cbc/install/include/coin/ClpInterior.hpp +570 -0
  140. data/ext/ruby-cbc/install/include/coin/ClpLinearObjective.hpp +103 -0
  141. data/ext/ruby-cbc/install/include/coin/ClpMatrixBase.hpp +524 -0
  142. data/ext/ruby-cbc/install/include/coin/ClpMessage.hpp +131 -0
  143. data/ext/ruby-cbc/install/include/coin/ClpModel.hpp +1307 -0
  144. data/ext/ruby-cbc/install/include/coin/ClpNetworkMatrix.hpp +229 -0
  145. data/ext/ruby-cbc/install/include/coin/ClpNode.hpp +349 -0
  146. data/ext/ruby-cbc/install/include/coin/ClpNonLinearCost.hpp +401 -0
  147. data/ext/ruby-cbc/install/include/coin/ClpObjective.hpp +134 -0
  148. data/ext/ruby-cbc/install/include/coin/ClpPackedMatrix.hpp +638 -0
  149. data/ext/ruby-cbc/install/include/coin/ClpParameters.hpp +126 -0
  150. data/ext/ruby-cbc/install/include/coin/ClpPdcoBase.hpp +103 -0
  151. data/ext/ruby-cbc/install/include/coin/ClpPlusMinusOneMatrix.hpp +290 -0
  152. data/ext/ruby-cbc/install/include/coin/ClpPresolve.hpp +299 -0
  153. data/ext/ruby-cbc/install/include/coin/ClpPrimalColumnDantzig.hpp +72 -0
  154. data/ext/ruby-cbc/install/include/coin/ClpPrimalColumnPivot.hpp +155 -0
  155. data/ext/ruby-cbc/install/include/coin/ClpPrimalColumnSteepest.hpp +247 -0
  156. data/ext/ruby-cbc/install/include/coin/ClpQuadraticObjective.hpp +155 -0
  157. data/ext/ruby-cbc/install/include/coin/ClpSimplex.hpp +1797 -0
  158. data/ext/ruby-cbc/install/include/coin/ClpSimplexDual.hpp +300 -0
  159. data/ext/ruby-cbc/install/include/coin/ClpSimplexNonlinear.hpp +117 -0
  160. data/ext/ruby-cbc/install/include/coin/ClpSimplexOther.hpp +277 -0
  161. data/ext/ruby-cbc/install/include/coin/ClpSimplexPrimal.hpp +244 -0
  162. data/ext/ruby-cbc/install/include/coin/ClpSolve.hpp +446 -0
  163. data/ext/ruby-cbc/install/include/coin/Clp_C_Interface.h +525 -0
  164. data/ext/ruby-cbc/install/include/coin/CoinAlloc.hpp +176 -0
  165. data/ext/ruby-cbc/install/include/coin/CoinBuild.hpp +149 -0
  166. data/ext/ruby-cbc/install/include/coin/CoinDenseFactorization.hpp +419 -0
  167. data/ext/ruby-cbc/install/include/coin/CoinDenseVector.hpp +383 -0
  168. data/ext/ruby-cbc/install/include/coin/CoinDistance.hpp +48 -0
  169. data/ext/ruby-cbc/install/include/coin/CoinError.hpp +257 -0
  170. data/ext/ruby-cbc/install/include/coin/CoinFactorization.hpp +2044 -0
  171. data/ext/ruby-cbc/install/include/coin/CoinFileIO.hpp +166 -0
  172. data/ext/ruby-cbc/install/include/coin/CoinFinite.hpp +34 -0
  173. data/ext/ruby-cbc/install/include/coin/CoinFloatEqual.hpp +177 -0
  174. data/ext/ruby-cbc/install/include/coin/CoinHelperFunctions.hpp +1111 -0
  175. data/ext/ruby-cbc/install/include/coin/CoinIndexedVector.hpp +1164 -0
  176. data/ext/ruby-cbc/install/include/coin/CoinLpIO.hpp +805 -0
  177. data/ext/ruby-cbc/install/include/coin/CoinMessage.hpp +96 -0
  178. data/ext/ruby-cbc/install/include/coin/CoinMessageHandler.hpp +666 -0
  179. data/ext/ruby-cbc/install/include/coin/CoinModel.hpp +1054 -0
  180. data/ext/ruby-cbc/install/include/coin/CoinModelUseful.hpp +441 -0
  181. data/ext/ruby-cbc/install/include/coin/CoinMpsIO.hpp +1056 -0
  182. data/ext/ruby-cbc/install/include/coin/CoinOslFactorization.hpp +280 -0
  183. data/ext/ruby-cbc/install/include/coin/CoinPackedMatrix.hpp +947 -0
  184. data/ext/ruby-cbc/install/include/coin/CoinPackedVector.hpp +657 -0
  185. data/ext/ruby-cbc/install/include/coin/CoinPackedVectorBase.hpp +269 -0
  186. data/ext/ruby-cbc/install/include/coin/CoinParam.hpp +644 -0
  187. data/ext/ruby-cbc/install/include/coin/CoinPragma.hpp +26 -0
  188. data/ext/ruby-cbc/install/include/coin/CoinPresolveDoubleton.hpp +73 -0
  189. data/ext/ruby-cbc/install/include/coin/CoinPresolveDual.hpp +85 -0
  190. data/ext/ruby-cbc/install/include/coin/CoinPresolveDupcol.hpp +226 -0
  191. data/ext/ruby-cbc/install/include/coin/CoinPresolveEmpty.hpp +116 -0
  192. data/ext/ruby-cbc/install/include/coin/CoinPresolveFixed.hpp +181 -0
  193. data/ext/ruby-cbc/install/include/coin/CoinPresolveForcing.hpp +61 -0
  194. data/ext/ruby-cbc/install/include/coin/CoinPresolveImpliedFree.hpp +60 -0
  195. data/ext/ruby-cbc/install/include/coin/CoinPresolveIsolated.hpp +51 -0
  196. data/ext/ruby-cbc/install/include/coin/CoinPresolveMatrix.hpp +1842 -0
  197. data/ext/ruby-cbc/install/include/coin/CoinPresolveMonitor.hpp +105 -0
  198. data/ext/ruby-cbc/install/include/coin/CoinPresolvePsdebug.hpp +166 -0
  199. data/ext/ruby-cbc/install/include/coin/CoinPresolveSingleton.hpp +112 -0
  200. data/ext/ruby-cbc/install/include/coin/CoinPresolveSubst.hpp +101 -0
  201. data/ext/ruby-cbc/install/include/coin/CoinPresolveTighten.hpp +55 -0
  202. data/ext/ruby-cbc/install/include/coin/CoinPresolveTripleton.hpp +66 -0
  203. data/ext/ruby-cbc/install/include/coin/CoinPresolveUseless.hpp +63 -0
  204. data/ext/ruby-cbc/install/include/coin/CoinPresolveZeros.hpp +60 -0
  205. data/ext/ruby-cbc/install/include/coin/CoinRational.hpp +44 -0
  206. data/ext/ruby-cbc/install/include/coin/CoinSearchTree.hpp +465 -0
  207. data/ext/ruby-cbc/install/include/coin/CoinShallowPackedVector.hpp +148 -0
  208. data/ext/ruby-cbc/install/include/coin/CoinSignal.hpp +117 -0
  209. data/ext/ruby-cbc/install/include/coin/CoinSimpFactorization.hpp +431 -0
  210. data/ext/ruby-cbc/install/include/coin/CoinSmartPtr.hpp +528 -0
  211. data/ext/ruby-cbc/install/include/coin/CoinSnapshot.hpp +476 -0
  212. data/ext/ruby-cbc/install/include/coin/CoinSort.hpp +678 -0
  213. data/ext/ruby-cbc/install/include/coin/CoinStructuredModel.hpp +247 -0
  214. data/ext/ruby-cbc/install/include/coin/CoinTime.hpp +310 -0
  215. data/ext/ruby-cbc/install/include/coin/CoinTypes.hpp +64 -0
  216. data/ext/ruby-cbc/install/include/coin/CoinUtility.hpp +19 -0
  217. data/ext/ruby-cbc/install/include/coin/CoinUtilsConfig.h +34 -0
  218. data/ext/ruby-cbc/install/include/coin/CoinWarmStart.hpp +58 -0
  219. data/ext/ruby-cbc/install/include/coin/CoinWarmStartBasis.hpp +456 -0
  220. data/ext/ruby-cbc/install/include/coin/CoinWarmStartDual.hpp +166 -0
  221. data/ext/ruby-cbc/install/include/coin/CoinWarmStartPrimalDual.hpp +211 -0
  222. data/ext/ruby-cbc/install/include/coin/CoinWarmStartVector.hpp +488 -0
  223. data/ext/ruby-cbc/install/include/coin/Coin_C_defines.h +115 -0
  224. data/ext/ruby-cbc/install/include/coin/Idiot.hpp +298 -0
  225. data/ext/ruby-cbc/install/include/coin/OsiAuxInfo.hpp +206 -0
  226. data/ext/ruby-cbc/install/include/coin/OsiBranchingObject.hpp +1005 -0
  227. data/ext/ruby-cbc/install/include/coin/OsiCbcSolverInterface.hpp +764 -0
  228. data/ext/ruby-cbc/install/include/coin/OsiChooseVariable.hpp +534 -0
  229. data/ext/ruby-cbc/install/include/coin/OsiClpSolverInterface.hpp +1509 -0
  230. data/ext/ruby-cbc/install/include/coin/OsiColCut.hpp +324 -0
  231. data/ext/ruby-cbc/install/include/coin/OsiCollections.hpp +35 -0
  232. data/ext/ruby-cbc/install/include/coin/OsiConfig.h +19 -0
  233. data/ext/ruby-cbc/install/include/coin/OsiCut.hpp +245 -0
  234. data/ext/ruby-cbc/install/include/coin/OsiCuts.hpp +474 -0
  235. data/ext/ruby-cbc/install/include/coin/OsiPresolve.hpp +252 -0
  236. data/ext/ruby-cbc/install/include/coin/OsiRowCut.hpp +331 -0
  237. data/ext/ruby-cbc/install/include/coin/OsiRowCutDebugger.hpp +187 -0
  238. data/ext/ruby-cbc/install/include/coin/OsiSolverBranch.hpp +152 -0
  239. data/ext/ruby-cbc/install/include/coin/OsiSolverInterface.hpp +2143 -0
  240. data/ext/ruby-cbc/install/include/coin/OsiSolverParameters.hpp +142 -0
  241. data/ext/ruby-cbc/install/include/coin/OsiUnitTests.hpp +374 -0
  242. data/ext/ruby-cbc/install/lib/libCbc.la +35 -0
  243. data/ext/ruby-cbc/install/lib/libCbc.so +0 -0
  244. data/ext/ruby-cbc/install/lib/libCbc.so.3 +0 -0
  245. data/ext/ruby-cbc/install/lib/libCbc.so.3.9.7 +0 -0
  246. data/ext/ruby-cbc/install/lib/libCbcSolver.la +35 -0
  247. data/ext/ruby-cbc/install/lib/libCbcSolver.so +0 -0
  248. data/ext/ruby-cbc/install/lib/libCbcSolver.so.3 +0 -0
  249. data/ext/ruby-cbc/install/lib/libCbcSolver.so.3.9.7 +0 -0
  250. data/ext/ruby-cbc/install/lib/libCgl.la +35 -0
  251. data/ext/ruby-cbc/install/lib/libCgl.so +0 -0
  252. data/ext/ruby-cbc/install/lib/libCgl.so.1 +0 -0
  253. data/ext/ruby-cbc/install/lib/libCgl.so.1.9.7 +0 -0
  254. data/ext/ruby-cbc/install/lib/libClp.la +35 -0
  255. data/ext/ruby-cbc/install/lib/libClp.so +0 -0
  256. data/ext/ruby-cbc/install/lib/libClp.so.1 +0 -0
  257. data/ext/ruby-cbc/install/lib/libClp.so.1.13.9 +0 -0
  258. data/ext/ruby-cbc/install/lib/libClpSolver.la +35 -0
  259. data/ext/ruby-cbc/install/lib/libClpSolver.so +0 -0
  260. data/ext/ruby-cbc/install/lib/libClpSolver.so.1 +0 -0
  261. data/ext/ruby-cbc/install/lib/libClpSolver.so.1.13.9 +0 -0
  262. data/ext/ruby-cbc/install/lib/libCoinUtils.la +35 -0
  263. data/ext/ruby-cbc/install/lib/libCoinUtils.so +0 -0
  264. data/ext/ruby-cbc/install/lib/libCoinUtils.so.3 +0 -0
  265. data/ext/ruby-cbc/install/lib/libCoinUtils.so.3.10.11 +0 -0
  266. data/ext/ruby-cbc/install/lib/libOsi.la +35 -0
  267. data/ext/ruby-cbc/install/lib/libOsi.so +0 -0
  268. data/ext/ruby-cbc/install/lib/libOsi.so.1 +0 -0
  269. data/ext/ruby-cbc/install/lib/libOsi.so.1.12.6 +0 -0
  270. data/ext/ruby-cbc/install/lib/libOsiCbc.la +35 -0
  271. data/ext/ruby-cbc/install/lib/libOsiCbc.so +0 -0
  272. data/ext/ruby-cbc/install/lib/libOsiCbc.so.3 +0 -0
  273. data/ext/ruby-cbc/install/lib/libOsiCbc.so.3.9.7 +0 -0
  274. data/ext/ruby-cbc/install/lib/libOsiClp.la +35 -0
  275. data/ext/ruby-cbc/install/lib/libOsiClp.so +0 -0
  276. data/ext/ruby-cbc/install/lib/libOsiClp.so.1 +0 -0
  277. data/ext/ruby-cbc/install/lib/libOsiClp.so.1.13.9 +0 -0
  278. data/ext/ruby-cbc/install/lib/libOsiCommonTests.la +35 -0
  279. data/ext/ruby-cbc/install/lib/libOsiCommonTests.so +0 -0
  280. data/ext/ruby-cbc/install/lib/libOsiCommonTests.so.1 +0 -0
  281. data/ext/ruby-cbc/install/lib/libOsiCommonTests.so.1.12.6 +0 -0
  282. data/ext/ruby-cbc/install/lib/pkgconfig/cbc.pc +12 -0
  283. data/ext/ruby-cbc/install/lib/pkgconfig/cgl.pc +12 -0
  284. data/ext/ruby-cbc/install/lib/pkgconfig/clp.pc +12 -0
  285. data/ext/ruby-cbc/install/lib/pkgconfig/coindatamiplib3.pc +9 -0
  286. data/ext/ruby-cbc/install/lib/pkgconfig/coindatasample.pc +9 -0
  287. data/ext/ruby-cbc/install/lib/pkgconfig/coinutils.pc +12 -0
  288. data/ext/ruby-cbc/install/lib/pkgconfig/osi-cbc.pc +12 -0
  289. data/ext/ruby-cbc/install/lib/pkgconfig/osi-clp.pc +12 -0
  290. data/ext/ruby-cbc/install/lib/pkgconfig/osi-unittests.pc +12 -0
  291. data/ext/ruby-cbc/install/lib/pkgconfig/osi.pc +12 -0
  292. data/lib/ruby-cbc/ilp/constant.rb +44 -0
  293. data/lib/ruby-cbc/ilp/constraint.rb +32 -0
  294. data/lib/ruby-cbc/ilp/objective.rb +26 -0
  295. data/lib/ruby-cbc/ilp/term.rb +47 -0
  296. data/lib/ruby-cbc/ilp/term_array.rb +80 -0
  297. data/lib/ruby-cbc/ilp/var.rb +62 -0
  298. data/lib/ruby-cbc/model.rb +125 -0
  299. data/lib/ruby-cbc/problem.rb +170 -0
  300. data/lib/ruby-cbc/version.rb +3 -0
  301. data/lib/ruby-cbc.rb +21 -0
  302. data/ruby-cbc.gemspec +36 -0
  303. metadata +431 -0
@@ -0,0 +1,528 @@
1
+ // Copyright (C) 2004, 2006 International Business Machines and others.
2
+ // All Rights Reserved.
3
+ // This code is published under the Eclipse Public License.
4
+ //
5
+ // $Id: CoinSmartPtr.hpp 1520 2012-01-29 00:43:31Z tkr $
6
+ //
7
+ // Authors: Carl Laird, Andreas Waechter IBM 2004-08-13
8
+ // Removed lots of debugging stuff and reformatted: Laszlo Ladanyi, IBM
9
+ #ifndef CoinSmartPtr_hpp
10
+ #define CoinSmartPtr_hpp
11
+
12
+ #include <list>
13
+ #include <cassert>
14
+ #include <cstddef>
15
+ #include <cstring>
16
+
17
+ namespace Coin {
18
+
19
+ //#########################################################################
20
+
21
+ /** ReferencedObject class.
22
+ * This is part of the implementation of an intrusive smart pointer
23
+ * design. This class stores the reference count of all the smart
24
+ * pointers that currently reference it. See the documentation for
25
+ * the SmartPtr class for more details.
26
+ *
27
+ * A SmartPtr behaves much like a raw pointer, but manages the lifetime
28
+ * of an object, deleting the object automatically. This class implements
29
+ * a reference-counting, intrusive smart pointer design, where all
30
+ * objects pointed to must inherit off of ReferencedObject, which
31
+ * stores the reference count. Although this is intrusive (native types
32
+ * and externally authored classes require wrappers to be referenced
33
+ * by smart pointers), it is a safer design. A more detailed discussion of
34
+ * these issues follows after the usage information.
35
+ *
36
+ * Usage Example:
37
+ * Note: to use the SmartPtr, all objects to which you point MUST
38
+ * inherit off of ReferencedObject.
39
+ *
40
+ * \verbatim
41
+ *
42
+ * In MyClass.hpp...
43
+ *
44
+ * #include "CoinSmartPtr.hpp"
45
+
46
+ *
47
+ * class MyClass : public Coin::ReferencedObject // must derive from ReferencedObject
48
+ * {
49
+ * ...
50
+ * }
51
+ *
52
+ * In my_usage.cpp...
53
+ *
54
+ * #include "CoinSmartPtr.hpp"
55
+ * #include "MyClass.hpp"
56
+ *
57
+ * void func(AnyObject& obj)
58
+ * {
59
+ * Coin::SmartPtr<MyClass> ptr_to_myclass = new MyClass(...);
60
+ * // ptr_to_myclass now points to a new MyClass,
61
+ * // and the reference count is 1
62
+ *
63
+ * ...
64
+ *
65
+ * obj.SetMyClass(ptr_to_myclass);
66
+ * // Here, let's assume that AnyObject uses a
67
+ * // SmartPtr<MyClass> internally here.
68
+ * // Now, both ptr_to_myclass and the internal
69
+ * // SmartPtr in obj point to the same MyClass object
70
+ * // and its reference count is 2.
71
+ *
72
+ * ...
73
+ *
74
+ * // No need to delete ptr_to_myclass, this
75
+ * // will be done automatically when the
76
+ * // reference count drops to zero.
77
+ *
78
+ * }
79
+ *
80
+ * \endverbatim
81
+ *
82
+ * Other Notes:
83
+ * The SmartPtr implements both dereference operators -> & *.
84
+ * The SmartPtr does NOT implement a conversion operator to
85
+ * the raw pointer. Use the GetRawPtr() method when this
86
+ * is necessary. Make sure that the raw pointer is NOT
87
+ * deleted.
88
+ * The SmartPtr implements the comparison operators == & !=
89
+ * for a variety of types. Use these instead of
90
+ * \verbatim
91
+ * if (GetRawPtr(smrt_ptr) == ptr) // Don't use this
92
+ * \endverbatim
93
+ * SmartPtr's, as currently implemented, do NOT handle circular references.
94
+ * For example: consider a higher level object using SmartPtrs to point
95
+ * to A and B, but A and B also point to each other (i.e. A has a
96
+ * SmartPtr to B and B has a SmartPtr to A). In this scenario, when the
97
+ * higher level object is finished with A and B, their reference counts
98
+ * will never drop to zero (since they reference each other) and they
99
+ * will not be deleted. This can be detected by memory leak tools like
100
+ * valgrind. If the circular reference is necessary, the problem can be
101
+ * overcome by a number of techniques:
102
+ *
103
+ * 1) A and B can have a method that "releases" each other, that is
104
+ * they set their internal SmartPtrs to NULL.
105
+ * \verbatim
106
+ * void AClass::ReleaseCircularReferences()
107
+ * {
108
+ * smart_ptr_to_B = NULL;
109
+ * }
110
+ * \endverbatim
111
+ * Then, the higher level class can call these methods before
112
+ * it is done using A & B.
113
+ *
114
+ * 2) Raw pointers can be used in A and B to reference each other.
115
+ * Here, an implicit assumption is made that the lifetime is
116
+ * controlled by the higher level object and that A and B will
117
+ * both exist in a controlled manner. Although this seems
118
+ * dangerous, in many situations, this type of referencing
119
+ * is very controlled and this is reasonably safe.
120
+ *
121
+ * 3) This SmartPtr class could be redesigned with the Weak/Strong
122
+ * design concept. Here, the SmartPtr is identified as being
123
+ * Strong (controls lifetime of the object) or Weak (merely
124
+ * referencing the object). The Strong SmartPtr increments
125
+ * (and decrements) the reference count in ReferencedObject
126
+ * but the Weak SmartPtr does not. In the example above,
127
+ * the higher level object would have Strong SmartPtrs to
128
+ * A and B, but A and B would have Weak SmartPtrs to each
129
+ * other. Then, when the higher level object was done with
130
+ * A and B, they would be deleted. The Weak SmartPtrs in A
131
+ * and B would not decrement the reference count and would,
132
+ * of course, not delete the object. This idea is very similar
133
+ * to item (2), where it is implied that the sequence of events
134
+ * is controlled such that A and B will not call anything using
135
+ * their pointers following the higher level delete (i.e. in
136
+ * their destructors!). This is somehow safer, however, because
137
+ * code can be written (however expensive) to perform run-time
138
+ * detection of this situation. For example, the ReferencedObject
139
+ * could store pointers to all Weak SmartPtrs that are referencing
140
+ * it and, in its destructor, tell these pointers that it is
141
+ * dying. They could then set themselves to NULL, or set an
142
+ * internal flag to detect usage past this point.
143
+ *
144
+ * Comments on Non-Intrusive Design:
145
+ * In a non-intrusive design, the reference count is stored somewhere other
146
+ * than the object being referenced. This means, unless the reference
147
+ * counting pointer is the first referencer, it must get a pointer to the
148
+ * referenced object from another smart pointer (so it has access to the
149
+ * reference count location). In this non-intrusive design, if we are
150
+ * pointing to an object with a smart pointer (or a number of smart
151
+ * pointers), and we then give another smart pointer the address through
152
+ * a RAW pointer, we will have two independent, AND INCORRECT, reference
153
+ * counts. To avoid this pitfall, we use an intrusive reference counting
154
+ * technique where the reference count is stored in the object being
155
+ * referenced.
156
+ */
157
+ class ReferencedObject {
158
+ public:
159
+ ReferencedObject() : reference_count_(0) {}
160
+ virtual ~ReferencedObject() { assert(reference_count_ == 0); }
161
+ inline int ReferenceCount() const { return reference_count_; }
162
+ inline void AddRef() const { ++reference_count_; }
163
+ inline void ReleaseRef() const { --reference_count_; }
164
+
165
+ private:
166
+ mutable int reference_count_;
167
+ };
168
+
169
+ //#########################################################################
170
+
171
+
172
+ //#define IP_DEBUG_SMARTPTR
173
+ #if COIN_IPOPT_CHECKLEVEL > 2
174
+ # define IP_DEBUG_SMARTPTR
175
+ #endif
176
+ #ifdef IP_DEBUG_SMARTPTR
177
+ # include "IpDebug.hpp"
178
+ #endif
179
+
180
+ /** Template class for Smart Pointers.
181
+ * A SmartPtr behaves much like a raw pointer, but manages the lifetime
182
+ * of an object, deleting the object automatically. This class implements
183
+ * a reference-counting, intrusive smart pointer design, where all
184
+ * objects pointed to must inherit off of ReferencedObject, which
185
+ * stores the reference count. Although this is intrusive (native types
186
+ * and externally authored classes require wrappers to be referenced
187
+ * by smart pointers), it is a safer design. A more detailed discussion of
188
+ * these issues follows after the usage information.
189
+ *
190
+ * Usage Example:
191
+ * Note: to use the SmartPtr, all objects to which you point MUST
192
+ * inherit off of ReferencedObject.
193
+ *
194
+ * \verbatim
195
+ *
196
+ * In MyClass.hpp...
197
+ *
198
+ * #include "CoinSmartPtr.hpp"
199
+ *
200
+ * class MyClass : public Coin::ReferencedObject // must derive from ReferencedObject
201
+ * {
202
+ * ...
203
+ * }
204
+ *
205
+ * In my_usage.cpp...
206
+ *
207
+ * #include "CoinSmartPtr.hpp"
208
+ * #include "MyClass.hpp"
209
+ *
210
+ * void func(AnyObject& obj)
211
+ * {
212
+ * SmartPtr<MyClass> ptr_to_myclass = new MyClass(...);
213
+ * // ptr_to_myclass now points to a new MyClass,
214
+ * // and the reference count is 1
215
+ *
216
+ * ...
217
+ *
218
+ * obj.SetMyClass(ptr_to_myclass);
219
+ * // Here, let's assume that AnyObject uses a
220
+ * // SmartPtr<MyClass> internally here.
221
+ * // Now, both ptr_to_myclass and the internal
222
+ * // SmartPtr in obj point to the same MyClass object
223
+ * // and its reference count is 2.
224
+ *
225
+ * ...
226
+ *
227
+ * // No need to delete ptr_to_myclass, this
228
+ * // will be done automatically when the
229
+ * // reference count drops to zero.
230
+ *
231
+ * }
232
+ *
233
+ * \endverbatim
234
+ *
235
+ * It is not necessary to use SmartPtr's in all cases where an
236
+ * object is used that has been allocated "into" a SmartPtr. It is
237
+ * possible to just pass objects by reference or regular pointers,
238
+ * even if lower down in the stack a SmartPtr is to be held on to.
239
+ * Everything should work fine as long as a pointer created by "new"
240
+ * is immediately passed into a SmartPtr, and if SmartPtr's are used
241
+ * to hold on to objects.
242
+ *
243
+ * Other Notes:
244
+ * The SmartPtr implements both dereference operators -> & *.
245
+ * The SmartPtr does NOT implement a conversion operator to
246
+ * the raw pointer. Use the GetRawPtr() method when this
247
+ * is necessary. Make sure that the raw pointer is NOT
248
+ * deleted.
249
+ * The SmartPtr implements the comparison operators == & !=
250
+ * for a variety of types. Use these instead of
251
+ * \verbatim
252
+ * if (GetRawPtr(smrt_ptr) == ptr) // Don't use this
253
+ * \endverbatim
254
+ * SmartPtr's, as currently implemented, do NOT handle circular references.
255
+ * For example: consider a higher level object using SmartPtrs to point to
256
+ * A and B, but A and B also point to each other (i.e. A has a SmartPtr
257
+ * to B and B has a SmartPtr to A). In this scenario, when the higher
258
+ * level object is finished with A and B, their reference counts will
259
+ * never drop to zero (since they reference each other) and they
260
+ * will not be deleted. This can be detected by memory leak tools like
261
+ * valgrind. If the circular reference is necessary, the problem can be
262
+ * overcome by a number of techniques:
263
+ *
264
+ * 1) A and B can have a method that "releases" each other, that is
265
+ * they set their internal SmartPtrs to NULL.
266
+ * \verbatim
267
+ * void AClass::ReleaseCircularReferences()
268
+ * {
269
+ * smart_ptr_to_B = NULL;
270
+ * }
271
+ * \endverbatim
272
+ * Then, the higher level class can call these methods before
273
+ * it is done using A & B.
274
+ *
275
+ * 2) Raw pointers can be used in A and B to reference each other.
276
+ * Here, an implicit assumption is made that the lifetime is
277
+ * controlled by the higher level object and that A and B will
278
+ * both exist in a controlled manner. Although this seems
279
+ * dangerous, in many situations, this type of referencing
280
+ * is very controlled and this is reasonably safe.
281
+ *
282
+ * 3) This SmartPtr class could be redesigned with the Weak/Strong
283
+ * design concept. Here, the SmartPtr is identified as being
284
+ * Strong (controls lifetime of the object) or Weak (merely
285
+ * referencing the object). The Strong SmartPtr increments
286
+ * (and decrements) the reference count in ReferencedObject
287
+ * but the Weak SmartPtr does not. In the example above,
288
+ * the higher level object would have Strong SmartPtrs to
289
+ * A and B, but A and B would have Weak SmartPtrs to each
290
+ * other. Then, when the higher level object was done with
291
+ * A and B, they would be deleted. The Weak SmartPtrs in A
292
+ * and B would not decrement the reference count and would,
293
+ * of course, not delete the object. This idea is very similar
294
+ * to item (2), where it is implied that the sequence of events
295
+ * is controlled such that A and B will not call anything using
296
+ * their pointers following the higher level delete (i.e. in
297
+ * their destructors!). This is somehow safer, however, because
298
+ * code can be written (however expensive) to perform run-time
299
+ * detection of this situation. For example, the ReferencedObject
300
+ * could store pointers to all Weak SmartPtrs that are referencing
301
+ * it and, in its destructor, tell these pointers that it is
302
+ * dying. They could then set themselves to NULL, or set an
303
+ * internal flag to detect usage past this point.
304
+ *
305
+ * Comments on Non-Intrusive Design:
306
+ * In a non-intrusive design, the reference count is stored somewhere other
307
+ * than the object being referenced. This means, unless the reference
308
+ * counting pointer is the first referencer, it must get a pointer to the
309
+ * referenced object from another smart pointer (so it has access to the
310
+ * reference count location). In this non-intrusive design, if we are
311
+ * pointing to an object with a smart pointer (or a number of smart
312
+ * pointers), and we then give another smart pointer the address through
313
+ * a RAW pointer, we will have two independent, AND INCORRECT, reference
314
+ * counts. To avoid this pitfall, we use an intrusive reference counting
315
+ * technique where the reference count is stored in the object being
316
+ * referenced.
317
+ */
318
+ template <class T>
319
+ class SmartPtr {
320
+ public:
321
+ /** Returns the raw pointer contained. Use to get the value of the
322
+ * raw ptr (i.e. to pass to other methods/functions, etc.) Note: This
323
+ * method does NOT copy, therefore, modifications using this value
324
+ * modify the underlying object contained by the SmartPtr, NEVER
325
+ * delete this returned value.
326
+ */
327
+ T* GetRawPtr() const { return ptr_; }
328
+
329
+ /** Returns true if the SmartPtr is NOT NULL.
330
+ * Use this to check if the SmartPtr is not null
331
+ * This is preferred to if(GetRawPtr(sp) != NULL)
332
+ */
333
+ bool IsValid() const { return ptr_ != NULL; }
334
+
335
+ /** Returns true if the SmartPtr is NULL.
336
+ * Use this to check if the SmartPtr IsNull.
337
+ * This is preferred to if(GetRawPtr(sp) == NULL)
338
+ */
339
+ bool IsNull() const { return ptr_ == NULL; }
340
+
341
+ private:
342
+ /**@name Private Data/Methods */
343
+ //@{
344
+ /** Actual raw pointer to the object. */
345
+ T* ptr_;
346
+
347
+ /** Release the currently referenced object. */
348
+ void ReleasePointer_() {
349
+ if (ptr_) {
350
+ ptr_->ReleaseRef();
351
+ if (ptr_->ReferenceCount() == 0) {
352
+ delete ptr_;
353
+ }
354
+ ptr_ = NULL;
355
+ }
356
+ }
357
+
358
+ /** Set the value of the internal raw pointer from another raw
359
+ * pointer, releasing the previously referenced object if necessary. */
360
+ SmartPtr<T>& SetFromRawPtr_(T* rhs){
361
+ ReleasePointer_(); // Release any old pointer
362
+ if (rhs != NULL) {
363
+ rhs->AddRef();
364
+ ptr_ = rhs;
365
+ }
366
+ return *this;
367
+ }
368
+
369
+ /** Set the value of the internal raw pointer from a SmartPtr,
370
+ * releasing the previously referenced object if necessary. */
371
+ inline SmartPtr<T>& SetFromSmartPtr_(const SmartPtr<T>& rhs) {
372
+ SetFromRawPtr_(rhs.GetRawPtr());
373
+ return (*this);
374
+ }
375
+
376
+ //@}
377
+
378
+ public:
379
+ #define dbg_smartptr_verbosity 0
380
+
381
+ /**@name Constructors/Destructors */
382
+ //@{
383
+ /** Default constructor, initialized to NULL */
384
+ SmartPtr() : ptr_(NULL) {}
385
+
386
+ /** Copy constructor, initialized from copy */
387
+ SmartPtr(const SmartPtr<T>& copy) : ptr_(NULL) {
388
+ (void) SetFromSmartPtr_(copy);
389
+ }
390
+
391
+ /** Constructor, initialized from T* ptr */
392
+ SmartPtr(T* ptr) : ptr_(NULL) {
393
+ (void) SetFromRawPtr_(ptr);
394
+ }
395
+
396
+ /** Destructor, automatically decrements the reference count, deletes
397
+ * the object if necessary.*/
398
+ ~SmartPtr() {
399
+ ReleasePointer_();
400
+ }
401
+ //@}
402
+
403
+ /**@name Overloaded operators. */
404
+ //@{
405
+ /** Overloaded arrow operator, allows the user to call
406
+ * methods using the contained pointer. */
407
+ T* operator->() const {
408
+ #if COIN_COINUTILS_CHECKLEVEL > 0
409
+ assert(ptr_);
410
+ #endif
411
+ return ptr_;
412
+ }
413
+
414
+ /** Overloaded dereference operator, allows the user
415
+ * to dereference the contained pointer. */
416
+ T& operator*() const {
417
+ #if COIN_IPOPT_CHECKLEVEL > 0
418
+ assert(ptr_);
419
+ #endif
420
+ return *ptr_;
421
+ }
422
+
423
+ /** Overloaded equals operator, allows the user to
424
+ * set the value of the SmartPtr from a raw pointer */
425
+ SmartPtr<T>& operator=(T* rhs) {
426
+ return SetFromRawPtr_(rhs);
427
+ }
428
+
429
+ /** Overloaded equals operator, allows the user to
430
+ * set the value of the SmartPtr from another
431
+ * SmartPtr */
432
+ SmartPtr<T>& operator=(const SmartPtr<T>& rhs) {
433
+ return SetFromSmartPtr_(rhs);
434
+ }
435
+
436
+ /** Overloaded equality comparison operator, allows the
437
+ * user to compare the value of two SmartPtrs */
438
+ template <class U1, class U2>
439
+ friend
440
+ bool operator==(const SmartPtr<U1>& lhs, const SmartPtr<U2>& rhs);
441
+
442
+ /** Overloaded equality comparison operator, allows the
443
+ * user to compare the value of a SmartPtr with a raw pointer. */
444
+ template <class U1, class U2>
445
+ friend
446
+ bool operator==(const SmartPtr<U1>& lhs, U2* raw_rhs);
447
+
448
+ /** Overloaded equality comparison operator, allows the
449
+ * user to compare the value of a raw pointer with a SmartPtr. */
450
+ template <class U1, class U2>
451
+ friend
452
+ bool operator==(U1* lhs, const SmartPtr<U2>& raw_rhs);
453
+
454
+ /** Overloaded in-equality comparison operator, allows the
455
+ * user to compare the value of two SmartPtrs */
456
+ template <class U1, class U2>
457
+ friend
458
+ bool operator!=(const SmartPtr<U1>& lhs, const SmartPtr<U2>& rhs);
459
+
460
+ /** Overloaded in-equality comparison operator, allows the
461
+ * user to compare the value of a SmartPtr with a raw pointer. */
462
+ template <class U1, class U2>
463
+ friend
464
+ bool operator!=(const SmartPtr<U1>& lhs, U2* raw_rhs);
465
+
466
+ /** Overloaded in-equality comparison operator, allows the
467
+ * user to compare the value of a SmartPtr with a raw pointer. */
468
+ template <class U1, class U2>
469
+ friend
470
+ bool operator!=(U1* lhs, const SmartPtr<U2>& raw_rhs);
471
+ //@}
472
+
473
+ };
474
+
475
+ template <class U1, class U2>
476
+ bool ComparePointers(const U1* lhs, const U2* rhs) {
477
+ if (lhs == rhs) {
478
+ return true;
479
+ }
480
+ // If lhs and rhs point to the same object with different interfaces
481
+ // U1 and U2, we cannot guarantee that the value of the pointers will
482
+ // be equivalent. We can guarantee this if we convert to void*.
483
+ return static_cast<const void*>(lhs) == static_cast<const void*>(rhs);
484
+ }
485
+
486
+ } // namespace Coin
487
+
488
+ //#############################################################################
489
+
490
+ /**@name SmartPtr friends that are overloaded operators, so they are not in
491
+ the Coin namespace. */
492
+ //@{
493
+ template <class U1, class U2>
494
+ bool operator==(const Coin::SmartPtr<U1>& lhs, const Coin::SmartPtr<U2>& rhs) {
495
+ return Coin::ComparePointers(lhs.GetRawPtr(), rhs.GetRawPtr());
496
+ }
497
+
498
+ template <class U1, class U2>
499
+ bool operator==(const Coin::SmartPtr<U1>& lhs, U2* raw_rhs) {
500
+ return Coin::ComparePointers(lhs.GetRawPtr(), raw_rhs);
501
+ }
502
+
503
+ template <class U1, class U2>
504
+ bool operator==(U1* raw_lhs, const Coin::SmartPtr<U2>& rhs) {
505
+ return Coin::ComparePointers(raw_lhs, rhs.GetRawPtr());
506
+ }
507
+
508
+ template <class U1, class U2>
509
+ bool operator!=(const Coin::SmartPtr<U1>& lhs, const Coin::SmartPtr<U2>& rhs) {
510
+ return ! operator==(lhs, rhs);
511
+ }
512
+
513
+ template <class U1, class U2>
514
+ bool operator!=(const Coin::SmartPtr<U1>& lhs, U2* raw_rhs) {
515
+ return ! operator==(lhs, raw_rhs);
516
+ }
517
+
518
+ template <class U1, class U2>
519
+ bool operator!=(U1* raw_lhs, const Coin::SmartPtr<U2>& rhs) {
520
+ return ! operator==(raw_lhs, rhs);
521
+ }
522
+ //@}
523
+
524
+ #define CoinReferencedObject Coin::ReferencedObject
525
+ #define CoinSmartPtr Coin::SmartPtr
526
+ #define CoinComparePointers Coin::ComparePointers
527
+
528
+ #endif