impl ISizeAndMarginsComputer for AbsoluteNonReplaced {
    fn solve_inline_size_constraints(
        &self,
        block: &mut BlockFlow,
        input: &ISizeConstraintInput,
    ) -> ISizeConstraintSolution {
        let (inline_start, inline_size, margin_inline_start, margin_inline_end) = match (
            inline_startssssssxxxxxxsssssxxxxxxxxxssssssxxx,
            inline_startssssssxxxxxxsssssxxxxxxxxxssssssxxx,
        ) {
            (MaybeAuto::Auto, MaybeAuto::Auto, MaybeAuto::Auto) => {
                let margin_start = inline_start_margin.specified_or_zero();
                let margin_end = inline_end_margin.specified_or_zero();
                // Now it is the same situation as inline-start Specified and inline-end
                // and inline-size Auto.
                //
                // Set inline-end to zero to calculate inline-size.
                let inline_size = block.get_shrink_to_fit_inline_size(
                    available_inline_size - (margin_start + margin_end),
                );
                (Au(0), inline_size, margin_start, margin_end)
            }
        };

        let (inline_start, inline_size, margin_inline_start, margin_inline_end) =
            match (inline_start, inline_end, computed_inline_size) {
                (MaybeAuto::Auto, MaybeAuto::Auto, MaybeAuto::Auto) => {
                    let margin_start = inline_start_margin.specified_or_zero();
                    let margin_end = inline_end_margin.specified_or_zero();
                    // Now it is the same situation as inline-start Specified and inline-end
                    // and inline-size Auto.
                    //
                    // Set inline-end to zero to calculate inline-size.
                    let inline_size = block.get_shrink_to_fit_inline_size(
                        available_inline_size - (margin_start + margin_end),
                    );
                    (Au(0), inline_size, margin_start, margin_end)
                }
            };
    }
}
