ngs_server 0.1

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 (284) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +4 -0
  3. data/Rakefile +2 -0
  4. data/bin/ngs_server +58 -0
  5. data/data/holder.txt +0 -0
  6. data/ext/bamtools/CMakeLists.txt +49 -0
  7. data/ext/bamtools/LICENSE +22 -0
  8. data/ext/bamtools/README +60 -0
  9. data/ext/bamtools/Tutorial_Toolkit_BamTools-1.0.pdf +0 -0
  10. data/ext/bamtools/docs/Doxyfile +1601 -0
  11. data/ext/bamtools/extconf.rb +9 -0
  12. data/ext/bamtools/src/CMakeFiles/CMakeDirectoryInformation.cmake +22 -0
  13. data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/DependInfo.cmake +13 -0
  14. data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/build.make +65 -0
  15. data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/cmake_clean.cmake +8 -0
  16. data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/depend.internal +3 -0
  17. data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/depend.make +3 -0
  18. data/ext/bamtools/src/CMakeFiles/SharedHeaders.dir/progress.make +2 -0
  19. data/ext/bamtools/src/CMakeFiles/progress.marks +1 -0
  20. data/ext/bamtools/src/CMakeLists.txt +18 -0
  21. data/ext/bamtools/src/ExportHeader.cmake +31 -0
  22. data/ext/bamtools/src/Makefile +182 -0
  23. data/ext/bamtools/src/api/BamAlignment.cpp +2432 -0
  24. data/ext/bamtools/src/api/BamAlignment.h +206 -0
  25. data/ext/bamtools/src/api/BamAux.h +456 -0
  26. data/ext/bamtools/src/api/BamConstants.h +127 -0
  27. data/ext/bamtools/src/api/BamIndex.h +79 -0
  28. data/ext/bamtools/src/api/BamMultiReader.cpp +395 -0
  29. data/ext/bamtools/src/api/BamMultiReader.h +126 -0
  30. data/ext/bamtools/src/api/BamReader.cpp +369 -0
  31. data/ext/bamtools/src/api/BamReader.h +117 -0
  32. data/ext/bamtools/src/api/BamWriter.cpp +142 -0
  33. data/ext/bamtools/src/api/BamWriter.h +63 -0
  34. data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/DependInfo.cmake +14 -0
  35. data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/build.make +80 -0
  36. data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/cmake_clean.cmake +8 -0
  37. data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/depend.internal +3 -0
  38. data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/depend.make +3 -0
  39. data/ext/bamtools/src/api/CMakeFiles/APIHeaders.dir/progress.make +2 -0
  40. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/BamAlignment.cpp.o +0 -0
  41. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/BamMultiReader.cpp.o +0 -0
  42. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/BamReader.cpp.o +0 -0
  43. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/BamWriter.cpp.o +0 -0
  44. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/CXX.includecache +596 -0
  45. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/DependInfo.cmake +41 -0
  46. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamHeader.cpp.o +0 -0
  47. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamProgram.cpp.o +0 -0
  48. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamProgramChain.cpp.o +0 -0
  49. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamReadGroup.cpp.o +0 -0
  50. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamReadGroupDictionary.cpp.o +0 -0
  51. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamSequence.cpp.o +0 -0
  52. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/SamSequenceDictionary.cpp.o +0 -0
  53. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/build.make +675 -0
  54. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/cmake_clean.cmake +32 -0
  55. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/cmake_clean_target.cmake +3 -0
  56. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/depend.internal +295 -0
  57. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/depend.make +295 -0
  58. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/flags.make +8 -0
  59. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamHeader_p.cpp.o +0 -0
  60. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamIndexFactory_p.cpp.o +0 -0
  61. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamMultiReader_p.cpp.o +0 -0
  62. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamRandomAccessController_p.cpp.o +0 -0
  63. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamReader_p.cpp.o +0 -0
  64. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamStandardIndex_p.cpp.o +0 -0
  65. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamToolsIndex_p.cpp.o +0 -0
  66. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BamWriter_p.cpp.o +0 -0
  67. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/BgzfStream_p.cpp.o +0 -0
  68. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/SamFormatParser_p.cpp.o +0 -0
  69. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/SamFormatPrinter_p.cpp.o +0 -0
  70. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/internal/SamHeaderValidator_p.cpp.o +0 -0
  71. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/link.txt +2 -0
  72. data/ext/bamtools/src/api/CMakeFiles/BamTools-static.dir/progress.make +24 -0
  73. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/BamAlignment.cpp.o +0 -0
  74. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/BamMultiReader.cpp.o +0 -0
  75. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/BamReader.cpp.o +0 -0
  76. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/BamWriter.cpp.o +0 -0
  77. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/CXX.includecache +596 -0
  78. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/DependInfo.cmake +47 -0
  79. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamHeader.cpp.o +0 -0
  80. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamProgram.cpp.o +0 -0
  81. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamProgramChain.cpp.o +0 -0
  82. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamReadGroup.cpp.o +0 -0
  83. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamReadGroupDictionary.cpp.o +0 -0
  84. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamSequence.cpp.o +0 -0
  85. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/SamSequenceDictionary.cpp.o +0 -0
  86. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/build.make +677 -0
  87. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/cmake_clean.cmake +33 -0
  88. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/depend.internal +295 -0
  89. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/depend.make +295 -0
  90. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/flags.make +8 -0
  91. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamHeader_p.cpp.o +0 -0
  92. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamIndexFactory_p.cpp.o +0 -0
  93. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamMultiReader_p.cpp.o +0 -0
  94. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamRandomAccessController_p.cpp.o +0 -0
  95. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamReader_p.cpp.o +0 -0
  96. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamStandardIndex_p.cpp.o +0 -0
  97. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamToolsIndex_p.cpp.o +0 -0
  98. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BamWriter_p.cpp.o +0 -0
  99. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/BgzfStream_p.cpp.o +0 -0
  100. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/SamFormatParser_p.cpp.o +0 -0
  101. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/SamFormatPrinter_p.cpp.o +0 -0
  102. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/internal/SamHeaderValidator_p.cpp.o +0 -0
  103. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/link.txt +1 -0
  104. data/ext/bamtools/src/api/CMakeFiles/BamTools.dir/progress.make +24 -0
  105. data/ext/bamtools/src/api/CMakeFiles/CMakeDirectoryInformation.cmake +22 -0
  106. data/ext/bamtools/src/api/CMakeFiles/progress.marks +1 -0
  107. data/ext/bamtools/src/api/CMakeLists.txt +78 -0
  108. data/ext/bamtools/src/api/Makefile +902 -0
  109. data/ext/bamtools/src/api/SamConstants.h +95 -0
  110. data/ext/bamtools/src/api/SamHeader.cpp +184 -0
  111. data/ext/bamtools/src/api/SamHeader.h +68 -0
  112. data/ext/bamtools/src/api/SamProgram.cpp +139 -0
  113. data/ext/bamtools/src/api/SamProgram.h +61 -0
  114. data/ext/bamtools/src/api/SamProgramChain.cpp +351 -0
  115. data/ext/bamtools/src/api/SamProgramChain.h +85 -0
  116. data/ext/bamtools/src/api/SamReadGroup.cpp +221 -0
  117. data/ext/bamtools/src/api/SamReadGroup.h +68 -0
  118. data/ext/bamtools/src/api/SamReadGroupDictionary.cpp +289 -0
  119. data/ext/bamtools/src/api/SamReadGroupDictionary.h +86 -0
  120. data/ext/bamtools/src/api/SamSequence.cpp +161 -0
  121. data/ext/bamtools/src/api/SamSequence.h +60 -0
  122. data/ext/bamtools/src/api/SamSequenceDictionary.cpp +292 -0
  123. data/ext/bamtools/src/api/SamSequenceDictionary.h +88 -0
  124. data/ext/bamtools/src/api/api_global.h +21 -0
  125. data/ext/bamtools/src/api/cmake_install.cmake +122 -0
  126. data/ext/bamtools/src/api/internal/BamHeader_p.cpp +132 -0
  127. data/ext/bamtools/src/api/internal/BamHeader_p.h +71 -0
  128. data/ext/bamtools/src/api/internal/BamIndexFactory_p.cpp +112 -0
  129. data/ext/bamtools/src/api/internal/BamIndexFactory_p.h +49 -0
  130. data/ext/bamtools/src/api/internal/BamMultiMerger_p.h +297 -0
  131. data/ext/bamtools/src/api/internal/BamMultiReader_p.cpp +805 -0
  132. data/ext/bamtools/src/api/internal/BamMultiReader_p.h +103 -0
  133. data/ext/bamtools/src/api/internal/BamRandomAccessController_p.cpp +272 -0
  134. data/ext/bamtools/src/api/internal/BamRandomAccessController_p.h +93 -0
  135. data/ext/bamtools/src/api/internal/BamReader_p.cpp +380 -0
  136. data/ext/bamtools/src/api/internal/BamReader_p.h +112 -0
  137. data/ext/bamtools/src/api/internal/BamStandardIndex_p.cpp +986 -0
  138. data/ext/bamtools/src/api/internal/BamStandardIndex_p.h +236 -0
  139. data/ext/bamtools/src/api/internal/BamToolsIndex_p.cpp +641 -0
  140. data/ext/bamtools/src/api/internal/BamToolsIndex_p.h +187 -0
  141. data/ext/bamtools/src/api/internal/BamWriter_p.cpp +424 -0
  142. data/ext/bamtools/src/api/internal/BamWriter_p.h +66 -0
  143. data/ext/bamtools/src/api/internal/BgzfStream_p.cpp +438 -0
  144. data/ext/bamtools/src/api/internal/BgzfStream_p.h +108 -0
  145. data/ext/bamtools/src/api/internal/SamFormatParser_p.cpp +230 -0
  146. data/ext/bamtools/src/api/internal/SamFormatParser_p.h +61 -0
  147. data/ext/bamtools/src/api/internal/SamFormatPrinter_p.cpp +210 -0
  148. data/ext/bamtools/src/api/internal/SamFormatPrinter_p.h +60 -0
  149. data/ext/bamtools/src/api/internal/SamHeaderValidator_p.cpp +510 -0
  150. data/ext/bamtools/src/api/internal/SamHeaderValidator_p.h +101 -0
  151. data/ext/bamtools/src/api/internal/SamHeaderVersion_p.h +134 -0
  152. data/ext/bamtools/src/cmake_install.cmake +42 -0
  153. data/ext/bamtools/src/shared/bamtools_global.h +78 -0
  154. data/ext/bamtools/src/third_party/CMakeFiles/CMakeDirectoryInformation.cmake +22 -0
  155. data/ext/bamtools/src/third_party/CMakeFiles/progress.marks +1 -0
  156. data/ext/bamtools/src/third_party/CMakeLists.txt +10 -0
  157. data/ext/bamtools/src/third_party/Makefile +167 -0
  158. data/ext/bamtools/src/third_party/cmake_install.cmake +35 -0
  159. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/CMakeDirectoryInformation.cmake +22 -0
  160. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/CXX.includecache +144 -0
  161. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/DependInfo.cmake +27 -0
  162. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/build.make +157 -0
  163. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/cmake_clean.cmake +13 -0
  164. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/depend.internal +31 -0
  165. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/depend.make +31 -0
  166. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/flags.make +8 -0
  167. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/json_reader.cpp.o +0 -0
  168. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/json_value.cpp.o +0 -0
  169. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/json_writer.cpp.o +0 -0
  170. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/link.txt +1 -0
  171. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/jsoncpp.dir/progress.make +4 -0
  172. data/ext/bamtools/src/third_party/jsoncpp/CMakeFiles/progress.marks +1 -0
  173. data/ext/bamtools/src/third_party/jsoncpp/CMakeLists.txt +23 -0
  174. data/ext/bamtools/src/third_party/jsoncpp/LICENSE +55 -0
  175. data/ext/bamtools/src/third_party/jsoncpp/Makefile +263 -0
  176. data/ext/bamtools/src/third_party/jsoncpp/cmake_install.cmake +29 -0
  177. data/ext/bamtools/src/third_party/jsoncpp/json.h +15 -0
  178. data/ext/bamtools/src/third_party/jsoncpp/json_batchallocator.h +130 -0
  179. data/ext/bamtools/src/third_party/jsoncpp/json_config.h +42 -0
  180. data/ext/bamtools/src/third_party/jsoncpp/json_features.h +47 -0
  181. data/ext/bamtools/src/third_party/jsoncpp/json_forwards.h +42 -0
  182. data/ext/bamtools/src/third_party/jsoncpp/json_internalarray.inl +453 -0
  183. data/ext/bamtools/src/third_party/jsoncpp/json_internalmap.inl +612 -0
  184. data/ext/bamtools/src/third_party/jsoncpp/json_reader.cpp +870 -0
  185. data/ext/bamtools/src/third_party/jsoncpp/json_reader.h +201 -0
  186. data/ext/bamtools/src/third_party/jsoncpp/json_tool.h +93 -0
  187. data/ext/bamtools/src/third_party/jsoncpp/json_value.cpp +1701 -0
  188. data/ext/bamtools/src/third_party/jsoncpp/json_value.h +1059 -0
  189. data/ext/bamtools/src/third_party/jsoncpp/json_valueiterator.inl +297 -0
  190. data/ext/bamtools/src/third_party/jsoncpp/json_writer.cpp +819 -0
  191. data/ext/bamtools/src/third_party/jsoncpp/json_writer.h +179 -0
  192. data/ext/bamtools/src/toolkit/CMakeFiles/CMakeDirectoryInformation.cmake +25 -0
  193. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/CXX.includecache +698 -0
  194. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/DependInfo.cmake +34 -0
  195. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools.cpp.o +0 -0
  196. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_convert.cpp.o +0 -0
  197. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_count.cpp.o +0 -0
  198. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_coverage.cpp.o +0 -0
  199. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_filter.cpp.o +0 -0
  200. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_header.cpp.o +0 -0
  201. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_index.cpp.o +0 -0
  202. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_merge.cpp.o +0 -0
  203. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_random.cpp.o +0 -0
  204. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_resolve.cpp.o +0 -0
  205. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_revert.cpp.o +0 -0
  206. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_sort.cpp.o +0 -0
  207. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_split.cpp.o +0 -0
  208. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/bamtools_stats.cpp.o +0 -0
  209. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/build.make +447 -0
  210. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/cmake_clean.cmake +24 -0
  211. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/depend.internal +319 -0
  212. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/depend.make +319 -0
  213. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/flags.make +8 -0
  214. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/link.txt +1 -0
  215. data/ext/bamtools/src/toolkit/CMakeFiles/bamtools_cmd.dir/progress.make +15 -0
  216. data/ext/bamtools/src/toolkit/CMakeFiles/progress.marks +1 -0
  217. data/ext/bamtools/src/toolkit/CMakeLists.txt +44 -0
  218. data/ext/bamtools/src/toolkit/Makefile +560 -0
  219. data/ext/bamtools/src/toolkit/bamtools.cpp +163 -0
  220. data/ext/bamtools/src/toolkit/bamtools_convert.cpp +888 -0
  221. data/ext/bamtools/src/toolkit/bamtools_convert.h +37 -0
  222. data/ext/bamtools/src/toolkit/bamtools_count.cpp +187 -0
  223. data/ext/bamtools/src/toolkit/bamtools_count.h +37 -0
  224. data/ext/bamtools/src/toolkit/bamtools_coverage.cpp +196 -0
  225. data/ext/bamtools/src/toolkit/bamtools_coverage.h +37 -0
  226. data/ext/bamtools/src/toolkit/bamtools_filter.cpp +911 -0
  227. data/ext/bamtools/src/toolkit/bamtools_filter.h +37 -0
  228. data/ext/bamtools/src/toolkit/bamtools_header.cpp +122 -0
  229. data/ext/bamtools/src/toolkit/bamtools_header.h +38 -0
  230. data/ext/bamtools/src/toolkit/bamtools_index.cpp +126 -0
  231. data/ext/bamtools/src/toolkit/bamtools_index.h +37 -0
  232. data/ext/bamtools/src/toolkit/bamtools_merge.cpp +221 -0
  233. data/ext/bamtools/src/toolkit/bamtools_merge.h +37 -0
  234. data/ext/bamtools/src/toolkit/bamtools_random.cpp +255 -0
  235. data/ext/bamtools/src/toolkit/bamtools_random.h +37 -0
  236. data/ext/bamtools/src/toolkit/bamtools_resolve.cpp +1396 -0
  237. data/ext/bamtools/src/toolkit/bamtools_resolve.h +42 -0
  238. data/ext/bamtools/src/toolkit/bamtools_revert.cpp +194 -0
  239. data/ext/bamtools/src/toolkit/bamtools_revert.h +37 -0
  240. data/ext/bamtools/src/toolkit/bamtools_sort.cpp +410 -0
  241. data/ext/bamtools/src/toolkit/bamtools_sort.h +37 -0
  242. data/ext/bamtools/src/toolkit/bamtools_split.cpp +551 -0
  243. data/ext/bamtools/src/toolkit/bamtools_split.h +38 -0
  244. data/ext/bamtools/src/toolkit/bamtools_stats.cpp +286 -0
  245. data/ext/bamtools/src/toolkit/bamtools_stats.h +37 -0
  246. data/ext/bamtools/src/toolkit/bamtools_tool.h +35 -0
  247. data/ext/bamtools/src/toolkit/bamtools_version.h +20 -0
  248. data/ext/bamtools/src/toolkit/bamtools_version.h.in +20 -0
  249. data/ext/bamtools/src/toolkit/cmake_install.cmake +52 -0
  250. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/CXX.includecache +250 -0
  251. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/DependInfo.cmake +29 -0
  252. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/bamtools_fasta.cpp.o +0 -0
  253. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/bamtools_options.cpp.o +0 -0
  254. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/bamtools_pileup_engine.cpp.o +0 -0
  255. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/bamtools_utilities.cpp.o +0 -0
  256. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/build.make +184 -0
  257. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/cmake_clean.cmake +14 -0
  258. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/depend.internal +40 -0
  259. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/depend.make +40 -0
  260. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/flags.make +8 -0
  261. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/link.txt +1 -0
  262. data/ext/bamtools/src/utils/CMakeFiles/BamTools-utils.dir/progress.make +5 -0
  263. data/ext/bamtools/src/utils/CMakeFiles/CMakeDirectoryInformation.cmake +23 -0
  264. data/ext/bamtools/src/utils/CMakeFiles/progress.marks +1 -0
  265. data/ext/bamtools/src/utils/CMakeLists.txt +30 -0
  266. data/ext/bamtools/src/utils/Makefile +290 -0
  267. data/ext/bamtools/src/utils/bamtools_fasta.cpp +632 -0
  268. data/ext/bamtools/src/utils/bamtools_fasta.h +47 -0
  269. data/ext/bamtools/src/utils/bamtools_filter_engine.h +552 -0
  270. data/ext/bamtools/src/utils/bamtools_filter_properties.h +195 -0
  271. data/ext/bamtools/src/utils/bamtools_filter_ruleparser.h +319 -0
  272. data/ext/bamtools/src/utils/bamtools_options.cpp +287 -0
  273. data/ext/bamtools/src/utils/bamtools_options.h +213 -0
  274. data/ext/bamtools/src/utils/bamtools_pileup_engine.cpp +327 -0
  275. data/ext/bamtools/src/utils/bamtools_pileup_engine.h +94 -0
  276. data/ext/bamtools/src/utils/bamtools_utilities.cpp +333 -0
  277. data/ext/bamtools/src/utils/bamtools_utilities.h +67 -0
  278. data/ext/bamtools/src/utils/bamtools_variant.h +128 -0
  279. data/ext/bamtools/src/utils/cmake_install.cmake +29 -0
  280. data/ext/bamtools/src/utils/utils_global.h +21 -0
  281. data/lib/ngs_server/version.rb +3 -0
  282. data/lib/ngs_server.rb +3 -0
  283. data/ngs_server.gemspec +23 -0
  284. metadata +339 -0
