//===- GCFactoryListTraitsTest.h ------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_GC_FACTORY_LIST_TRAITS_TEST_H
#define MCLD_GC_FACTORY_LIST_TRAITS_TEST_H

#include <gtest.h>

#include <mcld/Support/GCFactoryListTraits.h>

#include <llvm/ADT/ilist_node.h>

#include <mcld/Support/GCFactory.h>

namespace mcldtest
{

/** \class GCFactoryListTraitsTest
 *  \brief
 *
 *  \see GCFactoryListTraits
 */
class GCFactoryListTraitsTest : public ::testing::Test
{
public:
  /** \class GCFactoryListTraitsTest
  *   \brief Node used in the test
  *
  */
  class NodeFactory;

  class Node : public llvm::ilist_node<Node>
  {
    friend class NodeFactory;
  private:
    unsigned m_Init;
    unsigned m_Value;

  private:
    Node(unsigned pInit) : m_Init(pInit), m_Value(pInit) { }

  public:
    unsigned getInitialValue() const {
      return m_Init;
    }

    inline unsigned getValue() const
    { return m_Value; }

    inline void setValue(unsigned pValue)
    { m_Value = pValue; }
  };

  class NodeFactory : public mcld::GCFactory<Node, 0> {
  public:
    NodeFactory() : mcld::GCFactory<Node, 0>(16) { }

    Node *produce(unsigned pInit) {
      Node *result = allocate();
      new (result) Node(pInit);
      return result;
    }
  };

	// Constructor can do set-up work for all test here.
	GCFactoryListTraitsTest();

	// Destructor can do clean-up work that doesn't throw exceptions here.
	virtual ~GCFactoryListTraitsTest();

	// SetUp() will be called immediately before each test.
	virtual void SetUp();

	// TearDown() will be called immediately after each test.
	virtual void TearDown();

  const llvm::iplist<Node, mcld::GCFactoryListTraits<Node> > &getNodeList() const
  { return m_pNodeList; }

  llvm::iplist<Node, mcld::GCFactoryListTraits<Node> > &getNodeList()
  { return m_pNodeList; }

protected:
  NodeFactory m_NodeFactory;
  Node **m_pNodesAlloc;

  llvm::iplist<Node, mcld::GCFactoryListTraits<Node> > m_pNodeList;
};

} // namespace of mcldtest

#endif

