# Syntax: C, C++, Objective-C

## C++

    #include <iostream>

    // If we increase row by 1, the offset will increase by sz (number of elements per row i.e. number of columns)
    // If we increase col by 1, the offset will increase by 1
    unsigned rowMajorOffset(unsigned row, unsigned col, unsigned sz)
    {
    	return col + row * sz;
    }

    // If we increase col by 1, the offset will increase by sz (number of elements per column i.e. number of rows)
    // If we increase row by 1, the offset will increase by 1
    unsigned columnMajorOffset(unsigned row, unsigned col, unsigned sz)
    {
        return row + col * sz;
    }

    template <typename _ValueT, unsigned _R, unsigned _C, bool _ColumnMajor>
    class Matrix {
    protected:
    	enum { ColumnMajor = _ColumnMajor };
    	enum { R = _R };
    	enum { C = _C };

    	typedef _ValueT ValueT;

    	ValueT m_values[C*R];

    public:
    	const ValueT & at (unsigned r, unsigned c) const
    	{
    		if (ColumnMajor)
    			return m_values[columnMajorOffset(r, c, R)];
    		else
    			return m_values[rowMajorOffset(r, c, C)];
    	}

    	ValueT & at (unsigned r, unsigned c)
    	{
    		if (ColumnMajor)
    			return m_values[columnMajorOffset(r, c, R)];
    		else
    			return m_values[rowMajorOffset(r, c, C)];
    	}

    	void loadTestPattern ()
    	{
    		for (unsigned r = 0; r < R; r += 1)
    			for (unsigned c = 0; c < C; c += 1)
    				at(r, c) = (r+1) * 1000 + (c+1);
    	}

    	void debug ()
    	{
    		using namespace std;

    		if (ColumnMajor)
    			cout << "Column-Major Matrix " << "(" << R << "," << C << ")" << " @ " << this << endl;
    		else
    			cout << "Row-Major Matrix " << "(" << R << "," << C << ")" << " @ " << this << endl;

    		cout << "Memory Offset: ";
    		for (unsigned i = 0; i < (R*C); i += 1)
    			cout << i << "    ";
    		cout << endl;

    		cout << "       Values: ";
    		for (unsigned i = 0; i < (R*C); i += 1)
    			cout << m_values[i] << " ";
    		cout << endl;

    		cout << "Standard Mathematical Notation:" << endl;
    		cout << "      ";
    		for (unsigned c = 0; c < C; c += 1)
    			cout << "Col " << c << " ";
    		cout << endl;

    		for (unsigned r = 0; r < R; r += 1) {
    			cout << "Row " << r << " ";
    			for (unsigned c = 0; c < C; c += 1)
    				cout << at(r, c) << "  ";
    			cout << endl;
    		}
    		cout << endl;
    	}

    	Matrix<ValueT, R, C, !ColumnMajor> transposeStorage () const
    	{
    		Matrix<ValueT, R, C, !ColumnMajor> result;

    		for (unsigned r = 0; r < R; r += 1)
    			for (unsigned c = 0; c < C; c += 1)
    				result.at(r, c) = at(r, c);

    		return result;
    	}

    	Matrix<ValueT, C, R, !ColumnMajor> transposeMatrix () const
    	{
    		Matrix<ValueT, C, R, !ColumnMajor> result;

    		memcpy(&result.at(0,0), m_values, sizeof(m_values));

    		return result;
    	}
    };

    int main (int argc, char * const argv[]) {
    	Matrix<float, 4, 2, false> rowMajorMatrix;
    	Matrix<float, 4, 2, true> columnMajorMatrix;

    	rowMajorMatrix.loadTestPattern();
    	rowMajorMatrix.debug();

    	columnMajorMatrix.loadTestPattern();
    	columnMajorMatrix.debug();

    	rowMajorMatrix = columnMajorMatrix.transposeStorage();
    	rowMajorMatrix.debug();

    	Matrix<float, 2, 4, false> transposedMatrix = columnMajorMatrix.transposeMatrix();
    	transposedMatrix.debug();

    	return 0;
    }