@@ -0,0 +1,1701 @@
1
+ // Copyright 2007-2010 Baptiste Lepilleur
2
+ // Distributed under MIT license, or public domain if desired and
3
+ // recognized in your jurisdiction.
4
+ // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
5
+
6
+ #include <iostream>
7
+ #include "json_value.h"
8
+ #include "json_writer.h"
9
+ #include <utility>
10
+ #include <stdexcept>
11
+ #include <cstring>
12
+ #include <cassert>
13
+ #ifdef JSON_USE_CPPTL
14
+ # include <cpptl/conststring.h>
15
+ #endif
16
+ #include <cstddef> // size_t
17
+ #ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
18
+ # include "json_batchallocator.h"
19
+ #endif // #ifndef JSON_USE_SIMPLE_INTERNAL_ALLOCATOR
20
+
21
+ #define JSON_ASSERT_UNREACHABLE assert( false )
22
+ #define JSON_ASSERT( condition ) assert( condition ); // @todo <= change this into an exception throw
23
+ #define JSON_ASSERT_MESSAGE( condition, message ) if (!( condition )) throw std::runtime_error( message );
24
+
25
+ namespace Json {
26
+
27
+ const Value Value::null;
28
+ const Int Value::minInt = Int( ~(UInt(-1)/2) );
29
+ const Int Value::maxInt = Int( UInt(-1)/2 );
30
+ const UInt Value::maxUInt = UInt(-1);
31
+
32
+ /// Unknown size marker
33
+ enum { unknown = (unsigned)-1 };
34
+
35
+
36
+ /** Duplicates the specified string value.
37
+ * @param value Pointer to the string to duplicate. Must be zero-terminated if
38
+ * length is "unknown".
39
+ * @param length Length of the value. if equals to unknown, then it will be
40
+ * computed using strlen(value).
41
+ * @return Pointer on the duplicate instance of string.
42
+ */
43
+ static inline char *
44
+ duplicateStringValue( const char *value,
45
+ unsigned int length = unknown )
46
+ {
47
+ if ( length == unknown )
48
+ length = (unsigned int)strlen(value);
49
+ char *newString = static_cast<char *>( malloc( length + 1 ) );
50
+ memcpy( newString, value, length );
51
+ newString[length] = 0;
52
+ return newString;
53
+ }
54
+
55
+
56
+ /** Free the string duplicated by duplicateStringValue().
57
+ */
58
+ static inline void
59
+ releaseStringValue( char *value )
60
+ {
61
+ if ( value )
62
+ free( value );
63
+ }
64
+
65
+
66
+
67
+ // //////////////////////////////////////////////////////////////////
68
+ // //////////////////////////////////////////////////////////////////
69
+ // //////////////////////////////////////////////////////////////////
70
+ // ValueInternals...
71
+ // //////////////////////////////////////////////////////////////////
72
+ // //////////////////////////////////////////////////////////////////
73
+ // //////////////////////////////////////////////////////////////////
74
+ #ifdef JSON_VALUE_USE_INTERNAL_MAP
75
+ # include "json_internalarray.inl"
76
+ # include "json_internalmap.inl"
77
+ #endif // JSON_VALUE_USE_INTERNAL_MAP
78
+
79
+ # include "json_valueiterator.inl"
80
+
81
+
82
+ // //////////////////////////////////////////////////////////////////
83
+ // //////////////////////////////////////////////////////////////////
84
+ // //////////////////////////////////////////////////////////////////
85
+ // class Value::CommentInfo
86
+ // //////////////////////////////////////////////////////////////////
87
+ // //////////////////////////////////////////////////////////////////
88
+ // //////////////////////////////////////////////////////////////////
89
+
90
+
91
+ Value::CommentInfo::CommentInfo()
92
+ : comment_( 0 )
93
+ {
94
+ }
95
+
96
+ Value::CommentInfo::~CommentInfo()
97
+ {
98
+ if ( comment_ )
99
+ releaseStringValue( comment_ );
100
+ }
101
+
102
+
103
+ void
104
+ Value::CommentInfo::setComment( const char *text )
105
+ {
106
+ if ( comment_ )
107
+ releaseStringValue( comment_ );
108
+ JSON_ASSERT( text );
109
+ JSON_ASSERT_MESSAGE( text[0]=='\0' || text[0]=='/', "Comments must start with /");
110
+ // It seems that /**/ style comments are acceptable as well.
111
+ comment_ = duplicateStringValue( text );
112
+ }
113
+
114
+
115
+ // //////////////////////////////////////////////////////////////////
116
+ // //////////////////////////////////////////////////////////////////
117
+ // //////////////////////////////////////////////////////////////////
118
+ // class Value::CZString
119
+ // //////////////////////////////////////////////////////////////////
120
+ // //////////////////////////////////////////////////////////////////
121
+ // //////////////////////////////////////////////////////////////////
122
+ # ifndef JSON_VALUE_USE_INTERNAL_MAP
123
+
124
+ // Notes: index_ indicates if the string was allocated when
125
+ // a string is stored.
126
+
127
+ Value::CZString::CZString( ArrayIndex index )
128
+ : cstr_( 0 )
129
+ , index_( index )
130
+ {
131
+ }
132
+
133
+ Value::CZString::CZString( const char *cstr, DuplicationPolicy allocate )
134
+ : cstr_( allocate == duplicate ? duplicateStringValue(cstr)
135
+ : cstr )
136
+ , index_( allocate )
137
+ {
138
+ }
139
+
140
+ Value::CZString::CZString( const CZString &other )
141
+ : cstr_( other.index_ != noDuplication && other.cstr_ != 0
142
+ ? duplicateStringValue( other.cstr_ )
143
+ : other.cstr_ )
144
+ , index_( other.cstr_ ? (other.index_ == noDuplication ? noDuplication : duplicate)
145
+ : other.index_ )
146
+ {
147
+ }
148
+
149
+ Value::CZString::~CZString()
150
+ {
151
+ if ( cstr_ && index_ == duplicate )
152
+ releaseStringValue( const_cast<char *>( cstr_ ) );
153
+ }
154
+
155
+ void
156
+ Value::CZString::swap( CZString &other )
157
+ {
158
+ std::swap( cstr_, other.cstr_ );
159
+ std::swap( index_, other.index_ );
160
+ }
161
+
162
+ Value::CZString &
163
+ Value::CZString::operator =( const CZString &other )
164
+ {
165
+ CZString temp( other );
166
+ swap( temp );
167
+ return *this;
168
+ }
169
+
170
+ bool
171
+ Value::CZString::operator<( const CZString &other ) const
172
+ {
173
+ if ( cstr_ )
174
+ return strcmp( cstr_, other.cstr_ ) < 0;
175
+ return index_ < other.index_;
176
+ }
177
+
178
+ bool
179
+ Value::CZString::operator==( const CZString &other ) const
180
+ {
181
+ if ( cstr_ )
182
+ return strcmp( cstr_, other.cstr_ ) == 0;
183
+ return index_ == other.index_;
184
+ }
185
+
186
+
187
+ ArrayIndex
188
+ Value::CZString::index() const
189
+ {
190
+ return index_;
191
+ }
192
+
193
+
194
+ const char *
195
+ Value::CZString::c_str() const
196
+ {
197
+ return cstr_;
198
+ }
199
+
200
+ bool
201
+ Value::CZString::isStaticString() const
202
+ {
203
+ return index_ == noDuplication;
204
+ }
205
+
206
+ #endif // ifndef JSON_VALUE_USE_INTERNAL_MAP
207
+
208
+
209
+ // //////////////////////////////////////////////////////////////////
210
+ // //////////////////////////////////////////////////////////////////
211
+ // //////////////////////////////////////////////////////////////////
212
+ // class Value::Value
213
+ // //////////////////////////////////////////////////////////////////
214
+ // //////////////////////////////////////////////////////////////////
215
+ // //////////////////////////////////////////////////////////////////
216
+
217
+ /*! \internal Default constructor initialization must be equivalent to:
218
+ * memset( this, 0, sizeof(Value) )
219
+ * This optimization is used in ValueInternalMap fast allocator.
220
+ */
221
+ Value::Value( ValueType type )
222
+ : type_( type )
223
+ , allocated_( 0 )
224
+ , comments_( 0 )
225
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
226
+ , itemIsUsed_( 0 )
227
+ #endif
228
+ {
229
+ switch ( type )
230
+ {
231
+ case nullValue:
232
+ break;
233
+ case intValue:
234
+ case uintValue:
235
+ value_.int_ = 0;
236
+ break;
237
+ case realValue:
238
+ value_.real_ = 0.0;
239
+ break;
240
+ case stringValue:
241
+ value_.string_ = 0;
242
+ break;
243
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
244
+ case arrayValue:
245
+ case objectValue:
246
+ value_.map_ = new ObjectValues();
247
+ break;
248
+ #else
249
+ case arrayValue:
250
+ value_.array_ = arrayAllocator()->newArray();
251
+ break;
252
+ case objectValue:
253
+ value_.map_ = mapAllocator()->newMap();
254
+ break;
255
+ #endif
256
+ case booleanValue:
257
+ value_.bool_ = false;
258
+ break;
259
+ default:
260
+ JSON_ASSERT_UNREACHABLE;
261
+ }
262
+ }
263
+
264
+
265
+ #if !defined(JSON_NO_INT64)
266
+ Value::Value( ArrayIndex value )
267
+ : type_( uintValue )
268
+ , comments_( 0 )
269
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
270
+ , itemIsUsed_( 0 )
271
+ #endif
272
+ {
273
+ value_.uint_ = value;
274
+ }
275
+
276
+ Value::Value( int value )
277
+ : type_( intValue )
278
+ , comments_( 0 )
279
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
280
+ , itemIsUsed_( 0 )
281
+ #endif
282
+ {
283
+ value_.int_ = value;
284
+ }
285
+
286
+ #endif // if !defined(JSON_NO_INT64)
287
+
288
+
289
+ Value::Value( Int value )
290
+ : type_( intValue )
291
+ , comments_( 0 )
292
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
293
+ , itemIsUsed_( 0 )
294
+ #endif
295
+ {
296
+ value_.int_ = value;
297
+ }
298
+
299
+
300
+ Value::Value( UInt value )
301
+ : type_( uintValue )
302
+ , comments_( 0 )
303
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
304
+ , itemIsUsed_( 0 )
305
+ #endif
306
+ {
307
+ value_.uint_ = value;
308
+ }
309
+
310
+ Value::Value( double value )
311
+ : type_( realValue )
312
+ , comments_( 0 )
313
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
314
+ , itemIsUsed_( 0 )
315
+ #endif
316
+ {
317
+ value_.real_ = value;
318
+ }
319
+
320
+ Value::Value( const char *value )
321
+ : type_( stringValue )
322
+ , allocated_( true )
323
+ , comments_( 0 )
324
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
325
+ , itemIsUsed_( 0 )
326
+ #endif
327
+ {
328
+ value_.string_ = duplicateStringValue( value );
329
+ }
330
+
331
+
332
+ Value::Value( const char *beginValue,
333
+ const char *endValue )
334
+ : type_( stringValue )
335
+ , allocated_( true )
336
+ , comments_( 0 )
337
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
338
+ , itemIsUsed_( 0 )
339
+ #endif
340
+ {
341
+ value_.string_ = duplicateStringValue( beginValue,
342
+ (unsigned int)(endValue - beginValue) );
343
+ }
344
+
345
+
346
+ Value::Value( const std::string &value )
347
+ : type_( stringValue )
348
+ , allocated_( true )
349
+ , comments_( 0 )
350
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
351
+ , itemIsUsed_( 0 )
352
+ #endif
353
+ {
354
+ value_.string_ = duplicateStringValue( value.c_str(),
355
+ (unsigned int)value.length() );
356
+
357
+ }
358
+
359
+ Value::Value( const StaticString &value )
360
+ : type_( stringValue )
361
+ , allocated_( false )
362
+ , comments_( 0 )
363
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
364
+ , itemIsUsed_( 0 )
365
+ #endif
366
+ {
367
+ value_.string_ = const_cast<char *>( value.c_str() );
368
+ }
369
+
370
+
371
+ # ifdef JSON_USE_CPPTL
372
+ Value::Value( const CppTL::ConstString &value )
373
+ : type_( stringValue )
374
+ , allocated_( true )
375
+ , comments_( 0 )
376
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
377
+ , itemIsUsed_( 0 )
378
+ #endif
379
+ {
380
+ value_.string_ = duplicateStringValue( value, value.length() );
381
+ }
382
+ # endif
383
+
384
+ Value::Value( bool value )
385
+ : type_( booleanValue )
386
+ , comments_( 0 )
387
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
388
+ , itemIsUsed_( 0 )
389
+ #endif
390
+ {
391
+ value_.bool_ = value;
392
+ }
393
+
394
+
395
+ Value::Value( const Value &other )
396
+ : type_( other.type_ )
397
+ , comments_( 0 )
398
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
399
+ , itemIsUsed_( 0 )
400
+ #endif
401
+ {
402
+ switch ( type_ )
403
+ {
404
+ case nullValue:
405
+ case intValue:
406
+ case uintValue:
407
+ case realValue:
408
+ case booleanValue:
409
+ value_ = other.value_;
410
+ break;
411
+ case stringValue:
412
+ if ( other.value_.string_ )
413
+ {
414
+ value_.string_ = duplicateStringValue( other.value_.string_ );
415
+ allocated_ = true;
416
+ }
417
+ else
418
+ value_.string_ = 0;
419
+ break;
420
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
421
+ case arrayValue:
422
+ case objectValue:
423
+ value_.map_ = new ObjectValues( *other.value_.map_ );
424
+ break;
425
+ #else
426
+ case arrayValue:
427
+ value_.array_ = arrayAllocator()->newArrayCopy( *other.value_.array_ );
428
+ break;
429
+ case objectValue:
430
+ value_.map_ = mapAllocator()->newMapCopy( *other.value_.map_ );
431
+ break;
432
+ #endif
433
+ default:
434
+ JSON_ASSERT_UNREACHABLE;
435
+ }
436
+ if ( other.comments_ )
437
+ {
438
+ comments_ = new CommentInfo[numberOfCommentPlacement];
439
+ for ( int comment =0; comment < numberOfCommentPlacement; ++comment )
440
+ {
441
+ const CommentInfo &otherComment = other.comments_[comment];
442
+ if ( otherComment.comment_ )
443
+ comments_[comment].setComment( otherComment.comment_ );
444
+ }
445
+ }
446
+ }
447
+
448
+
449
+ Value::~Value()
450
+ {
451
+ switch ( type_ )
452
+ {
453
+ case nullValue:
454
+ case intValue:
455
+ case uintValue:
456
+ case realValue:
457
+ case booleanValue:
458
+ break;
459
+ case stringValue:
460
+ if ( allocated_ )
461
+ releaseStringValue( value_.string_ );
462
+ break;
463
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
464
+ case arrayValue:
465
+ case objectValue:
466
+ delete value_.map_;
467
+ break;
468
+ #else
469
+ case arrayValue:
470
+ arrayAllocator()->destructArray( value_.array_ );
471
+ break;
472
+ case objectValue:
473
+ mapAllocator()->destructMap( value_.map_ );
474
+ break;
475
+ #endif
476
+ default:
477
+ JSON_ASSERT_UNREACHABLE;
478
+ }
479
+
480
+ if ( comments_ )
481
+ delete[] comments_;
482
+ }
483
+
484
+ Value &
485
+ Value::operator=( const Value &other )
486
+ {
487
+ Value temp( other );
488
+ swap( temp );
489
+ return *this;
490
+ }
491
+
492
+ void
493
+ Value::swap( Value &other )
494
+ {
495
+ ValueType temp = type_;
496
+ type_ = other.type_;
497
+ other.type_ = temp;
498
+ std::swap( value_, other.value_ );
499
+ int temp2 = allocated_;
500
+ allocated_ = other.allocated_;
501
+ other.allocated_ = temp2;
502
+ }
503
+
504
+ ValueType
505
+ Value::type() const
506
+ {
507
+ return type_;
508
+ }
509
+
510
+
511
+ int
512
+ Value::compare( const Value &other )
513
+ {
514
+ /*
515
+ int typeDelta = other.type_ - type_;
516
+ switch ( type_ )
517
+ {
518
+ case nullValue:
519
+
520
+ return other.type_ == type_;
521
+ case intValue:
522
+ if ( other.type_.isNumeric()
523
+ case uintValue:
524
+ case realValue:
525
+ case booleanValue:
526
+ break;
527
+ case stringValue,
528
+ break;
529
+ case arrayValue:
530
+ delete value_.array_;
531
+ break;
532
+ case objectValue:
533
+ delete value_.map_;
534
+ default:
535
+ JSON_ASSERT_UNREACHABLE;
536
+ }
537
+ */
538
+ return 0; // unreachable
539
+ }
540
+
541
+ bool
542
+ Value::operator <( const Value &other ) const
543
+ {
544
+ int typeDelta = type_ - other.type_;
545
+ if ( typeDelta )
546
+ return typeDelta < 0 ? true : false;
547
+ switch ( type_ )
548
+ {
549
+ case nullValue:
550
+ return false;
551
+ case intValue:
552
+ return value_.int_ < other.value_.int_;
553
+ case uintValue:
554
+ return value_.uint_ < other.value_.uint_;
555
+ case realValue:
556
+ return value_.real_ < other.value_.real_;
557
+ case booleanValue:
558
+ return value_.bool_ < other.value_.bool_;
559
+ case stringValue:
560
+ return ( value_.string_ == 0 && other.value_.string_ )
561
+ || ( other.value_.string_
562
+ && value_.string_
563
+ && strcmp( value_.string_, other.value_.string_ ) < 0 );
564
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
565
+ case arrayValue:
566
+ case objectValue:
567
+ {
568
+ int delta = int( value_.map_->size() - other.value_.map_->size() );
569
+ if ( delta )
570
+ return delta < 0;
571
+ return (*value_.map_) < (*other.value_.map_);
572
+ }
573
+ #else
574
+ case arrayValue:
575
+ return value_.array_->compare( *(other.value_.array_) ) < 0;
576
+ case objectValue:
577
+ return value_.map_->compare( *(other.value_.map_) ) < 0;
578
+ #endif
579
+ default:
580
+ JSON_ASSERT_UNREACHABLE;
581
+ }
582
+ return 0; // unreachable
583
+ }
584
+
585
+ bool
586
+ Value::operator <=( const Value &other ) const
587
+ {
588
+ return !(other > *this);
589
+ }
590
+
591
+ bool
592
+ Value::operator >=( const Value &other ) const
593
+ {
594
+ return !(*this < other);
595
+ }
596
+
597
+ bool
598
+ Value::operator >( const Value &other ) const
599
+ {
600
+ return other < *this;
601
+ }
602
+
603
+ bool
604
+ Value::operator ==( const Value &other ) const
605
+ {
606
+ //if ( type_ != other.type_ )
607
+ // GCC 2.95.3 says:
608
+ // attempt to take address of bit-field structure member `Json::Value::type_'
609
+ // Beats me, but a temp solves the problem.
610
+ int temp = other.type_;
611
+ if ( type_ != temp )
612
+ return false;
613
+ switch ( type_ )
614
+ {
615
+ case nullValue:
616
+ return true;
617
+ case intValue:
618
+ return value_.int_ == other.value_.int_;
619
+ case uintValue:
620
+ return value_.uint_ == other.value_.uint_;
621
+ case realValue:
622
+ return value_.real_ == other.value_.real_;
623
+ case booleanValue:
624
+ return value_.bool_ == other.value_.bool_;
625
+ case stringValue:
626
+ return ( value_.string_ == other.value_.string_ )
627
+ || ( other.value_.string_
628
+ && value_.string_
629
+ && strcmp( value_.string_, other.value_.string_ ) == 0 );
630
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
631
+ case arrayValue:
632
+ case objectValue:
633
+ return value_.map_->size() == other.value_.map_->size()
634
+ && (*value_.map_) == (*other.value_.map_);
635
+ #else
636
+ case arrayValue:
637
+ return value_.array_->compare( *(other.value_.array_) ) == 0;
638
+ case objectValue:
639
+ return value_.map_->compare( *(other.value_.map_) ) == 0;
640
+ #endif
641
+ default:
642
+ JSON_ASSERT_UNREACHABLE;
643
+ }
644
+ return 0; // unreachable
645
+ }
646
+
647
+ bool
648
+ Value::operator !=( const Value &other ) const
649
+ {
650
+ return !( *this == other );
651
+ }
652
+
653
+ const char *
654
+ Value::asCString() const
655
+ {
656
+ JSON_ASSERT( type_ == stringValue );
657
+ return value_.string_;
658
+ }
659
+
660
+
661
+ std::string
662
+ Value::asString() const
663
+ {
664
+ switch ( type_ )
665
+ {
666
+ case nullValue:
667
+ return "";
668
+ case stringValue:
669
+ return value_.string_ ? value_.string_ : "";
670
+ case booleanValue:
671
+ return value_.bool_ ? "true" : "false";
672
+ case intValue:
673
+ case uintValue:
674
+ case realValue:
675
+ case arrayValue:
676
+ case objectValue:
677
+ JSON_ASSERT_MESSAGE( false, "Type is not convertible to string" );
678
+ default:
679
+ JSON_ASSERT_UNREACHABLE;
680
+ }
681
+ return ""; // unreachable
682
+ }
683
+
684
+ # ifdef JSON_USE_CPPTL
685
+ CppTL::ConstString
686
+ Value::asConstString() const
687
+ {
688
+ return CppTL::ConstString( asString().c_str() );
689
+ }
690
+ # endif
691
+
692
+ Value::Int
693
+ Value::asInt() const
694
+ {
695
+ switch ( type_ )
696
+ {
697
+ case nullValue:
698
+ return 0;
699
+ case intValue:
700
+ return value_.int_;
701
+ case uintValue:
702
+ JSON_ASSERT_MESSAGE( value_.uint_ < (unsigned)maxInt, "integer out of signed integer range" );
703
+ return value_.uint_;
704
+ case realValue:
705
+ JSON_ASSERT_MESSAGE( value_.real_ >= minInt && value_.real_ <= maxInt, "Real out of signed integer range" );
706
+ return Int( value_.real_ );
707
+ case booleanValue:
708
+ return value_.bool_ ? 1 : 0;
709
+ case stringValue:
710
+ case arrayValue:
711
+ case objectValue:
712
+ JSON_ASSERT_MESSAGE( false, "Type is not convertible to int" );
713
+ default:
714
+ JSON_ASSERT_UNREACHABLE;
715
+ }
716
+ return 0; // unreachable;
717
+ }
718
+
719
+ Value::UInt
720
+ Value::asUInt() const
721
+ {
722
+ switch ( type_ )
723
+ {
724
+ case nullValue:
725
+ return 0;
726
+ case intValue:
727
+ JSON_ASSERT_MESSAGE( value_.int_ >= 0, "Negative integer can not be converted to unsigned integer" );
728
+ return value_.int_;
729
+ case uintValue:
730
+ return value_.uint_;
731
+ case realValue:
732
+ JSON_ASSERT_MESSAGE( value_.real_ >= 0 && value_.real_ <= maxUInt, "Real out of unsigned integer range" );
733
+ return UInt( value_.real_ );
734
+ case booleanValue:
735
+ return value_.bool_ ? 1 : 0;
736
+ case stringValue:
737
+ case arrayValue:
738
+ case objectValue:
739
+ JSON_ASSERT_MESSAGE( false, "Type is not convertible to uint" );
740
+ default:
741
+ JSON_ASSERT_UNREACHABLE;
742
+ }
743
+ return 0; // unreachable;
744
+ }
745
+
746
+ double
747
+ Value::asDouble() const
748
+ {
749
+ switch ( type_ )
750
+ {
751
+ case nullValue:
752
+ return 0.0;
753
+ case intValue:
754
+ return static_cast<double>( value_.int_ );
755
+ case uintValue:
756
+ #if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
757
+ return static_cast<double>( value_.uint_ );
758
+ #else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
759
+ return static_cast<double>( Int(value_.uint_/2) ) * 2 + Int(value_.uint_ & 1);
760
+ #endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION)
761
+ case realValue:
762
+ return value_.real_;
763
+ case booleanValue:
764
+ return value_.bool_ ? 1.0 : 0.0;
765
+ case stringValue:
766
+ case arrayValue:
767
+ case objectValue:
768
+ JSON_ASSERT_MESSAGE( false, "Type is not convertible to double" );
769
+ default:
770
+ JSON_ASSERT_UNREACHABLE;
771
+ }
772
+ return 0; // unreachable;
773
+ }
774
+
775
+ bool
776
+ Value::asBool() const
777
+ {
778
+ switch ( type_ )
779
+ {
780
+ case nullValue:
781
+ return false;
782
+ case intValue:
783
+ case uintValue:
784
+ return value_.int_ != 0;
785
+ case realValue:
786
+ return value_.real_ != 0.0;
787
+ case booleanValue:
788
+ return value_.bool_;
789
+ case stringValue:
790
+ return value_.string_ && value_.string_[0] != 0;
791
+ case arrayValue:
792
+ case objectValue:
793
+ return value_.map_->size() != 0;
794
+ default:
795
+ JSON_ASSERT_UNREACHABLE;
796
+ }
797
+ return false; // unreachable;
798
+ }
799
+
800
+
801
+ bool
802
+ Value::isConvertibleTo( ValueType other ) const
803
+ {
804
+ switch ( type_ )
805
+ {
806
+ case nullValue:
807
+ return true;
808
+ case intValue:
809
+ return ( other == nullValue && value_.int_ == 0 )
810
+ || other == intValue
811
+ || ( other == uintValue && value_.int_ >= 0 )
812
+ || other == realValue
813
+ || other == stringValue
814
+ || other == booleanValue;
815
+ case uintValue:
816
+ return ( other == nullValue && value_.uint_ == 0 )
817
+ || ( other == intValue && value_.uint_ <= (unsigned)maxInt )
818
+ || other == uintValue
819
+ || other == realValue
820
+ || other == stringValue
821
+ || other == booleanValue;
822
+ case realValue:
823
+ return ( other == nullValue && value_.real_ == 0.0 )
824
+ || ( other == intValue && value_.real_ >= minInt && value_.real_ <= maxInt )
825
+ || ( other == uintValue && value_.real_ >= 0 && value_.real_ <= maxUInt )
826
+ || other == realValue
827
+ || other == stringValue
828
+ || other == booleanValue;
829
+ case booleanValue:
830
+ return ( other == nullValue && value_.bool_ == false )
831
+ || other == intValue
832
+ || other == uintValue
833
+ || other == realValue
834
+ || other == stringValue
835
+ || other == booleanValue;
836
+ case stringValue:
837
+ return other == stringValue
838
+ || ( other == nullValue && (!value_.string_ || value_.string_[0] == 0) );
839
+ case arrayValue:
840
+ return other == arrayValue
841
+ || ( other == nullValue && value_.map_->size() == 0 );
842
+ case objectValue:
843
+ return other == objectValue
844
+ || ( other == nullValue && value_.map_->size() == 0 );
845
+ default:
846
+ JSON_ASSERT_UNREACHABLE;
847
+ }
848
+ return false; // unreachable;
849
+ }
850
+
851
+
852
+ /// Number of values in array or object
853
+ ArrayIndex
854
+ Value::size() const
855
+ {
856
+ switch ( type_ )
857
+ {
858
+ case nullValue:
859
+ case intValue:
860
+ case uintValue:
861
+ case realValue:
862
+ case booleanValue:
863
+ case stringValue:
864
+ return 0;
865
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
866
+ case arrayValue: // size of the array is highest index + 1
867
+ if ( !value_.map_->empty() )
868
+ {
869
+ ObjectValues::const_iterator itLast = value_.map_->end();
870
+ --itLast;
871
+ return (*itLast).first.index()+1;
872
+ }
873
+ return 0;
874
+ case objectValue:
875
+ return ArrayIndex( value_.map_->size() );
876
+ #else
877
+ case arrayValue:
878
+ return Int( value_.array_->size() );
879
+ case objectValue:
880
+ return Int( value_.map_->size() );
881
+ #endif
882
+ default:
883
+ JSON_ASSERT_UNREACHABLE;
884
+ }
885
+ return 0; // unreachable;
886
+ }
887
+
888
+
889
+ bool
890
+ Value::empty() const
891
+ {
892
+ if ( isNull() || isArray() || isObject() )
893
+ return size() == 0u;
894
+ else
895
+ return false;
896
+ }
897
+
898
+
899
+ bool
900
+ Value::operator!() const
901
+ {
902
+ return isNull();
903
+ }
904
+
905
+
906
+ void
907
+ Value::clear()
908
+ {
909
+ JSON_ASSERT( type_ == nullValue || type_ == arrayValue || type_ == objectValue );
910
+
911
+ switch ( type_ )
912
+ {
913
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
914
+ case arrayValue:
915
+ case objectValue:
916
+ value_.map_->clear();
917
+ break;
918
+ #else
919
+ case arrayValue:
920
+ value_.array_->clear();
921
+ break;
922
+ case objectValue:
923
+ value_.map_->clear();
924
+ break;
925
+ #endif
926
+ default:
927
+ break;
928
+ }
929
+ }
930
+
931
+ void
932
+ Value::resize( ArrayIndex newSize )
933
+ {
934
+ JSON_ASSERT( type_ == nullValue || type_ == arrayValue );
935
+ if ( type_ == nullValue )
936
+ *this = Value( arrayValue );
937
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
938
+ ArrayIndex oldSize = size();
939
+ if ( newSize == 0 )
940
+ clear();
941
+ else if ( newSize > oldSize )
942
+ (*this)[ newSize - 1 ];
943
+ else
944
+ {
945
+ for ( ArrayIndex index = newSize; index < oldSize; ++index )
946
+ {
947
+ value_.map_->erase( index );
948
+ }
949
+ assert( size() == newSize );
950
+ }
951
+ #else
952
+ value_.array_->resize( newSize );
953
+ #endif
954
+ }
955
+
956
+
957
+ Value &
958
+ Value::operator[]( ArrayIndex index )
959
+ {
960
+ JSON_ASSERT( type_ == nullValue || type_ == arrayValue );
961
+ if ( type_ == nullValue )
962
+ *this = Value( arrayValue );
963
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
964
+ CZString key( index );
965
+ ObjectValues::iterator it = value_.map_->lower_bound( key );
966
+ if ( it != value_.map_->end() && (*it).first == key )
967
+ return (*it).second;
968
+
969
+ ObjectValues::value_type defaultValue( key, null );
970
+ it = value_.map_->insert( it, defaultValue );
971
+ return (*it).second;
972
+ #else
973
+ return value_.array_->resolveReference( index );
974
+ #endif
975
+ }
976
+
977
+
978
+ const Value &
979
+ Value::operator[]( ArrayIndex index ) const
980
+ {
981
+ JSON_ASSERT( type_ == nullValue || type_ == arrayValue );
982
+ if ( type_ == nullValue )
983
+ return null;
984
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
985
+ CZString key( index );
986
+ ObjectValues::const_iterator it = value_.map_->find( key );
987
+ if ( it == value_.map_->end() )
988
+ return null;
989
+ return (*it).second;
990
+ #else
991
+ Value *value = value_.array_->find( index );
992
+ return value ? *value : null;
993
+ #endif
994
+ }
995
+
996
+
997
+ Value &
998
+ Value::operator[]( const char *key )
999
+ {
1000
+ return resolveReference( key, false );
1001
+ }
1002
+
1003
+
1004
+ Value &
1005
+ Value::resolveReference( const char *key,
1006
+ bool isStatic )
1007
+ {
1008
+ JSON_ASSERT( type_ == nullValue || type_ == objectValue );
1009
+ if ( type_ == nullValue )
1010
+ *this = Value( objectValue );
1011
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
1012
+ CZString actualKey( key, isStatic ? CZString::noDuplication
1013
+ : CZString::duplicateOnCopy );
1014
+ ObjectValues::iterator it = value_.map_->lower_bound( actualKey );
1015
+ if ( it != value_.map_->end() && (*it).first == actualKey )
1016
+ return (*it).second;
1017
+
1018
+ ObjectValues::value_type defaultValue( actualKey, null );
1019
+ it = value_.map_->insert( it, defaultValue );
1020
+ Value &value = (*it).second;
1021
+ return value;
1022
+ #else
1023
+ return value_.map_->resolveReference( key, isStatic );
1024
+ #endif
1025
+ }
1026
+
1027
+
1028
+ Value
1029
+ Value::get( ArrayIndex index,
1030
+ const Value &defaultValue ) const
1031
+ {
1032
+ const Value *value = &((*this)[index]);
1033
+ return value == &null ? defaultValue : *value;
1034
+ }
1035
+
1036
+
1037
+ bool
1038
+ Value::isValidIndex( ArrayIndex index ) const
1039
+ {
1040
+ return index < size();
1041
+ }
1042
+
1043
+
1044
+
1045
+ const Value &
1046
+ Value::operator[]( const char *key ) const
1047
+ {
1048
+ JSON_ASSERT( type_ == nullValue || type_ == objectValue );
1049
+ if ( type_ == nullValue )
1050
+ return null;
1051
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
1052
+ CZString actualKey( key, CZString::noDuplication );
1053
+ ObjectValues::const_iterator it = value_.map_->find( actualKey );
1054
+ if ( it == value_.map_->end() )
1055
+ return null;
1056
+ return (*it).second;
1057
+ #else
1058
+ const Value *value = value_.map_->find( key );
1059
+ return value ? *value : null;
1060
+ #endif
1061
+ }
1062
+
1063
+
1064
+ Value &
1065
+ Value::operator[]( const std::string &key )
1066
+ {
1067
+ return (*this)[ key.c_str() ];
1068
+ }
1069
+
1070
+
1071
+ const Value &
1072
+ Value::operator[]( const std::string &key ) const
1073
+ {
1074
+ return (*this)[ key.c_str() ];
1075
+ }
1076
+
1077
+ Value &
1078
+ Value::operator[]( const StaticString &key )
1079
+ {
1080
+ return resolveReference( key, true );
1081
+ }
1082
+
1083
+
1084
+ # ifdef JSON_USE_CPPTL
1085
+ Value &
1086
+ Value::operator[]( const CppTL::ConstString &key )
1087
+ {
1088
+ return (*this)[ key.c_str() ];
1089
+ }
1090
+
1091
+
1092
+ const Value &
1093
+ Value::operator[]( const CppTL::ConstString &key ) const
1094
+ {
1095
+ return (*this)[ key.c_str() ];
1096
+ }
1097
+ # endif
1098
+
1099
+
1100
+ Value &
1101
+ Value::append( const Value &value )
1102
+ {
1103
+ return (*this)[size()] = value;
1104
+ }
1105
+
1106
+
1107
+ Value
1108
+ Value::get( const char *key,
1109
+ const Value &defaultValue ) const
1110
+ {
1111
+ const Value *value = &((*this)[key]);
1112
+ return value == &null ? defaultValue : *value;
1113
+ }
1114
+
1115
+
1116
+ Value
1117
+ Value::get( const std::string &key,
1118
+ const Value &defaultValue ) const
1119
+ {
1120
+ return get( key.c_str(), defaultValue );
1121
+ }
1122
+
1123
+ Value
1124
+ Value::removeMember( const char* key )
1125
+ {
1126
+ JSON_ASSERT( type_ == nullValue || type_ == objectValue );
1127
+ if ( type_ == nullValue )
1128
+ return null;
1129
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
1130
+ CZString actualKey( key, CZString::noDuplication );
1131
+ ObjectValues::iterator it = value_.map_->find( actualKey );
1132
+ if ( it == value_.map_->end() )
1133
+ return null;
1134
+ Value old(it->second);
1135
+ value_.map_->erase(it);
1136
+ return old;
1137
+ #else
1138
+ Value *value = value_.map_->find( key );
1139
+ if (value){
1140
+ Value old(*value);
1141
+ value_.map_.remove( key );
1142
+ return old;
1143
+ } else {
1144
+ return null;
1145
+ }
1146
+ #endif
1147
+ }
1148
+
1149
+ Value
1150
+ Value::removeMember( const std::string &key )
1151
+ {
1152
+ return removeMember( key.c_str() );
1153
+ }
1154
+
1155
+ # ifdef JSON_USE_CPPTL
1156
+ Value
1157
+ Value::get( const CppTL::ConstString &key,
1158
+ const Value &defaultValue ) const
1159
+ {
1160
+ return get( key.c_str(), defaultValue );
1161
+ }
1162
+ # endif
1163
+
1164
+ bool
1165
+ Value::isMember( const char *key ) const
1166
+ {
1167
+ const Value *value = &((*this)[key]);
1168
+ return value != &null;
1169
+ }
1170
+
1171
+
1172
+ bool
1173
+ Value::isMember( const std::string &key ) const
1174
+ {
1175
+ return isMember( key.c_str() );
1176
+ }
1177
+
1178
+
1179
+ # ifdef JSON_USE_CPPTL
1180
+ bool
1181
+ Value::isMember( const CppTL::ConstString &key ) const
1182
+ {
1183
+ return isMember( key.c_str() );
1184
+ }
1185
+ #endif
1186
+
1187
+ Value::Members
1188
+ Value::getMemberNames() const
1189
+ {
1190
+ JSON_ASSERT( type_ == nullValue || type_ == objectValue );
1191
+ if ( type_ == nullValue )
1192
+ return Value::Members();
1193
+ Members members;
1194
+ members.reserve( value_.map_->size() );
1195
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
1196
+ ObjectValues::const_iterator it = value_.map_->begin();
1197
+ ObjectValues::const_iterator itEnd = value_.map_->end();
1198
+ for ( ; it != itEnd; ++it )
1199
+ members.push_back( std::string( (*it).first.c_str() ) );
1200
+ #else
1201
+ ValueInternalMap::IteratorState it;
1202
+ ValueInternalMap::IteratorState itEnd;
1203
+ value_.map_->makeBeginIterator( it );
1204
+ value_.map_->makeEndIterator( itEnd );
1205
+ for ( ; !ValueInternalMap::equals( it, itEnd ); ValueInternalMap::increment(it) )
1206
+ members.push_back( std::string( ValueInternalMap::key( it ) ) );
1207
+ #endif
1208
+ return members;
1209
+ }
1210
+ //
1211
+ //# ifdef JSON_USE_CPPTL
1212
+ //EnumMemberNames
1213
+ //Value::enumMemberNames() const
1214
+ //{
1215
+ // if ( type_ == objectValue )
1216
+ // {
1217
+ // return CppTL::Enum::any( CppTL::Enum::transform(
1218
+ // CppTL::Enum::keys( *(value_.map_), CppTL::Type<const CZString &>() ),
1219
+ // MemberNamesTransform() ) );
1220
+ // }
1221
+ // return EnumMemberNames();
1222
+ //}
1223
+ //
1224
+ //
1225
+ //EnumValues
1226
+ //Value::enumValues() const
1227
+ //{
1228
+ // if ( type_ == objectValue || type_ == arrayValue )
1229
+ // return CppTL::Enum::anyValues( *(value_.map_),
1230
+ // CppTL::Type<const Value &>() );
1231
+ // return EnumValues();
1232
+ //}
1233
+ //
1234
+ //# endif
1235
+
1236
+
1237
+ bool
1238
+ Value::isNull() const
1239
+ {
1240
+ return type_ == nullValue;
1241
+ }
1242
+
1243
+
1244
+ bool
1245
+ Value::isBool() const
1246
+ {
1247
+ return type_ == booleanValue;
1248
+ }
1249
+
1250
+
1251
+ bool
1252
+ Value::isInt() const
1253
+ {
1254
+ return type_ == intValue;
1255
+ }
1256
+
1257
+
1258
+ bool
1259
+ Value::isUInt() const
1260
+ {
1261
+ return type_ == uintValue;
1262
+ }
1263
+
1264
+
1265
+ bool
1266
+ Value::isIntegral() const
1267
+ {
1268
+ return type_ == intValue
1269
+ || type_ == uintValue
1270
+ || type_ == booleanValue;
1271
+ }
1272
+
1273
+
1274
+ bool
1275
+ Value::isDouble() const
1276
+ {
1277
+ return type_ == realValue;
1278
+ }
1279
+
1280
+
1281
+ bool
1282
+ Value::isNumeric() const
1283
+ {
1284
+ return isIntegral() || isDouble();
1285
+ }
1286
+
1287
+
1288
+ bool
1289
+ Value::isString() const
1290
+ {
1291
+ return type_ == stringValue;
1292
+ }
1293
+
1294
+
1295
+ bool
1296
+ Value::isArray() const
1297
+ {
1298
+ return type_ == nullValue || type_ == arrayValue;
1299
+ }
1300
+
1301
+
1302
+ bool
1303
+ Value::isObject() const
1304
+ {
1305
+ return type_ == nullValue || type_ == objectValue;
1306
+ }
1307
+
1308
+
1309
+ void
1310
+ Value::setComment( const char *comment,
1311
+ CommentPlacement placement )
1312
+ {
1313
+ if ( !comments_ )
1314
+ comments_ = new CommentInfo[numberOfCommentPlacement];
1315
+ comments_[placement].setComment( comment );
1316
+ }
1317
+
1318
+
1319
+ void
1320
+ Value::setComment( const std::string &comment,
1321
+ CommentPlacement placement )
1322
+ {
1323
+ setComment( comment.c_str(), placement );
1324
+ }
1325
+
1326
+
1327
+ bool
1328
+ Value::hasComment( CommentPlacement placement ) const
1329
+ {
1330
+ return comments_ != 0 && comments_[placement].comment_ != 0;
1331
+ }
1332
+
1333
+ std::string
1334
+ Value::getComment( CommentPlacement placement ) const
1335
+ {
1336
+ if ( hasComment(placement) )
1337
+ return comments_[placement].comment_;
1338
+ return "";
1339
+ }
1340
+
1341
+
1342
+ std::string
1343
+ Value::toStyledString() const
1344
+ {
1345
+ StyledWriter writer;
1346
+ return writer.write( *this );
1347
+ }
1348
+
1349
+
1350
+ Value::const_iterator
1351
+ Value::begin() const
1352
+ {
1353
+ switch ( type_ )
1354
+ {
1355
+ #ifdef JSON_VALUE_USE_INTERNAL_MAP
1356
+ case arrayValue:
1357
+ if ( value_.array_ )
1358
+ {
1359
+ ValueInternalArray::IteratorState it;
1360
+ value_.array_->makeBeginIterator( it );
1361
+ return const_iterator( it );
1362
+ }
1363
+ break;
1364
+ case objectValue:
1365
+ if ( value_.map_ )
1366
+ {
1367
+ ValueInternalMap::IteratorState it;
1368
+ value_.map_->makeBeginIterator( it );
1369
+ return const_iterator( it );
1370
+ }
1371
+ break;
1372
+ #else
1373
+ case arrayValue:
1374
+ case objectValue:
1375
+ if ( value_.map_ )
1376
+ return const_iterator( value_.map_->begin() );
1377
+ break;
1378
+ #endif
1379
+ default:
1380
+ break;
1381
+ }
1382
+ return const_iterator();
1383
+ }
1384
+
1385
+ Value::const_iterator
1386
+ Value::end() const
1387
+ {
1388
+ switch ( type_ )
1389
+ {
1390
+ #ifdef JSON_VALUE_USE_INTERNAL_MAP
1391
+ case arrayValue:
1392
+ if ( value_.array_ )
1393
+ {
1394
+ ValueInternalArray::IteratorState it;
1395
+ value_.array_->makeEndIterator( it );
1396
+ return const_iterator( it );
1397
+ }
1398
+ break;
1399
+ case objectValue:
1400
+ if ( value_.map_ )
1401
+ {
1402
+ ValueInternalMap::IteratorState it;
1403
+ value_.map_->makeEndIterator( it );
1404
+ return const_iterator( it );
1405
+ }
1406
+ break;
1407
+ #else
1408
+ case arrayValue:
1409
+ case objectValue:
1410
+ if ( value_.map_ )
1411
+ return const_iterator( value_.map_->end() );
1412
+ break;
1413
+ #endif
1414
+ default:
1415
+ break;
1416
+ }
1417
+ return const_iterator();
1418
+ }
1419
+
1420
+
1421
+ Value::iterator
1422
+ Value::begin()
1423
+ {
1424
+ switch ( type_ )
1425
+ {
1426
+ #ifdef JSON_VALUE_USE_INTERNAL_MAP
1427
+ case arrayValue:
1428
+ if ( value_.array_ )
1429
+ {
1430
+ ValueInternalArray::IteratorState it;
1431
+ value_.array_->makeBeginIterator( it );
1432
+ return iterator( it );
1433
+ }
1434
+ break;
1435
+ case objectValue:
1436
+ if ( value_.map_ )
1437
+ {
1438
+ ValueInternalMap::IteratorState it;
1439
+ value_.map_->makeBeginIterator( it );
1440
+ return iterator( it );
1441
+ }
1442
+ break;
1443
+ #else
1444
+ case arrayValue:
1445
+ case objectValue:
1446
+ if ( value_.map_ )
1447
+ return iterator( value_.map_->begin() );
1448
+ break;
1449
+ #endif
1450
+ default:
1451
+ break;
1452
+ }
1453
+ return iterator();
1454
+ }
1455
+
1456
+ Value::iterator
1457
+ Value::end()
1458
+ {
1459
+ switch ( type_ )
1460
+ {
1461
+ #ifdef JSON_VALUE_USE_INTERNAL_MAP
1462
+ case arrayValue:
1463
+ if ( value_.array_ )
1464
+ {
1465
+ ValueInternalArray::IteratorState it;
1466
+ value_.array_->makeEndIterator( it );
1467
+ return iterator( it );
1468
+ }
1469
+ break;
1470
+ case objectValue:
1471
+ if ( value_.map_ )
1472
+ {
1473
+ ValueInternalMap::IteratorState it;
1474
+ value_.map_->makeEndIterator( it );
1475
+ return iterator( it );
1476
+ }
1477
+ break;
1478
+ #else
1479
+ case arrayValue:
1480
+ case objectValue:
1481
+ if ( value_.map_ )
1482
+ return iterator( value_.map_->end() );
1483
+ break;
1484
+ #endif
1485
+ default:
1486
+ break;
1487
+ }
1488
+ return iterator();
1489
+ }
1490
+
1491
+
1492
+ // class PathArgument
1493
+ // //////////////////////////////////////////////////////////////////
1494
+
1495
+ PathArgument::PathArgument()
1496
+ : kind_( kindNone )
1497
+ {
1498
+ }
1499
+
1500
+
1501
+ PathArgument::PathArgument( ArrayIndex index )
1502
+ : index_( index )
1503
+ , kind_( kindIndex )
1504
+ {
1505
+ }
1506
+
1507
+
1508
+ PathArgument::PathArgument( const char *key )
1509
+ : key_( key )
1510
+ , kind_( kindKey )
1511
+ {
1512
+ }
1513
+
1514
+
1515
+ PathArgument::PathArgument( const std::string &key )
1516
+ : key_( key.c_str() )
1517
+ , kind_( kindKey )
1518
+ {
1519
+ }
1520
+
1521
+ // class Path
1522
+ // //////////////////////////////////////////////////////////////////
1523
+
1524
+ Path::Path( const std::string &path,
1525
+ const PathArgument &a1,
1526
+ const PathArgument &a2,
1527
+ const PathArgument &a3,
1528
+ const PathArgument &a4,
1529
+ const PathArgument &a5 )
1530
+ {
1531
+ InArgs in;
1532
+ in.push_back( &a1 );
1533
+ in.push_back( &a2 );
1534
+ in.push_back( &a3 );
1535
+ in.push_back( &a4 );
1536
+ in.push_back( &a5 );
1537
+ makePath( path, in );
1538
+ }
1539
+
1540
+
1541
+ void
1542
+ Path::makePath( const std::string &path,
1543
+ const InArgs &in )
1544
+ {
1545
+ const char *current = path.c_str();
1546
+ const char *end = current + path.length();
1547
+ InArgs::const_iterator itInArg = in.begin();
1548
+ while ( current != end )
1549
+ {
1550
+ if ( *current == '[' )
1551
+ {
1552
+ ++current;
1553
+ if ( *current == '%' )
1554
+ addPathInArg( path, in, itInArg, PathArgument::kindIndex );
1555
+ else
1556
+ {
1557
+ ArrayIndex index = 0;
1558
+ for ( ; current != end && *current >= '0' && *current <= '9'; ++current )
1559
+ index = index * 10 + ArrayIndex(*current - '0');
1560
+ args_.push_back( index );
1561
+ }
1562
+ if ( current == end || *current++ != ']' )
1563
+ invalidPath( path, int(current - path.c_str()) );
1564
+ }
1565
+ else if ( *current == '%' )
1566
+ {
1567
+ addPathInArg( path, in, itInArg, PathArgument::kindKey );
1568
+ ++current;
1569
+ }
1570
+ else if ( *current == '.' )
1571
+ {
1572
+ ++current;
1573
+ }
1574
+ else
1575
+ {
1576
+ const char *beginName = current;
1577
+ while ( current != end && !strchr( "[.", *current ) )
1578
+ ++current;
1579
+ args_.push_back( std::string( beginName, current ) );
1580
+ }
1581
+ }
1582
+ }
1583
+
1584
+
1585
+ void
1586
+ Path::addPathInArg( const std::string &path,
1587
+ const InArgs &in,
1588
+ InArgs::const_iterator &itInArg,
1589
+ PathArgument::Kind kind )
1590
+ {
1591
+ if ( itInArg == in.end() )
1592
+ {
1593
+ // Error: missing argument %d
1594
+ }
1595
+ else if ( (*itInArg)->kind_ != kind )
1596
+ {
1597
+ // Error: bad argument type
1598
+ }
1599
+ else
1600
+ {
1601
+ args_.push_back( **itInArg );
1602
+ }
1603
+ }
1604
+
1605
+
1606
+ void
1607
+ Path::invalidPath( const std::string &path,
1608
+ int location )
1609
+ {
1610
+ // Error: invalid path.
1611
+ }
1612
+
1613
+
1614
+ const Value &
1615
+ Path::resolve( const Value &root ) const
1616
+ {
1617
+ const Value *node = &root;
1618
+ for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
1619
+ {
1620
+ const PathArgument &arg = *it;
1621
+ if ( arg.kind_ == PathArgument::kindIndex )
1622
+ {
1623
+ if ( !node->isArray() || node->isValidIndex( arg.index_ ) )
1624
+ {
1625
+ // Error: unable to resolve path (array value expected at position...
1626
+ }
1627
+ node = &((*node)[arg.index_]);
1628
+ }
1629
+ else if ( arg.kind_ == PathArgument::kindKey )
1630
+ {
1631
+ if ( !node->isObject() )
1632
+ {
1633
+ // Error: unable to resolve path (object value expected at position...)
1634
+ }
1635
+ node = &((*node)[arg.key_]);
1636
+ if ( node == &Value::null )
1637
+ {
1638
+ // Error: unable to resolve path (object has no member named '' at position...)
1639
+ }
1640
+ }
1641
+ }
1642
+ return *node;
1643
+ }
1644
+
1645
+
1646
+ Value
1647
+ Path::resolve( const Value &root,
1648
+ const Value &defaultValue ) const
1649
+ {
1650
+ const Value *node = &root;
1651
+ for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
1652
+ {
1653
+ const PathArgument &arg = *it;
1654
+ if ( arg.kind_ == PathArgument::kindIndex )
1655
+ {
1656
+ if ( !node->isArray() || node->isValidIndex( arg.index_ ) )
1657
+ return defaultValue;
1658
+ node = &((*node)[arg.index_]);
1659
+ }
1660
+ else if ( arg.kind_ == PathArgument::kindKey )
1661
+ {
1662
+ if ( !node->isObject() )
1663
+ return defaultValue;
1664
+ node = &((*node)[arg.key_]);
1665
+ if ( node == &Value::null )
1666
+ return defaultValue;
1667
+ }
1668
+ }
1669
+ return *node;
1670
+ }
1671
+
1672
+
1673
+ Value &
1674
+ Path::make( Value &root ) const
1675
+ {
1676
+ Value *node = &root;
1677
+ for ( Args::const_iterator it = args_.begin(); it != args_.end(); ++it )
1678
+ {
1679
+ const PathArgument &arg = *it;
1680
+ if ( arg.kind_ == PathArgument::kindIndex )
1681
+ {
1682
+ if ( !node->isArray() )
1683
+ {
1684
+ // Error: node is not an array at position ...
1685
+ }
1686
+ node = &((*node)[arg.index_]);
1687
+ }
1688
+ else if ( arg.kind_ == PathArgument::kindKey )
1689
+ {
1690
+ if ( !node->isObject() )
1691
+ {
1692
+ // Error: node is not an object at position...
1693
+ }
1694
+ node = &((*node)[arg.key_]);
1695
+ }
1696
+ }
1697
+ return *node;
1698
+ }
1699
+
1700
+
1701
+ } // namespace Json