blob: 2a1320e6314c59bea359463887fa66d42e175597 [file] [log] [blame]
/*
* Copyright (C) 2012 Google Inc.
*
* 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.google.caliper.memory;
/**
* A visitor that controls an object traversal. Implementations
* of this interface are passed to {@link ObjectExplorer} exploration methods.
*
* @param <T> the type of the result that this visitor returns
* (can be defined as {@code Void} to denote no result}.
*
* @see ObjectExplorer
*/
public interface ObjectVisitor<T> {
/**
* Visits an explored value (the whole chain from the root object
* leading to the value is provided), and decides whether to continue
* the exploration of that value.
*
* <p>In case the explored value is either primitive or {@code null}
* (e.g., if {@code chain.isPrimitive() || chain.getValue() == null}),
* the return value is meaningless and is ignored.
*
* @param chain the chain that leads to the explored value.
* @return {@link Traversal#EXPLORE} to denote that the visited object
* should be further explored, or {@link Traversal#SKIP} to avoid
* exploring it.
*/
Traversal visit(Chain chain);
/**
* Returns an arbitrary value (presumably constructed during the object
* graph traversal).
*/
T result();
/**
* Constants that denote how the traversal of a given object (chain)
* should continue.
*/
enum Traversal {
/**
* The visited object should be further explored.
*/
EXPLORE,
/**
* The visited object should not be explored.
*/
SKIP
}
}