Skip to content

Commit

Permalink
Merge branch 'master' into task/2016_06_relay_python_iface
Browse files Browse the repository at this point in the history
  • Loading branch information
cyrush committed Jun 30, 2016
2 parents 7c47659 + ee47dfa commit f0203b5
Show file tree
Hide file tree
Showing 6 changed files with 117 additions and 26 deletions.
53 changes: 38 additions & 15 deletions src/libs/conduit/DataArray.cpp
Expand Up @@ -54,6 +54,12 @@
//-----------------------------------------------------------------------------
#include <cstring>


//-----------------------------------------------------------------------------
// -- conduit includes --
//-----------------------------------------------------------------------------
#include "Utils.hpp"

//-----------------------------------------------------------------------------
// -- begin conduit:: --
//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -156,21 +162,38 @@ DataArray<T>::to_json(std::ostream &os) const
os << ", ";
switch(m_dtype.id())
{
/// TODO: This could be orged better
/* ints */
case DataType::INT8_ID: os << (int64) element(idx); break;
case DataType::INT16_ID: os << (int64) element(idx); break;
case DataType::INT32_ID: os << (int64) element(idx); break;
case DataType::INT64_ID: os << (int64) element(idx); break;
/* uints */
case DataType::UINT8_ID: os << (uint64) element(idx); break;
case DataType::UINT16_ID: os << (uint64) element(idx); break;
case DataType::UINT32_ID: os << (uint64) element(idx); break;
case DataType::UINT64_ID: os << (uint64) element(idx); break;
/* floats */
case DataType::FLOAT32_ID: os << (float64) element(idx); break;
case DataType::FLOAT64_ID: os << (float64) element(idx); break;

// ints
case DataType::INT8_ID:
case DataType::INT16_ID:
case DataType::INT32_ID:
case DataType::INT64_ID:
{
os << (int64) element(idx);
break;
}
// uints
case DataType::UINT8_ID:
case DataType::UINT16_ID:
case DataType::UINT32_ID:
case DataType::UINT64_ID:
{
os << (uint64) element(idx);
break;
}
// floats
case DataType::FLOAT32_ID:
case DataType::FLOAT64_ID:
{
os << utils::float64_to_string((float64) element(idx));
break;
}
default:
{
CONDUIT_ERROR("Leaf type \""
<< m_dtype.name()
<< "\""
<< "is not supported in conduit::DataArray.")
}
}
first=false;
}
Expand Down
39 changes: 30 additions & 9 deletions src/libs/conduit/Utils.cpp
Expand Up @@ -70,7 +70,7 @@ const char CONDUIT_UTILS_FILE_PATH_SEPARATOR='/';


#include <string.h>

#include <stdio.h>

//-----------------------------------------------------------------------------
// -- libb64 includes --
Expand Down Expand Up @@ -432,7 +432,8 @@ indent(std::ostream &os,
}

//-----------------------------------------------------------------------------
void sleep(index_t milliseconds)
void
sleep(index_t milliseconds)
{

#if defined(CONDUIT_PLATFORM_WINDOWS)
Expand Down Expand Up @@ -593,11 +594,12 @@ unescape_special_chars(const std::string &input)


//-----------------------------------------------------------------------------
void base64_encode(const void *src,
index_t src_nbytes,
void *dest)
void
base64_encode(const void *src,
index_t src_nbytes,
void *dest)
{
int nbytes = (int)src_nbytes;
int nbytes = (int)src_nbytes;
base64_encodestate enc_state;
base64_init_encodestate(&enc_state);
const char *src_ptr = (const char*)src;
Expand All @@ -617,9 +619,10 @@ void base64_encode(const void *src,
}

//-----------------------------------------------------------------------------
void base64_decode(const void *src,
index_t src_nbytes,
void *dest)
void
base64_decode(const void *src,
index_t src_nbytes,
void *dest)
{
base64_decodestate dec_state;
int src_len = src_nbytes;
Expand All @@ -632,6 +635,24 @@ void base64_decode(const void *src,
&dec_state);
}

//-----------------------------------------------------------------------------
std::string
float64_to_string(float64 value)
{
char buffer[64];
snprintf(buffer,64,"%.15g",value);

std::string res(buffer);

if(res.find('.') == std::string::npos &&
res.find('e') == std::string::npos )
{
res += ".0";
}

return res;
}


}
//-----------------------------------------------------------------------------
Expand Down
7 changes: 7 additions & 0 deletions src/libs/conduit/Utils.hpp
Expand Up @@ -327,6 +327,13 @@ namespace utils
return oss.str();
}


//-----------------------------------------------------------------------------
// floating point to string helper, strikes a balance of what we want
// for format-wise for debug printing and json.
//-----------------------------------------------------------------------------
std::string CONDUIT_API float64_to_string(float64 value);

//-----------------------------------------------------------------------------
void CONDUIT_API indent(std::ostream &os,
index_t indent,
Expand Down
22 changes: 22 additions & 0 deletions src/tests/conduit/t_conduit_json.cpp
Expand Up @@ -546,6 +546,28 @@ TEST(conduit_json, json_schema_string_value_with_escapes)
}


//-----------------------------------------------------------------------------
TEST(conduit_json, json_schema_preserve_floats)
{
Node n;
n["i"].set_int64(10);
n["f"].set_float64(20.0);

std::string source_json= n.to_json();

Generator g(source_json,"json");
Node n_parse;
g.walk(n_parse);

std::string parsed_json = n.to_json();

CONDUIT_INFO(parsed_json);

EXPECT_TRUE(n_parse["i"].dtype().is_int64());
EXPECT_TRUE(n_parse["f"].dtype().is_float64());

}




4 changes: 2 additions & 2 deletions src/tests/conduit/t_conduit_to_string.cpp
Expand Up @@ -71,15 +71,15 @@ TEST(conduit_to_string, simple_1)
Node n(schema,data,true);
n.schema().print();
n.print_detailed();
EXPECT_EQ(std::string("{\"a\": 10,\"b\": 20,\"c\": 30}"),n.to_json("json",0,0,"",""));
EXPECT_EQ(std::string("{\"a\": 10,\"b\": 20,\"c\": 30.0}"),n.to_json("json",0,0,"",""));



Schema schema2("{\"g\": {\"a\":\"uint32\",\"b\":\"uint32\",\"c\":\"float64\"}}");
Node n2(schema2,data,true);
n2.schema().print();
n.print_detailed();
EXPECT_EQ(std::string("{\"g\": {\"a\": 10,\"b\": 20,\"c\": 30}}"),n2.to_json("json",0,0,"",""));
EXPECT_EQ(std::string("{\"g\": {\"a\": 10,\"b\": 20,\"c\": 30.0}}"),n2.to_json("json",0,0,"",""));

delete [] data;
}
Expand Down
18 changes: 18 additions & 0 deletions src/tests/conduit/t_conduit_utils.cpp
Expand Up @@ -208,4 +208,22 @@ TEST(conduit_utils, escape_special_chars)
EXPECT_EQ(test,test_unescaped);
}

//-----------------------------------------------------------------------------
TEST(conduit_utils, float64_to_string)
{


float64 v = 10.0;

EXPECT_EQ("10.0",utils::float64_to_string(v));

v = 10000000000000000;
EXPECT_EQ("1e+16",utils::float64_to_string(v));

}






0 comments on commit f0203b5

Please sign in to comment.