D campaign or design workshop, be sure to prepare, understand the problem you’re trying to solve, and be ready to change course when something is not working. And the biggest tip? The Owensboro Symphony Orchestra's annual Concert on the Lawn is right around the corner! The community is invited to this FREE event for the entire family.
This is pretty awesome! Last week at Friday After Five in downtown Owensboro, members of the Owensboro Symphony Orchestra pulled off a flash mob performance. And we have the video here!
The Owensboro Symphony Orchestra opens its 2013-2014 season TONIGHT with a special appearance by world-class trumpeter Allen Vizzutti. What else can you expect from the upcoming season? Check out this hilarious video starring Maestro Nicholas Palmer!
Owensboro's Symphony Orchestra presents the "Magical Beatles" March 23rd. The concert brings back the great talents of Jeans 'n Classics, following their huge success with last year's 70's show!
December brings the annual Holiday Concert, titled The Magic of Christmas this year. It's on December 9 at 3:00 p.m., at RiverPark Center and tickets start at just $18./*
 * Copyright 2013 University of Chicago and Argonne National Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License
 */

/*
  BLOB.H

  Binary Large OBjects

  The Tcl bindings for all this are generated by SWIG

  This file is documented with maint/doc.sh and is online here:
  http://swift-lang.github.io/swift-t/blob.html
*/

#pragma once

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#include <mpi.h>

/** The M4 macro DOC CODE() (leave that space) allows us to extract
    C code into Asciidoc, this preprocessor macro simply passes it through.
*/
#define DOC_CODE(x) x

/**
   DOCN(`')
   DOCSECTION(Struct +turbine_blob+)

   DOCT(`
   Simple struct for variable-length data blob.

   This data type is represented by SWIG in Tcl as a regular pointer-
   you can pass it in and out of functions, display it, etc.
')
*/
DOC_CODE(
typedef struct
{
  void* pointer;
  int length;
} turbine_blob;
)

/**
   DOCT(`
   Based on this struct, SWIG will generate the following
   Tcl functions, assuming +blob+ is a +turbine_blob*+:
 ')

   DOCD(new_turbine_blob, Returns a fresh +turbine_blob*+.)
   DOCD(delete_turbine_blob blob, +free()+ the +blob+. Cf. +blobutils_destroy()+.)
   DOCD(turbine_blob_pointer_set blob p,
        `Set +blob->pointer=p+,  where +p+ is a +void*+.')
   DOCD(turbine_blob_pointer_get blob,
        `Returns +blob->pointer+, a +void*+.')
   DOCD(turbine_blob_length_set blob i,
        `Set +blob->pointer=i+, where +i+ is an integer.')
   DOCD(turbine_blob_length_get blob,
        `Returns +blob->length+, an +int+.')
*/

// DOCNN(== Functions)
// DOCNN(=== Pointers and sizes)
/* DOCNN(`Functions for +turbine_blob+ creation,
          memory allocation/deallocation,
          pointer arithmetic, and +sizeof()+.') */

/**
   DOCD(blobutils_create pointer length, Create a +turbine_blob+ from
   a long integer representing the pointer and the length.)
   @param pointer An int representation of a void*
 */
turbine_blob* blobutils_create(long pointer, int length);

/**
   DOCD(blobutils_create_ptr pointer length, Create a +turbine_blob+ from
   the pointer and the length.)
*/
turbine_blob* blobutils_create_ptr(void* pointer, int length);

/**
   DOCD(blobutils_malloc length, Allocate memory (not a blob) of given size.)
 */
void* blobutils_malloc(size_t bytes);

/**
   DOCD(blobutils_free pointer, Call +free()+ on the given pointer.)
 */
void blobutils_free(void* p);

/**
   DOCD(blobutils_destroy, Deallocate a blob _and_ frees the data pointer.)
 */
void blobutils_destroy(turbine_blob* blob);

/**
   DOCD(blobutils_ptr_add pointer offset, Return the result of
        adding offset to pointer.)
 */
void* blobutils_ptr_add(void* p, int offset);

/**
   DOCD(blobutils_sizeof_ptr, Obtain +sizeof(void*)+)
 */
int blobutils_sizeof_ptr(void);

/**
   DOCD(blobutils_sizeof_int, Obtain +sizeof(int)+)
 */
int blobutils_sizeof_int(void);

/**
   DOCD(blobutils_sizeof_int32, Obtain +sizeof(int32)+)
 */
int blobutils_sizeof_int32(void);

/**
   DOCD(blobutils_sizeof_float, Obtain +sizeof(double)+.
    (In Swift/T, all floats are 64-bit))
 */
int blobutils_sizeof_float(void);

// DOCNN(=== Casts)

/*
   DOCNN(`
   Cast functions for simple SWIG type transformations.
   Not all possible type pairs are yet implemented.
   In our naming scheme, if a type is not given, +void*+ is assumed.
   ')
 */

/** DOCD(blobutils_cast_to_ptr i, Integer to +void*+.) */
void* blobutils_cast_to_ptr(int i);
/** DOCD(blobutils_cast_lli_to_ptr i, Integer to +void*+.) */
void* blobutils_cast_lli_to_ptr(long long int i);
/** DOCD(blobutils_cast_int64_to_ptr i, Integer (64-bit) to +void*+.) */
void* blobutils_cast_int64_to_ptr(int64_t i);
/** DOCD(blobutils_cast_char_ptrptr_to_ptr p, +char**+ to +void*+.) */
void* blobutils_cast_char_ptrptr_to_ptr(char** p);

/** DOCD(blobutils_cast_to_ptrptr p, +void*+ to +void**+.) */
void** blobutils_cast_to_ptrptr(void* p);
/** DOCD(blobutils_cast_to_string p, +void*+ to +char**+.) */
char* blobutils_cast_to_string(void* p);
/** DOCD(blobutils_cast_to_char_ptrptr p, +void*+ to +char**+.) */
char** blobutils_cast_to_char_ptrptr(void* p);
/** DOCD(blobutils_cast_to_char_ppp p, +void*+ to +char***+.) */
char*** blobutils_cast_to_char_ppp(void* p);
/** DOCD(blobutils_cast_string_to_ptrptr s, +char*+ to +void*+.) */
void* blobutils_cast_string_to_ptr(char* s);

/** DOCD(blobutils_cast_to_int p, +void*+ to +int+.) */
int     blobutils_cast_to_int(void* p);
/** DOCD(blobutils_cast_to_long p, +void*+ to +long+.) */
long    blobutils_cast_to_long(void* p);
/** DOCD(blobutils_cast_to_lli p, +void*+ to +long long int+.) */
long long blobutils_cast_to_lli(void* p);
/** DOCD(blobutils_cast_to_int64 p, +void*+ to +int64_t+.) */
int64_t