Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- subzero/src/IceDefs.h - Common Subzero declaraions -------*- C++ -*-===// | 1 //===- subzero/src/IceDefs.h - Common Subzero declaraions -------*- C++ -*-===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // This file declares various useful types and classes that have | 10 // This file declares various useful types and classes that have |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 86 inline bool operator==(const CfgLocalAllocator<T> &, | 86 inline bool operator==(const CfgLocalAllocator<T> &, |
| 87 const CfgLocalAllocator<U> &) { | 87 const CfgLocalAllocator<U> &) { |
| 88 return true; | 88 return true; |
| 89 } | 89 } |
| 90 template <typename T, typename U> | 90 template <typename T, typename U> |
| 91 inline bool operator!=(const CfgLocalAllocator<T> &, | 91 inline bool operator!=(const CfgLocalAllocator<T> &, |
| 92 const CfgLocalAllocator<U> &) { | 92 const CfgLocalAllocator<U> &) { |
| 93 return false; | 93 return false; |
| 94 } | 94 } |
| 95 | 95 |
| 96 // makeUnique should be used when memory is expected to be allocated from the | |
| 97 // heap (as opposed to allocated from some Allocator.) It is intended to be used | |
| 98 // instead of new. | |
| 99 // | |
| 100 // The expected usage is as follows | |
| 101 // | |
| 102 // class MyClass { | |
| 103 // public: | |
| 104 // static std::unique_ptr<MyClass> create(<ctor_args>) { | |
| 105 // return makeUnique<MyClass>(<ctor_args>); | |
| 106 // } | |
| 107 // | |
| 108 // private: | |
| 109 // ENABLE_MAKE_UNIQUE; | |
| 110 // | |
| 111 // MyClass(<ctor_args>) ... | |
| 112 // } | |
| 113 // | |
| 114 // ENABLE_MAKE_UNIQUE is a trick that is necessary if MyClass' ctor is private. | |
| 115 // Private ctors are highly encouraged when you're writing a class that you'd | |
| 116 // like to have allocated with makeUnique as it would prevent users from | |
| 117 // declaring stack allocated variables. | |
| 118 namespace Internal { | |
| 119 struct MakeUniqueEnabler { | |
| 120 template <class T, class... Args> | |
| 121 static std::unique_ptr<T> create(Args &&... TheArgs) { | |
| 122 std::unique_ptr<T> Unique(new T(std::forward<Args>(TheArgs)...)); | |
| 123 return Unique; | |
| 124 } | |
| 125 }; | |
| 126 } // namespace Internal | |
|
Jim Stichnoth
2015/06/19 23:09:25
"end of namespace Internal" for code base consiste
John
2015/06/20 00:10:33
Done.
| |
| 127 | |
| 128 template <class T, class... Args> | |
| 129 static std::unique_ptr<T> makeUnique(Args &&... TheArgs) { | |
| 130 return ::Ice::Internal::MakeUniqueEnabler::create<T>( | |
| 131 std::forward<Args>(TheArgs)...); | |
| 132 } | |
| 133 | |
| 134 #define ENABLE_MAKE_UNIQUE friend struct ::Ice::Internal::MakeUniqueEnabler | |
| 135 | |
| 96 typedef std::string IceString; | 136 typedef std::string IceString; |
| 97 typedef llvm::ilist<Inst> InstList; | 137 typedef llvm::ilist<Inst> InstList; |
| 98 // Ideally PhiList would be llvm::ilist<InstPhi>, and similar for | 138 // Ideally PhiList would be llvm::ilist<InstPhi>, and similar for |
| 99 // AssignList, but this runs into issues with SFINAE. | 139 // AssignList, but this runs into issues with SFINAE. |
| 100 typedef InstList PhiList; | 140 typedef InstList PhiList; |
| 101 typedef InstList AssignList; | 141 typedef InstList AssignList; |
| 102 // VarList and NodeList are arena-allocated from the Cfg's allocator. | 142 // VarList and NodeList are arena-allocated from the Cfg's allocator. |
| 103 typedef std::vector<Variable *, CfgLocalAllocator<Variable *>> VarList; | 143 typedef std::vector<Variable *, CfgLocalAllocator<Variable *>> VarList; |
| 104 typedef std::vector<CfgNode *, CfgLocalAllocator<CfgNode *>> NodeList; | 144 typedef std::vector<CfgNode *, CfgLocalAllocator<CfgNode *>> NodeList; |
| 105 typedef std::vector<Constant *> ConstantList; | 145 typedef std::vector<Constant *> ConstantList; |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 221 return llvm::make_range(Container.rbegin(), Container.rend()); | 261 return llvm::make_range(Container.rbegin(), Container.rend()); |
| 222 } | 262 } |
| 223 template <typename T> | 263 template <typename T> |
| 224 llvm::iterator_range<typename T::reverse_iterator> reverse_range(T &Container) { | 264 llvm::iterator_range<typename T::reverse_iterator> reverse_range(T &Container) { |
| 225 return llvm::make_range(Container.rbegin(), Container.rend()); | 265 return llvm::make_range(Container.rbegin(), Container.rend()); |
| 226 } | 266 } |
| 227 | 267 |
| 228 } // end of namespace Ice | 268 } // end of namespace Ice |
| 229 | 269 |
| 230 #endif // SUBZERO_SRC_ICEDEFS_H | 270 #endif // SUBZERO_SRC_ICEDEFS_H |
| OLD | NEW |