1 
 2 /*
 3  * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
 4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 5  *
 6  * This code is free software; you can redistribute it and/or modify it
 7  * under the terms of the GNU General Public License version 2 only, as
 8  * published by the Free Software Foundation.  Oracle designates this
 9  * particular file as subject to the "Classpath" exception as provided
10  * by Oracle in the LICENSE file that accompanied this code.
11  *
12  * This code is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15  * version 2 for more details (a copy is included in the LICENSE file that
16  * accompanied this code).
17  *
18  * You should have received a copy of the GNU General Public License version
19  * 2 along with this work; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
21  *
22  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
23  * or visit www.oracle.com if you need additional information or have any
24  * questions.
25  */
26 package optkl.util;
27 
28 import java.util.LinkedHashMap;
29 import java.util.LinkedHashSet;
30 import java.util.Map;
31 import java.util.Set;
32 
33 public class BiMapOfSets<From, To> {
34     private Map<From, Set<To>> fromTo = new LinkedHashMap<>();
35     private Map<To, Set<From>> toFrom = new LinkedHashMap<>();
36 
37     public void add(From from, To to) {
38         fromTo.computeIfAbsent(from,_->new LinkedHashSet<>()).add(to);
39         toFrom.computeIfAbsent(to,_->new LinkedHashSet<>()).add(from);
40     }
41 
42     public Set<From> getFrom(To to) {
43         return toFrom.get(to);
44     }
45 
46     public Set<To> getTo(From from) {
47         return fromTo.get(from);
48     }
49 
50     public boolean containsFrom(From from) {
51         return fromTo.containsKey(from);
52     }
53 
54     public boolean containsTo(To to) {
55         return toFrom.containsKey(to);
56     }
57 
58     public Iterable<From> fromKeys() {
59         return fromTo.keySet();
60     }
61     public Iterable<To> toKeys() {
62         return toFrom.keySet();
63     }
64 }