Apache DataSketches Memory

Copyright 2015-2018 Yahoo
Copyright 2018- Verizon
Copyright 2019 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

Prior to moving to ASF, the software for this project was developed at
Yahoo (now Verizon Media) (https://developer.yahoo.com).

This product contains 3rd party code under the following licenses:

Apache License version 2.0 (see LICENSE)
================================
This product contains a method to create a dummy read-only ByteBuffer using unsafe:
  * https://github.com/apache/incubator-datasketches-memory/blob/master/src/main/java/org/apache/datasketches/memory/AccessByteBuffer.java
    Method: getDummyReadOnlyDirectByteBuffer(...).
This code was adapted from
  https://github.com/odnoklassniki/one-nio/blob/master/src/one/nio/mem/DirectMemory.java
  Method: wrap(...),
  Copyright 2015 Odnoklassniki Ltd, Mail.Ru Group

This product contains code to implement and test the xxHash function:
  * https://github.com/apache/incubator-datasketches-memory/blob/master/src/main/java/org/apache/datasketches/memory/XxHash64.java
  * https://github.com/apache/incubator-datasketches-memory/blob/master/src/test/java/org/apache/datasketches/memory/XxHash64Test.java
    Method: collisionTest(),
  * https://github.com/apache/incubator-datasketches-memory/blob/master/src/test/java/org/apache/datasketches/memory/XxHash64LoopingTest.java
    Method: testWithSeed() and HASHES_OF_LOOPING_BYTES_WITH_SEED_42 test data,
This code was adapted from
  https://github.com/OpenHFT/Zero-Allocation-Hashing, 
  Copyright 2015 Higher Frequency Trading http://www.higherfrequencytrading.com


Google Protobuf License (see LICENSE):
================================
This product contains code for encoding, decoding and testing UTF8:
  * https://github.com/apache/incubator-datasketches-memory/blob/master/src/main/java/org/apache/datasketches/memory/Utf8.java
  * https://github.com/apache/incubator-datasketches-memory/blob/master/src/test/java/org/apache/datasketches/memory/Utf8Test.java
  * https://github.com/apache/incubator-datasketches-memory/blob/master/src/test/java/org/apache/datasketches/memory/IsValidUtf8TestUtil.java
This code was adapted from 
  https://github.com/protocolbuffers/protobuf/blob/master/java/core/src/main/java/com/google/protobuf/Utf8.java,
  https://github.com/protocolbuffers/protobuf/blob/master/java/core/src/test/java/com/google/protobuf/Utf8Test.java,
  https://github.com/protocolbuffers/protobuf/blob/master/java/core/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java,
  all Copyright 2008 Google Inc.


BSD-2-Clause License (see LICENSE):
================================
This product contains code for encoding, decoding and testing UTF8:
  * https://github.com/apache/incubator-datasketches-memory/blob/master/src/main/java/org/apache/datasketches/memory/XxHash64.java
and adapted from C++
  https://github.com/Cyan4973/xxHash/blob/dev/xxhash.c,
  https://github.com/Cyan4973/xxHash/blob/dev/xxhash.h,
  both Copyright (C) 2012-2016, Yann Collet.


Public Domain (optional notice)
================================
  This product contains the text of Lincoln's Gettysburg Address, which is in the public domain, and is used in various file tests.
  This file is read-only and tested for its exact character sequence and cannot be appended with any additional text.
  * https://github.com/apache/incubator-datasketches-memory/blob/master/src/test/java/org/apache/datasketches/memory/AllocateDirectMapMemoryTest.java
  * https://github.com/apache/incubator-datasketches-memory/blob/master/src/test/java/org/apache/datasketches/memory/AllocateDirectWritableMapMemoryTest.java
  * https://github.com/apache/incubator-datasketches-memory/blob/master/src/test/java/org/apache/datasketches/memory/MemoryTest.java
  * https://github.com/apache/incubator-datasketches-memory/blob/master/src/test/java/org/apache/datasketches/memory/UtilTest.java
