/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
/*
 * Copyright (c) 2013, Regents of the University of California
 *                     Alexander Afanasyev
 *                     Zhenkai Zhu
 *
 * BSD license, See the LICENSE file for more information
 *
 * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
 *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
 */

#ifndef NDN_SIGNED_BLOB_H
#define NDN_SIGNED_BLOB_H

#include "blob.h"

namespace ndn {

class SignedBlob;
typedef boost::shared_ptr<SignedBlob> SignedBlobPtr;
typedef boost::shared_ptr<const SignedBlob> ConstSignedBlobPtr;

/**
 * @brief Class representing a blob, which has a signed portion (e.g., bytes of DATA packet)
 */
class SignedBlob : public Blob
{
public:
  /**
   * @brief Set signed portion of the blob
   * @param offset An offset from the beginning of the blob
   * @param size Size of the signed portion of the blob
   */
  inline void
  setSignedPortion (size_t offset, size_t size);
  
  /**
   * @brief Get begin iterator to a signed portion of the blob
   */
  inline const_iterator
  signed_begin () const;

  /**
   * @brief Get end iterator of a signed portion of the blob
   */
  inline const_iterator
  signed_end () const;

  /**
   * @brief Get pointer to a first byte of the signed blob
   */
  inline const char*
  signed_buf () const;

  /**
   * @brief Get size of the signed blob
   */
  inline size_t
  signed_size () const;

private:
  const_iterator m_signedBegin;
  const_iterator m_signedEnd;
};


inline void
SignedBlob::setSignedPortion (size_t offset, size_t size)
{
  m_signedBegin = begin () + offset;
  m_signedEnd = begin () + offset + size;
}
  
inline SignedBlob::const_iterator
SignedBlob::signed_begin () const
{
  return m_signedBegin;
}

inline SignedBlob::const_iterator
SignedBlob::signed_end () const
{
  return m_signedEnd;
}

inline const char*
SignedBlob::signed_buf () const
{
  return &*m_signedBegin;
}

inline size_t
SignedBlob::signed_size () const
{
  return m_signedEnd - m_signedBegin;
}

} // ndn

#endif // NDN_SIGNED_BLOB_H
