| // Copyright 2016 Google Inc. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef COBALT_BINDINGS_TESTING_GARBAGE_COLLECTION_TEST_INTERFACE_H_ |
| #define COBALT_BINDINGS_TESTING_GARBAGE_COLLECTION_TEST_INTERFACE_H_ |
| |
| #include <vector> |
| |
| #include "cobalt/script/wrappable.h" |
| |
| namespace cobalt { |
| namespace bindings { |
| namespace testing { |
| |
| // GarbageCollectionTestInterface maintains strong references from head -> tail, |
| // and raw pointers from tail -> head to prevent reference cycles, similar to |
| // how references between Nodes are handled in Cobalt. |
| class GarbageCollectionTestInterface : public script::Wrappable { |
| public: |
| typedef std::vector<GarbageCollectionTestInterface*> |
| GarbageCollectionTestInterfaceVector; |
| |
| GarbageCollectionTestInterface(); |
| ~GarbageCollectionTestInterface(); |
| |
| // The current |previous| node will become the tail of its list. |
| void set_previous( |
| const scoped_refptr<GarbageCollectionTestInterface>& previous); |
| scoped_refptr<GarbageCollectionTestInterface> previous() { |
| return make_scoped_refptr(previous_); |
| } |
| |
| // The current |next| node will become the head of a new list. |
| void set_next(const scoped_refptr<GarbageCollectionTestInterface>& next); |
| scoped_refptr<GarbageCollectionTestInterface> next() { return next_; } |
| |
| static GarbageCollectionTestInterfaceVector& instances(); |
| |
| void TraceMembers(script::Tracer* tracer) OVERRIDE; |
| |
| DEFINE_WRAPPABLE_TYPE(GarbageCollectionTestInterface); |
| |
| private: |
| void MakeHead(); |
| void MakeTail(); |
| |
| static void Join(GarbageCollectionTestInterface* first, |
| GarbageCollectionTestInterface* second); |
| |
| // Raw pointers going upstream, strong pointers going downstream to prevent |
| // reference cycles. |
| GarbageCollectionTestInterface* previous_; |
| scoped_refptr<GarbageCollectionTestInterface> next_; |
| }; |
| |
| } // namespace testing |
| } // namespace bindings |
| } // namespace cobalt |
| |
| #endif // COBALT_BINDINGS_TESTING_GARBAGE_COLLECTION_TEST_INTERFACE_H_ |