From 126f1ecf0b13f8f72f506da7b008c46fb5c04aef Mon Sep 17 00:00:00 2001 From: irengrig Date: Tue, 31 Aug 2010 15:32:26 +0400 Subject: [PATCH] git log: auxiliary stuff --- .../util/containers/PrimitiveConvertor.java | 28 +++++++++ .../util/containers/ReadonlyList.java | 24 ++++++++ .../intellij/openapi/vcs/CompoundNumber.java | 57 ++++++++++++++++++ .../openapi/vcs/ReadonlyListsMerger.java | 58 +++++++++++++++++++ 4 files changed, 167 insertions(+) create mode 100644 platform/util/src/com/intellij/util/containers/PrimitiveConvertor.java create mode 100644 platform/util/src/com/intellij/util/containers/ReadonlyList.java create mode 100644 platform/vcs-api/src/com/intellij/openapi/vcs/CompoundNumber.java create mode 100644 platform/vcs-api/src/com/intellij/openapi/vcs/ReadonlyListsMerger.java diff --git a/platform/util/src/com/intellij/util/containers/PrimitiveConvertor.java b/platform/util/src/com/intellij/util/containers/PrimitiveConvertor.java new file mode 100644 index 000000000000..067daecb4b33 --- /dev/null +++ b/platform/util/src/com/intellij/util/containers/PrimitiveConvertor.java @@ -0,0 +1,28 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.util.containers; + +/** + * @author irengrig + */ +public interface PrimitiveConvertor { + interface Int extends PrimitiveConvertor { + T convert(final int value); + } + interface Long extends PrimitiveConvertor { + T convert(final long value); + } +} diff --git a/platform/util/src/com/intellij/util/containers/ReadonlyList.java b/platform/util/src/com/intellij/util/containers/ReadonlyList.java new file mode 100644 index 000000000000..53ed0f431c2d --- /dev/null +++ b/platform/util/src/com/intellij/util/containers/ReadonlyList.java @@ -0,0 +1,24 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.util.containers; + +/** + * @author irengrig + */ +public interface ReadonlyList { + T get(final int idx); + int getSize(); +} diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/CompoundNumber.java b/platform/vcs-api/src/com/intellij/openapi/vcs/CompoundNumber.java new file mode 100644 index 000000000000..7d3dd1568173 --- /dev/null +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/CompoundNumber.java @@ -0,0 +1,57 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.openapi.vcs; + +/** +* @author irengrig +*/ +public class CompoundNumber { + private final int myMemberNumber; + private final int myIdx; + + public CompoundNumber(int memberNumber, int idx) { + myIdx = idx; + myMemberNumber = memberNumber; + } + + public int getIdx() { + return myIdx; + } + + public int getMemberNumber() { + return myMemberNumber; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + CompoundNumber that = (CompoundNumber)o; + + if (myIdx != that.myIdx) return false; + if (myMemberNumber != that.myMemberNumber) return false; + + return true; + } + + @Override + public int hashCode() { + int result = myMemberNumber; + result = 31 * result + myIdx; + return result; + } +} diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/ReadonlyListsMerger.java b/platform/vcs-api/src/com/intellij/openapi/vcs/ReadonlyListsMerger.java new file mode 100644 index 000000000000..0dd7ca76be01 --- /dev/null +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/ReadonlyListsMerger.java @@ -0,0 +1,58 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * 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. + */ +package com.intellij.openapi.vcs; + +import com.intellij.util.Consumer; +import com.intellij.util.containers.ReadonlyList; + +import java.util.List; + +/** + * @author irengrig + */ +public class ReadonlyListsMerger> { + private final List> myLists; + private final Consumer myConsumer; + + public ReadonlyListsMerger(final List> lists, final Consumer consumer) { + myLists = lists; + myConsumer = consumer; + } + + public void execute() { + final int[] idxs = new int[myLists.size()]; + for (int i = 0; i < myLists.size(); i++) { + final ReadonlyList member = myLists.get(i); + idxs[i] = member.getSize() == 0 ? -1 : 0; + } + + while (true) { + T minValue = null; + int minValueIdx = -1; + for (int i = 0; i < idxs.length; i++) { + if (idxs[i] == -1) continue; // at end + final ReadonlyList list = myLists.get(i); + if ((minValue == null) || (list.get(idxs[i]).compareTo(minValue) <= 0)) { + minValue = list.get(idxs[i]); + minValueIdx = i; + } + } + if (minValueIdx == -1) return; + myConsumer.consume(new CompoundNumber(minValueIdx, idxs[minValueIdx])); + idxs[minValueIdx] = (myLists.get(minValueIdx).getSize() == (idxs[minValueIdx] + 1) ? -1 : idxs[minValueIdx] + 1); + } + } +}