001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.data.osm;
003
004/**
005 * IRelation captures the common functions of {@link Relation} and {@link RelationData}.
006 * @since 4098
007 */
008public interface IRelation extends IPrimitive {
009
010    /**
011     * Returns the number of members.
012     * @return number of members
013     */
014    int getMembersCount();
015
016    /**
017     * Returns id of the member at given index.
018     * @param idx member index
019     * @return id of the member at given index
020     */
021    long getMemberId(int idx);
022
023    /**
024     * Returns role of the member at given index.
025     * @param idx member index
026     * @return role of the member at given index
027     */
028    String getRole(int idx);
029
030    /**
031     * Returns type of the member at given index.
032     * @param idx member index
033     * @return type of the member at given index
034     */
035    OsmPrimitiveType getMemberType(int idx);
036
037    /**
038     * Determines if at least one child primitive is incomplete.
039     *
040     * @return true if at least one child primitive is incomplete
041     * @since 13564
042     */
043    default boolean hasIncompleteMembers() {
044        return false;
045    }
046
047    @Override
048    default int compareTo(IPrimitive o) {
049        return o instanceof IRelation ? Long.compare(getUniqueId(), o.getUniqueId()) : -1;
050    }
051
052    @Override
053    default String getDisplayName(NameFormatter formatter) {
054        return formatter.format(this);
055    }
056
057    /**
058     * Determines if this relation is a boundary.
059     * @return {@code true} if a boundary relation
060     */
061    default boolean isBoundary() {
062        return "boundary".equals(get("type"));
063    }
064
065    @Override
066    default boolean isMultipolygon() {
067        return "multipolygon".equals(get("type")) || isBoundary();
068    }
069}