| // Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | package com.android.tools.r8.utils; | 
 |  | 
 | public abstract class OptionalBool extends BooleanLatticeElement { | 
 |  | 
 |   public static final OptionalBool TRUE = | 
 |       new OptionalBool() { | 
 |  | 
 |         @Override | 
 |         public boolean isTrue() { | 
 |           return true; | 
 |         } | 
 |  | 
 |         @Override | 
 |         public boolean toBoolean() { | 
 |           return true; | 
 |         } | 
 |  | 
 |         @Override | 
 |         public int ordinal() { | 
 |           return 1; | 
 |         } | 
 |  | 
 |         @Override | 
 |         public String toString() { | 
 |           return "true"; | 
 |         } | 
 |       }; | 
 |  | 
 |   public static final OptionalBool FALSE = | 
 |       new OptionalBool() { | 
 |  | 
 |         @Override | 
 |         public boolean isFalse() { | 
 |           return true; | 
 |         } | 
 |  | 
 |         @Override | 
 |         public boolean toBoolean() { | 
 |           return false; | 
 |         } | 
 |  | 
 |         @Override | 
 |         public int ordinal() { | 
 |           return 0; | 
 |         } | 
 |  | 
 |         @Override | 
 |         public String toString() { | 
 |           return "false"; | 
 |         } | 
 |       }; | 
 |  | 
 |   public static final OptionalBool UNKNOWN = | 
 |       new OptionalBool() { | 
 |  | 
 |         @Override | 
 |         public boolean getOrDefault(boolean defaultValue) { | 
 |           return defaultValue; | 
 |         } | 
 |  | 
 |         @Override | 
 |         public boolean isUnknown() { | 
 |           return true; | 
 |         } | 
 |  | 
 |         @Override | 
 |         public boolean toBoolean() { | 
 |           throw new IllegalStateException("Cannot convert UNKNOWN to boolean"); | 
 |         } | 
 |  | 
 |         @Override | 
 |         public int ordinal() { | 
 |           return 2; | 
 |         } | 
 |  | 
 |         @Override | 
 |         public String toString() { | 
 |           return "unknown"; | 
 |         } | 
 |       }; | 
 |  | 
 |   OptionalBool() {} | 
 |  | 
 |   public static OptionalBool of(boolean bool) { | 
 |     return bool ? TRUE : FALSE; | 
 |   } | 
 |  | 
 |   public static OptionalBool unknown() { | 
 |     return UNKNOWN; | 
 |   } | 
 |  | 
 |   @Override | 
 |   public OptionalBool asOptionalBool() { | 
 |     return this; | 
 |   } | 
 |  | 
 |   public boolean getOrDefault(boolean defaultValue) { | 
 |     return toBoolean(); | 
 |   } | 
 |  | 
 |   public abstract boolean toBoolean(); | 
 |  | 
 |   @Override | 
 |   public boolean equals(Object other) { | 
 |     return this == other; | 
 |   } | 
 |  | 
 |   @Override | 
 |   public int hashCode() { | 
 |     return System.identityHashCode(this); | 
 |   } | 
 |  | 
 |   public abstract int ordinal(); | 
 |  | 
 |   // Force all subtypes to implement toString(). | 
 |   @Override | 
 |   public abstract String toString(); | 
 | } |