class ColumnStorageDefinition<T> extends ColumnConstraint<T> {

    private final GenericProperties<T> properties;

    public ColumnStorageDefinition(GenericProperties<T> properties) {
        this.properties = properties;
    }

    public GenericProperties<T> properties() {
        return properties;
    }

    @Override
    public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
        return visitor.visitColumnStorageDefinition(this, context);
    }

    @Override
    public <U> ColumnConstraint<U> map(Function<? super T, ? extends U> mapper) {
        return new ColumnStorageDefinition<>(properties.map(mapper));
    }

    @Override
    public void visit(Consumer<? super T> consumer) {
        properties.properties().values().forEach(consumer);
    }

    @Override
    public boolean equals(Object o) {<FILL_FUNCTION_BODY>}

    @Override
    public int hashCode() {
        return Objects.hash(properties);
    }

    @Override
    public String toString() {
        return "ColumnStorageDefinition{" +
               "properties=" + properties +
               '}';
    }
}

        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        ColumnStorageDefinition<?> that = (ColumnStorageDefinition<?>) o;
        return Objects.equals(properties, that.properties);
    
<methods>public R accept(AstVisitor<R,C>, C) ,public abstract ColumnConstraint<U> map(Function<? super T,? extends U>) ,public abstract void visit(Consumer<? super T>) <variables>permits CheckColumnConstraint,permits ColumnStorageDefinition,permits DefaultConstraint,permits GeneratedExpressionConstraint,permits IndexColumnConstraint,permits NotNullColumnConstraint,permits NullColumnConstraint,permits PrimaryKeyColumnConstraint