GCFactoryListTraits.h revision 5460a1f25d9ddecb5c70667267d66d51af177a99
1//===- GCFactoryListTraits.h ----------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#ifndef MCLD_GC_FACTORY_LIST_TRAITS_H 10#define MCLD_GC_FACTORY_LIST_TRAITS_H 11#ifdef ENABLE_UNITTEST 12#include <gtest.h> 13#endif 14 15#include <llvm/ADT/ilist_node.h> 16#include <llvm/ADT/ilist.h> 17 18#include <assert.h> 19 20namespace mcld 21{ 22 23/** \class GCFactoryListTraits 24 * \brief GCFactoryListTraits provides trait class for llvm::iplist when 25 * the nodes in the list is produced by GCFactory. 26 */ 27template<typename DataType> 28class GCFactoryListTraits : public llvm::ilist_default_traits<DataType> { 29private: 30 class SentinelNode : public llvm::ilist_node<DataType> { 31 public: 32 SentinelNode() : llvm::ilist_node<DataType>() { } 33 }; 34 35public: 36 // override the traits provided in llvm::ilist_sentinel_traits since we've 37 // defined our own sentinel. 38 DataType *createSentinel() const 39 { return reinterpret_cast<DataType*>(&mSentinel); } 40 41 static void destroySentinel(DataType*) { } 42 43 DataType *provideInitialHead() const 44 { return createSentinel(); } 45 46 DataType *ensureHead(DataType*) const 47 { return createSentinel(); } 48 49 static void noteHead(DataType*, DataType*) { } 50 51 // override the traits provided in llvm::ilist_node_traits since 52 static DataType *createNode(const DataType &V) { 53 assert(false && "Only GCFactory knows how to create a node."); 54 } 55 static void deleteNode(DataType *V) { 56 // No action. GCFactory will handle it by itself. 57 } 58 59private: 60 mutable SentinelNode mSentinel; 61}; 62 63} // namespace of mcld 64 65#endif 66