src/sizes/sizes_state.cpp (46 lines of code) (raw):

// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. #include "sizes_state.h" bool isStartObject(uint8_t state) { return (state & 1u) != 0u; } bool isInSubtree(uint8_t state) { return (state & (1u << 1u)) != 0u; } bool isReachableOutside(uint8_t state) { return (state & (1u << 2u)) != 0u; } bool isAlreadyVisited(uint8_t state) { return (state & (1u << 3u)) != 0u; } uint8_t createState(bool isStartObject, bool isInSubtree, bool isReachableOutside, bool isAlreadyVisited) { uint8_t state = 0; if (isStartObject) { state |= 1u; } if (isInSubtree) { state |= 1u << 1u; } if (isReachableOutside) { state |= 1u << 2u; } if (isAlreadyVisited) { state |= 1u << 3u; } return state; } bool isRetained(uint8_t state) { return isStartObject(state) || (isInSubtree(state) && !isReachableOutside(state)); } uint8_t updateState(uint8_t currentState, uint8_t referrerState) { return createState( isStartObject(currentState), isInSubtree(currentState) || isInSubtree(referrerState), isReachableOutside(currentState) || (!isStartObject(referrerState) && isReachableOutside(referrerState)), true ); } uint8_t asVisitedFromUntagged(uint8_t state) { state |= 1u << 2u; state |= 1u << 3u; return state; }