| 
									
										
										
										
											2021-06-09 00:08:47 +03:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2021, Idan Horowitz <idan.horowitz@serenityos.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <LibJS/Runtime/Set.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace JS { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-13 20:49:50 +00:00
										 |  |  | NonnullGCPtr<Set> Set::create(Realm& realm) | 
					
						
							| 
									
										
										
										
											2021-06-09 00:08:47 +03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2022-12-13 20:49:50 +00:00
										 |  |  |     return *realm.heap().allocate<Set>(realm, *realm.intrinsics().set_prototype()); | 
					
						
							| 
									
										
										
										
											2021-06-09 00:08:47 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Set::Set(Object& prototype) | 
					
						
							|  |  |  |     : Object(prototype) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-30 09:18:27 -05:00
										 |  |  | void Set::initialize(Realm& realm) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_values = Map::create(realm); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-01 23:04:30 +02:00
										 |  |  | NonnullGCPtr<Set> Set::copy() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto& vm = this->vm(); | 
					
						
							|  |  |  |     auto& realm = *vm.current_realm(); | 
					
						
							|  |  |  |     // FIXME: This is very inefficient, but there's no better way to do this at the moment, as the underlying Map
 | 
					
						
							|  |  |  |     //  implementation of m_values uses a non-copyable RedBlackTree.
 | 
					
						
							| 
									
										
										
										
											2022-12-13 20:49:50 +00:00
										 |  |  |     auto result = Set::create(realm); | 
					
						
							| 
									
										
										
										
											2022-12-01 23:04:30 +02:00
										 |  |  |     for (auto const& entry : *this) | 
					
						
							|  |  |  |         result->set_add(entry.key); | 
					
						
							|  |  |  |     return *result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 18:01:06 +03:00
										 |  |  | void Set::visit_edges(Cell::Visitor& visitor) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-09-11 14:05:12 +02:00
										 |  |  |     Base::visit_edges(visitor); | 
					
						
							| 
									
										
										
										
											2022-11-30 09:18:27 -05:00
										 |  |  |     visitor.visit(m_values); | 
					
						
							| 
									
										
										
										
											2021-06-09 18:01:06 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-09 00:08:47 +03:00
										 |  |  | } |