brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.4 KiB · 5a9f44f Raw
44 lines · cpp
1//===-- llvm/ADT/APSInt.cpp - Arbitrary Precision Signed Int ---*- C++ -*--===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the APSInt class, which is a simple class that10// represents an arbitrary sized integer that knows its signedness.11//12//===----------------------------------------------------------------------===//13 14#include "llvm/ADT/APSInt.h"15#include "llvm/ADT/FoldingSet.h"16#include "llvm/ADT/StringRef.h"17#include <cassert>18 19using namespace llvm;20 21APSInt::APSInt(StringRef Str) {22  assert(!Str.empty() && "Invalid string length");23 24  // (Over-)estimate the required number of bits.25  unsigned NumBits = ((Str.size() * 64) / 19) + 2;26  APInt Tmp(NumBits, Str, /*radix=*/10);27  if (Str[0] == '-') {28    unsigned MinBits = Tmp.getSignificantBits();29    if (MinBits < NumBits)30      Tmp = Tmp.trunc(std::max<unsigned>(1, MinBits));31    *this = APSInt(Tmp, /*isUnsigned=*/false);32    return;33  }34  unsigned ActiveBits = Tmp.getActiveBits();35  if (ActiveBits < NumBits)36    Tmp = Tmp.trunc(std::max<unsigned>(1, ActiveBits));37  *this = APSInt(Tmp, /*isUnsigned=*/true);38}39 40void APSInt::Profile(FoldingSetNodeID& ID) const {41  ID.AddInteger((unsigned) (IsUnsigned ? 1 : 0));42  APInt::Profile(ID);43}44