## Objective-C Header

    //
    //  GHInventoryEditor.h
    //  Goblin Hacker
    //
    //  Created by Samuel Williams on 19/12/07.
    //  Copyright 2007 Samuel Williams, Orion Transfer Ltd. All rights reserved.

    //  This software was originally produced by Orion Transfer Ltd.
    //    Please see http://www.oriontransfer.org for more details.
    //

    /*
        This program is free software: you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation, either version 3 of the License, or
        (at your option) any later version.

        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.

        You should have received a copy of the GNU General Public License
        along with this program.  If not, see <http://www.gnu.org/licenses/>.
    */

    #import <Cocoa/Cocoa.h>

    #import "GHEditorController.h"
    #import "GHSavedGameDocument+Slots.h"

    @interface GHInventoryEditor : GHEditorController {
    	NSInteger armorType, weaponType, potionQuality;
    }

    + (NSArray*) items;

    @property NSInteger armorType;
    @property NSInteger weaponType;
    @property NSInteger potionQuality;

    - (IBAction)healingPotions: (id)sender;
    - (IBAction)manaPotions: (id)sender;
    - (IBAction)cureDiseasePotions: (id)sender;
    - (IBAction)catsEyePotions: (id)sender;
    - (IBAction)predatorSightPotions:(id)sender;
    - (IBAction)leatherSkinPotions: (id)sender;
    - (IBAction)hastePotions: (id)sender;
    - (IBAction)invisibilityPotions: (id)sender;

    - (IBAction)basicWeapon: (id)sender;
    - (IBAction)goodWeapon: (id)sender;
    - (IBAction)superbWeapon: (id)sender;
    - (IBAction)avatarWeapon: (id)sender;

    - (IBAction)basicArmor: (id)sender;
    - (IBAction)goodArmor: (id)sender;
    - (IBAction)superbArmor: (id)sender;
    - (IBAction)avatarArmor: (id)sender;

    - (IBAction)alchemyBooks: (id)sender;
    - (IBAction)amulets: (id)sender;
    - (IBAction)lockpicks: (id)sender;
    - (IBAction)reagents: (id)sender;
    - (IBAction)reactants: (id)sender;
    - (IBAction)rings: (id)sender;
    - (IBAction)torches: (id)sender;

    - (IBAction)avatarJewelry: (id)sender;

    @end

## Objective-C Implementation

    //
    //  GPointSet.m
    //  Gocoa
    //
    //  Created by Samuel Williams on 9/05/05.
    //  Copyright 2005 Orion Transfer Ltd. All rights reserved.
    //

    #import "GPointSet.h"

    void adjacentPoints (NSPoint p, NSPoint pts[4]) { //pts must have four elements
    	pts[3] = NSMakePoint (p.x - 1, p.y);
    	pts[0] = NSMakePoint (p.x, p.y + 1);
    	pts[1] = NSMakePoint (p.x + 1, p.y);
    	pts[2] = NSMakePoint (p.x, p.y - 1);
    }

    @implementation GPointSet
    + (NSPoint) pointForIndex:(unsigned int)index withSize:(NSSize)s {
    	int x = index % (int)(s.width);
    	return NSMakePoint (x, (int)((index - x) / s.width));
    }

    + (unsigned int) indexForPoint:(NSPoint)point withSize:(NSSize)s {
    	return point.x + (point.y * s.width);
    }

    - (id) init {
    	NSLog(@"%s does not have default constructor", __FUNCTION__);
    	return nil;
    }

    - (id) initWithSize:(NSSize)newSize {
    	if (self = [super init]) {
    		size = newSize;
    		indexSet = [[NSMutableIndexSet alloc] init];
    	}

    	return self;
    }

    - (void) dealloc {
    	[super dealloc];
    	[indexSet release];
    }

    - (NSMutableIndexSet*) indexSet {
    	return [[indexSet retain] autorelease];
    }

    - (void) addPoint:(NSPoint)point {
    	[indexSet addIndex:[GPointSet indexForPoint:point withSize:size]];
    }

    - (void) removePoint:(NSPoint)point {
    	[indexSet removeIndex:[GPointSet indexForPoint:point withSize:size]];
    }

    - (BOOL) containsPoint:(NSPoint)point {
    	return [indexSet containsIndex:[GPointSet indexForPoint:point withSize:size]];
    }

    - (NSPoint) pointForIndex:(unsigned int)index {
    	return [GPointSet pointForIndex:index withSize:size];
    }

    - (unsigned int) indexForPoint:(NSPoint)point {
    	return [GPointSet indexForPoint:point withSize:size];
    }

    - (NSString*)description {
    	NSMutableString *result = [NSMutableString new];
    	[result appendFormat:@"<GPointSet %h", self];

    	unsigned index = [indexSet firstIndex];

    	while (index != NSNotFound) {
    		[result appendFormat:@"%@ ", NSStringFromPoint([self pointForIndex:index])];

    		index = [indexSet indexGreaterThanIndex:index];
    	}

    	[result appendString:@">"];
    	return result;
    }

    @end

## Strings with embedded escapes

    const char * text = "The elephant\n was in the room.";

## Types and Functions

    int   pthread_setcancelstate(int, int *);
    int   pthread_setcanceltype(int, int *);
    int   pthread_setconcurrency(int);
    int   pthread_setschedparam(pthread_t, int ,
          const struct sched_param *);
    int   pthread_setspecific(pthread_key_t, const void *);
    void  pthread_testcancel(void);

    namespace Bob {
    	namespace moo {

    	}
    }