Struct inkwell::context::ContextRef
source · pub struct ContextRef<'ctx> { /* private fields */ }Expand description
A ContextRef is a smart pointer allowing borrowed access to a type’s Context.
Implementations§
source§impl<'ctx> ContextRef<'ctx>
impl<'ctx> ContextRef<'ctx>
sourcepub fn raw(&self) -> LLVMContextRef
pub fn raw(&self) -> LLVMContextRef
Get raw LLVMContextRef.
This function is exposed only for interoperability with other LLVM IR libraries. It’s not intended to be used by most users.
sourcepub unsafe fn new(context: LLVMContextRef) -> Self
pub unsafe fn new(context: LLVMContextRef) -> Self
Creates a new ContextRef from LLVMContextRef.
§Safety
This function is exposed only for interoperability with other LLVM IR libraries. It’s not intended to be used by most users, hence marked as unsafe.
sourcepub fn create_builder(&self) -> Builder<'ctx>
pub fn create_builder(&self) -> Builder<'ctx>
Creates a new Builder for a Context.
§Example
use inkwell::context::Context;
let context = Context::create();
let builder = context.create_builder();sourcepub fn create_module(&self, name: &str) -> Module<'ctx>
pub fn create_module(&self, name: &str) -> Module<'ctx>
Creates a new Module for a Context.
§Example
use inkwell::context::Context;
let context = Context::create();
let module = context.create_module("my_module");sourcepub fn create_module_from_ir(
&self,
memory_buffer: MemoryBuffer,
) -> Result<Module<'ctx>, LLVMString>
pub fn create_module_from_ir( &self, memory_buffer: MemoryBuffer, ) -> Result<Module<'ctx>, LLVMString>
Creates a new Module for the current Context from a MemoryBuffer.
§Example
use inkwell::context::Context;
let context = Context::create();
let module = context.create_module("my_module");
let builder = context.create_builder();
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_val = module.add_function("my_fn", fn_type, None);
let basic_block = context.append_basic_block(fn_val, "entry");
builder.position_at_end(basic_block);
builder.build_return(None).unwrap();
let memory_buffer = module.write_bitcode_to_memory();
let module2 = context.create_module_from_ir(memory_buffer).unwrap();sourcepub fn create_inline_asm(
&self,
ty: FunctionType<'ctx>,
assembly: String,
constraints: String,
sideeffects: bool,
alignstack: bool,
dialect: Option<InlineAsmDialect>,
can_throw: bool,
) -> PointerValue<'ctx>
pub fn create_inline_asm( &self, ty: FunctionType<'ctx>, assembly: String, constraints: String, sideeffects: bool, alignstack: bool, dialect: Option<InlineAsmDialect>, can_throw: bool, ) -> PointerValue<'ctx>
Creates a inline asm function pointer.
§Example
use std::convert::TryFrom;
use inkwell::context::Context;
let context = Context::create();
let module = context.create_module("my_module");
let builder = context.create_builder();
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_val = module.add_function("my_fn", fn_type, None);
let basic_block = context.append_basic_block(fn_val, "entry");
builder.position_at_end(basic_block);
let asm_fn = context.i64_type().fn_type(&[context.i64_type().into(), context.i64_type().into()], false);
let asm = context.create_inline_asm(
asm_fn,
"syscall".to_string(),
"=r,{rax},{rdi}".to_string(),
true,
false,
#[cfg(not(any(feature = "llvm4-0", feature = "llvm5-0", feature = "llvm6-0")))] None,
#[cfg(not(any(
feature = "llvm4-0",
feature = "llvm5-0",
feature = "llvm6-0",
feature = "llvm7-0",
feature = "llvm8-0",
feature = "llvm9-0",
feature = "llvm10-0",
feature = "llvm11-0",
feature = "llvm12-0"
)))]
false,
);
let params = &[context.i64_type().const_int(60, false).into(), context.i64_type().const_int(1, false).into()];
#[cfg(any(
feature = "llvm4-0",
feature = "llvm5-0",
feature = "llvm6-0",
feature = "llvm7-0",
feature = "llvm8-0",
feature = "llvm9-0",
feature = "llvm10-0",
feature = "llvm11-0",
feature = "llvm12-0",
feature = "llvm13-0",
feature = "llvm14-0"
))]
{
use inkwell::values::CallableValue;
let callable_value = CallableValue::try_from(asm).unwrap();
builder.build_call(callable_value, params, "exit").unwrap();
}
#[cfg(any(feature = "llvm15-0", feature = "llvm16-0", feature = "llvm17-0", feature = "llvm18-0"))]
builder.build_indirect_call(asm_fn, asm, params, "exit").unwrap();
builder.build_return(None).unwrap();sourcepub fn void_type(&self) -> VoidType<'ctx>
pub fn void_type(&self) -> VoidType<'ctx>
Gets the VoidType. It will be assigned the current context.
§Example
use inkwell::context::Context;
let context = Context::create();
let void_type = context.void_type();
assert_eq!(void_type.get_context(), context);sourcepub fn bool_type(&self) -> IntType<'ctx>
pub fn bool_type(&self) -> IntType<'ctx>
Gets the IntType representing 1 bit width. It will be assigned the current context.
§Example
use inkwell::context::Context;
let context = Context::create();
let bool_type = context.bool_type();
assert_eq!(bool_type.get_bit_width(), 1);
assert_eq!(bool_type.get_context(), context);sourcepub fn i8_type(&self) -> IntType<'ctx>
pub fn i8_type(&self) -> IntType<'ctx>
Gets the IntType representing 8 bit width. It will be assigned the current context.
§Example
use inkwell::context::Context;
let context = Context::create();
let i8_type = context.i8_type();
assert_eq!(i8_type.get_bit_width(), 8);
assert_eq!(i8_type.get_context(), context);sourcepub fn i16_type(&self) -> IntType<'ctx>
pub fn i16_type(&self) -> IntType<'ctx>
Gets the IntType representing 16 bit width. It will be assigned the current context.
§Example
use inkwell::context::Context;
let context = Context::create();
let i16_type = context.i16_type();
assert_eq!(i16_type.get_bit_width(), 16);
assert_eq!(i16_type.get_context(), context);sourcepub fn i32_type(&self) -> IntType<'ctx>
pub fn i32_type(&self) -> IntType<'ctx>
Gets the IntType representing 32 bit width. It will be assigned the current context.
§Example
use inkwell::context::Context;
let context = Context::create();
let i32_type = context.i32_type();
assert_eq!(i32_type.get_bit_width(), 32);
assert_eq!(i32_type.get_context(), context);sourcepub fn i64_type(&self) -> IntType<'ctx>
pub fn i64_type(&self) -> IntType<'ctx>
Gets the IntType representing 64 bit width. It will be assigned the current context.
§Example
use inkwell::context::Context;
let context = Context::create();
let i64_type = context.i64_type();
assert_eq!(i64_type.get_bit_width(), 64);
assert_eq!(i64_type.get_context(), context);sourcepub fn i128_type(&self) -> IntType<'ctx>
pub fn i128_type(&self) -> IntType<'ctx>
Gets the IntType representing 128 bit width. It will be assigned the current context.
§Example
use inkwell::context::Context;
let context = Context::create();
let i128_type = context.i128_type();
assert_eq!(i128_type.get_bit_width(), 128);
assert_eq!(i128_type.get_context(), context);sourcepub fn custom_width_int_type(&self, bits: u32) -> IntType<'ctx>
pub fn custom_width_int_type(&self, bits: u32) -> IntType<'ctx>
Gets the IntType representing a custom bit width. It will be assigned the current context.
§Example
use inkwell::context::Context;
let context = Context::create();
let i42_type = context.custom_width_int_type(42);
assert_eq!(i42_type.get_bit_width(), 42);
assert_eq!(i42_type.get_context(), context);sourcepub fn metadata_type(&self) -> MetadataType<'ctx>
pub fn metadata_type(&self) -> MetadataType<'ctx>
Gets the MetadataType representing 128 bit width. It will be assigned the current context.
§Example
use inkwell::context::Context;
use inkwell::values::IntValue;
let context = Context::create();
let md_type = context.metadata_type();
assert_eq!(md_type.get_context(), context);sourcepub fn ptr_sized_int_type(
&self,
target_data: &TargetData,
address_space: Option<AddressSpace>,
) -> IntType<'ctx>
pub fn ptr_sized_int_type( &self, target_data: &TargetData, address_space: Option<AddressSpace>, ) -> IntType<'ctx>
Gets the IntType representing a bit width of a pointer. It will be assigned the referenced context.
§Example
use inkwell::OptimizationLevel;
use inkwell::context::Context;
use inkwell::targets::{InitializationConfig, Target};
Target::initialize_native(&InitializationConfig::default()).expect("Failed to initialize native target");
let context = Context::create();
let module = context.create_module("sum");
let execution_engine = module.create_jit_execution_engine(OptimizationLevel::None).unwrap();
let target_data = execution_engine.get_target_data();
let int_type = context.ptr_sized_int_type(&target_data, None);sourcepub fn f16_type(&self) -> FloatType<'ctx>
pub fn f16_type(&self) -> FloatType<'ctx>
Gets the FloatType representing a 16 bit width. It will be assigned the current context.
§Example
use inkwell::context::Context;
let context = Context::create();
let f16_type = context.f16_type();
assert_eq!(f16_type.get_context(), context);sourcepub fn f32_type(&self) -> FloatType<'ctx>
pub fn f32_type(&self) -> FloatType<'ctx>
Gets the FloatType representing a 32 bit width. It will be assigned the current context.
§Example
use inkwell::context::Context;
let context = Context::create();
let f32_type = context.f32_type();
assert_eq!(f32_type.get_context(), context);sourcepub fn f64_type(&self) -> FloatType<'ctx>
pub fn f64_type(&self) -> FloatType<'ctx>
Gets the FloatType representing a 64 bit width. It will be assigned the current context.
§Example
use inkwell::context::Context;
let context = Context::create();
let f64_type = context.f64_type();
assert_eq!(f64_type.get_context(), context);sourcepub fn x86_f80_type(&self) -> FloatType<'ctx>
pub fn x86_f80_type(&self) -> FloatType<'ctx>
Gets the FloatType representing a 80 bit width. It will be assigned the current context.
§Example
use inkwell::context::Context;
let context = Context::create();
let x86_f80_type = context.x86_f80_type();
assert_eq!(x86_f80_type.get_context(), context);sourcepub fn f128_type(&self) -> FloatType<'ctx>
pub fn f128_type(&self) -> FloatType<'ctx>
Gets the FloatType representing a 128 bit width. It will be assigned the current context.
§Example
use inkwell::context::Context;
let context = Context::create();
let f128_type = context.f128_type();
assert_eq!(f128_type.get_context(), context);sourcepub fn ppc_f128_type(&self) -> FloatType<'ctx>
pub fn ppc_f128_type(&self) -> FloatType<'ctx>
Gets the FloatType representing a 128 bit width. It will be assigned the current context.
PPC is two 64 bits side by side rather than one single 128 bit float.
§Example
use inkwell::context::Context;
let context = Context::create();
let f128_type = context.ppc_f128_type();
assert_eq!(f128_type.get_context(), context);sourcepub fn ptr_type(&self, address_space: AddressSpace) -> PointerType<'ctx>
pub fn ptr_type(&self, address_space: AddressSpace) -> PointerType<'ctx>
Gets the PointerType. It will be assigned the current context.
§Example
use inkwell::context::Context;
use inkwell::AddressSpace;
let context = Context::create();
let ptr_type = context.ptr_type(AddressSpace::default());
assert_eq!(ptr_type.get_address_space(), AddressSpace::default());
assert_eq!(ptr_type.get_context(), context);sourcepub fn struct_type(
&self,
field_types: &[BasicTypeEnum<'ctx>],
packed: bool,
) -> StructType<'ctx>
pub fn struct_type( &self, field_types: &[BasicTypeEnum<'ctx>], packed: bool, ) -> StructType<'ctx>
Creates a StructType definition from heterogeneous types in the current Context.
§Example
use inkwell::context::Context;
let context = Context::create();
let f32_type = context.f32_type();
let i16_type = context.i16_type();
let struct_type = context.struct_type(&[i16_type.into(), f32_type.into()], false);
assert_eq!(struct_type.get_field_types(), &[i16_type.into(), f32_type.into()]);sourcepub fn opaque_struct_type(&self, name: &str) -> StructType<'ctx>
pub fn opaque_struct_type(&self, name: &str) -> StructType<'ctx>
Creates an opaque StructType with no type definition yet defined.
§Example
use inkwell::context::Context;
let context = Context::create();
let f32_type = context.f32_type();
let i16_type = context.i16_type();
let struct_type = context.opaque_struct_type("my_struct");
assert_eq!(struct_type.get_field_types(), &[]);sourcepub fn get_struct_type(&self, name: &str) -> Option<StructType<'ctx>>
pub fn get_struct_type(&self, name: &str) -> Option<StructType<'ctx>>
Gets a named StructType from this Context.
§Example
use inkwell::context::Context;
let context = Context::create();
assert!(context.get_struct_type("foo").is_none());
let opaque = context.opaque_struct_type("foo");
assert_eq!(context.get_struct_type("foo").unwrap(), opaque);sourcepub fn const_struct(
&self,
values: &[BasicValueEnum<'ctx>],
packed: bool,
) -> StructValue<'ctx>
pub fn const_struct( &self, values: &[BasicValueEnum<'ctx>], packed: bool, ) -> StructValue<'ctx>
Creates a constant StructValue from constant values.
§Example
use inkwell::context::Context;
let context = Context::create();
let f32_type = context.f32_type();
let i16_type = context.i16_type();
let f32_one = f32_type.const_float(1.);
let i16_two = i16_type.const_int(2, false);
let const_struct = context.const_struct(&[i16_two.into(), f32_one.into()], false);
assert_eq!(const_struct.get_type().get_field_types(), &[i16_type.into(), f32_type.into()]);sourcepub fn append_basic_block(
&self,
function: FunctionValue<'ctx>,
name: &str,
) -> BasicBlock<'ctx>
pub fn append_basic_block( &self, function: FunctionValue<'ctx>, name: &str, ) -> BasicBlock<'ctx>
Append a named BasicBlock at the end of the referenced FunctionValue.
§Example
use inkwell::context::Context;
let context = Context::create();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let entry_basic_block = context.append_basic_block(fn_value, "entry");
assert_eq!(fn_value.count_basic_blocks(), 1);
let last_basic_block = context.append_basic_block(fn_value, "last");
assert_eq!(fn_value.count_basic_blocks(), 2);
assert_eq!(fn_value.get_first_basic_block().unwrap(), entry_basic_block);
assert_eq!(fn_value.get_last_basic_block().unwrap(), last_basic_block);sourcepub fn insert_basic_block_after(
&self,
basic_block: BasicBlock<'ctx>,
name: &str,
) -> BasicBlock<'ctx>
pub fn insert_basic_block_after( &self, basic_block: BasicBlock<'ctx>, name: &str, ) -> BasicBlock<'ctx>
Append a named BasicBlock after the referenced BasicBlock.
§Example
use inkwell::context::Context;
let context = Context::create();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let entry_basic_block = context.append_basic_block(fn_value, "entry");
assert_eq!(fn_value.count_basic_blocks(), 1);
let last_basic_block = context.insert_basic_block_after(entry_basic_block, "last");
assert_eq!(fn_value.count_basic_blocks(), 2);
assert_eq!(fn_value.get_first_basic_block().unwrap(), entry_basic_block);
assert_eq!(fn_value.get_last_basic_block().unwrap(), last_basic_block);sourcepub fn prepend_basic_block(
&self,
basic_block: BasicBlock<'ctx>,
name: &str,
) -> BasicBlock<'ctx>
pub fn prepend_basic_block( &self, basic_block: BasicBlock<'ctx>, name: &str, ) -> BasicBlock<'ctx>
Prepend a named BasicBlock before the referenced BasicBlock.
§Example
use inkwell::context::Context;
let context = Context::create();
let module = context.create_module("my_mod");
let void_type = context.void_type();
let fn_type = void_type.fn_type(&[], false);
let fn_value = module.add_function("my_fn", fn_type, None);
let entry_basic_block = context.append_basic_block(fn_value, "entry");
assert_eq!(fn_value.count_basic_blocks(), 1);
let first_basic_block = context.prepend_basic_block(entry_basic_block, "first");
assert_eq!(fn_value.count_basic_blocks(), 2);
assert_eq!(fn_value.get_first_basic_block().unwrap(), first_basic_block);
assert_eq!(fn_value.get_last_basic_block().unwrap(), entry_basic_block);sourcepub fn metadata_node(
&self,
values: &[BasicMetadataValueEnum<'ctx>],
) -> MetadataValue<'ctx>
pub fn metadata_node( &self, values: &[BasicMetadataValueEnum<'ctx>], ) -> MetadataValue<'ctx>
Creates a MetadataValue tuple of heterogeneous types (a “Node”) for the current context. It can be assigned to a value.
§Example
use inkwell::context::Context;
let context = Context::create();
let i8_type = context.i8_type();
let i8_two = i8_type.const_int(2, false);
let f32_type = context.f32_type();
let f32_zero = f32_type.const_float(0.);
let md_node = context.metadata_node(&[i8_two.into(), f32_zero.into()]);
let f32_one = f32_type.const_float(1.);
let void_type = context.void_type();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let fn_type = void_type.fn_type(&[f32_type.into()], false);
let fn_value = module.add_function("my_func", fn_type, None);
let entry_block = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_block);
let ret_instr = builder.build_return(None).unwrap();
assert!(md_node.is_node());
ret_instr.set_metadata(md_node, 0);sourcepub fn metadata_string(&self, string: &str) -> MetadataValue<'ctx>
pub fn metadata_string(&self, string: &str) -> MetadataValue<'ctx>
Creates a MetadataValue string for the current context. It can be assigned to a value.
§Example
use inkwell::context::Context;
let context = Context::create();
let md_string = context.metadata_string("Floats are awesome!");
let f32_type = context.f32_type();
let f32_one = f32_type.const_float(1.);
let void_type = context.void_type();
let builder = context.create_builder();
let module = context.create_module("my_mod");
let fn_type = void_type.fn_type(&[f32_type.into()], false);
let fn_value = module.add_function("my_func", fn_type, None);
let entry_block = context.append_basic_block(fn_value, "entry");
builder.position_at_end(entry_block);
let ret_instr = builder.build_return(None).unwrap();
assert!(md_string.is_string());
ret_instr.set_metadata(md_string, 0);sourcepub fn get_kind_id(&self, key: &str) -> u32
pub fn get_kind_id(&self, key: &str) -> u32
Obtains the index of a metadata kind id. If the string doesn’t exist, LLVM will add it at index FIRST_CUSTOM_METADATA_KIND_ID onward.
§Example
use inkwell::context::Context;
use inkwell::values::FIRST_CUSTOM_METADATA_KIND_ID;
let context = Context::create();
assert_eq!(context.get_kind_id("dbg"), 0);
assert_eq!(context.get_kind_id("tbaa"), 1);
assert_eq!(context.get_kind_id("prof"), 2);
// Custom kind id doesn't exist in LLVM until now:
assert_eq!(context.get_kind_id("foo"), FIRST_CUSTOM_METADATA_KIND_ID);sourcepub fn create_enum_attribute(&self, kind_id: u32, val: u64) -> Attribute
pub fn create_enum_attribute(&self, kind_id: u32, val: u64) -> Attribute
Creates an enum Attribute in this Context.
§Example
use inkwell::context::Context;
let context = Context::create();
let enum_attribute = context.create_enum_attribute(0, 10);
assert!(enum_attribute.is_enum());sourcepub fn create_string_attribute(&self, key: &str, val: &str) -> Attribute
pub fn create_string_attribute(&self, key: &str, val: &str) -> Attribute
Creates a string Attribute in this Context.
§Example
use inkwell::context::Context;
let context = Context::create();
let string_attribute = context.create_string_attribute("my_key_123", "my_val");
assert!(string_attribute.is_string());sourcepub fn create_type_attribute(
&self,
kind_id: u32,
type_ref: AnyTypeEnum<'_>,
) -> Attribute
pub fn create_type_attribute( &self, kind_id: u32, type_ref: AnyTypeEnum<'_>, ) -> Attribute
Create an enum Attribute with an AnyTypeEnum attached to it.
§Example
use inkwell::context::Context;
use inkwell::attributes::Attribute;
use inkwell::types::AnyType;
let context = Context::create();
let kind_id = Attribute::get_named_enum_kind_id("sret");
let any_type = context.i32_type().as_any_type_enum();
let type_attribute = context.create_type_attribute(
kind_id,
any_type,
);
assert!(type_attribute.is_type());
assert_eq!(type_attribute.get_type_value(), any_type);
assert_ne!(type_attribute.get_type_value(), context.i64_type().as_any_type_enum());sourcepub fn const_string(
&self,
string: &[u8],
null_terminated: bool,
) -> ArrayValue<'ctx>
pub fn const_string( &self, string: &[u8], null_terminated: bool, ) -> ArrayValue<'ctx>
Creates a const string which may be null terminated.
§Example
use inkwell::context::Context;
use inkwell::values::AnyValue;
let context = Context::create();
let string = context.const_string(b"my_string", false);
assert_eq!(string.print_to_string().to_string(), "[9 x i8] c\"my_string\"");Trait Implementations§
source§impl<'ctx> AsContextRef<'ctx> for ContextRef<'ctx>
impl<'ctx> AsContextRef<'ctx> for ContextRef<'ctx>
source§fn as_ctx_ref(&self) -> LLVMContextRef
fn as_ctx_ref(&self) -> LLVMContextRef
Acquires the underlying raw pointer belonging to this ContextRef type.
source§impl<'ctx> Clone for ContextRef<'ctx>
impl<'ctx> Clone for ContextRef<'ctx>
source§fn clone(&self) -> ContextRef<'ctx>
fn clone(&self) -> ContextRef<'ctx>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moresource§impl<'ctx> Debug for ContextRef<'ctx>
impl<'ctx> Debug for ContextRef<'ctx>
source§impl PartialEq<Context> for ContextRef<'_>
impl PartialEq<Context> for ContextRef<'_>
source§impl PartialEq<ContextRef<'_>> for Context
impl PartialEq<ContextRef<'_>> for Context
source§fn eq(&self, other: &ContextRef<'_>) -> bool
fn eq(&self, other: &ContextRef<'_>) -> bool
self and other values to be equal, and is used
by ==.source§impl<'ctx> PartialEq for ContextRef<'ctx>
impl<'ctx> PartialEq for ContextRef<'ctx>
source§fn eq(&self, other: &ContextRef<'ctx>) -> bool
fn eq(&self, other: &ContextRef<'ctx>) -> bool
self and other values to be equal, and is used
by ==.impl<'ctx> Copy for ContextRef<'ctx>
impl<'ctx> Eq for ContextRef<'ctx>
impl<'ctx> StructuralPartialEq for ContextRef<'ctx>
Auto Trait Implementations§
impl<'ctx> Freeze for ContextRef<'ctx>
impl<'ctx> RefUnwindSafe for ContextRef<'ctx>
impl<'ctx> !Send for ContextRef<'ctx>
impl<'ctx> !Sync for ContextRef<'ctx>
impl<'ctx> Unpin for ContextRef<'ctx>
impl<'ctx> UnwindSafe for ContextRef<'ctx>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more