blob: cf17edb3f3537e46757bd39cf4c8ca8cadf2a587 [file] [log] [blame]
Christopher Ferrisdf4942c2015-02-17 19:58:53 -08001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Elliott Hughesc2173732015-05-13 13:18:04 -070017#include "utils.h"
18
Christopher Ferrisdf4942c2015-02-17 19:58:53 -080019#include <inttypes.h>
20#include <stdio.h>
21#include <stdint.h>
22#include <stdlib.h>
23
24#include <string>
25
Elliott Hughesc2173732015-05-13 13:18:04 -070026#include <base/stringprintf.h>
Christopher Ferrisdf4942c2015-02-17 19:58:53 -080027
28int Round(int n) {
29 int base = 1;
30 while (base*10 < n) {
31 base *= 10;
32 }
33 if (n < 2*base) {
34 return 2*base;
35 }
36 if (n < 5*base) {
37 return 5*base;
38 }
39 return 10*base;
40}
41
42// Similar to the code in art, but supporting both binary and decimal prefixes.
43std::string PrettyInt(long value, size_t base) {
44 if (base != 2 && base != 10) abort();
45
46 uint64_t count = static_cast<uint64_t>(value);
47 bool negative_number = false;
48 if (value < 0) {
49 negative_number = true;
50 count = static_cast<uint64_t>(-value);
51 }
52
53 // The byte thresholds at which we display amounts. A count is displayed
54 // in unit U when kUnitThresholds[U] <= bytes < kUnitThresholds[U+1].
55 static const uint64_t kUnitThresholds2[] = {
56 1024*1024*1024 /* Gi */, 2*1024*1024 /* Mi */, 3*1024 /* Ki */, 0,
57 };
58 static const uint64_t kUnitThresholds10[] = {
59 1000*1000*1000 /* G */, 2*1000*1000 /* M */, 3*1000 /* k */, 0,
60 };
61 static const uint64_t kAmountPerUnit2[] = { 1024*1024*1024, 1024*1024, 1024, 1 };
62 static const uint64_t kAmountPerUnit10[] = { 1000*1000*1000, 1000*1000, 1000, 1 };
63 static const char* const kUnitStrings2[] = { "Gi", "Mi", "Ki", "" };
64 static const char* const kUnitStrings10[] = { "G", "M", "k", "" };
65
66 // Which set are we using?
67 const uint64_t* kUnitThresholds = ((base == 2) ? kUnitThresholds2 : kUnitThresholds10);
68 const uint64_t* kAmountPerUnit = ((base == 2) ? kAmountPerUnit2 : kAmountPerUnit10);
69 const char* const* kUnitStrings = ((base == 2) ? kUnitStrings2 : kUnitStrings10);
70
71 size_t i = 0;
72 for (; kUnitThresholds[i] != 0; ++i) {
73 if (count >= kUnitThresholds[i]) {
74 break;
75 }
76 }
Elliott Hughesc2173732015-05-13 13:18:04 -070077 return android::base::StringPrintf("%s%" PRId64 "%s",
78 negative_number ? "-" : "",
79 count / kAmountPerUnit[i], kUnitStrings[i]);
Christopher Ferrisdf4942c2015-02-17 19:58:53 -080080}