Edit

kc3-lang/angle/src/compiler/translator/InfoSink.h

Branch :

  • Show log

    Commit

  • Author : Jonah Ryan-Davis
    Date : 2019-01-31 13:53:59
    Hash : f563fdc9
    Message : Reland "Fix unit test for setting locale creating malformed HLSL shader code Fix malformed HLSL shader code in other locales than classic" This is a reland of 5f662c0042703344eb0eef6d1c123e902e3aefbf Original change's description: > Fix unit test for setting locale creating malformed HLSL shader code > Fix malformed HLSL shader code in other locales than classic > > Bug: angleproject:1433 > Change-Id: I30bad0bd0cfda465ec7200e48e12800d7d8efd26 > Reviewed-on: https://chromium-review.googlesource.com/c/1447862 > Reviewed-by: Geoff Lang <geofflang@chromium.org> > Reviewed-by: Jamie Madill <jmadill@chromium.org> > Commit-Queue: Jonah Ryan-Davis <jonahr@google.com> Bug: angleproject:1433 Change-Id: I94caf7b4c7179119e5a5567c3014d7232df45a13 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1516192 Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Jonah Ryan-Davis <jonahr@google.com>

  • src/compiler/translator/InfoSink.h
  • //
    // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    #ifndef COMPILER_TRANSLATOR_INFOSINK_H_
    #define COMPILER_TRANSLATOR_INFOSINK_H_
    
    #include <math.h>
    #include <stdlib.h>
    #include "compiler/translator/Common.h"
    #include "compiler/translator/Severity.h"
    
    namespace sh
    {
    
    class ImmutableString;
    class TType;
    
    // Returns the fractional part of the given floating-point number.
    inline float fractionalPart(float f)
    {
        float intPart = 0.0f;
        return modff(f, &intPart);
    }
    
    class ImmutableString;
    
    //
    // Encapsulate info logs for all objects that have them.
    //
    // The methods are a general set of tools for getting a variety of
    // messages and types inserted into the log.
    //
    class TInfoSinkBase
    {
      public:
        TInfoSinkBase() {}
    
        template <typename T>
        TInfoSinkBase &operator<<(const T &t)
        {
            TPersistStringStream stream = sh::InitializeStream<TPersistStringStream>();
            stream << t;
            sink.append(stream.str());
            return *this;
        }
        // Override << operator for specific types. It is faster to append strings
        // and characters directly to the sink.
        TInfoSinkBase &operator<<(char c)
        {
            sink.append(1, c);
            return *this;
        }
        TInfoSinkBase &operator<<(const char *str)
        {
            sink.append(str);
            return *this;
        }
        TInfoSinkBase &operator<<(const TPersistString &str)
        {
            sink.append(str);
            return *this;
        }
        TInfoSinkBase &operator<<(const TString &str)
        {
            sink.append(str.c_str());
            return *this;
        }
        TInfoSinkBase &operator<<(const ImmutableString &str);
    
        TInfoSinkBase &operator<<(const TType &type);
    
        // Make sure floats are written with correct precision.
        TInfoSinkBase &operator<<(float f)
        {
            // Make sure that at least one decimal point is written. If a number
            // does not have a fractional part, the default precision format does
            // not write the decimal portion which gets interpreted as integer by
            // the compiler.
            TPersistStringStream stream = sh::InitializeStream<TPersistStringStream>();
            if (fractionalPart(f) == 0.0f)
            {
                stream.precision(1);
                stream << std::showpoint << std::fixed << f;
            }
            else
            {
                stream.unsetf(std::ios::fixed);
                stream.unsetf(std::ios::scientific);
                stream.precision(8);
                stream << f;
            }
            sink.append(stream.str());
            return *this;
        }
        // Write boolean values as their names instead of integral value.
        TInfoSinkBase &operator<<(bool b)
        {
            const char *str = b ? "true" : "false";
            sink.append(str);
            return *this;
        }
    
        void erase() { sink.clear(); }
        int size() { return static_cast<int>(sink.size()); }
    
        const TPersistString &str() const { return sink; }
        const char *c_str() const { return sink.c_str(); }
    
        void prefix(Severity severity);
        void location(int file, int line);
    
      private:
        TPersistString sink;
    };
    
    class TInfoSink
    {
      public:
        TInfoSinkBase info;
        TInfoSinkBase debug;
        TInfoSinkBase obj;
    };
    
    }  // namespace sh
    
    #endif  // COMPILER_TRANSLATOR_INFOSINK_H_