/*
* Copyright 2011 Steven Gribble
*
* This file is part of the UW CSE 333 course project sequence
* (333proj).
*
* 333proj is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* 333proj is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with 333proj. If not, see .
*/
#ifndef _HW3_HASHTABLEREADER_H_
#define _HW3_HASHTABLEREADER_H_
#include // for uint32_t, etc.
#include // for (FILE *).
#include // for std::list.
namespace hw3 {
// A HashTableReader is the base class for the different kinds
// of hash table readers. Its subclasses are the DocTableReader, the
// IndexTableReader, and the DocPositionsReader.
class HashTableReader {
// This friend declaration is here so that the Test_HashTableReader
// unit test fixture can access protected member variables of
// HashTableReader. See test_hashtablereader.h for details.
friend class Test_HashTableReader;
public:
// Construct a HashTableReader reader. Arguments:
//
// - f: an open (FILE *) for the underlying index file. The
// constructed object takes ownership of the (FILE *) and will
// fclose() it on destruction.
//
// - offset: the hash table's byte offset within the file.
HashTableReader(FILE *f, uint32_t offset);
~HashTableReader();
// We have to implement a copy constructor and assignment operator
// to manage the (FILE *) that instances of HashTableReader use.
// If somebody uses a copy constructor to manufactur a new
// HashTableReader or the assignment operator to assign to an
// existing one from another HashTableReader, we want to duplicate
// the (FILE *) so that the right fclose()-on-destruction behavior
// takes place.
HashTableReader(const HashTableReader &rhs);
HashTableReader &operator=(const HashTableReader &rhs);
// Given a 64-bit hash value, this function navigates through
// the on-disk hash table and returns a list of file offsets of
// "element" fields within the bucket that the hash value maps to.
// Only subclasses may invoke this.
//
// Arguments:
//
// - hashval: the 64-bit hash value to look up.
//
// Returns:
//
// - A list of offsets of "element" fields inside the bucket that
// the hash value maps to. If no elements are in the bucket,
// this returns an empty list.
std::list LookupElementPositions(uint64_t hashval);
protected:
// The open (FILE *) stream associated with this hash table.
FILE *file_;
// The byte offset within the file that this hash table starts at.
uint32_t offset_;
// A cached copy of the total number of buckets in this hash table.
uint32_t num_buckets_;
};
} // namespace hw3
#endif // _HW3_HASHTABLEREADER_H_