added data inflater based on AliHLTTPCCompModelInflater
authorrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 13 Aug 2011 20:58:19 +0000 (20:58 +0000)
committerrichterm <richterm@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 13 Aug 2011 20:58:19 +0000 (20:58 +0000)
HLT/BASE/AliHLTDataInflater.cxx [new file with mode: 0644]
HLT/BASE/AliHLTDataInflater.h [new file with mode: 0644]
HLT/BASE/HLTbaseLinkDef.h
HLT/CMakelibHLTbase.pkg

diff --git a/HLT/BASE/AliHLTDataInflater.cxx b/HLT/BASE/AliHLTDataInflater.cxx
new file mode 100644 (file)
index 0000000..5e9209b
--- /dev/null
@@ -0,0 +1,142 @@
+// $Id$
+
+//**************************************************************************
+//* This file is property of and copyright by the ALICE HLT Project        * 
+//* ALICE Experiment at CERN, All rights reserved.                         *
+//*                                                                        *
+//* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
+//*                  for The ALICE HLT Project.                            *
+//*                                                                        *
+//* Permission to use, copy, modify and distribute this software and its   *
+//* documentation strictly for non-commercial purposes is hereby granted   *
+//* without fee, provided that the above copyright notice appears in all   *
+//* copies and that both the copyright notice and this permission notice   *
+//* appear in the supporting documentation. The authors make no claims     *
+//* about the suitability of this software for any purpose. It is          *
+//* provided "as is" without express or implied warranty.                  *
+//**************************************************************************
+
+/// @file   AliHLTDataInflater.cxx
+/// @author Matthias Richter, Timm Steinbeck
+/// @date   2011-08-10
+/// @brief  Data inflater reading the bitstream from the AliHLTDataDeflater
+/// @note   Code original from AliHLTTPCCompModelInflater
+
+#include "AliHLTDataInflater.h"
+#include "AliHLTErrorGuard.h"
+#include <memory>
+#include <algorithm>
+#include <iostream>
+
+/** ROOT macro for the implementation of ROOT specific class methods */
+ClassImp(AliHLTDataInflater)
+
+AliHLTDataInflater::AliHLTDataInflater()
+  : AliHLTLogging()
+  , fBitDataCurrentWord(0)
+  , fBitDataCurrentPosInWord(0)
+  , fBitDataCurrentInput(NULL)
+  , fBitDataCurrentInputStart(NULL)
+  , fBitDataCurrentInputEnd(NULL)
+{
+  // see header file for class documentation
+  // or
+  // refer to README to build package
+  // or
+  // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+}
+
+AliHLTDataInflater::~AliHLTDataInflater()
+{
+  // destructor
+  Clear();
+}
+
+int AliHLTDataInflater::InitBitDataInput(const AliHLTUInt8_t* input, UInt_t inputSize )
+{
+  // init inflater for reading
+  fBitDataCurrentWord = 0;
+  fBitDataCurrentPosInWord = 7;
+  fBitDataCurrentInput = fBitDataCurrentInputStart = input;
+  fBitDataCurrentInputEnd = input+inputSize;
+  fBitDataCurrentWord = *fBitDataCurrentInput;
+  return 0;
+}
+
+void AliHLTDataInflater::CloseBitDataInput()
+{
+  // close inflater for reading
+  fBitDataCurrentWord=0;
+  fBitDataCurrentPosInWord=0;
+  fBitDataCurrentInput=NULL;
+  fBitDataCurrentInputStart=NULL;
+  fBitDataCurrentInputEnd=NULL;
+}
+
+bool AliHLTDataInflater::InputBit( AliHLTUInt8_t & value )
+{
+  // see header file for class documenation
+  if ( fBitDataCurrentInput>=fBitDataCurrentInputEnd )
+    return false;
+  value = (fBitDataCurrentWord >> fBitDataCurrentPosInWord) & 1;
+  if ( fBitDataCurrentPosInWord )
+    fBitDataCurrentPosInWord--;
+  else {
+    fBitDataCurrentInput++;
+    if ( fBitDataCurrentInput<fBitDataCurrentInputEnd ) {
+      fBitDataCurrentWord = *fBitDataCurrentInput;
+      fBitDataCurrentPosInWord = 7;
+    }
+  }
+  return true;
+}
+
+void AliHLTDataInflater::Pad8Bits()
+{
+  // see header file for class documenation
+  if ( fBitDataCurrentPosInWord == 7 )
+    return;
+  fBitDataCurrentInput++;
+  if ( fBitDataCurrentInput<fBitDataCurrentInputEnd ) {
+    fBitDataCurrentWord = *fBitDataCurrentInput;
+    fBitDataCurrentPosInWord = 7;
+  }
+}
+
+bool AliHLTDataInflater::InputBytes( AliHLTUInt8_t* data, UInt_t const & byteCount )
+{
+  // see header file for class documenation
+  Pad8Bits();
+  if ( fBitDataCurrentInput+byteCount>fBitDataCurrentInputEnd )
+    return false;
+  memcpy( data, fBitDataCurrentInput, byteCount );
+  fBitDataCurrentInput += byteCount;
+  if ( fBitDataCurrentInput<fBitDataCurrentInputEnd ) {
+    fBitDataCurrentWord = *fBitDataCurrentInput;
+    fBitDataCurrentPosInWord = 7;
+  }
+  return true;
+}
+
+void AliHLTDataInflater::Clear(Option_t * /*option*/)
+{
+  // internal cleanup
+}
+
+void AliHLTDataInflater::Print(Option_t *option) const
+{
+  // print info
+  Print(cout, option);
+}
+
+void AliHLTDataInflater::Print(ostream& out, Option_t */*option*/) const
+{
+  // print to stream
+  out << "AliHLTDataInflater: " << endl;
+}
+
+ostream& operator<<(ostream &out, const AliHLTDataInflater& me)
+{
+  me.Print(out);
+  return out;
+}
diff --git a/HLT/BASE/AliHLTDataInflater.h b/HLT/BASE/AliHLTDataInflater.h
new file mode 100644 (file)
index 0000000..f2d0cc3
--- /dev/null
@@ -0,0 +1,173 @@
+//-*- Mode: C++ -*-
+// $Id$
+#ifndef ALIHLTDATAINFLATER_H
+#define ALIHLTDATAINFLATER_H
+//* This file is property of and copyright by the ALICE HLT Project        * 
+//* ALICE Experiment at CERN, All rights reserved.                         *
+//* See cxx source for full Copyright notice                               *
+
+/// @file   AliHLTDataInflater.h
+/// @author Matthias Richter, Timm Steinbeck
+/// @date   2011-08-10
+/// @brief  Data inflater reading the bitstream from the AliHLTDataDeflater
+/// @note   Code original from AliHLTTPCCompModelInflater
+
+#include "AliHLTLogging.h"
+#include "AliHLTDataTypes.h"
+#include "AliHLTStdIncludes.h"
+
+/**
+ * @class AliHLTDataInflater
+ * Data inflating interface to a bitstream encoded by AliHLTDataInflater
+ * 
+ * 
+ * 
+ *
+ * @ingroup alihlt_base
+ */
+class AliHLTDataInflater : public AliHLTLogging
+{
+public:
+  /// standard constructor
+  AliHLTDataInflater();
+  /// destructor
+  ~AliHLTDataInflater();
+
+  /** init inflater for reading
+   * @param input  AliHLTUInt8_t* pointer to input data
+   * @param inputSize UInt_t input data size
+   */
+  int InitBitDataInput(const AliHLTUInt8_t* input, UInt_t inputSize );
+
+  /** close inflater for reading */    
+  void CloseBitDataInput();
+      
+  /** function to get current byte input position 
+   * @return unsigned long value of current byte input position
+   */
+  unsigned long GetCurrentByteInputPosition() const
+  {
+    return (unsigned long)( fBitDataCurrentInput - fBitDataCurrentInputStart );
+  }
+
+  /** function to get current bit input position
+   * @return unsigned value of current bit input position
+   */
+  unsigned GetCurrentBitInputPosition() const
+  {
+    return fBitDataCurrentPosInWord;
+  }
+
+  /** function to get current input byte
+   * @return AliHLTUInt8_t value of current input byte
+   */
+  AliHLTUInt8_t GetCurrentInputByte() const
+  {
+    return fBitDataCurrentWord;
+  }
+
+  /** function to determine end of bit input
+   * @return boolean if end is reached or not
+   */
+  bool EndOfBitInput() const
+  {
+    return (fBitDataCurrentInput>=fBitDataCurrentInputEnd);
+  }
+      
+  /** function to get bit data input size bytes
+   * @return UInt_t value of bit data input size bytes
+   */
+  UInt_t GetBitDataInputSizeBytes() const
+  {
+    return fBitDataCurrentInput-fBitDataCurrentInputStart;
+  }
+
+  /** function to determine input bit
+   * @return boolean (if bit is 1 or 0)
+   */
+  bool InputBit( AliHLTUInt8_t & value );
+
+  /** function to read bits from bitstream
+   * @param value
+   * @param bitCount
+   * @return boolean 
+   */
+  template<typename T>
+  bool InputBits( T & value, UInt_t const & bitCount );
+  /** function pad 8 bits */
+  void Pad8Bits();
+
+  /** function to determine input bytes
+   * @param data       AliHLTUInt8_t* pointer to input data
+   * @param byteCount  UInt_t const &
+   * @return boolean
+   */
+  bool InputBytes( AliHLTUInt8_t* data, UInt_t const & byteCount );
+
+  /// clear the object and reset pointer references
+  virtual void Clear(Option_t * /*option*/ ="");
+
+  /// print info
+  virtual void Print(Option_t *option="") const;
+
+  /// print info
+  virtual void Print(ostream& out, Option_t *option="") const;
+
+protected:
+private:
+  /** copy constructor prohibited */
+  AliHLTDataInflater(const AliHLTDataInflater&);
+  /** assignment operator prohibited */
+  AliHLTDataInflater& operator=(const AliHLTDataInflater&);
+
+  /** member variable for bit data current word */
+  AliHLTUInt8_t fBitDataCurrentWord; // member variable for bit data current word
+  /** member variable for bit data current position in word */
+  UInt_t fBitDataCurrentPosInWord;// member variable for bit data current position in word
+  /** member variable for bit data current input */
+  const AliHLTUInt8_t *fBitDataCurrentInput; // member variable for bit data current input
+  /** member variable for bit data current input start */
+  const AliHLTUInt8_t *fBitDataCurrentInputStart; // member variable for bit data current input star
+  /** member variable for bit data current input end */
+  const AliHLTUInt8_t *fBitDataCurrentInputEnd; // member variable for bit data current input end
+
+  ClassDef(AliHLTDataInflater, 0)
+};
+
+template<typename T>
+bool AliHLTDataInflater::InputBits( T & value, UInt_t const & bitCount )
+{
+  // read bits from the input stream into variable
+  if (bitCount>sizeof(T)*8) {
+    HLTFatal( "variable of type size %u too small to read %u bits", sizeof(T)*8, (unsigned)bitCount);
+    return false;
+  }
+  UInt_t bitsToRead=bitCount;
+  UInt_t curBitCount;
+  value = 0;
+  while ( bitsToRead>0 ) {
+    if ( fBitDataCurrentInput>=fBitDataCurrentInputEnd )
+      return false;
+    if ( bitsToRead >= fBitDataCurrentPosInWord+1 )
+      curBitCount = fBitDataCurrentPosInWord+1;
+    else
+      curBitCount = bitsToRead;
+    value = (value << curBitCount) | ( (fBitDataCurrentWord >> (fBitDataCurrentPosInWord-curBitCount+1)) & ((1 << curBitCount)-1) );
+    if ( fBitDataCurrentPosInWord < curBitCount ) {
+      fBitDataCurrentInput++;
+      if ( fBitDataCurrentInput<fBitDataCurrentInputEnd ) {
+       fBitDataCurrentWord = *fBitDataCurrentInput;
+       fBitDataCurrentPosInWord = 7;
+      }
+    }
+    else
+      fBitDataCurrentPosInWord -= curBitCount;
+    bitsToRead -= curBitCount;
+  }
+  return true;
+}
+
+ostream& operator<<(ostream &out, const AliHLTDataInflater& me);
+
+#endif
index bb3c346..8847597 100644 (file)
@@ -57,6 +57,7 @@
 #pragma link C++ class AliHLTComponentBenchmark+;
 #pragma link C++ class AliHLTDataDeflater+;
 #pragma link C++ class AliHLTDataDeflaterSimple+;
+#pragma link C++ class AliHLTDataInflater+;
 
 #include "RVersion.h"
 #if ROOT_VERSION_CODE < 334336 //ROOT_VERSION(5,26,0)
index d84f4f2..c3db0da 100644 (file)
@@ -93,6 +93,7 @@ set ( CLASS_HDRS
     AliHLTComponentBenchmark.h
     AliHLTDataDeflater.h
     AliHLTDataDeflaterSimple.h
+    AliHLTDataInflater.h
     )
 
 string ( REPLACE ".h" ".cxx" MODULE_SRCS "${CLASS_HDRS}")