BUG: UListIO: byteSize overflowing on really big faceLists
[OpenFOAM-2.0.x.git] / applications / test / PackedList / Test-PackedList.C
blob90ed8ac740810c7669a892d355c13ed1580016c6
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 Application
26 Description
28 \*---------------------------------------------------------------------------*/
30 #include "argList.H"
31 #include "uLabel.H"
32 #include "IOobject.H"
33 #include "IOstreams.H"
34 #include "IFstream.H"
35 #include "PackedBoolList.H"
36 #include <climits>
39 using namespace Foam;
41 template<unsigned nBits>
42 inline void reportInfo()
44     unsigned offset = PackedList<nBits>::packing();
46     unsigned useSHL = ((1u << (nBits * offset)) - 1);
47     unsigned useSHR = (~0u >> (sizeof(unsigned)*CHAR_BIT - nBits * offset));
49     Info<< nl
50         << "PackedList<" << nBits << ">" << nl
51         << " max_value: " << PackedList<nBits>::max_value() << nl
52         << " packing: " << PackedList<nBits>::packing() << nl
53         << " utilization: " << (nBits * offset) << nl;
55     Info<< " Masking:" << nl
56         << "  shift << "
57         << unsigned(nBits * offset) << nl
58         << "  shift >> "
59         << unsigned((sizeof(unsigned)*CHAR_BIT) - nBits * offset)
60         << nl;
62     hex(Info);
63     Info<< "   maskLower: "
64         << PackedList<nBits>::maskLower(PackedList<nBits>::packing())
65         << nl
66         << "      useSHL: " << useSHL << nl
67         << "      useSHR: " << useSHR << nl;
69     if (useSHL != useSHR)
70     {
71         Info<< "WARNING:  different results for SHL and SHR" << nl;
72     }
74     Info<< nl;
75     dec(Info);
79 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
80 //  Main program:
82 int main(int argc, char *argv[])
84     argList::noParallel();
85     argList::validArgs.insert("file .. fileN");
87     argList::addBoolOption("mask", "report information about the bit masks");
88     argList::addBoolOption("count", "test the count() method");
89     argList::addBoolOption
90     (
91         "info",
92         "print an ascii representation of the storage"
93     );
95     argList args(argc, argv, false, true);
98     if (args.optionFound("mask"))
99     {
100         Info<< "bit width: " << unsigned(sizeof(unsigned)*CHAR_BIT) << endl;
101         reportInfo<1>();
102         reportInfo<2>();
103         reportInfo<3>();
104         reportInfo<4>();
105         reportInfo<5>();
106         reportInfo<6>();
107         reportInfo<7>();
108         reportInfo<8>();
109         reportInfo<9>();
110         reportInfo<10>();
111         reportInfo<11>();
112         reportInfo<12>();
113         reportInfo<13>();
114         reportInfo<14>();
115         reportInfo<15>();
116         reportInfo<16>();
118         return 0;
119     }
120     else if (args.size() <= 1)
121     {
122         args.printUsage();
123     }
126     for (label argI=1; argI < args.size(); ++argI)
127     {
128         const string& srcFile = args[argI];
129         Info<< nl << "reading " << srcFile << nl;
131         IFstream ifs(srcFile);
132         List<label> rawLst(ifs);
134         PackedBoolList packLst(rawLst);
136         Info<< "size: " << packLst.size() << nl;
138         if (args.optionFound("count"))
139         {
140             unsigned int rawCount = 0;
141             forAll(rawLst, elemI)
142             {
143                 if (rawLst[elemI])
144                 {
145                     rawCount++;
146                 }
147             }
148             Info<< "raw count: " << rawCount << nl
149                 << "packed count: " << packLst.count() << nl;
150         }
152         if (args.optionFound("info"))
153         {
154             packLst.printInfo(Info);
155         }
157         Info<< nl;
158         IOobject::writeDivider(Info);
159     }
161     return 0;
164 // ************************************************************************* //