Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
小 白蛋
Intellij Community
Commits
d7370028
Commit
d7370028
authored
7 years ago
by
Alexander Kass
Browse files
Options
Download
Email Patches
Plain Diff
ConcurrentFactoryMap make keySet, entrySet, values mutable
parent
24726b11
Branches unavailable
Tags unavailable
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
platform/util/src/com/intellij/util/containers/ConcurrentFactoryMap.java
+100
-22
...rc/com/intellij/util/containers/ConcurrentFactoryMap.java
with
100 additions
and
22 deletions
+100
-22
platform/util/src/com/intellij/util/containers/ConcurrentFactoryMap.java
+
100
-
22
View file @
d7370028
...
...
@@ -25,7 +25,6 @@ import org.jetbrains.annotations.NotNull;
import
org.jetbrains.annotations.Nullable
;
import
java.util.*
;
import
java.util.HashSet
;
import
java.util.concurrent.ConcurrentMap
;
/**
...
...
@@ -103,15 +102,7 @@ public abstract class ConcurrentFactoryMap<K,V> implements ConcurrentMap<K,V> {
@NotNull
@Override
public
Set
<
K
>
keySet
()
{
final
Set
<
K
>
ts
=
myMap
.
keySet
();
K
nullKey
=
FAKE_NULL
();
if
(
ts
.
contains
(
nullKey
))
{
Set
<
K
>
hashSet
=
new
HashSet
<
K
>(
ts
);
hashSet
.
remove
(
nullKey
);
hashSet
.
add
(
null
);
return
hashSet
;
}
return
ts
;
return
new
CollectionWrapper
.
Set
<
K
>(
myMap
.
keySet
());
}
public
boolean
removeValue
(
Object
value
)
{
...
...
@@ -150,23 +141,23 @@ public abstract class ConcurrentFactoryMap<K,V> implements ConcurrentMap<K,V> {
@NotNull
@Override
public
Collection
<
V
>
values
()
{
return
ContainerUtil
.
map
(
myMap
.
values
(),
new
Function
<
V
,
V
>()
{
@Override
public
V
fun
(
V
v
)
{
return
nullize
(
v
);
}
});
return
new
CollectionWrapper
<
V
>(
myMap
.
values
());
}
@NotNull
@Override
public
Set
<
Entry
<
K
,
V
>>
entrySet
()
{
return
ContainerUtil
.
map2Set
(
myMap
.
entrySet
(),
new
Function
<
Entry
<
K
,
V
>,
Entry
<
K
,
V
>>()
{
@Override
public
Entry
<
K
,
V
>
fun
(
Entry
<
K
,
V
>
entry
)
{
return
new
AbstractMap
.
SimpleEntry
<
K
,
V
>(
nullize
(
entry
.
getKey
()),
nullize
(
entry
.
getValue
()));
}
});
return
new
CollectionWrapper
.
Set
<
Entry
<
K
,
V
>>(
myMap
.
entrySet
())
{
@Override
public
Object
wrap
(
Object
val
)
{
return
val
instanceof
EntryWrapper
?
((
EntryWrapper
)
val
).
myEntry
:
val
;
}
@Override
public
Entry
<
K
,
V
>
unwrap
(
Entry
<
K
,
V
>
val
)
{
return
val
.
getKey
()
==
FAKE_NULL
()
||
val
.
getValue
()
==
FAKE_NULL
()
?
new
EntryWrapper
<
K
,
V
>(
val
)
:
val
;
}
};
}
@NotNull
...
...
@@ -260,4 +251,91 @@ public abstract class ConcurrentFactoryMap<K,V> implements ConcurrentMap<K,V> {
V
v
;
return
(
v
=
get
(
key
))
!=
null
?
v
:
defaultValue
;
}
private
static
class
CollectionWrapper
<
K
>
extends
AbstractCollection
<
K
>
{
private
final
Collection
<
K
>
myDelegate
;
public
CollectionWrapper
(
Collection
<
K
>
delegate
)
{
myDelegate
=
delegate
;
}
@Override
public
Iterator
<
K
>
iterator
()
{
return
new
Iterator
<
K
>()
{
Iterator
<
K
>
it
=
myDelegate
.
iterator
();
@Override
public
boolean
hasNext
()
{
return
it
.
hasNext
();
}
@Override
public
K
next
()
{
return
unwrap
(
it
.
next
());
}
@Override
public
void
remove
()
{
it
.
remove
();
}
};
}
@Override
public
int
size
()
{
return
myDelegate
.
size
();
}
@Override
public
boolean
contains
(
Object
o
)
{
return
myDelegate
.
contains
(
wrap
(
o
));
}
@Override
public
boolean
remove
(
Object
o
)
{
return
myDelegate
.
remove
(
wrap
(
o
));
}
protected
Object
wrap
(
Object
val
)
{
return
notNull
(
val
);
}
protected
K
unwrap
(
K
val
)
{
return
nullize
(
val
);
}
private
static
class
Set
<
K
>
extends
CollectionWrapper
<
K
>
implements
java
.
util
.
Set
<
K
>
{
public
Set
(
Collection
<
K
>
delegate
)
{
super
(
delegate
);
}
}
protected
static
class
EntryWrapper
<
K
,
V
>
implements
Entry
<
K
,
V
>
{
final
Entry
<
K
,
V
>
myEntry
;
private
EntryWrapper
(
Entry
<
K
,
V
>
entry
)
{
myEntry
=
entry
;
}
@Override
public
K
getKey
()
{
return
nullize
(
myEntry
.
getKey
());
}
@Override
public
V
getValue
()
{
return
nullize
(
myEntry
.
getValue
());
}
@Override
public
V
setValue
(
V
value
)
{
return
myEntry
.
setValue
(
ConcurrentFactoryMap
.<
V
>
notNull
(
value
));
}
@Override
public
int
hashCode
()
{
return
myEntry
.
hashCode
();
}
@Override
public
boolean
equals
(
Object
obj
)
{
return
myEntry
.
equals
(
obj
instanceof
EntryWrapper
?
((
EntryWrapper
)
obj
).
myEntry
:
obj
);
}
}
}
}
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help