Use IntrusiveForwardList<> for Env-/UsePosition.

Test: m test-art-host-gtest
Test: testrunner.py --host
Change-Id: I2b720e2ed8f96303cf80e9daa6d5278bf0c3da2f
diff --git a/compiler/utils/intrusive_forward_list.h b/compiler/utils/intrusive_forward_list.h
index b5fc2f2..5a358ac 100644
--- a/compiler/utils/intrusive_forward_list.h
+++ b/compiler/utils/intrusive_forward_list.h
@@ -23,6 +23,7 @@
 #include <memory>
 #include <type_traits>
 
+#include "base/casts.h"
 #include "base/logging.h"
 #include "base/macros.h"
 
@@ -42,10 +43,19 @@
   mutable const IntrusiveForwardListHook* next_hook;
 };
 
-template <typename T, IntrusiveForwardListHook T::* NextPtr = &T::hook>
-class IntrusiveForwardListMemberHook;
+template <typename Derived, typename Tag = void>
+struct IntrusiveForwardListNode : public IntrusiveForwardListHook {
+};
 
-template <typename T, typename HookTraits = IntrusiveForwardListMemberHook<T>>
+template <typename T, IntrusiveForwardListHook T::* NextPtr = &T::hook>
+class IntrusiveForwardListMemberHookTraits;
+
+template <typename T, typename Tag = void>
+class IntrusiveForwardListBaseHookTraits;
+
+template <typename T,
+          typename HookTraits =
+              IntrusiveForwardListBaseHookTraits<typename std::remove_const<T>::type>>
 class IntrusiveForwardList;
 
 template <typename T, typename HookTraits>
@@ -435,7 +445,7 @@
 }
 
 template <typename T, IntrusiveForwardListHook T::* NextPtr>
-class IntrusiveForwardListMemberHook {
+class IntrusiveForwardListMemberHookTraits {
  public:
   static const IntrusiveForwardListHook* GetHook(const T* value) {
     return &(value->*NextPtr);
@@ -447,6 +457,20 @@
   }
 };
 
+template <typename T, typename Tag>
+class IntrusiveForwardListBaseHookTraits {
+ public:
+  static const IntrusiveForwardListHook* GetHook(const T* value) {
+    // Explicit conversion to the "node" followed by implicit conversion to the "hook".
+    return static_cast<const IntrusiveForwardListNode<T, Tag>*>(value);
+  }
+
+  static T* GetValue(const IntrusiveForwardListHook* hook) {
+    return down_cast<T*>(down_cast<IntrusiveForwardListNode<T, Tag>*>(
+        const_cast<IntrusiveForwardListHook*>(hook)));
+  }
+};
+
 }  // namespace art
 
 #endif  // ART_COMPILER_UTILS_INTRUSIVE_FORWARD_LIST_H_