OXIESEC PANEL
- Current Dir:
/
/
usr
/
include
/
gdcm-2.8
Server IP: 139.59.38.164
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
10/28/2024 06:50:42 AM
rwxr-xr-x
📄
gdcmAAbortPDU.h
1.43 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmAAssociateACPDU.h
3.22 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmAAssociateRJPDU.h
1.35 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmAAssociateRQPDU.h
5.41 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmARTIMTimer.h
2.48 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmAReleaseRPPDU.h
1.28 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmAReleaseRQPDU.h
1.28 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmASN1.h
1.22 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmAbstractSyntax.h
1.78 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmAnonymizeEvent.h
1.5 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmAnonymizer.h
6.67 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmApplicationContext.h
1.56 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmApplicationEntity.h
1.81 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmAsynchronousOperationsWindowSub.h
1.37 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmAttribute.h
32.28 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmAudioCodec.h
1011 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmBase64.h
1.9 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmBaseCompositeMessage.h
2.39 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmBaseNormalizedMessage.h
2.22 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmBasePDU.h
1.96 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmBaseQuery.h
2.74 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmBaseRootQuery.h
4.33 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmBasicOffsetTable.h
3.17 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmBitmap.h
5.7 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmBitmapToBitmapFilter.h
1.22 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmBoxRegion.h
2.02 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmByteBuffer.h
2.45 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmByteSwap.h
1.46 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmByteSwap.txx
4.55 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmByteSwapFilter.h
1.1 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmByteValue.h
6.53 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCAPICryptoFactory.h
931 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCAPICryptographicMessageSyntax.h
1.96 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCEchoMessages.h
1.46 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCFindMessages.h
1.65 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCMoveMessages.h
1.88 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCP246ExplicitDataElement.h
1.59 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCP246ExplicitDataElement.txx
6.51 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCSAElement.h
4.76 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCSAHeader.h
4.89 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCSAHeader.txx
957 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCSAHeaderDict.h
2.84 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCSAHeaderDictEntry.h
2.74 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCStoreMessages.h
1.8 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCodeString.h
3.67 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCodec.h
809 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCoder.h
1.28 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCommand.h
5.09 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCommandDataSet.h
1.7 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCompositeMessageFactory.h
2.44 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCompositeNetworkFunctions.h
5.84 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmConfigure.h
5.53 KB
02/05/2018 04:49:23 PM
rw-r--r--
📄
gdcmConstCharWrapper.h
1.6 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCryptoFactory.h
1.85 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCryptographicMessageSyntax.h
1.78 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmCurve.h
2.54 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDICOMDIR.h
984 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDICOMDIRGenerator.h
3.85 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDIMSE.h
2.61 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDataElement.h
9 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDataEvent.h
1.53 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDataSet.h
10.79 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDataSet.txx
16.02 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDataSetEvent.h
1.47 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDataSetHelper.h
1.22 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDecoder.h
1.16 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDefinedTerms.h
1.56 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDeflateStream.h
678 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDefs.h
2.04 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDeltaEncodingCodec.h
1.08 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDict.h
9.53 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDictConverter.h
2.05 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDictEntry.h
4.29 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDictPrinter.h
1.04 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDicts.h
2.22 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDirectionCosines.h
1.94 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDirectory.h
3.08 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDirectoryHelper.h
3.51 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDummyValueGenerator.h
1.15 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmDumper.h
1023 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmElement.h
23.5 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmEmptyMaskGenerator.h
2.64 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmEncapsulatedDocument.h
866 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmEnumeratedValues.h
1.53 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmEvent.h
3.07 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmException.h
3.24 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmExplicitDataElement.h
1.36 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmExplicitDataElement.txx
16.27 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmExplicitImplicitDataElement.h
1.81 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmExplicitImplicitDataElement.txx
14.69 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFiducials.h
800 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFile.h
2.1 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFileAnonymizer.h
2.84 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFileChangeTransferSyntax.h
2.2 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFileDecompressLookupTable.h
1.49 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFileDerivation.h
3.19 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFileExplicitFilter.h
2.43 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFileMetaInformation.h
4.78 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFileNameEvent.h
1.51 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFileSet.h
1.62 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFileStreamer.h
4.04 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFilename.h
2.26 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFilenameGenerator.h
2.09 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFindPatientRootQuery.h
1.2 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFindStudyRootQuery.h
1.41 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFragment.h
6.13 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmFragment.txx
711 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmGlobal.h
3.41 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmGroupDict.h
2.29 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmIOD.h
1.85 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmIODEntry.h
2.97 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmIODs.h
2.02 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmIPPSorter.h
4.62 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmIconImage.h
2.47 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmIconImageFilter.h
2.37 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmIconImageGenerator.h
3.09 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImage.h
3.63 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImageApplyLookupTable.h
1.11 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImageChangePhotometricInterpretation.h
3.77 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImageChangePlanarConfiguration.h
2.72 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImageChangeTransferSyntax.h
3.29 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImageCodec.h
4.51 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImageConverter.h
1.27 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImageFragmentSplitter.h
1.53 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImageHelper.h
6.92 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImageReader.h
1.55 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImageRegionReader.h
2.44 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImageToImageFilter.h
1.15 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImageWriter.h
1.46 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImplementationClassUIDSub.h
1.27 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImplementationUIDSub.h
1.14 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImplementationVersionNameSub.h
1.28 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImplicitDataElement.h
1.49 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmImplicitDataElement.txx
18.5 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmItem.h
9.65 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmItem.txx
1.82 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmJPEG12Codec.h
1.26 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmJPEG16Codec.h
1.25 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmJPEG2000Codec.h
2.73 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmJPEG8Codec.h
1.25 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmJPEGCodec.h
3.23 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmJPEGLSCodec.h
2.99 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmJSON.h
1.12 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmKAKADUCodec.h
1.06 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmLO.h
1.81 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmLegacyMacro.h
2.72 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmLookupTable.h
3.33 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmMD5.h
1.41 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmMacro.h
2.93 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmMacroEntry.h
2.57 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmMacros.h
2.05 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmMaximumLengthSub.h
1.39 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmMediaStorage.h
7.39 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmMeshPrimitive.h
2.34 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmModalityPerformedProcedureStepCreateQuery.h
1.3 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmModalityPerformedProcedureStepSetQuery.h
1.28 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmModule.h
3.15 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmModuleEntry.h
2.51 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmModules.h
2.06 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmMovePatientRootQuery.h
1.21 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmMoveStudyRootQuery.h
1.19 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmMrProtocol.h
2.17 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmNActionMessages.h
1.27 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmNCreateMessages.h
1.27 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmNDeleteMessages.h
1.27 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmNEventReportMessages.h
1.31 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmNGetMessages.h
1.24 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmNSetMessages.h
1.24 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmNestedModuleEntries.h
1.88 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmNetworkEvents.h
1.95 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmNetworkStateID.h
2.69 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmNormalizedMessageFactory.h
1.64 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmNormalizedNetworkFunctions.h
3.03 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmObject.h
2.98 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmOpenSSLCryptoFactory.h
1.18 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmOpenSSLCryptographicMessageSyntax.h
2.09 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmOpenSSLP7CryptoFactory.h
1.12 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmOpenSSLP7CryptographicMessageSyntax.h
2.37 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmOrientation.h
1.77 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmOverlay.h
3.71 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPDBElement.h
1.69 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPDBHeader.h
2.92 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPDFCodec.h
1003 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPDUFactory.h
3.42 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPDataTFPDU.h
1.89 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPGXCodec.h
1.21 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPNMCodec.h
1.52 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPVRGCodec.h
1.42 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmParseException.h
2.2 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmParser.h
3.98 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPatient.h
899 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPersonName.h
2.45 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPhotometricInterpretation.h
2.75 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPixelFormat.h
7.44 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPixmap.h
2.29 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPixmapReader.h
2.05 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPixmapToPixmapFilter.h
1.15 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPixmapWriter.h
1.99 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPreamble.h
1.9 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPresentationContext.h
2.21 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPresentationContextAC.h
1.77 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPresentationContextGenerator.h
3.79 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPresentationContextRQ.h
3.18 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPresentationDataValue.h
2.7 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPrinter.h
2.84 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmPrivateTag.h
2.5 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmProgressEvent.h
1.46 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmQueryBase.h
3.48 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmQueryFactory.h
3.58 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmQueryImage.h
1.45 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmQueryPatient.h
1.44 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmQuerySeries.h
1.43 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmQueryStudy.h
1.42 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmRAWCodec.h
1.45 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmRLECodec.h
2.51 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmReader.h
4.39 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmRegion.h
1.68 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmRescaler.h
4.63 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmRoleSelectionSub.h
1.36 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSHA1.h
1.42 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSOPClassExtendedNegociationSub.h
1.56 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSOPClassUIDToIOD.h
1.47 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmScanner.h
7.32 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSegment.h
4.18 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSegmentHelper.h
2.17 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSegmentReader.h
1.58 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSegmentWriter.h
1.52 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSegmentedPaletteColorLookupTable.h
1.16 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSequenceOfFragments.h
11.04 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSequenceOfFragments.txx
756 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSequenceOfItems.h
8.36 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSequenceOfItems.txx
1.22 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSerieHelper.h
3.03 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSeries.h
809 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmServiceClassApplicationInformation.h
1.28 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmServiceClassUser.h
3.94 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSimpleSubjectWatcher.h
2.91 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSmartPointer.h
2.86 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSorter.h
2.55 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSpacing.h
5.05 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSpectroscopy.h
824 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSplitMosaicFilter.h
2.15 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmStaticAssert.h
1.47 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmStreamImageReader.h
5.41 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmStreamImageWriter.h
6.21 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmStrictScanner.h
6.54 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmString.h
4.4 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmStringFilter.h
2.78 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmStudy.h
856 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSubject.h
2.43 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSurface.h
7.6 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSurfaceHelper.h
6.31 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSurfaceReader.h
1.27 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSurfaceWriter.h
1.62 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSwapCode.h
1.52 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSwapper.h
1.6 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSwapper.txx
6.14 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmSystem.h
5.16 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTable.h
1.61 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTableEntry.h
1.04 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTableReader.h
2.97 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTag.h
9.73 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTagKeywords.h
245.37 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTagPath.h
1.46 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTagToType.h
838.4 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTagToVR.h
734 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTerminal.h
1.56 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTestDriver.h
993 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTesting.h
4.38 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTrace.h
8.46 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTransferSyntax.h
4.34 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTransferSyntaxSub.h
1.65 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmType.h
1.86 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmTypes.h
1.96 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmUIDGenerator.h
3.41 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmUIDs.h
46.02 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmULAction.h
3.35 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmULActionAA.h
3.67 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmULActionAE.h
3.7 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmULActionAR.h
4.1 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmULActionDT.h
1.73 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmULBasicCallback.h
2.04 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmULConnection.h
5.33 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmULConnectionCallback.h
2.47 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmULConnectionInfo.h
2.63 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmULConnectionManager.h
6.94 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmULEvent.h
2.65 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmULTransitionTable.h
3.48 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmULWritingCallback.h
1.81 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmUNExplicitDataElement.h
1.46 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmUNExplicitDataElement.txx
6.18 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmUNExplicitImplicitDataElement.h
1.8 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmUNExplicitImplicitDataElement.txx
2.09 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmUUIDGenerator.h
1.04 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmUnpacker12Bits.h
1.72 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmUsage.h
2.61 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmUserInformation.h
2.15 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmVL.h
3.23 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmVM.h
4.92 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmVR.h
9.97 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmVR16ExplicitDataElement.h
1.57 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmVR16ExplicitDataElement.txx
8.84 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmValidate.h
973 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmValue.h
1.34 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmValue.txx
681 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmValueIO.h
1.01 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmValueIO.txx
2.25 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmVersion.h
1.43 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmWLMFindQuery.h
1.26 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmWaveform.h
800 bytes
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmWin32.h
3.05 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmWriter.h
3.03 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmXMLDictReader.h
1.39 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmXMLPrinter.h
3.54 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcmXMLPrivateDictReader.h
1.46 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcm_j2k.h
15.51 KB
11/09/2017 08:09:58 AM
rw-r--r--
📄
gdcm_jp2.h
5.8 KB
11/09/2017 08:09:58 AM
rw-r--r--
📁
gdcmjpeg
-
10/28/2024 06:50:28 AM
rwxr-xr-x
📄
zipstreamimpl.h
10.7 KB
11/09/2017 08:09:58 AM
rw-r--r--
Editing: gdcmAttribute.h
Close
/*========================================================================= Program: GDCM (Grassroots DICOM). A DICOM library Copyright (c) 2006-2011 Mathieu Malaterre All rights reserved. See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef GDCMATTRIBUTE_H #define GDCMATTRIBUTE_H #include "gdcmTypes.h" #include "gdcmVR.h" #include "gdcmTagToType.h" #include "gdcmVM.h" #include "gdcmElement.h" #include "gdcmDataElement.h" #include "gdcmDataSet.h" #include "gdcmStaticAssert.h" #include <string> #include <vector> #include <sstream> namespace gdcm_ns { struct void_; // Declaration, also serve as forward declaration template<int T> class VRVLSize; // Implementation when VL is coded on 16 bits: template<> class VRVLSize<0> { public: static inline uint16_t Read(std::istream &_is) { uint16_t l; _is.read((char*)&l, 2); return l; } static inline void Write(std::ostream &os) { (void)os; } }; // Implementation when VL is coded on 32 bits: template<> class VRVLSize<1> { public: static inline uint32_t Read(std::istream &_is) { char dummy[2]; _is.read(dummy, 2); uint32_t l; _is.read((char*)&l, 4); return l; } static inline void Write(std::ostream &os) { (void)os; } }; /** * \brief Attribute class * This class use template metaprograming tricks to let the user know when the template * instanciation does not match the public dictionary. * * Typical example that compile is: * Attribute<0x0008,0x9007> a = {"ORIGINAL","PRIMARY","T1","NONE"}; * * Examples that will NOT compile are: * * Attribute<0x0018,0x1182, VR::IS, VM::VM1> fd1 = {}; // not enough parameters * Attribute<0x0018,0x1182, VR::IS, VM::VM2> fd2 = {0,1,2}; // too many initializers * Attribute<0x0018,0x1182, VR::IS, VM::VM3> fd3 = {0,1,2}; // VM3 is not valid * Attribute<0x0018,0x1182, VR::UL, VM::VM2> fd3 = {0,1}; // UL is not valid VR */ template<uint16_t Group, uint16_t Element, int TVR = TagToType<Group, Element>::VRType, // can the user override this value ? int TVM = TagToType<Group, Element>::VMType // can the user override this value ? /*typename SQAttribute = void_*/ > // if only I had variadic template... class Attribute { public: typedef typename VRToType<TVR>::Type ArrayType; enum { VMType = VMToLength<TVM>::Length }; ArrayType Internal[VMToLength<TVM>::Length]; // Make sure that user specified VR/VM are compatible with the public dictionary: GDCM_STATIC_ASSERT( ((VR::VRType)TVR & (VR::VRType)(TagToType<Group, Element>::VRType)) ); GDCM_STATIC_ASSERT( ((VM::VMType)TVM & (VM::VMType)(TagToType<Group, Element>::VMType)) ); GDCM_STATIC_ASSERT( ((((VR::VRType)TVR & VR::VR_VM1) && ((VM::VMType)TVM == VM::VM1) ) || !((VR::VRType)TVR & VR::VR_VM1) ) ); static Tag GetTag() { return Tag(Group,Element); } static VR GetVR() { return (VR::VRType)TVR; } static VM GetVM() { return (VM::VMType)TVM; } // The following two methods do make sense only in case of public element, // when the template is intanciated with private element the VR/VM are simply // defaulted to allow everything (see gdcmTagToType.h default template for TagToType) static VR GetDictVR() { return (VR::VRType)(TagToType<Group, Element>::VRType); } static VM GetDictVM() { return (VM::VMType)(TagToType<Group, Element>::VMType); } // Some extra dummy checks: // Data Elements with a VR of SQ, OF, OW, OB or UN shall always have a Value Multiplicity of one. unsigned int GetNumberOfValues() const { return VMToLength<TVM>::Length; } // Implementation of Print is common to all Mode (ASCII/Binary) // TODO: Can we print a \ when in ASCII...well I don't think so // it would mean we used a bad VM then, right ? void Print(std::ostream &os) const { os << GetTag() << " "; os << TagToType<Group,Element>::GetVRString() << " "; os << TagToType<Group,Element>::GetVMString() << " "; os << Internal[0]; // VM is at least garantee to be one for(unsigned int i=1; i<GetNumberOfValues(); ++i) os << "," << Internal[i]; } // copy: //ArrayType GetValue(unsigned int idx = 0) { // assert( idx < GetNumberOfValues() ); // return Internal[idx]; //} //ArrayType operator[] (unsigned int idx) { // return GetValue(idx); //} // FIXME: is this always a good idea ? // I do not think so, I prefer operator //operator ArrayType () const { return Internal[0]; } bool operator==(const Attribute &att) const { return std::equal(Internal, Internal+GetNumberOfValues(), att.GetValues()); } bool operator!=(const Attribute &att) const { return !std::equal(Internal, Internal+GetNumberOfValues(), att.GetValues()); } bool operator<(const Attribute &att) const { return std::lexicographical_compare(Internal, Internal+GetNumberOfValues(), att.GetValues(), att.GetValues() + att.GetNumberOfValues() ); } ArrayType &GetValue(unsigned int idx = 0) { assert( idx < GetNumberOfValues() ); return Internal[idx]; } ArrayType & operator[] (unsigned int idx) { return GetValue(idx); } // const reference ArrayType const &GetValue(unsigned int idx = 0) const { assert( idx < GetNumberOfValues() ); return Internal[idx]; } ArrayType const & operator[] (unsigned int idx) const { return GetValue(idx); } void SetValue(ArrayType v, unsigned int idx = 0) { assert( idx < GetNumberOfValues() ); Internal[idx] = v; } void SetValues(const ArrayType* array, unsigned int numel = VMType ) { assert( array && numel && numel == GetNumberOfValues() ); // std::copy is smarted than a memcpy, and will call memcpy when POD type std::copy(array, array+numel, Internal); } const ArrayType* GetValues() const { return Internal; } // API to talk to the run-time layer: gdcm::DataElement DataElement GetAsDataElement() const { DataElement ret( GetTag() ); std::ostringstream os; // os.imbue(std::locale::classic()); // This is not required AFAIK EncodingImplementation<VRToEncoding<TVR>::Mode>::Write(Internal, GetNumberOfValues(),os); ret.SetVR( GetVR() ); assert( ret.GetVR() != VR::SQ ); if( (VR::VRType)VRToEncoding<TVR>::Mode == VR::VRASCII ) { if( GetVR() != VR::UI ) { if( os.str().size() % 2 ) { os << " "; } } } VL::Type osStrSize = (VL::Type)os.str().size(); ret.SetByteValue( os.str().c_str(), osStrSize ); return ret; } void SetFromDataElement(DataElement const &de) { // This is kind of hackish but since I do not generate other element than the first one: 0x6000 I should be ok: assert( GetTag() == de.GetTag() || GetTag().GetGroup() == 0x6000 || GetTag().GetGroup() == 0x5000 ); assert( GetVR() != VR::INVALID ); assert( GetVR().Compatible( de.GetVR() ) || de.GetVR() == VR::INVALID ); // In case of VR::INVALID cannot use the & operator if( de.IsEmpty() ) return; const ByteValue *bv = de.GetByteValue(); #ifdef GDCM_WORDS_BIGENDIAN if( de.GetVR() == VR::UN /*|| de.GetVR() == VR::INVALID*/ ) #else if( de.GetVR() == VR::UN || de.GetVR() == VR::INVALID ) #endif { SetByteValue(bv); } else { SetByteValueNoSwap(bv); } } void Set(DataSet const &ds) { SetFromDataElement( ds.GetDataElement( GetTag() ) ); } void SetFromDataSet(DataSet const &ds) { if( ds.FindDataElement( GetTag() ) && !ds.GetDataElement( GetTag() ).IsEmpty() ) { SetFromDataElement( ds.GetDataElement( GetTag() ) ); } } protected: void SetByteValueNoSwap(const ByteValue *bv) { if( !bv ) return; // That would be bad... assert( bv->GetPointer() && bv->GetLength() ); // [123]C element can be empty //if( VRToEncoding<TVR>::Mode == VR::VRBINARY ) // { // // always do a copy ! // SetValues(bv->GetPointer(), bv->GetLength()); // } //else { std::stringstream ss; std::string s = std::string( bv->GetPointer(), bv->GetLength() ); ss.str( s ); EncodingImplementation<VRToEncoding<TVR>::Mode>::ReadNoSwap(Internal, GetNumberOfValues(),ss); } } void SetByteValue(const ByteValue *bv) { if( !bv ) return; // That would be bad... assert( bv->GetPointer() && bv->GetLength() ); // [123]C element can be empty //if( VRToEncoding<TVR>::Mode == VR::VRBINARY ) // { // // always do a copy ! // SetValues(bv->GetPointer(), bv->GetLength()); // } //else { std::stringstream ss; std::string s = std::string( bv->GetPointer(), bv->GetLength() ); ss.str( s ); EncodingImplementation<VRToEncoding<TVR>::Mode>::Read(Internal, GetNumberOfValues(),ss); } } #if 0 // TODO FIXME the implicit way: // explicit: void Read(std::istream &_is) { const uint16_t cref[] = { Group, Element }; uint16_t c[2]; _is.read((char*)&c, sizeof(c)); assert( c[0] == cref[0] && c[1] == cref[1] ); char vr[2]; _is.read(vr, 2); // Check consistency ? const uint32_t lref = GetLength() * sizeof( typename VRToType<TVR>::Type ); uint32_t l = VRVLSize< (TVR & VR::VL32) >::Read(_is); l /= sizeof( typename VRToType<TVR>::Type ); return EncodingImplementation<VRToEncoding<TVR>::Mode>::Read(Internal, l,_is); } void Write(std::ostream &_os) const { uint16_t c[] = { Group, Element }; _os.write((char*)&c, 4); uint32_t l = GetLength() * sizeof( typename VRToType<TVR>::Type ); _os.write((char*)&l, 4); return EncodingImplementation<VRToEncoding<TVR>::Mode>::Write(Internal, GetLength(),_os); } void Read(std::istream &_is) { uint16_t cref[] = { Group, Element }; uint16_t c[2]; _is.read((char*)&c, 4); const uint32_t lref = GetLength() * sizeof( typename VRToType<TVR>::Type ); uint32_t l; _is.read((char*)&l, 4); l /= sizeof( typename VRToType<TVR>::Type ); return EncodingImplementation<VRToEncoding<TVR>::Mode>::Read(Internal, l,_is); } void Write(std::ostream &_os) const { uint16_t c[] = { Group, Element }; _os.write((char*)&c, 4); uint32_t l = GetLength() * sizeof( typename VRToType<TVR>::Type ); _os.write((char*)&l, 4); return EncodingImplementation<VRToEncoding<TVR>::Mode>::Write(Internal, GetLength(),_os); } #endif }; template<uint16_t Group, uint16_t Element, int TVR > class Attribute<Group,Element,TVR,VM::VM1> { public: typedef typename VRToType<TVR>::Type ArrayType; enum { VMType = VMToLength<VM::VM1>::Length }; //ArrayType Internal[VMToLength<TVM>::Length]; ArrayType Internal; GDCM_STATIC_ASSERT( VMToLength<VM::VM1>::Length == 1 ); // Make sure that user specified VR/VM are compatible with the public dictionary: GDCM_STATIC_ASSERT( ((VR::VRType)TVR & (VR::VRType)(TagToType<Group, Element>::VRType)) ); GDCM_STATIC_ASSERT( ((VM::VMType)VM::VM1 & (VM::VMType)(TagToType<Group, Element>::VMType)) ); GDCM_STATIC_ASSERT( ((((VR::VRType)TVR & VR::VR_VM1) && ((VM::VMType)VM::VM1 == VM::VM1) ) || !((VR::VRType)TVR & VR::VR_VM1) ) ); static Tag GetTag() { return Tag(Group,Element); } static VR GetVR() { return (VR::VRType)TVR; } static VM GetVM() { return (VM::VMType)VM::VM1; } // The following two methods do make sense only in case of public element, // when the template is intanciated with private element the VR/VM are simply // defaulted to allow everything (see gdcmTagToType.h default template for TagToType) static VR GetDictVR() { return (VR::VRType)(TagToType<Group, Element>::VRType); } static VM GetDictVM() { return (VM::VMType)(TagToType<Group, Element>::VMType); } // Some extra dummy checks: // Data Elements with a VR of SQ, OF, OW, OB or UN shall always have a Value Multiplicity of one. unsigned int GetNumberOfValues() const { return VMToLength<VM::VM1>::Length; } // Implementation of Print is common to all Mode (ASCII/Binary) // TODO: Can we print a \ when in ASCII...well I don't think so // it would mean we used a bad VM then, right ? void Print(std::ostream &os) const { os << GetTag() << " "; os << TagToType<Group,Element>::GetVRString() << " "; os << TagToType<Group,Element>::GetVMString() << " "; os << Internal; // VM is at least garantee to be one } // copy: //ArrayType GetValue(unsigned int idx = 0) { // assert( idx < GetNumberOfValues() ); // return Internal[idx]; //} //ArrayType operator[] (unsigned int idx) { // return GetValue(idx); //} // FIXME: is this always a good idea ? // I do not think so, I prefer operator //operator ArrayType () const { return Internal[0]; } bool operator==(const Attribute &att) const { return std::equal(&Internal, &Internal+GetNumberOfValues(), att.GetValues()); } bool operator!=(const Attribute &att) const { return !std::equal(&Internal, &Internal+GetNumberOfValues(), att.GetValues()); } bool operator<(const Attribute &att) const { return std::lexicographical_compare(&Internal, &Internal+GetNumberOfValues(), att.GetValues(), att.GetValues() + att.GetNumberOfValues() ); } ArrayType &GetValue() { // assert( idx < GetNumberOfValues() ); return Internal; } // ArrayType & operator[] (unsigned int idx) { // return GetValue(idx); // } // const reference ArrayType const &GetValue() const { //assert( idx < GetNumberOfValues() ); return Internal; } //ArrayType const & operator[] () const { // return GetValue(); //} void SetValue(ArrayType v) { // assert( idx < GetNumberOfValues() ); Internal = v; } /* void SetValues(const ArrayType* array, unsigned int numel = VMType ) { assert( array && numel && numel == GetNumberOfValues() ); // std::copy is smarted than a memcpy, and will call memcpy when POD type std::copy(array, array+numel, Internal); } */ // FIXME Should we remove this function ? const ArrayType* GetValues() const { return &Internal; } // API to talk to the run-time layer: gdcm::DataElement DataElement GetAsDataElement() const { DataElement ret( GetTag() ); std::ostringstream os; // os.imbue(std::locale::classic()); // This is not required AFAIK EncodingImplementation<VRToEncoding<TVR>::Mode>::Write(&Internal, GetNumberOfValues(),os); ret.SetVR( GetVR() ); assert( ret.GetVR() != VR::SQ ); if( (VR::VRType)VRToEncoding<TVR>::Mode == VR::VRASCII ) { if( GetVR() != VR::UI ) { if( os.str().size() % 2 ) { os << " "; } } } VL::Type osStrSize = (VL::Type)os.str().size(); ret.SetByteValue( os.str().c_str(), osStrSize ); return ret; } void SetFromDataElement(DataElement const &de) { // This is kind of hackish but since I do not generate other element than the first one: 0x6000 I should be ok: assert( GetTag() == de.GetTag() || GetTag().GetGroup() == 0x6000 || GetTag().GetGroup() == 0x5000 ); assert( GetVR() != VR::INVALID ); assert( GetVR().Compatible( de.GetVR() ) || de.GetVR() == VR::INVALID ); // In case of VR::INVALID cannot use the & operator if( de.IsEmpty() ) return; const ByteValue *bv = de.GetByteValue(); #ifdef GDCM_WORDS_BIGENDIAN if( de.GetVR() == VR::UN /*|| de.GetVR() == VR::INVALID*/ ) #else if( de.GetVR() == VR::UN || de.GetVR() == VR::INVALID ) #endif { SetByteValue(bv); } else { SetByteValueNoSwap(bv); } } void Set(DataSet const &ds) { SetFromDataElement( ds.GetDataElement( GetTag() ) ); } void SetFromDataSet(DataSet const &ds) { if( ds.FindDataElement( GetTag() ) && !ds.GetDataElement( GetTag() ).IsEmpty() ) { SetFromDataElement( ds.GetDataElement( GetTag() ) ); } } protected: void SetByteValueNoSwap(const ByteValue *bv) { if( !bv ) return; // That would be bad... assert( bv->GetPointer() && bv->GetLength() ); // [123]C element can be empty //if( VRToEncoding<TVR>::Mode == VR::VRBINARY ) // { // // always do a copy ! // SetValues(bv->GetPointer(), bv->GetLength()); // } //else { std::stringstream ss; std::string s = std::string( bv->GetPointer(), bv->GetLength() ); ss.str( s ); EncodingImplementation<VRToEncoding<TVR>::Mode>::ReadNoSwap(&Internal, GetNumberOfValues(),ss); } } void SetByteValue(const ByteValue *bv) { if( !bv ) return; // That would be bad... assert( bv->GetPointer() && bv->GetLength() ); // [123]C element can be empty //if( VRToEncoding<TVR>::Mode == VR::VRBINARY ) // { // // always do a copy ! // SetValues(bv->GetPointer(), bv->GetLength()); // } //else { std::stringstream ss; std::string s = std::string( bv->GetPointer(), bv->GetLength() ); ss.str( s ); EncodingImplementation<VRToEncoding<TVR>::Mode>::Read(&Internal, GetNumberOfValues(),ss); } } #if 0 // TODO FIXME the implicit way: // explicit: void Read(std::istream &_is) { const uint16_t cref[] = { Group, Element }; uint16_t c[2]; _is.read((char*)&c, sizeof(c)); assert( c[0] == cref[0] && c[1] == cref[1] ); char vr[2]; _is.read(vr, 2); // Check consistency ? const uint32_t lref = GetLength() * sizeof( typename VRToType<TVR>::Type ); uint32_t l = VRVLSize< (TVR & VR::VL32) >::Read(_is); l /= sizeof( typename VRToType<TVR>::Type ); return EncodingImplementation<VRToEncoding<TVR>::Mode>::Read(Internal, l,_is); } void Write(std::ostream &_os) const { uint16_t c[] = { Group, Element }; _os.write((char*)&c, 4); uint32_t l = GetLength() * sizeof( typename VRToType<TVR>::Type ); _os.write((char*)&l, 4); return EncodingImplementation<VRToEncoding<TVR>::Mode>::Write(Internal, GetLength(),_os); } void Read(std::istream &_is) { uint16_t cref[] = { Group, Element }; uint16_t c[2]; _is.read((char*)&c, 4); const uint32_t lref = GetLength() * sizeof( typename VRToType<TVR>::Type ); uint32_t l; _is.read((char*)&l, 4); l /= sizeof( typename VRToType<TVR>::Type ); return EncodingImplementation<VRToEncoding<TVR>::Mode>::Read(Internal, l,_is); } void Write(std::ostream &_os) const { uint16_t c[] = { Group, Element }; _os.write((char*)&c, 4); uint32_t l = GetLength() * sizeof( typename VRToType<TVR>::Type ); _os.write((char*)&l, 4); return EncodingImplementation<VRToEncoding<TVR>::Mode>::Write(Internal, GetLength(),_os); } #endif }; // No need to repeat default template arg, since primary template // will be used to generate the default arguments template<uint16_t Group, uint16_t Element, int TVR > class Attribute<Group,Element,TVR,VM::VM1_n> { public: typedef typename VRToType<TVR>::Type ArrayType; // Make sure that user specified VR/VM are compatible with the public dictionary: GDCM_STATIC_ASSERT( ((VR::VRType)TVR & (VR::VRType)(TagToType<Group, Element>::VRType)) ); GDCM_STATIC_ASSERT( (VM::VM1_n & (VM::VMType)(TagToType<Group, Element>::VMType)) ); GDCM_STATIC_ASSERT( ((((VR::VRType)TVR & VR::VR_VM1) && ((VM::VMType)TagToType<Group,Element>::VMType == VM::VM1) ) || !((VR::VRType)TVR & VR::VR_VM1) ) ); static Tag GetTag() { return Tag(Group,Element); } static VR GetVR() { return (VR::VRType)TVR; } static VM GetVM() { return VM::VM1_n; } static VR GetDictVR() { return (VR::VRType)(TagToType<Group, Element>::VRType); } static VM GetDictVM() { return GetVM(); } // This the way to prevent default initialization explicit Attribute() { Internal=0; Length=0; Own = true; } ~Attribute() { if( Own ) { delete[] Internal; } Internal = 0; // paranoid } unsigned int GetNumberOfValues() const { return Length; } void SetNumberOfValues(unsigned int numel) { SetValues(NULL, numel, true); } const ArrayType* GetValues() const { return Internal; } void Print(std::ostream &os) const { os << GetTag() << " "; os << GetVR() << " "; os << GetVM() << " "; os << Internal[0]; // VM is at least garantee to be one for(unsigned int i=1; i<GetNumberOfValues(); ++i) os << "," << Internal[i]; } ArrayType &GetValue(unsigned int idx = 0) { assert( idx < GetNumberOfValues() ); return Internal[idx]; } ArrayType &operator[] (unsigned int idx) { return GetValue(idx); } // const reference ArrayType const &GetValue(unsigned int idx = 0) const { assert( idx < GetNumberOfValues() ); return Internal[idx]; } ArrayType const & operator[] (unsigned int idx) const { return GetValue(idx); } void SetValue(unsigned int idx, ArrayType v) { assert( idx < GetNumberOfValues() ); Internal[idx] = v; } void SetValue(ArrayType v) { SetValue(0, v); } void SetValues(const ArrayType *array, unsigned int numel, bool own = false) { if( Internal ) // were we used before ? { // yes ! if( Own ) delete[] Internal; Internal = 0; } Own = own; Length = numel; assert( Internal == 0 ); if( own ) // make a copy: { Internal = new ArrayType[numel]; if( array && numel ) std::copy(array, array+numel, Internal); } else // pass pointer { Internal = const_cast<ArrayType*>(array); } // postcondition assert( numel == GetNumberOfValues() ); } DataElement GetAsDataElement() const { DataElement ret( GetTag() ); std::ostringstream os; if( Internal ) { EncodingImplementation<VRToEncoding<TVR>::Mode>::Write(Internal, GetNumberOfValues(),os); if( (VR::VRType)VRToEncoding<TVR>::Mode == VR::VRASCII ) { if( GetVR() != VR::UI ) { if( os.str().size() % 2 ) { os << " "; } } } } ret.SetVR( GetVR() ); assert( ret.GetVR() != VR::SQ ); VL::Type osStrSize = (VL::Type) os.str().size(); ret.SetByteValue( os.str().c_str(), osStrSize); return ret; } void SetFromDataElement(DataElement const &de) { // This is kind of hackish but since I do not generate other element than the first one: 0x6000 I should be ok: assert( GetTag() == de.GetTag() || GetTag().GetGroup() == 0x6000 || GetTag().GetGroup() == 0x5000 ); assert( GetVR().Compatible( de.GetVR() ) ); // In case of VR::INVALID cannot use the & operator assert( !de.IsEmpty() ); const ByteValue *bv = de.GetByteValue(); SetByteValue(bv); } void Set(DataSet const &ds) { SetFromDataElement( ds.GetDataElement( GetTag() ) ); } void SetFromDataSet(DataSet const &ds) { if( ds.FindDataElement( GetTag() ) && !ds.GetDataElement( GetTag() ).IsEmpty() ) { SetFromDataElement( ds.GetDataElement( GetTag() ) ); } } protected: void SetByteValue(const ByteValue *bv) { assert( bv ); // FIXME std::stringstream ss; std::string s = std::string( bv->GetPointer(), bv->GetLength() ); Length = bv->GetLength(); // HACK FIXME ss.str( s ); ArrayType *internal; ArrayType buffer[256]; if( bv->GetLength() < 256 ) { internal = buffer; } else { internal = new ArrayType[(VL::Type)bv->GetLength()]; // over allocation } EncodingImplementation<VRToEncoding<TVR>::Mode>::ReadComputeLength(internal, Length, ss); SetValues( internal, Length, true ); if( !(bv->GetLength() < 256) ) { delete[] internal; } //EncodingImplementation<VRToEncoding<TVR>::Mode>::Read(Internal, // GetNumberOfValues(),ss); } private: ArrayType *Internal; unsigned int Length; bool Own : 1; }; template<uint16_t Group, uint16_t Element, int TVR> class Attribute<Group,Element,TVR,VM::VM1_3> : public Attribute<Group,Element,TVR,VM::VM1_n> { public: VM GetVM() const { return VM::VM1_3; } }; template<uint16_t Group, uint16_t Element, int TVR> class Attribute<Group,Element,TVR,VM::VM1_8> : public Attribute<Group,Element,TVR,VM::VM1_n> { public: VM GetVM() const { return VM::VM1_8; } }; template<uint16_t Group, uint16_t Element, int TVR> class Attribute<Group,Element,TVR,VM::VM2_n> : public Attribute<Group,Element,TVR,VM::VM1_n> { public: VM GetVM() const { return VM::VM2_n; } }; template<uint16_t Group, uint16_t Element, int TVR> class Attribute<Group,Element,TVR,VM::VM2_2n> : public Attribute<Group,Element,TVR,VM::VM2_n> { public: static VM GetVM() { return VM::VM2_2n; } }; template<uint16_t Group, uint16_t Element, int TVR> class Attribute<Group,Element,TVR,VM::VM3_n> : public Attribute<Group,Element,TVR,VM::VM1_n> { public: static VM GetVM() { return VM::VM3_n; } }; template<uint16_t Group, uint16_t Element, int TVR> class Attribute<Group,Element,TVR,VM::VM3_3n> : public Attribute<Group,Element,TVR,VM::VM3_n> { public: static VM GetVM() { return VM::VM3_3n; } }; // For particular case for ASCII string // WARNING: This template explicitly instanciates a particular // EncodingImplementation THEREFORE it is required to be declared after the // EncodingImplementation is needs (doh!) #if 0 template<int TVM> class Attribute<TVM> { public: Attribute(const char array[]) { unsigned int i = 0; const char sep = '\\'; std::string sarray = array; std::string::size_type pos1 = 0; std::string::size_type pos2 = sarray.find(sep, pos1+1); while(pos2 != std::string::npos) { Internal[i++] = sarray.substr(pos1, pos2-pos1); pos1 = pos2+1; pos2 = sarray.find(sep, pos1+1); } Internal[i] = sarray.substr(pos1, pos2-pos1); // Shouldn't we do the contrary, since we know how many separators // (and default behavior is to discard anything after the VM declared assert( GetLength()-1 == i ); } unsigned long GetLength() const { return VMToLength<TVM>::Length; } // Implementation of Print is common to all Mode (ASCII/Binary) void Print(std::ostream &_os) const { _os << Internal[0]; // VM is at least garantee to be one for(int i=1; i<VMToLength<TVM>::Length; ++i) _os << "," << Internal[i]; } void Read(std::istream &_is) { EncodingImplementation<VR::VRASCII>::Read(Internal, GetLength(),_is); } void Write(std::ostream &_os) const { EncodingImplementation<VR::VRASCII>::Write(Internal, GetLength(),_os); } private: typename String Internal[VMToLength<TVM>::Length]; }; template< int TVM> class Attribute<VR::PN, TVM> : public StringAttribute<TVM> { }; #endif #if 0 // Implementation for the undefined length (dynamically allocated array) template<int TVR> class Attribute<TVR, VM::VM1_n> { public: // This the way to prevent default initialization explicit Attribute() { Internal=0; Length=0; } ~Attribute() { delete[] Internal; Internal = 0; } // Length manipulation // SetLength should really be protected anyway...all operation // should go through SetArray unsigned long GetLength() const { return Length; } typedef typename VRToType<TVR>::Type ArrayType; void SetLength(unsigned long len) { const unsigned int size = sizeof(ArrayType); if( len ) { if( len > Length ) { // perform realloc assert( (len / size) * size == len ); ArrayType *internal = new ArrayType[len / size]; memcpy(internal, Internal, Length * size); delete[] Internal; Internal = internal; } } Length = len / size; } // If save is set to zero user should not delete the pointer //void SetArray(const typename VRToType<TVR>::Type *array, int len, bool save = false) void SetArray(const ArrayType *array, unsigned long len, bool save = false) { if( save ) { SetLength(len); // realloc memcpy(Internal, array, len/*/sizeof(ArrayType)*/); } else { // TODO rewrite this stupid code: Length = len; //Internal = array; assert(0); } } // Implementation of Print is common to all Mode (ASCII/Binary) void Print(std::ostream &_os) const { assert( Length ); assert( Internal ); _os << Internal[0]; // VM is at least garantee to be one const unsigned long length = GetLength() < 25 ? GetLength() : 25; for(unsigned long i=1; i<length; ++i) _os << "," << Internal[i]; } void Read(std::istream &_is) { EncodingImplementation<VRToEncoding<TVR>::Mode>::Read(Internal, GetLength(),_is); } void Write(std::ostream &_os) const { EncodingImplementation<VRToEncoding<TVR>::Mode>::Write(Internal, GetLength(),_os); } Attribute(const Attribute&_val) { if( this != &_val) { *this = _val; } } Attribute &operator=(const Attribute &_val) { Length = 0; // SYITF Internal = 0; SetArray(_val.Internal, _val.Length, true); return *this; } private: typename VRToType<TVR>::Type *Internal; unsigned long Length; // unsigned int ?? }; //template <int TVM = VM::VM1_n> //class Attribute<VR::OB, TVM > : public Attribute<VR::OB, VM::VM1_n> {}; // Partial specialization for derivatives of 1-n : 2-n, 3-n ... template<int TVR> class Attribute<TVR, VM::VM2_n> : public Attribute<TVR, VM::VM1_n> { public: typedef Attribute<TVR, VM::VM1_n> Parent; void SetLength(int len) { if( len <= 1 ) return; Parent::SetLength(len); } }; template<int TVR> class Attribute<TVR, VM::VM2_2n> : public Attribute<TVR, VM::VM2_n> { public: typedef Attribute<TVR, VM::VM2_n> Parent; void SetLength(int len) { if( len % 2 ) return; Parent::SetLength(len); } }; template<int TVR> class Attribute<TVR, VM::VM3_n> : public Attribute<TVR, VM::VM1_n> { public: typedef Attribute<TVR, VM::VM1_n> Parent; void SetLength(int len) { if( len <= 2 ) return; Parent::SetLength(len); } }; template<int TVR> class Attribute<TVR, VM::VM3_3n> : public Attribute<TVR, VM::VM3_n> { public: typedef Attribute<TVR, VM::VM3_n> Parent; void SetLength(int len) { if( len % 3 ) return; Parent::SetLength(len); } }; //template<int T> struct VRToLength; //template <> struct VRToLength<VR::AS> //{ enum { Length = VM::VM1 }; } //template<> //class Attribute<VR::AS> : public Attribute<VR::AS, VRToLength<VR::AS>::Length > // only 0010 1010 AS 1 Patient's Age template<> class Attribute<VR::AS, VM::VM5> { public: char Internal[VMToLength<VM::VM5>::Length]; void Print(std::ostream &_os) const { _os << Internal; } }; template <> class Attribute<VR::OB, VM::VM1> : public Attribute<VR::OB, VM::VM1_n> {}; // Make it impossible to compile any other cases: template <int TVM> class Attribute<VR::OB, TVM>; // Same for OW: template <> class Attribute<VR::OW, VM::VM1> : public Attribute<VR::OW, VM::VM1_n> {}; // Make it impossible to compile any other cases: template <int TVM> class Attribute<VR::OW, TVM>; #endif #if 0 template<> class Attribute<0x7fe0,0x0010, VR::OW, VM::VM1> { public: char *Internal; unsigned long Length; // unsigned int ?? void Print(std::ostream &_os) const { _os << Internal[0]; } void SetBytes(char *bytes, unsigned long length) { Internal = bytes; Length = length; } void Read(std::istream &_is) { uint16_t c[2]; _is.read((char*)&c, 4); uint32_t l; _is.read((char*)&l, 4); Length = l; _is.read( Internal, Length ); } void Write(std::ostream &_os) const { uint16_t c[] = {0x7fe0, 0x0010}; _os.write((char*)&c, 4); _os.write((char*)&Length, 4); _os.write( Internal, Length ); } }; #endif /* // Removing Attribute for SQ for now... template<uint16_t Group, uint16_t Element, typename SQA> class Attribute<Group,Element, VR::SQ, VM::VM1, SQA> { public: SQA sqa; void Print(std::ostream &_os) const { _os << Tag(Group,Element); sqa.Print(_os << std::endl << '\t'); } void Write(std::ostream &_os) const { uint16_t c[] = {Group, Element}; _os.write((char*)&c, 4); uint32_t undef = 0xffffffff; _os.write((char*)&undef, 4); uint16_t item_beg[] = {0xfffe,0xe000}; _os.write((char*)&item_beg, 4); _os.write((char*)&undef, 4); sqa.Write(_os); uint16_t item_end[] = {0xfffe,0xe00d}; _os.write((char*)&item_end, 4); uint32_t zero = 0x0; _os.write((char*)&zero, 4); uint16_t seq_end[] = {0xfffe, 0xe0dd}; _os.write((char*)&seq_end, 4); _os.write((char*)&zero, 4); } }; */ /** * \example PatchFile.cxx * This is a C++ example on how to use gdcm::Attribute */ } // namespace gdcm_ns #endif //GDCMATTRIBUTE_H