#ifndef WRITEGROUPER_H
#define WRITEGROUPER_H

#include "persifs.h"
#include "inodelog.h"
#include <qhash.h>

class FS;

typedef unsigned long nonce;

struct fileState 
{
  inumber num;
  inode ino;
  ref<chunkable> content;
  nonce lastWrite;
  ihash_entry<fileState> hlink;
  fileState(inumber num, inode ino, ref<chunkable> content,
            nonce lastWrite);
};


class writeGrouper 
{
public:
  writeGrouper(FS *fs, time_t writeGroupTime);
  ~writeGrouper();
  const fileState * read(inumber num);
  void write(inumber num, inode ino, ref<chunkable> content);

private:
  FS *fs;
  ihash<inumber, fileState, &fileState::num, &fileState::hlink> state;
  nonce lastNonce;
  time_t writeGroupTime;
  
  nonce newNonce();
  void doDelayedWrite(inumber num, nonce n);
  
  void doDelayedWrite_after_flush(inumber num, inode ino,
                                  ref<chunkable> contentCopy,
                                  nonce n);
  void doDelayedWrite_after_marshall(inumber num, inode ino,
                                     ref<chunkable> contentCopy,
                                     nonce n,
                                     chunkable::marshalled m);
  void doDelayedWrite_after_inodePut(inumber num, inode ino,
                                     ref<chunkable> contentCopy,
                                     nonce n, timestamp ts);
};


#endif
